Changeset 3057 in kBuild
- Timestamp:
- Sep 15, 2017 6:06:42 AM (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kash/exec.c
r2652 r3057 122 122 char *cmdname; 123 123 int e; 124 const char *argv0 = argv[0]; 125 int argv0len = (int)strlen(argv0); 126 char kmkcmd[48]; 124 127 #ifdef PC_EXE_EXTS 125 int has_ext = (int)strlen(argv[0])- 4;128 int has_ext = argv0len - 4; 126 129 has_ext = has_ext > 0 127 && argv [0][has_ext] == '.'130 && argv0[has_ext] == '.' 128 131 /* use strstr and upper/lower permuated extensions to avoid multiple strcasecmp calls. */ 129 132 && strstr("exe;" "Exe;" "EXe;" "EXE;" "ExE;" "eXe;" "eXE;" "exE;" … … 132 135 "bat;" "Bat;" "BAt;" "BAT;" "BaT;" "bAt;" "bAT;" "baT;" 133 136 "btm;" "Btm;" "BTm;" "BTM;" "BtM;" "bTm;" "bTM;" "btM;", 134 argv[0]+ has_ext + 1)137 argv0 + has_ext + 1) 135 138 != NULL; 136 139 #else 137 140 const int has_ext = 1; 138 141 #endif 139 TRACE((psh, "shellexec: argv[0]=%s idx=%d\n", argv [0], idx));140 if (strchr(argv [0], '/') != NULL) {141 cmdname = stalloc(psh, strlen(argv[0])+ 5);142 strcpy(cmdname, argv [0]);142 TRACE((psh, "shellexec: argv[0]=%s idx=%d\n", argv0, idx)); 143 if (strchr(argv0, '/') != NULL) { 144 cmdname = stalloc(psh, argv0len + 5); 145 strcpy(cmdname, argv0); 143 146 tryexec(psh, cmdname, argv, envp, vforked, has_ext); 144 147 TRACE((psh, "shellexec: cmdname=%s\n", cmdname)); … … 146 149 e = errno; 147 150 } else { 151 /* Before we search the PATH, transform kmk_builtin_% to kmk_% so we don't 152 need to be too careful mixing internal and external kmk command. */ 153 if ( argv0len > 12 154 && argv0len < 42 155 && strncmp(argv0, "kmk_builtin_", 12) == 0 156 && strpbrk(argv0 + 12, "./\\-:;<>") == NULL) { 157 memcpy(kmkcmd, "kmk_", 4); 158 memcpy(&kmkcmd[4], argv0 + 12, argv0len + 1 - 8); 159 TRACE((psh, "shellexec: dropped '_builtin' from %s to %s\n", argv0, kmkcmd)); 160 argv0len -= 8; 161 argv0 = kmkcmd; 162 } 163 148 164 e = ENOENT; 149 while ((cmdname = padvance(psh, &path, argv [0])) != NULL) {165 while ((cmdname = padvance(psh, &path, argv0)) != NULL) { 150 166 if (--idx < 0 && psh->pathopt == NULL) { 151 167 tryexec(psh, cmdname, argv, envp, vforked, has_ext); … … 553 569 int e; 554 570 int (*bltin)(shinstance*,int,char **); 555 571 int argv0len = (int)strlen(name); 572 char kmkcmd[48]; 556 573 #ifdef PC_EXE_EXTS 557 int has_ext = (int)(strlen(name) - 4);574 int has_ext = argv0len - 4; 558 575 has_ext = has_ext > 0 559 576 && name[has_ext] == '.' … … 638 655 else 639 656 prev = cmdp->param.index; 657 } 658 659 /* Before we search the PATH, transform kmk_builtin_% to kmk_% so we don't 660 need to be too careful mixing internal and external kmk command. */ 661 if ( argv0len > 12 662 && argv0len < (int)sizeof(kmkcmd) 663 && strncmp(name, "kmk_builtin_", 12) == 0 664 && strpbrk(name + 12, "./\\-:;<>") == NULL) { 665 memcpy(kmkcmd, "kmk_", 4); 666 memcpy(&kmkcmd[4], name + 12, argv0len + 1 - 8); 667 TRACE((psh, "find_command: dropped '_builtin' from %s to %s\n", name, kmkcmd)); 668 argv0len -= 8; 669 name = kmkcmd; 640 670 } 641 671
Note:
See TracChangeset
for help on using the changeset viewer.