6 * Various Unix compatibility functions for OS/2
17 /*****************************************************************************/
20 int setpriority(int which, int pid, int val)
22 return DosSetPriority((pid < 0) ? PRTYS_PROCESSTREE : PRTYS_PROCESS,
23 val >> 8, val & 0xFF, abs(pid));
26 int getpriority(int which /* ignored */, int pid)
30 DosGetInfoBlocks(&tib, &pib);
31 return tib->tib_ptib2->tib2_ulpri;
34 /*****************************************************************************/
38 result(int flag, int pid)
41 Signal_t (*ihand)(); /* place to save signal during system() */
42 Signal_t (*qhand)(); /* place to save signal during system() */
44 if (pid < 0 || flag != 0)
47 ihand = signal(SIGINT, SIG_IGN);
48 qhand = signal(SIGQUIT, SIG_IGN);
49 r = waitpid(pid, &status, 0);
50 signal(SIGINT, ihand);
51 signal(SIGQUIT, qhand);
53 statusvalue = (U16)status;
56 return status & 0xFFFF;
60 do_aspawn(really,mark,sp)
68 int flag = P_WAIT, trueflag;
71 New(401,Argv, sp - mark + 1, char*);
74 if (mark < sp && SvIOKp(*(mark+1))) {
79 while (++mark <= sp) {
81 *a++ = SvPVx(*mark, na);
91 if (really && *(tmps = SvPV(really, na)))
92 rc = result(trueflag, spawnvp(flag,tmps,Argv));
94 rc = result(trueflag, spawnvp(flag,Argv[0],Argv));
97 warn("Can't spawn \"%s\": %s", Argv[0], Strerror(errno));
114 if ((shell = getenv("SHELL")) != NULL)
116 else if ((shell = getenv("COMSPEC")) != NULL)
121 /* save an extra exec if possible */
122 /* see if there are shell metacharacters in it */
129 for (s = cmd; *s; s++) {
130 if (*s != ' ' && !isALPHA(*s) && strchr("%&|<>\n",*s)) {
131 if (*s == '\n' && !s[1]) {
135 shell_cmd: return result(P_WAIT, spawnl(P_NOWAIT,shell,shell,copt,cmd,(char*)0));
138 New(402,Argv, (s - cmd) / 2 + 2, char*);
139 Cmd = savepvn(cmd, s-cmd);
142 while (*s && isSPACE(*s)) s++;
145 while (*s && !isSPACE(*s)) s++;
151 rc = result(P_WAIT, spawnvp(P_NOWAIT,Argv[0],Argv));
152 if (rc < 0 && dowarn)
153 warn("Can't spawn \"%s\": %s", Argv[0], Strerror(errno));
160 /*****************************************************************************/
166 die(no_func, "Unsupported function fork");
172 /*****************************************************************************/
173 /* not implemented in EMX 0.9a */
175 void * ctermid(x) { return 0; }
177 #ifdef MYTTYNAME /* was not in emx0.9a */
178 void * ttyname(x) { return 0; }
181 void * gethostent() { return 0; }
182 void * getnetent() { return 0; }
183 void * getprotoent() { return 0; }
184 void * getservent() { return 0; }
185 void sethostent(x) {}
187 void setprotoent(x) {}
188 void setservent(x) {}
189 void endhostent(x) {}
191 void endprotoent(x) {}
192 void endservent(x) {}
194 /*****************************************************************************/
195 /* stat() hack for char/block device */
199 /* First attempt used DosQueryFSAttach which crashed the system when
200 used with 5.001. Now just look for /dev/. */
203 os2_stat(char *name, struct stat *st)
205 static int ino = SHRT_MAX;
207 if (stricmp(name, "/dev/con") != 0
208 && stricmp(name, "/dev/tty") != 0)
209 return stat(name, st);
211 memset(st, 0, sizeof *st);
212 st->st_mode = S_IFCHR|0666;
213 st->st_ino = (ino-- & 0x7FFF);