diff options
| author | tim <tim> | 1997-05-14 15:30:41 +0000 |
|---|---|---|
| committer | Toby Goodwin <toby@paccrat.org> | 2015-05-16 21:23:00 +0100 |
| commit | 53cf1b1c1c3f0c2b5067afccc2976b99a574a089 (patch) | |
| tree | a31f167c3779362e29ab377d662052b6257253a8 /execve.c | |
| parent | b87bfedf65c289bf0ee5338c9e10492b70b1e8e0 (diff) | |
Initial revision
Diffstat (limited to 'execve.c')
| -rw-r--r-- | execve.c | 61 |
1 files changed, 0 insertions, 61 deletions
diff --git a/execve.c b/execve.c deleted file mode 100644 index b21b30c..0000000 --- a/execve.c +++ /dev/null @@ -1,61 +0,0 @@ -/* execve.c: an execve() for geriatric unices without #! */ - -/* - NOTE: this file depends on a hack in footobar.c which places two free spots before - av[][] so that execve does not have to call malloc. -*/ - -#include <errno.h> -#include "rc.h" - -#define giveupif(x) { if (x) goto fail; } - -extern int my_execve(const char *path, const char **av, const char **ev) { - int fd, len, fst, snd, end; - bool noarg; - char pb[256]; /* arbitrary but generous limit */ - execve(path, av, ev); - if (errno != ENOEXEC) - return -1; - fd = rc_open(path, rFrom); - giveupif(fd < 0); - len = read(fd, pb, sizeof pb); - close(fd); - /* reject scripts which don't begin with #! */ - giveupif(len <= 0 || pb[0] != '#' || pb[1] != '!'); - for (fst = 2; fst < len && (pb[fst] == ' ' || pb[fst] == '\t'); fst++) - ; /* skip leading whitespace */ - giveupif(fst == len); - for (snd = fst; snd < len && pb[snd] != ' ' && pb[snd] != '\t' && pb[snd] != '\n'; snd++) - ; /* skip first arg */ - giveupif(snd == len); - noarg = (pb[snd] == '\n'); - pb[snd++] = '\0'; /* null terminate the first arg */ - if (!noarg) { - while (snd < len && (pb[snd] == ' ' || pb[snd] == '\t')) - snd++; /* skip whitespace to second arg */ - giveupif(snd == len); - noarg = (pb[snd] == '\n'); /* could have trailing whitespace after only one arg */ - if (!noarg) { - for (end = snd; end < len && pb[end] != ' ' && pb[end] != '\t' && pb[end] != '\n'; end++) - ; /* skip to the end of the second arg */ - giveupif(end == len); - if (pb[end] == '\n') { - pb[end] = '\0'; /* null terminate the first arg */ - } else { /* else check for a spurious third arg */ - pb[end++] = '\0'; - while (end < len && (pb[end] == ' ' || pb[end] == '\t')) - end++; - giveupif(end == len || pb[end] != '\n'); - } - } - } - *av = path; - if (!noarg) - *--av = pb + snd; - *--av = pb + fst; - execve(*av, av, ev); - return -1; -fail: errno = ENOEXEC; - return -1; -} |