Deleted Added
full compact
exec.c (200956) exec.c (201053)
1/*-
2 * Copyright (c) 1991, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * This code is derived from software contributed to Berkeley by
6 * Kenneth Almquist.
7 *
8 * Redistribution and use in source and binary forms, with or without

--- 22 unchanged lines hidden (view full) ---

31 */
32
33#ifndef lint
34#if 0
35static char sccsid[] = "@(#)exec.c 8.4 (Berkeley) 6/8/95";
36#endif
37#endif /* not lint */
38#include <sys/cdefs.h>
1/*-
2 * Copyright (c) 1991, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * This code is derived from software contributed to Berkeley by
6 * Kenneth Almquist.
7 *
8 * Redistribution and use in source and binary forms, with or without

--- 22 unchanged lines hidden (view full) ---

31 */
32
33#ifndef lint
34#if 0
35static char sccsid[] = "@(#)exec.c 8.4 (Berkeley) 6/8/95";
36#endif
37#endif /* not lint */
38#include <sys/cdefs.h>
39__FBSDID("$FreeBSD: head/bin/sh/exec.c 200956 2009-12-24 18:41:14Z jilles $");
39__FBSDID("$FreeBSD: head/bin/sh/exec.c 201053 2009-12-27 18:04:05Z jilles $");
40
41#include <sys/types.h>
42#include <sys/stat.h>
43#include <unistd.h>
44#include <fcntl.h>
45#include <errno.h>
46#include <stdlib.h>
47

--- 56 unchanged lines hidden (view full) ---

104
105
106/*
107 * Exec a program. Never returns. If you change this routine, you may
108 * have to change the find_command routine as well.
109 */
110
111void
40
41#include <sys/types.h>
42#include <sys/stat.h>
43#include <unistd.h>
44#include <fcntl.h>
45#include <errno.h>
46#include <stdlib.h>
47

--- 56 unchanged lines hidden (view full) ---

