diff options
Diffstat (limited to 'bin/sh/exec.c')
-rw-r--r-- | bin/sh/exec.c | 89 |
1 files changed, 48 insertions, 41 deletions
diff --git a/bin/sh/exec.c b/bin/sh/exec.c index e9061e8..4b6b1b4 100644 --- a/bin/sh/exec.c +++ b/bin/sh/exec.c @@ -33,13 +33,20 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: exec.c,v 1.3 1994/09/24 02:57:32 davidg Exp $ + * $Id: exec.c,v 1.4 1995/05/30 00:07:12 rgrimes Exp $ */ #ifndef lint -static char sccsid[] = "@(#)exec.c 8.1 (Berkeley) 5/31/93"; +static char sccsid[] = "@(#)exec.c 8.4 (Berkeley) 6/8/95"; #endif /* not lint */ +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> +#include <fcntl.h> +#include <errno.h> +#include <stdlib.h> + /* * When commands are first encountered, they are entered in a hash table. * This ensures that a full path search will not have to be done for them @@ -66,11 +73,8 @@ static char sccsid[] = "@(#)exec.c 8.1 (Berkeley) 5/31/93"; #include "error.h" #include "init.h" #include "mystring.h" +#include "show.h" #include "jobs.h" -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <errno.h> #define CMDTABLESIZE 31 /* should be prime */ @@ -91,21 +95,12 @@ STATIC struct tblentry *cmdtable[CMDTABLESIZE]; STATIC int builtinloc = -1; /* index in path of %builtin, or -1 */ -#ifdef __STDC__ -STATIC void tryexec(char *, char **, char **); -STATIC void execinterp(char **, char **); -STATIC void printentry(struct tblentry *, int); -STATIC void clearcmdentry(int); -STATIC struct tblentry *cmdlookup(char *, int); -STATIC void delete_cmd_entry(void); -#else -STATIC void tryexec(); -STATIC void execinterp(); -STATIC void printentry(); -STATIC void clearcmdentry(); -STATIC struct tblentry *cmdlookup(); -STATIC void delete_cmd_entry(); -#endif +STATIC void tryexec __P((char *, char **, char **)); +STATIC void execinterp __P((char **, char **)); +STATIC void printentry __P((struct tblentry *, int)); +STATIC void clearcmdentry __P((int)); +STATIC struct tblentry *cmdlookup __P((char *, int)); +STATIC void delete_cmd_entry __P((void)); @@ -118,7 +113,8 @@ void shellexec(argv, envp, path, index) char **argv, **envp; char *path; - { + int index; +{ char *cmdname; int e; @@ -147,7 +143,9 @@ tryexec(cmd, argv, envp) char **envp; { int e; +#ifndef BSD char *p; +#endif #ifdef SYSV do { @@ -286,7 +284,7 @@ padvance(path, name) growstackblock(); q = stackblock(); if (p != start) { - bcopy(start, q, p - start); + memcpy(q, start, p - start); q += p - start; *q++ = '/'; } @@ -308,7 +306,11 @@ padvance(path, name) /*** Command hashing code ***/ -hashcmd(argc, argv) char **argv; { +int +hashcmd(argc, argv) + int argc; + char **argv; +{ struct tblentry **pp; struct tblentry *cmdp; int c; @@ -335,9 +337,9 @@ hashcmd(argc, argv) char **argv; { while ((name = *argptr) != NULL) { if ((cmdp = cmdlookup(name, 0)) != NULL && (cmdp->cmdtype == CMDNORMAL - || cmdp->cmdtype == CMDBUILTIN && builtinloc >= 0)) + || (cmdp->cmdtype == CMDBUILTIN && builtinloc >= 0))) delete_cmd_entry(); - find_command(name, &entry, 1); + find_command(name, &entry, 1, pathval()); if (verbose) { if (entry.cmdtype != CMDUNKNOWN) { /* if no error msg */ cmdp = cmdlookup(name, 0); @@ -398,14 +400,15 @@ printentry(cmdp, verbose) */ void -find_command(name, entry, printerr) +find_command(name, entry, printerr, path) char *name; struct cmdentry *entry; - { + int printerr; + char *path; +{ struct tblentry *cmdp; int index; int prev; - char *path; char *fullname; struct stat statb; int e; @@ -441,7 +444,6 @@ find_command(name, entry, printerr) prev = cmdp->param.index; } - path = pathval(); e = ENOENT; index = -1; loop: @@ -481,7 +483,7 @@ loop: goto loop; } e = EACCES; /* if we fail, this will be the error */ - if ((statb.st_mode & S_IFMT) != S_IFREG) + if (!S_ISREG(statb.st_mode)) goto loop; if (pathopt) { /* this is a %func directory */ stalloc(strlen(fullname) + 1); @@ -535,8 +537,8 @@ success: int find_builtin(name) char *name; - { - const register struct builtincmd *bp; +{ + register const struct builtincmd *bp; for (bp = builtincmd ; bp->name ; bp++) { if (*bp->name == *name && equal(bp->name, name)) @@ -560,7 +562,7 @@ hashcd() { for (pp = cmdtable ; pp < &cmdtable[CMDTABLESIZE] ; pp++) { for (cmdp = *pp ; cmdp ; cmdp = cmdp->next) { if (cmdp->cmdtype == CMDNORMAL - || cmdp->cmdtype == CMDBUILTIN && builtinloc >= 0) + || (cmdp->cmdtype == CMDBUILTIN && builtinloc >= 0)) cmdp->rehash = 1; } } @@ -577,7 +579,7 @@ hashcd() { void changepath(newval) char *newval; - { +{ char *old, *new; int index; int firstchange; @@ -591,8 +593,8 @@ changepath(newval) for (;;) { if (*old != *new) { firstchange = index; - if (*old == '\0' && *new == ':' - || *old == ':' && *new == '\0') + if ((*old == '\0' && *new == ':') + || (*old == ':' && *new == '\0')) firstchange++; old = new; /* ignore subsequent differences */ } @@ -620,7 +622,9 @@ changepath(newval) */ STATIC void -clearcmdentry(firstchange) { +clearcmdentry(firstchange) + int firstchange; +{ struct tblentry **tblp; struct tblentry **pp; struct tblentry *cmdp; @@ -629,8 +633,10 @@ clearcmdentry(firstchange) { for (tblp = cmdtable ; tblp < &cmdtable[CMDTABLESIZE] ; tblp++) { pp = tblp; while ((cmdp = *pp) != NULL) { - if (cmdp->cmdtype == CMDNORMAL && cmdp->param.index >= firstchange - || cmdp->cmdtype == CMDBUILTIN && builtinloc >= firstchange) { + if ((cmdp->cmdtype == CMDNORMAL && + cmdp->param.index >= firstchange) + || (cmdp->cmdtype == CMDBUILTIN && + builtinloc >= firstchange)) { *pp = cmdp->next; ckfree(cmdp); } else { @@ -692,7 +698,8 @@ struct tblentry **lastcmdentry; STATIC struct tblentry * cmdlookup(name, add) char *name; - { + int add; +{ int hashval; register char *p; struct tblentry *cmdp; |