home *** CD-ROM | disk | FTP | other *** search
- #define INCL_DOS
- #define INCL_NOPM
- #include <os2.h>
-
- /*
- * Various Unix compatibility functions for OS/2
- */
-
- #include <stdio.h>
- #include <errno.h>
- #include <limits.h>
- #include <process.h>
-
- #include "EXTERN.h"
- #include "perl.h"
-
- /*****************************************************************************/
- /* priorities */
-
- int setpriority(int which, int pid, int val)
- {
- return DosSetPriority((pid < 0) ? PRTYS_PROCESSTREE : PRTYS_PROCESS,
- val >> 8, val & 0xFF, abs(pid));
- }
-
- int getpriority(int which /* ignored */, int pid)
- {
- TIB *tib;
- PIB *pib;
- DosGetInfoBlocks(&tib, &pib);
- return tib->tib_ptib2->tib2_ulpri;
- }
-
- /*****************************************************************************/
- /* spawn */
-
- static int
- result(int flag, int pid)
- {
- int r, status;
- Signal_t (*ihand)(); /* place to save signal during system() */
- Signal_t (*qhand)(); /* place to save signal during system() */
- #ifndef __EMX__
- RESULTCODES res;
- int rpid;
- #endif
-
- if (pid < 0 || flag != 0)
- return pid;
-
- #ifdef __EMX__
- ihand = signal(SIGINT, SIG_IGN);
- qhand = signal(SIGQUIT, SIG_IGN);
- r = waitpid(pid, &status, 0);
- signal(SIGINT, ihand);
- signal(SIGQUIT, qhand);
- statusvalue = (U16)status;
- if (r < 0)
- return -1;
- return status & 0xFFFF;
- #else
- ihand = signal(SIGINT, SIG_IGN);
- r = DosWaitChild(DCWA_PROCESS, DCWW_WAIT, &res, &rpid, pid);
- signal(SIGINT, ihand);
- statusvalue = res.codeResult << 8 | res.codeTerminate;
- if (r)
- return -1;
- return statusvalue;
- #endif
- }
-
- int
- do_aspawn(really,mark,sp)
- SV *really;
- register SV **mark;
- register SV **sp;
- {
- register char **a;
- char *tmps;
- int rc;
- int flag = P_WAIT, trueflag;
-
- if (sp > mark) {
- New(401,Argv, sp - mark + 1, char*);
- a = Argv;
-
- if (mark < sp && SvIOKp(*(mark+1))) {
- ++mark;
- flag = SvIVx(*mark);
- }
-
- while (++mark <= sp) {
- if (*mark)
- *a++ = SvPVx(*mark, na);
- else
- *a++ = "";
- }
- *a = Nullch;
-
- trueflag = flag;
- if (flag == P_WAIT)
- flag = P_NOWAIT;
-
- if (really && *(tmps = SvPV(really, na)))
- rc = result(trueflag, spawnvp(flag,tmps,Argv));
- else
- rc = result(trueflag, spawnvp(flag,Argv[0],Argv));
-
- if (rc < 0 && dowarn)
- warn("Can't spawn \"%s\": %s", Argv[0], Strerror(errno));
- } else
- rc = -1;
- do_execfree();
- return rc;
- }
-
- int
- do_spawn2(cmd, execf)
- char *cmd;
- {
- register char **a;
- register char *s;
- char flags[10];
- char *shell, *copt;
- int rc;
-
- if ((shell = getenv("SHELL")) != NULL)
- copt = "-c";
- else if ((shell = getenv("COMSPEC")) != NULL)
- copt = "/C";
- else
- shell = "cmd.exe";
-
- /* save an extra exec if possible */
- /* see if there are shell metacharacters in it */
-
- /*SUPPRESS 530*/
- if (*cmd == '@') {
- ++cmd;
- goto shell_cmd;
- }
- for (s = cmd; *s; s++) {
- if (*s != ' ' && !isALPHA(*s) && strchr("%&|<>\n",*s)) {
- if (*s == '\n' && !s[1]) {
- *s = '\0';
- break;
- }
- shell_cmd: if (execf)
- return spawnl(P_OVERLAY,shell,shell,copt,cmd,(char*)0);
- return result(P_WAIT, spawnl(P_WAIT,shell,shell,copt,cmd,(char*)0));
- }
- }
- New(402,Argv, (s - cmd) / 2 + 2, char*);
- Cmd = savepvn(cmd, s-cmd);
- a = Argv;
- for (s = Cmd; *s;) {
- while (*s && isSPACE(*s)) s++;
- if (*s)
- *(a++) = s;
- while (*s && !isSPACE(*s)) s++;
- if (*s)
- *s++ = '\0';
- }
- *a = Nullch;
- if (Argv[0]) {
- if (execf)
- rc = spawnvp(P_OVERLAY,Argv[0],Argv);
- else
- rc = result(P_WAIT, spawnvp(P_NOWAIT,Argv[0],Argv));
- if (rc < 0 && dowarn)
- warn("Can't spawn \"%s\": %s", Argv[0], Strerror(errno));
- } else
- rc = -1;
- do_execfree();
- return rc;
- }
-
- int
- do_spawn(cmd)
- char *cmd;
- {
- return do_spawn2(cmd, 0);
- }
-
- bool
- do_exec(cmd)
- char *cmd;
- {
- return do_spawn2(cmd, 1);
- }
-
- /*****************************************************************************/
-
- #ifndef HAS_FORK
- int
- fork(void)
- {
- die(no_func, "Unsupported function fork");
- errno = EINVAL;
- return -1;
- }
- #endif
-
- /*****************************************************************************/
- /* not implemented in EMX 0.9a */
-
- void * ctermid(x) { return 0; }
- void * ttyname(x) { return 0; }
-
- /*****************************************************************************/
- /* my socket forwarders - EMX lib only provides static forwarders */
-
- static HMODULE htcp = 0;
-
- static void *
- tcp0(char *name)
- {
- static BYTE buf[20];
- PFN fcn;
- if (!htcp)
- DosLoadModule(buf, sizeof buf, "tcp32dll", &htcp);
- if (htcp && DosQueryProcAddr(htcp, 0, name, &fcn) == 0)
- return (void *) ((void * (*)(void)) fcn) ();
- return 0;
- }
-
- static void
- tcp1(char *name, int arg)
- {
- static BYTE buf[20];
- PFN fcn;
- if (!htcp)
- DosLoadModule(buf, sizeof buf, "tcp32dll", &htcp);
- if (htcp && DosQueryProcAddr(htcp, 0, name, &fcn) == 0)
- ((void (*)(int)) fcn) (arg);
- }
-
- void * gethostent() { return tcp0("GETHOSTENT"); }
- void * getnetent() { return tcp0("GETNETENT"); }
- void * getprotoent() { return tcp0("GETPROTOENT"); }
- void * getservent() { return tcp0("GETSERVENT"); }
- void sethostent(x) { tcp1("SETHOSTENT", x); }
- void setnetent(x) { tcp1("SETNETENT", x); }
- void setprotoent(x) { tcp1("SETPROTOENT", x); }
- void setservent(x) { tcp1("SETSERVENT", x); }
- void endhostent() { tcp0("ENDHOSTENT"); }
- void endnetent() { tcp0("ENDNETENT"); }
- void endprotoent() { tcp0("ENDPROTOENT"); }
- void endservent() { tcp0("ENDSERVENT"); }
-
- /*****************************************************************************/
- /* not implemented in C Set++ */
-
- #ifndef __EMX__
- int setuid(x) { errno = EINVAL; return -1; }
- int setgid(x) { errno = EINVAL; return -1; }
- #endif
-
- /*****************************************************************************/
- /* stat() hack for char/block device */
-
- #if OS2_STAT_HACK
-
- /* First attempt used DosQueryFSAttach which crashed the system when
- used with 5.001. Now just look for /dev/. */
-
- int
- os2_stat(char *name, struct stat *st)
- {
- static int ino = SHRT_MAX;
-
- if (stricmp(name, "/dev/con") != 0
- && stricmp(name, "/dev/tty") != 0)
- return stat(name, st);
-
- memset(st, 0, sizeof *st);
- st->st_mode = S_IFCHR|0666;
- st->st_ino = (ino-- & 0x7FFF);
- st->st_nlink = 1;
- return 0;
- }
-
- #endif
-