diff options
author | Larry Wall <lwall@jpl-devvax.jpl.nasa.gov> | 1990-10-16 02:28:17 +0000 |
---|---|---|
committer | Larry Wall <lwall@jpl-devvax.jpl.nasa.gov> | 1990-10-16 02:28:17 +0000 |
commit | d9d8d8de9462d72f6b4520fc11dd84dbe2c8bf1d (patch) | |
tree | 42dd9d991eecc159ab1e232be5f9941456228df0 /os2/os2.c | |
parent | c2ab57d4ffc80c0e2a9e968e66e52c289ac9ed45 (diff) | |
download | perl-d9d8d8de9462d72f6b4520fc11dd84dbe2c8bf1d.tar.gz |
perl 3.0 patch #32 patch #29, continued
See patch #29.
Diffstat (limited to 'os2/os2.c')
-rw-r--r-- | os2/os2.c | 273 |
1 files changed, 273 insertions, 0 deletions
diff --git a/os2/os2.c b/os2/os2.c new file mode 100644 index 0000000000..279a88f88b --- /dev/null +++ b/os2/os2.c @@ -0,0 +1,273 @@ +/* $Header: os2.c,v 3.0.1.1 90/10/15 17:49:55 lwall Locked $ + * + * (C) Copyright 1989, 1990 Diomidis Spinellis. + * + * You may distribute under the terms of the GNU General Public License + * as specified in the README file that comes with the perl 3.0 kit. + * + * $Log: os2.c,v $ + * Revision 3.0.1.1 90/10/15 17:49:55 lwall + * patch29: Initial revision + * + * Revision 3.0.1.1 90/03/27 16:10:41 lwall + * patch16: MSDOS support + * + * Revision 1.1 90/03/18 20:32:01 dds + * Initial revision + * + */ + +#define INCL_DOS +#define INCL_NOPM +#include <os2.h> + +/* + * Various Unix compatibility functions for OS/2 + */ + +#include <stdio.h> +#include <errno.h> +#include <process.h> + +#include "EXTERN.h" +#include "perl.h" + + +/* dummies */ + +int ioctl(int handle, unsigned int function, char *data) +{ return -1; } + +int userinit() +{ return -1; } + +int syscall() +{ return -1; } + + +/* extendd chdir() */ + +int chdir(char *path) +{ + if ( path[0] != 0 && path[1] == ':' ) + DosSelectDisk(tolower(path[0]) - '@'); + + DosChDir(path, 0L); +} + + +/* priorities */ + +int setpriority(int class, int pid, int val) +{ + int flag = 0; + + if ( pid < 0 ) + { + flag++; + pid = -pid; + } + + return DosSetPrty(flag ? PRTYS_PROCESSTREE : PRTYS_PROCESS, class, val, pid); +} + +int getpriority(int which /* ignored */, int pid) +{ + USHORT val; + + if ( DosGetPrty(PRTYS_PROCESS, &val, pid) ) + return -1; + else + return val; +} + + +/* get parent process id */ + +int getppid(void) +{ + PIDINFO pi; + + DosGetPID(&pi); + return pi.pidParent; +} + + +/* kill */ + +int kill(int pid, int sig) +{ + int flag = 0; + + if ( pid < 0 ) + { + flag++; + pid = -pid; + } + + switch ( sig & 3 ) + { + + case 0: + DosKillProcess(flag ? DKP_PROCESSTREE : DKP_PROCESS, pid); + break; + + case 1: /* FLAG A */ + DosFlagProcess(pid, flag ? FLGP_SUBTREE : FLGP_PID, PFLG_A, 0); + break; + + case 2: /* FLAG B */ + DosFlagProcess(pid, flag ? FLGP_SUBTREE : FLGP_PID, PFLG_B, 0); + break; + + case 3: /* FLAG C */ + DosFlagProcess(pid, flag ? FLGP_SUBTREE : FLGP_PID, PFLG_C, 0); + break; + + } +} + + +/* Sleep function. */ +void +sleep(unsigned len) +{ + DosSleep(len * 1000L); +} + +/* Just pretend that everyone is a superuser */ + +int setuid() +{ return 0; } + +int setgid() +{ return 0; } + +int getuid(void) +{ return 0; } + +int geteuid(void) +{ return 0; } + +int getgid(void) +{ return 0; } + +int getegid(void) +{ return 0; } + +/* + * The following code is based on the do_exec and do_aexec functions + * in file doio.c + */ +int +do_aspawn(really,arglast) +STR *really; +int *arglast; +{ + register STR **st = stack->ary_array; + register int sp = arglast[1]; + register int items = arglast[2] - sp; + register char **a; + char **argv; + char *tmps; + int status; + + if (items) { + New(1101,argv, items+1, char*); + a = argv; + for (st += ++sp; items > 0; items--,st++) { + if (*st) + *a++ = str_get(*st); + else + *a++ = ""; + } + *a = Nullch; + if (really && *(tmps = str_get(really))) + status = spawnvp(P_WAIT,tmps,argv); + else + status = spawnvp(P_WAIT,argv[0],argv); + Safefree(argv); + } + return status; +} + +char *getenv(char *name); + +int +do_spawn(cmd) +char *cmd; +{ + register char **a; + register char *s; + char **argv; + char flags[10]; + int status; + char *shell, *cmd2; + + /* save an extra exec if possible */ + if ((shell = getenv("COMSPEC")) == 0) + shell = "C:\\OS2\\CMD.EXE"; + + /* see if there are shell metacharacters in it */ + if (strchr(cmd, '>') || strchr(cmd, '<') || strchr(cmd, '|') + || strchr(cmd, '&') || strchr(cmd, '^')) + doshell: + return spawnl(P_WAIT,shell,shell,"/C",cmd,(char*)0); + + New(1102,argv, strlen(cmd) / 2 + 2, char*); + + New(1103,cmd2, strlen(cmd) + 1, char); + strcpy(cmd2, cmd); + a = argv; + for (s = cmd2; *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 ((status = spawnvp(P_WAIT,argv[0],argv)) == -1) { + Safefree(argv); + Safefree(cmd2); + goto doshell; + } + Safefree(cmd2); + Safefree(argv); + return status; +} + +usage(char *myname) +{ +#ifdef MSDOS + printf("\nUsage: %s [-acdnpsSvw] [-Dnumber] [-i[extension]] [-Idirectory]" +#else + printf("\nUsage: %s [-acdnpPsSuUvw] [-Dnumber] [-i[extension]] [-Idirectory]" +#endif + "\n [-e \"command\"] [-x[directory]] [filename] [arguments]\n", myname); + + printf("\n -a autosplit mode with -n or -p" + "\n -c syntaxcheck only" + "\n -d run scripts under debugger" + "\n -n assume 'while (<>) { ...script... }' loop arround your script" + "\n -p assume loop like -n but print line also like sed" +#ifndef MSDOS + "\n -P run script through C preprocessor befor compilation" +#endif + "\n -s enable some switch parsing for switches after script name" + "\n -S look for the script using PATH environment variable"); +#ifndef MSDOS + printf("\n -u dump core after compiling the script" + "\n -U allow unsafe operations"); +#endif + printf("\n -v print version number and patchlevel of perl" + "\n -w turn warnings on for compilation of your script\n" + "\n -Dnumber set debugging flags" + "\n -i[extension] edit <> files in place (make backup if extension supplied)" + "\n -Idirectory specify include directory in conjunction with -P" + "\n -e command one line of script, multiple -e options are allowed" + "\n [filename] can be ommitted, when -e is used" + "\n -x[directory] strip off text before #!perl line and perhaps cd to directory\n"); +} |