#include #include #include #include #include typedef struct { char xarg_magic[4]; /* verification value "xArg" */ int xargc; /* argc */ char **xargv; /* argv */ char *xiovector; /* i/o handle status */ BASEPAGE *xparent; /* pointer to parent's basepage */ } XARG; extern int _argc; extern char **_argv; static char xmagic[] = "xArg"; static char hex[] = "0123456789ABCDEF"; static char *_sbrk(size) register int size; /* * Internal error checking interface for the sbrk() function */ { register char *p; char *sbrk(); size = (size + 1) & ~1; if(p = sbrk(size)) return(p); Cconws("Too many arguments\n"); _exit(ENSMEM); } /* * Retrieve extended arguments, if possible, and set up argc and argv[]. */ void _initargs(cmdline, cmdlen) char *cmdline; int cmdlen; { register XARG *xp; register char *p, **q; register int i, n; register long a; char *getenv(); if(p = getenv(xmagic)) { /* * if the "xArg" variable exists, decode the address * and assume that it points somewhere reasonable, * though possibly not to a valid XARG struct */ for(a = 0L; *p; ++p) /* convert ascii-hex to long */ a = ((a << 4) | (0xF & strpos(hex, *p))); xp = ((XARG *) a); } if((p == NULL) /* no extended args */ || (strncmp(xp->xarg_magic, xmagic, 4)) /* not XARG struct */ || (xp->xparent != _base->p_parent)) /* not right parent */ { /* copy the command line */ i = cmdlen; p = strncpy(_sbrk(i + 1), cmdline, i); p[i] = '\0'; _argv = q = (char **) _sbrk(sizeof(char *)); *q = ""; /* argv[0] == "" */ n = 1; /* * parse command line image based on whitespace */ if(p = strtok(p, " \t")) { do { q = (char **) _sbrk(sizeof(char *)); ++n; *q = p; } while(p = strtok(NULL, " \t")); } q = (char **) _sbrk(sizeof(char *)); *q = NULL; /* tie off argv */ _argc = n; } else /* EXTENDED ARGS! */ { /* * extended args are easy... just remember to copy the * data, since it resides in your parent's data space */ _argc = n = xp->xargc; /* copy argc */ i = ((n + 1) * sizeof(char *)); _argv = q = ((char **) _sbrk(i)); memcpy(q, xp->xargv, i); /* copy argv */ q[n] = NULL; do /* copy arguments */ { p = _sbrk(strlen(*q) + 1); *q = strcpy(p, *q); } while(*++q); } if (_argv[0] == NULL) _argv[0] = ""; /* for sid... */ }