home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
perl501m.zip
/
OS2
/
os2.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-07-04
|
6KB
|
284 lines
#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