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} |