|
DataMuseum.dkPresents historical artifacts from the history of: Commodore CBM-900 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Commodore CBM-900 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - download
Length: 1040 (0x410) Types: TextFile Notes: UNIX file Names: »execvp.c«
└─⟦f27320a65⟧ Bits:30001972 Commodore 900 hard disk image with partial source code └─⟦f4b8d8c84⟧ UNIX Filesystem └─ ⟦this⟧ »libc/sys/execvp.c«
/* * Version of execv that mimics the * actions of the shell in using search * rules and running a shell file. */ #include <stdio.h> #include <errno.h> #define NFNAME 100 /* Largest filename */ static char srch[] = ":/bin"; static char shell[] = "/bin/sh"; extern int errno; execvp(name, argp) char *name; char *argp[]; { char *getenv(); register char *p1, *p2; register char *sp; char fname[NFNAME]; if ((sp = getenv("PATH")) == NULL) sp = srch; for (;;) { p2 = fname; while (*sp!='\0' && *sp!=':') *p2++ = *sp++; p1 = name; if (p2 != fname) *p2++ = '/'; while (*p1 != '\0') *p2++ = *p1++; *p2 = '\0'; if (*name == '/') { execv(name, argp); if (errno != ENOEXEC) break; } else execv(fname, argp); if (errno == ENOEXEC) { register char *sv1, *sv2; sv1 = argp[-1]; sv2 = argp[0]; argp[-1] = shell; argp[0] = fname; execv(shell, argp-1); argp[-1] = sv1; argp[0] = sv2; break; } if (*sp == '\0') break; if (*sp == ':') sp++; } return (-1); }