version 1.17, 1995/06/09 01:53:50 |
version 1.17.6.2, 1997/03/04 15:18:10 |
Line 79 static char rcsid[] = "$NetBSD$"; |
|
Line 79 static char rcsid[] = "$NetBSD$"; |
|
#include "mystring.h" |
#include "mystring.h" |
#include "show.h" |
#include "show.h" |
#include "jobs.h" |
#include "jobs.h" |
|
#include "alias.h" |
|
|
|
|
#define CMDTABLESIZE 31 /* should be prime */ |
#define CMDTABLESIZE 31 /* should be prime */ |
Line 97 struct tblentry { |
|
Line 98 struct tblentry { |
|
|
|
STATIC struct tblentry *cmdtable[CMDTABLESIZE]; |
STATIC struct tblentry *cmdtable[CMDTABLESIZE]; |
STATIC int builtinloc = -1; /* index in path of %builtin, or -1 */ |
STATIC int builtinloc = -1; /* index in path of %builtin, or -1 */ |
|
int exerrno = 0; /* Last exec error */ |
|
|
|
|
STATIC void tryexec __P((char *, char **, char **)); |
STATIC void tryexec __P((char *, char **, char **)); |
Line 136 shellexec(argv, envp, path, index) |
|
Line 138 shellexec(argv, envp, path, index) |
|
stunalloc(cmdname); |
stunalloc(cmdname); |
} |
} |
} |
} |
error2(argv[0], errmsg(e, E_EXEC)); |
|
|
/* Map to POSIX errors */ |
|
switch (e) { |
|
case EACCES: |
|
exerrno = 126; |
|
break; |
|
case ENOENT: |
|
exerrno = 127; |
|
break; |
|
default: |
|
exerrno = 2; |
|
break; |
|
} |
|
exerror(EXEXEC, "%s: %s", argv[0], errmsg(e, E_EXEC)); |
} |
} |
|
|
|
|
Line 275 padvance(path, name) |
|
Line 290 padvance(path, name) |
|
char **path; |
char **path; |
char *name; |
char *name; |
{ |
{ |
register char *p, *q; |
char *p, *q; |
char *start; |
char *start; |
int len; |
int len; |
|
|
Line 313 padvance(path, name) |
|
Line 328 padvance(path, name) |
|
int |
int |
hashcmd(argc, argv) |
hashcmd(argc, argv) |
int argc; |
int argc; |
char **argv; |
char **argv; |
{ |
{ |
struct tblentry **pp; |
struct tblentry **pp; |
struct tblentry *cmdp; |
struct tblentry *cmdp; |
|
|
find_builtin(name) |
find_builtin(name) |
char *name; |
char *name; |
{ |
{ |
register const struct builtincmd *bp; |
const struct builtincmd *bp; |
|
|
for (bp = builtincmd ; bp->name ; bp++) { |
for (bp = builtincmd ; bp->name ; bp++) { |
if (*bp->name == *name && equal(bp->name, name)) |
if (*bp->name == *name && equal(bp->name, name)) |
|
|
|
|
void |
void |
changepath(newval) |
changepath(newval) |
char *newval; |
const char *newval; |
{ |
{ |
char *old, *new; |
const char *old, *new; |
int index; |
int index; |
int firstchange; |
int firstchange; |
int bltin; |
int bltin; |
Line 705 cmdlookup(name, add) |
|
Line 720 cmdlookup(name, add) |
|
int add; |
int add; |
{ |
{ |
int hashval; |
int hashval; |
register char *p; |
char *p; |
struct tblentry *cmdp; |
struct tblentry *cmdp; |
struct tblentry **pp; |
struct tblentry **pp; |
|
|
Line 755 delete_cmd_entry() { |
|
Line 770 delete_cmd_entry() { |
|
void |
void |
getcmdentry(name, entry) |
getcmdentry(name, entry) |
char *name; |
char *name; |
struct cmdentry *entry; |
struct cmdentry *entry; |
{ |
{ |
struct tblentry *cmdp = cmdlookup(name, 0); |
struct tblentry *cmdp = cmdlookup(name, 0); |
|
|
|
|
} |
} |
return (1); |
return (1); |
} |
} |
|
|
|
/* |
|
* Locate and print what a word is... |
|
*/ |
|
|
|
int |
|
typecmd(argc, argv) |
|
int argc; |
|
char **argv; |
|
{ |
|
struct cmdentry entry; |
|
struct tblentry *cmdp; |
|
char **pp; |
|
struct alias *ap; |
|
int i; |
|
int error = 0; |
|
extern char *const parsekwd[]; |
|
|
|
for (i = 1; i < argc; i++) { |
|
out1str(argv[i]); |
|
/* First look at the keywords */ |
|
for (pp = (char **)parsekwd; *pp; pp++) |
|
if (**pp == *argv[i] && equal(*pp, argv[i])) |
|
break; |
|
|
|
if (*pp) { |
|
out1str(" is a shell keyword\n"); |
|
continue; |
|
} |
|
|
|
/* Then look at the aliases */ |
|
if ((ap = lookupalias(argv[i], 1)) != NULL) { |
|
out1fmt(" is an alias for %s\n", ap->val); |
|
continue; |
|
} |
|
|
|
/* Then check if it is a tracked alias */ |
|
if ((cmdp = cmdlookup(argv[i], 0)) != NULL) { |
|
entry.cmdtype = cmdp->cmdtype; |
|
entry.u = cmdp->param; |
|
} |
|
else { |
|
/* Finally use brute force */ |
|
find_command(argv[i], &entry, 0, pathval()); |
|
} |
|
|
|
switch (entry.cmdtype) { |
|
case CMDNORMAL: { |
|
int j = entry.u.index; |
|
char *path = pathval(), *name; |
|
do { |
|
name = padvance(&path, argv[i]); |
|
stunalloc(name); |
|
} while (--j >= 0); |
|
out1fmt(" is%s %s\n", |
|
cmdp ? " a tracked alias for" : "", name); |
|
break; |
|
} |
|
case CMDFUNCTION: |
|
out1str(" is a shell function\n"); |
|
break; |
|
|
|
case CMDBUILTIN: |
|
out1str(" is a shell builtin\n"); |
|
break; |
|
|
|
default: |
|
out1str(" not found\n"); |
|
error |= 127; |
|
break; |
|
} |
|
} |
|
return error; |
|
} |