104
105
106/*
107 * Exec a program. Never returns. If you change this routine, you may
108 * have to change the find_command routine as well.
109 */
110
111void
112shellexec(char **argv, char **envp, const char *path, int index)
112shellexec(char **argv, char **envp, const char *path, int idx)
113{
114 char *cmdname;
115 int e;
116
117 if (strchr(argv[0], '/') != NULL) {
118 tryexec(argv[0], argv, envp);
119 e = errno;
120 } else {
121 e = ENOENT;
122 while ((cmdname = padvance(&path, argv[0])) != NULL) {
113{
114 char *cmdname;
115 int e;
116
117 if (strchr(argv[0], '/') != NULL) {
118 tryexec(argv[0], argv, envp);
119 e = errno;
120 } else {
121 e = ENOENT;
122 while ((cmdname = padvance(&path, argv[0])) != NULL) {
123 if (--index < 0 && pathopt == NULL) {
123 if (--idx < 0 && pathopt == NULL) {
124 tryexec(cmdname, argv, envp);
125 if (errno != ENOENT && errno != ENOTDIR)
126 e = errno;
127 }
128 stunalloc(cmdname);
129 }
130 }
131

--- 131 unchanged lines hidden (view full) ---

263 }
264 return 0;
265}
266
267
268STATIC void
269printentry(struct tblentry *cmdp, int verbose)
270{
124 tryexec(cmdname, argv, envp);
125 if (errno != ENOENT && errno != ENOTDIR)
126 e = errno;
127 }
128 stunalloc(cmdname);
129 }
130 }
131

--- 131 unchanged lines hidden (view full) ---

263 }
264 return 0;
265}
266
267
268STATIC void
269printentry(struct tblentry *cmdp, int verbose)
270{
271 int index;
271 int idx;
272 const char *path;
273 char *name;
274
275 if (cmdp->cmdtype == CMDNORMAL) {
272 const char *path;
273 char *name;
274
275 if (cmdp->cmdtype == CMDNORMAL) {
276 index = cmdp->param.index;
276 idx = cmdp->param.index;
277 path = pathval();
278 do {
279 name = padvance(&path, cmdp->cmdname);
280 stunalloc(name);
277 path = pathval();
278 do {
279 name = padvance(&path, cmdp->cmdname);
280 stunalloc(name);
281 } while (--index >= 0);
281 } while (--idx >= 0);
282 out1str(name);
283 } else if (cmdp->cmdtype == CMDBUILTIN) {
284 out1fmt("builtin %s", cmdp->cmdname);
285 } else if (cmdp->cmdtype == CMDFUNCTION) {
286 out1fmt("function %s", cmdp->cmdname);
287 if (verbose) {
288 INTOFF;
289 name = commandtext(getfuncnode(cmdp->param.func));

--- 19 unchanged lines hidden (view full) ---

309 * change the shellexec routine as well.
310 */
311
312void
313find_command(const char *name, struct cmdentry *entry, int printerr,
314 const char *path)
315{
316 struct tblentry *cmdp;
282 out1str(name);
283 } else if (cmdp->cmdtype == CMDBUILTIN) {
284 out1fmt("builtin %s", cmdp->cmdname);
285 } else if (cmdp->cmdtype == CMDFUNCTION) {
286 out1fmt("function %s", cmdp->cmdname);
287 if (verbose) {
288 INTOFF;
289 name = commandtext(getfuncnode(cmdp->param.func));

--- 19 unchanged lines hidden (view full) ---

309 * change the shellexec routine as well.
310 */
311
312void
313find_command(const char *name, struct cmdentry *entry, int printerr,
314 const char *path)
315{
316 struct tblentry *cmdp;
317 int index;
317 int idx;
318 int prev;
319 char *fullname;
320 struct stat statb;
321 int e;
322 int i;
323 int spec;
324
325 /* If name contains a slash, don't use the hash table */

--- 23 unchanged lines hidden (view full) ---

349 if (cmdp) { /* doing a rehash */
350 if (cmdp->cmdtype == CMDBUILTIN)
351 prev = builtinloc;
352 else
353 prev = cmdp->param.index;
354 }
355
356 e = ENOENT;
318 int prev;
319 char *fullname;
320 struct stat statb;
321 int e;
322 int i;
323 int spec;
324
325 /* If name contains a slash, don't use the hash table */

--- 23 unchanged lines hidden (view full) ---

349 if (cmdp) { /* doing a rehash */
350 if (cmdp->cmdtype == CMDBUILTIN)
351 prev = builtinloc;
352 else
353 prev = cmdp->param.index;
354 }
355
356 e = ENOENT;
357 index = -1;
357 idx = -1;
358loop:
359 while ((fullname = padvance(&path, name)) != NULL) {
360 stunalloc(fullname);
358loop:
359 while ((fullname = padvance(&path, name)) != NULL) {
360 stunalloc(fullname);
361 index++;
361 idx++;
362 if (pathopt) {
363 if (prefix("builtin", pathopt)) {
364 if ((i = find_builtin(name, &spec)) < 0)
365 goto loop;
366 INTOFF;
367 cmdp = cmdlookup(name, 1);
368 cmdp->cmdtype = CMDBUILTIN;
369 cmdp->param.index = i;
370 cmdp->special = spec;
371 INTON;
372 goto success;
373 } else if (prefix("func", pathopt)) {
374 /* handled below */
375 } else {
376 goto loop; /* ignore unimplemented options */
377 }
378 }
379 /* if rehash, don't redo absolute path names */
362 if (pathopt) {
363 if (prefix("builtin", pathopt)) {
364 if ((i = find_builtin(name, &spec)) < 0)
365 goto loop;
366 INTOFF;
367 cmdp = cmdlookup(name, 1);
368 cmdp->cmdtype = CMDBUILTIN;
369 cmdp->param.index = i;
370 cmdp->special = spec;
371 INTON;
372 goto success;
373 } else if (prefix("func", pathopt)) {
374 /* handled below */
375 } else {
376 goto loop; /* ignore unimplemented options */
377 }
378 }
379 /* if rehash, don't redo absolute path names */
380 if (fullname[0] == '/' && index <= prev) {
381 if (index < prev)
380 if (fullname[0] == '/' && idx <= prev) {
381 if (idx < prev)
382 goto loop;
383 TRACE(("searchexec \"%s\": no change\n", name));
384 goto success;
385 }
386 if (stat(fullname, &statb) < 0) {
387 if (errno != ENOENT && errno != ENOTDIR)
388 e = errno;
389 goto loop;

--- 20 unchanged lines hidden (view full) ---

410 if ((statb.st_mode & 01) == 0)
411 goto loop;
412 }
413#endif
414 TRACE(("searchexec \"%s\" returns \"%s\"\n", name, fullname));
415 INTOFF;
416 cmdp = cmdlookup(name, 1);
417 cmdp->cmdtype = CMDNORMAL;
382 goto loop;
383 TRACE(("searchexec \"%s\": no change\n", name));
384 goto success;
385 }
386 if (stat(fullname, &statb) < 0) {
387 if (errno != ENOENT && errno != ENOTDIR)
388 e = errno;
389 goto loop;

--- 20 unchanged lines hidden (view full) ---

410 if ((statb.st_mode & 01) == 0)
411 goto loop;
412 }
413#endif
414 TRACE(("searchexec \"%s\" returns \"%s\"\n", name, fullname));
415 INTOFF;
416 cmdp = cmdlookup(name, 1);
417 cmdp->cmdtype = CMDNORMAL;
418 cmdp->param.index = index;
418 cmdp->param.index = idx;
419 INTON;
420 goto success;
421 }
422
423 /* We failed. If there was an entry for this command, delete it */
424 if (cmdp)
425 delete_cmd_entry();
426 if (printerr) {

--- 62 unchanged lines hidden (view full) ---

489 * pathval() still returns the old value at this point. Called with
490 * interrupts off.
491 */
492
493void
494changepath(const char *newval)
495{
496 const char *old, *new;
419 INTON;
420 goto success;
421 }
422
423 /* We failed. If there was an entry for this command, delete it */
424 if (cmdp)
425 delete_cmd_entry();
426 if (printerr) {

--- 62 unchanged lines hidden (view full) ---

489 * pathval() still returns the old value at this point. Called with
490 * interrupts off.
491 */
492
493void
494changepath(const char *newval)
495{
496 const char *old, *new;
497 int index;
497 int idx;
498 int firstchange;
499 int bltin;
500
501 old = pathval();
502 new = newval;
503 firstchange = 9999; /* assume no change */
498 int firstchange;
499 int bltin;
500
501 old = pathval();
502 new = newval;
503 firstchange = 9999; /* assume no change */
504 index = 0;
504 idx = 0;
505 bltin = -1;
506 for (;;) {
507 if (*old != *new) {
505 bltin = -1;
506 for (;;) {
507 if (*old != *new) {
508 firstchange = index;
508 firstchange = idx;
509 if ((*old == '\0' && *new == ':')
510 || (*old == ':' && *new == '\0'))
511 firstchange++;
512 old = new; /* ignore subsequent differences */
513 }
514 if (*new == '\0')
515 break;
516 if (*new == '%' && bltin < 0 && prefix("builtin", new + 1))
509 if ((*old == '\0' && *new == ':')
510 || (*old == ':' && *new == '\0'))
511 firstchange++;
512 old = new; /* ignore subsequent differences */
513 }
514 if (*new == '\0')
515 break;
516 if (*new == '%' && bltin < 0 && prefix("builtin", new + 1))
517 bltin = index;
517 bltin = idx;
518 if (*new == ':') {
518 if (*new == ':') {
519 index++;
519 idx++;
520 }
521 new++, old++;
522 }
523 if (builtinloc < 0 && bltin >= 0)
524 builtinloc = bltin; /* zap builtins */
525 if (builtinloc >= 0 && bltin < 0)
526 firstchange = 0;
527 clearcmdentry(firstchange);

--- 191 unchanged lines hidden (view full) ---

719 * type, command -v, command -V
720 */
721
722int
723typecmd_impl(int argc, char **argv, int cmd)
724{
725 struct cmdentry entry;
726 struct tblentry *cmdp;
520 }
521 new++, old++;
522 }
523 if (builtinloc < 0 && bltin >= 0)
524 builtinloc = bltin; /* zap builtins */
525 if (builtinloc >= 0 && bltin < 0)
526 firstchange = 0;
527 clearcmdentry(firstchange);

--- 191 unchanged lines hidden (view full) ---

719 * type, command -v, command -V
720 */
721
722int
723typecmd_impl(int argc, char **argv, int cmd)
724{
725 struct cmdentry entry;
726 struct tblentry *cmdp;
727 char **pp;
727 const char *const *pp;
728 struct alias *ap;
729 int i;
728 struct alias *ap;
729 int i;
730 int error = 0;
731 extern char *const parsekwd[];
730 int error1 = 0;
732
733 for (i = 1; i < argc; i++) {
734 /* First look at the keywords */
731
732 for (i = 1; i < argc; i++) {
733 /* First look at the keywords */
735 for (pp = (char **)parsekwd; *pp; pp++)
734 for (pp = parsekwd; *pp; pp++)
736 if (**pp == *argv[i] && equal(*pp, argv[i]))
737 break;
738
739 if (*pp) {
740 if (cmd == TYPECMD_SMALLV)
741 out1fmt("%s\n", argv[i]);
742 else
743 out1fmt("%s is a shell keyword\n", argv[i]);

--- 44 unchanged lines hidden (view full) ---

788 out1fmt("%s\n", argv[i]);
789 else
790 out1fmt("%s is %s\n", argv[i],
791 argv[i]);
792 } else {
793 if (cmd != TYPECMD_SMALLV)
794 outfmt(out2, "%s: %s\n",
795 argv[i], strerror(errno));
735 if (**pp == *argv[i] && equal(*pp, argv[i]))
736 break;
737
738 if (*pp) {
739 if (cmd == TYPECMD_SMALLV)
740 out1fmt("%s\n", argv[i]);
741 else
742 out1fmt("%s is a shell keyword\n", argv[i]);

--- 44 unchanged lines hidden (view full) ---

787 out1fmt("%s\n", argv[i]);
788 else
789 out1fmt("%s is %s\n", argv[i],
790 argv[i]);
791 } else {
792 if (cmd != TYPECMD_SMALLV)
793 outfmt(out2, "%s: %s\n",
794 argv[i], strerror(errno));
796 error |= 127;
795 error1 |= 127;
797 }
798 }
799 break;
800 }
801 case CMDFUNCTION:
802 if (cmd == TYPECMD_SMALLV)
803 out1fmt("%s\n", argv[i]);
804 else

--- 8 unchanged lines hidden (view full) ---

813 argv[i]);
814 else
815 out1fmt("%s is a shell builtin\n", argv[i]);
816 break;
817
818 default:
819 if (cmd != TYPECMD_SMALLV)
820 outfmt(out2, "%s: not found\n", argv[i]);
796 }
797 }
798 break;
799 }
800 case CMDFUNCTION:
801 if (cmd == TYPECMD_SMALLV)
802 out1fmt("%s\n", argv[i]);
803 else

--- 8 unchanged lines hidden (view full) ---

812 argv[i]);
813 else
814 out1fmt("%s is a shell builtin\n", argv[i]);
815 break;
816
817 default:
818 if (cmd != TYPECMD_SMALLV)
819 outfmt(out2, "%s: not found\n", argv[i]);
821 error |= 127;
820 error1 |= 127;
822 break;
823 }
824 }
821 break;
822 }
823 }
825 return error;
824 return error1;
826}
827
828/*
829 * Locate and print what a word is...
830 */
831
832int
833typecmd(int argc, char **argv)
834{
835 return typecmd_impl(argc, argv, TYPECMD_TYPE);
836}
825}
826
827/*
828 * Locate and print what a word is...
829 */
830
831int
832typecmd(int argc, char **argv)
833{
834 return typecmd_impl(argc, argv, TYPECMD_TYPE);
835}