Changeset 2463
- Timestamp:
- Nov 19, 2005, 4:58:38 PM (20 years ago)
- Location:
- trunk/ash
- Files:
-
- 1 added
- 19 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/ash/bltin/kill.c
r2462 r2463 58 58 #ifdef SHELL /* sh (aka ash) builtin */ 59 59 #define main killcmd 60 #include " ../../bin/sh/bltin/bltin.h"61 #endif /* SHELL */ 60 #include "bltin/bltin.h" 61 #endif /* SHELL */ 62 62 63 63 static void nosig(char *); … … 149 149 continue; 150 150 } 151 } else 151 } else 152 152 #endif 153 153 { … … 207 207 int termwidth = 80; 208 208 209 #ifdef TIOCGWINSZ 209 210 if (isatty(fileno(fp))) { 210 211 struct winsize win; … … 212 213 termwidth = win.ws_col; 213 214 } 215 #else 216 #warning TIOCGWINSZ is not present. 217 #endif 214 218 215 219 for (len = 0, sig = 1; sig < NSIG; sig++) { -
trunk/ash/cd.c
r2462 r2463 120 120 if (*dest == '\0') 121 121 dest = "."; 122 if ( *dest == '/'|| (path = bltinlookup("CDPATH", 1)) == NULL)122 if (IS_ROOT(dest) || (path = bltinlookup("CDPATH", 1)) == NULL) 123 123 path = nullstr; 124 124 while ((p = padvance(&path, dest)) != NULL) { … … 168 168 scopy(dest, cdcomppath); 169 169 STARTSTACKSTR(p); 170 if ( *dest == '/') {170 if (IS_ROOT(dest)) { 171 171 STPUTC('/', p); 172 172 cdcomppath++; … … 269 269 scopy(dir, cdcomppath); 270 270 STARTSTACKSTR(new); 271 if ( *dir != '/') {271 if (!IS_ROOT(dir)) { 272 272 p = curdir; 273 273 while (*p) … … 349 349 first = 0; 350 350 pwd = getenv("PWD"); 351 if (pwd && *pwd == '/'&& stat(".", &stdot) != -1 &&351 if (pwd && IS_ROOT(pwd) && stat(".", &stdot) != -1 && 352 352 stat(pwd, &stpwd) != -1 && 353 353 stdot.st_dev == stpwd.st_dev && … … 381 381 * /bin/pwd. 382 382 */ 383 #if defined(__NetBSD__) || defined(__SVR4) 383 #if defined(__NetBSD__) || defined(__SVR4) || defined(__INNOTEK_LIBC__) 384 384 385 385 for (i = MAXPWD;; i *= 2) { -
trunk/ash/cd.h
r2462 r2463 34 34 int cdcmd(int, char **); 35 35 int pwdcmd(int, char **); 36 #ifdef PC_DRIVE_LETTERS 37 #define IS_ROOT(path) ( *(path) == '/' \ 38 || *(path) == '\\' \ 39 || ( ((*(path) >= 'A' && *(path) <= 'Z') || (*(path) >= 'a' && *(path) <= 'z')) \ 40 && (path)[1] == ':') ) 41 #else 42 #define IS_ROOT(path) ( *(path) == '/' ) 43 #endif -
trunk/ash/error.c
r2462 r2463 168 168 exvwarning(-1, msg, ap); 169 169 170 flushall();170 output_flushall(); 171 171 exraise(cond); 172 172 /* NOTREACHED */ -
trunk/ash/eval.c
r2462 r2463 606 606 static char *sys_path = NULL; 607 607 static int mib[] = {CTL_USER, USER_CS_PATH}; 608 #ifdef PC_PATH_SEP 609 static char def_path[] = "PATH=/usr/bin;/bin;/usr/sbin;/sbin"; 610 #else 608 611 static char def_path[] = "PATH=/usr/bin:/bin:/usr/sbin:/sbin"; 612 #endif 609 613 size_t len; 610 614 … … 1014 1018 } 1015 1019 handler = savehandler; 1016 flushall();1020 output_flushall(); 1017 1021 out1 = &output; 1018 1022 out2 = &errout; -
trunk/ash/exec.c
r2462 r2463 80 80 #include "jobs.h" 81 81 #include "alias.h" 82 #ifdef __INNOTEK_LIBC__ 83 #include <InnoTekLIBC/backend.h> 84 #endif 82 85 83 86 … … 101 104 102 105 103 STATIC void tryexec(char *, char **, char **, int );106 STATIC void tryexec(char *, char **, char **, int, int); 104 107 STATIC void execinterp(char **, char **); 105 108 STATIC void printentry(struct tblentry *, int); … … 107 110 STATIC struct tblentry *cmdlookup(const char *, int); 108 111 STATIC void delete_cmd_entry(void); 112 #ifdef PC_EXE_EXTS 113 STATIC int stat_pc_exec_exts(char *fullname, struct stat *st, int has_ext); 114 #endif 109 115 110 116 … … 121 127 char *cmdname; 122 128 int e; 123 129 #ifdef PC_EXE_EXTS 130 int has_ext = strlen(argv[0]) - 4; 131 has_ext = has_ext > 0 132 && argv[0][has_ext] == '.' 133 /* use strstr and upper/lower permuated extensions to avoid multiple strcasecmp calls. */ 134 && strstr("exe;" "Exe;" "EXe;" "EXE;" "ExE;" "eXe;" "eXE;" "exE;" 135 "cmd;" "Cmd;" "CMd;" "CMD;" "CmD;" "cMd;" "cMD;" "cmD;" 136 "com;" "Com;" "COm;" "COM;" "CoM;" "cOm;" "cOM;" "coM;" 137 "bat;" "Bat;" "BAt;" "BAT;" "BaT;" "bAt;" "bAT;" "baT;" 138 "btm;" "Btm;" "BTm;" "BTM;" "BtM;" "bTm;" "bTM;" "btM;", 139 argv[0] + has_ext + 1) 140 != NULL; 141 #else 142 const int has_ext = 1; 143 #endif 144 TRACE(("shellexec: argv[0]=%s idx=%d\n", argv[0], idx)); 124 145 if (strchr(argv[0], '/') != NULL) { 125 tryexec(argv[0], argv, envp, vforked); 146 cmdname = stalloc(strlen(argv[0]) + 5); 147 strcpy(cmdname, argv[0]); 148 tryexec(cmdname, argv, envp, vforked, has_ext); 149 TRACE(("shellexec: cmdname=%s\n", cmdname)); 150 stunalloc(cmdname); 126 151 e = errno; 127 152 } else { … … 129 154 while ((cmdname = padvance(&path, argv[0])) != NULL) { 130 155 if (--idx < 0 && pathopt == NULL) { 131 tryexec(cmdname, argv, envp, vforked );156 tryexec(cmdname, argv, envp, vforked, has_ext); 132 157 if (errno != ENOENT && errno != ENOTDIR) 133 158 e = errno; … … 149 174 break; 150 175 } 151 TRACE(("shellexec failed for %s, errno %d, vforked %d, suppressint %d\n",176 TRACE(("shellexec failed for '%s', errno %d, vforked %d, suppressint %d\n", 152 177 argv[0], e, vforked, suppressint )); 153 178 exerror(EXEXEC, "%s: %s", argv[0], errmsg(e, E_EXEC)); … … 157 182 158 183 STATIC void 159 tryexec(char *cmd, char **argv, char **envp, int vforked )184 tryexec(char *cmd, char **argv, char **envp, int vforked, int has_ext) 160 185 { 161 186 int e; 162 #if ndef BSD187 #ifdef EXEC_HASH_BANG_SCRIPT 163 188 char *p; 189 #endif 190 #ifdef PC_EXE_EXTS 191 /* exploit the effect of stat_pc_exec_exts which adds the 192 * correct extentions to the file. 193 */ 194 struct stat st; 195 if (!has_ext) 196 stat_pc_exec_exts(cmd, &st, 0); 197 #endif 198 #if defined __INNOTEK_LIBC__ && defined EXEC_HASH_BANG_SCRIPT 199 __libc_Back_gfProcessHandleHashBangScripts = 0; 164 200 #endif 165 201 … … 183 219 setinputfile(cmd, 0); 184 220 commandname = arg0 = savestr(argv[0]); 185 #if ndef BSD221 #ifdef EXEC_HASH_BANG_SCRIPT 186 222 pgetc(); pungetc(); /* fill up input buffer */ 187 223 p = parsenextc; … … 198 234 199 235 200 #if ndef BSD236 #ifdef EXEC_HASH_BANG_SCRIPT 201 237 /* 202 238 * Execute an interpreter introduced by "#!", for systems where this … … 249 285 for (;;) { 250 286 if (equal(p, "sh") || equal(p, "ash")) { 287 TRACE(("hash bang self\n")); 251 288 return; 252 289 } … … 270 307 ap = argv; 271 308 while (*ap2++ = *ap++); 272 shellexec(new, envp, pathval(), 0); 309 TRACE(("hash bang '%s'\n", new[0])); 310 shellexec(new, envp, pathval(), 0, 0); 273 311 /* NOTREACHED */ 274 312 } … … 300 338 return NULL; 301 339 start = *path; 340 #ifdef PC_PATH_SEP 341 for (p = start ; *p && *p != ';' && *p != '%' ; p++); 342 #else 302 343 for (p = start ; *p && *p != ':' && *p != '%' ; p++); 344 #endif 303 345 len = p - start + strlen(name) + 2; /* "2" is for '/' and '\0' */ 346 #ifdef PC_EXE_EXTS 347 len += 4; /* "4" is for .exe/.com/.cmd/.bat/.btm */ 348 #endif 304 349 while (stackblocksize() < len) 305 350 growstackblock(); … … 314 359 if (*p == '%') { 315 360 pathopt = ++p; 361 #ifdef PC_PATH_SEP 362 while (*p && *p != ';') p++; 363 #else 316 364 while (*p && *p != ':') p++; 317 } 365 #endif 366 } 367 #ifdef PC_PATH_SEP 368 if (*p == ';') 369 #else 318 370 if (*p == ':') 371 #endif 319 372 *path = p + 1; 320 373 else … … 322 375 return stalloc(len); 323 376 } 377 378 379 #ifdef PC_EXE_EXTS 380 STATIC int stat_pc_exec_exts(char *fullname, struct stat *st, int has_ext) 381 { 382 /* skip the SYSV crap */ 383 if (stat(fullname, st) >= 0) 384 return 0; 385 if (!has_ext && errno == ENOENT) 386 { 387 char *psz = strchr(fullname, '\0'); 388 memcpy(psz, ".exe", 5); 389 if (stat(fullname, st) >= 0) 390 return 0; 391 if (errno != ENOENT && errno != ENOTDIR) 392 return -1; 393 394 memcpy(psz, ".cmd", 5); 395 if (stat(fullname, st) >= 0) 396 return 0; 397 if (errno != ENOENT && errno != ENOTDIR) 398 return -1; 399 400 memcpy(psz, ".bat", 5); 401 if (stat(fullname, st) >= 0) 402 return 0; 403 if (errno != ENOENT && errno != ENOTDIR) 404 return -1; 405 406 memcpy(psz, ".com", 5); 407 if (stat(fullname, st) >= 0) 408 return 0; 409 if (errno != ENOENT && errno != ENOTDIR) 410 return -1; 411 412 memcpy(psz, ".btm", 5); 413 if (stat(fullname, st) >= 0) 414 return 0; 415 *psz = '\0'; 416 } 417 return -1; 418 } 419 #endif /* PC_EXE_EXTS */ 324 420 325 421 … … 366 462 printentry(cmdp, verbose); 367 463 } 368 flushall();464 output_flushall(); 369 465 } 370 466 argptr++; … … 434 530 int e; 435 531 int (*bltin)(int,char **); 532 533 #ifdef PC_EXE_EXTS 534 int has_ext = strlen(name) - 4; 535 has_ext = has_ext > 0 536 && name[has_ext] == '.' 537 /* use strstr and upper/lower permuated extensions to avoid multiple strcasecmp calls. */ 538 && strstr("exe;" "Exe;" "EXe;" "EXE;" "ExE;" "eXe;" "eXE;" "exE;" 539 "cmd;" "Cmd;" "CMd;" "CMD;" "CmD;" "cMd;" "cMD;" "cmD;" 540 "com;" "Com;" "COm;" "COM;" "CoM;" "cOm;" "cOM;" "coM;" 541 "bat;" "Bat;" "BAt;" "BAT;" "BaT;" "bAt;" "bAT;" "baT;" 542 "btm;" "Btm;" "BTm;" "BTM;" "BtM;" "bTm;" "bTM;" "btM;", 543 name + has_ext + 1) 544 != NULL; 545 #endif 436 546 437 547 /* If name contains a slash, don't use PATH or hash table */ … … 532 642 goto success; 533 643 } 644 #ifdef PC_EXE_EXTS 645 while (stat_pc_exec_exts(fullname, &statb, has_ext) < 0) { 646 #else 534 647 while (stat(fullname, &statb) < 0) { 648 #endif 535 649 #ifdef SYSV 536 650 if (errno == EINTR) … … 539 653 if (errno != ENOENT && errno != ENOTDIR) 540 654 e = errno; 655 541 656 goto loop; 542 657 } … … 707 822 if (*old != *new) { 708 823 firstchange = idx; 824 #ifdef PC_PATH_SEP 825 if ((*old == '\0' && *new == ';') 826 || (*old == ';' && *new == '\0')) 827 #else 709 828 if ((*old == '\0' && *new == ':') 710 829 || (*old == ':' && *new == '\0')) 830 #endif 711 831 firstchange++; 712 832 old = new; /* ignore subsequent differences */ … … 716 836 if (*new == '%' && bltin < 0 && prefix("builtin", new + 1)) 717 837 bltin = idx; 838 #ifdef PC_PATH_SEP 839 if (*new == ';') { 840 #else 718 841 if (*new == ':') { 842 #endif 719 843 idx++; 720 844 } -
trunk/ash/input.c
r2462 r2463 105 105 int whichprompt; /* 1 == PS1, 2 == PS2 */ 106 106 107 #ifndef SMALL 107 108 EditLine *el; /* cookie for editline package */ 109 #endif 108 110 109 111 STATIC void pushfile(void); -
trunk/ash/jobs.c
r2462 r2463 259 259 out1fmt(" | %s", jp->ps[i].cmd ); 260 260 out1c('\n'); 261 flushall();261 output_flushall(); 262 262 263 263 for (i = 0; i < jp->nprocs; i++) … … 339 339 out1fmt(" | %s", jp->ps[i].cmd ); 340 340 out1c('\n'); 341 flushall();341 output_flushall(); 342 342 restartjob(jp); 343 343 } while (*argptr && *++argptr); … … 449 449 } else { 450 450 #if JOBS 451 if (WIFSTOPPED(ps->status)) 451 if (WIFSTOPPED(ps->status)) 452 452 st = WSTOPSIG(ps->status); 453 453 else /* WIFSIGNALED(ps->status) */ -
trunk/ash/miscbltin.c
r2462 r2463 112 112 if (prompt && isatty(0)) { 113 113 out2str(prompt); 114 flushall();114 output_flushall(); 115 115 } 116 116 … … 276 276 277 277 INTOFF; 278 #ifdef __INNOTEK_LIBC__ 279 if ((set = bsd_setmode(ap)) != 0) { 280 #else 278 281 if ((set = setmode(ap)) != 0) { 282 #endif 279 283 mask = getmode(set, ~mask & 0777); 280 284 ckfree(set); -
trunk/ash/mknodes.sh
r2462 r2463 118 118 echo "void freefunc(union node *);" 119 119 120 mv $objdir/nodes.h.tmp $objdir/nodes.h || exit 1121 122 120 exec <$nodes_pat 123 121 exec >$objdir/nodes.c.tmp 122 mv -f $objdir/nodes.h.tmp $objdir/nodes.h || exit 1 124 123 125 124 echo "/*" … … 215 214 done 216 215 217 mv $objdir/nodes.c.tmp $objdir/nodes.c || exit 1 216 exec >/dev/null 217 mv -f $objdir/nodes.c.tmp $objdir/nodes.c || exit 1 -
trunk/ash/mktokens
r2462 r2463 38 38 # error messages. 39 39 40 cat > /tmp/ka$$ <<\! 40 F="$TMPDIR/ka$$" 41 echo $F 42 cat > $F <<\! 41 43 TEOF 1 end of file 42 44 TNL 0 newline … … 68 70 TNOT 0 "!" 69 71 ! 70 nl=`wc -l /tmp/ka$$`72 nl=`wc -l $F` 71 73 exec > token.h 72 awk '{print "#define " $1 " " NR-1}' /tmp/ka$$74 awk '{print "#define " $1 " " NR-1}' $F 73 75 echo ' 74 76 /* Array indicating which tokens mark the end of a list */ 75 77 const char tokendlist[] = {' 76 awk '{print "\t" $2 ","}' /tmp/ka$$78 awk '{print "\t" $2 ","}' $F 77 79 echo '}; 78 80 … … 80 82 sed -e 's/"/\\"/g' \ 81 83 -e 's/[^ ]*[ ][ ]*[^ ]*[ ][ ]*\(.*\)/ "\1",/' \ 82 /tmp/ka$$84 $F 83 85 echo '}; 84 86 ' 85 sed 's/"//g' /tmp/ka$$| awk '86 /TIF/{print "#define KWDOFFSET " NR-1; print ""; 87 sed 's/"//g' $F | awk ' 88 /TIF/{print "#define KWDOFFSET " NR-1; print ""; 87 89 print "const char *const parsekwd[] = {"} 88 90 /TIF/,/neverfound/{print " \"" $3 "\","}' … … 90 92 };' 91 93 92 rm /tmp/ka$$94 rm $F -
trunk/ash/myhistedit.h
r2462 r2463 32 32 */ 33 33 34 #ifndef SMALL 34 35 #include <histedit.h> 35 36 36 37 extern History *hist; 37 38 extern EditLine *el; 39 #endif 38 40 extern int displayhist; 39 41 -
trunk/ash/options.c
r2462 r2463 482 482 *optnext = NULL; 483 483 *optpptr = NULL; 484 flushall();484 output_flushall(); 485 485 exraise(EXERROR); 486 486 } -
trunk/ash/output.c
r2462 r2463 175 175 176 176 void 177 flushall(void)177 output_flushall(void) 178 178 { 179 179 flushout(&output); … … 285 285 vasprintf(&s, f, ap); 286 286 outstr(s, dest); 287 free(s); 287 free(s); 288 288 #else /* !HAVE_VASPRINTF */ 289 289 static const char digit[] = "0123456789ABCDEF"; -
trunk/ash/output.h
r2462 r2463 59 59 void outstr(const char *, struct output *); 60 60 void emptyoutbuf(struct output *); 61 void flushall(void);61 void output_flushall(void); 62 62 void flushout(struct output *); 63 63 void freestdout(void); -
trunk/ash/show.c
r2462 r2463 288 288 if (debug != 1) 289 289 return; 290 fprintf(tracefile, "[%d] ", getpid()); 290 291 va_start(va, fmt); 291 292 (void) vfprintf(tracefile, fmt, va); … … 300 301 if (debug != 1) 301 302 return; 303 fprintf(tracefile, "[%d] ", getpid()); 302 304 (void) vfprintf(tracefile, fmt, va); 303 305 #endif -
trunk/ash/trap.c
r2462 r2463 442 442 } 443 443 l1: handler = &loc2; /* probably unnecessary */ 444 flushall();444 output_flushall(); 445 445 #if JOBS 446 446 setjobctl(0); -
trunk/ash/var.c
r2462 r2463 47 47 #include <paths.h> 48 48 49 #ifdef PC_OS2_LIBPATHS 50 #define INCL_BASE 51 #include <os2.h> 52 53 #ifndef LIBPATHSTRICT 54 #define LIBPATHSTRICT 3 55 #endif 56 57 extern APIRET 58 #ifdef APIENTRY 59 APIENTRY 60 #endif 61 DosQueryHeaderInfo(HMODULE hmod, ULONG ulIndex, PVOID pvBuffer, ULONG cbBuffer, ULONG ulSubFunction); 62 #define QHINF_EXEINFO 1 /* NE exeinfo. */ 63 #define QHINF_READRSRCTBL 2 /* Reads from the resource table. */ 64 #define QHINF_READFILE 3 /* Reads from the executable file. */ 65 #define QHINF_LIBPATHLENGTH 4 /* Gets the libpath length. */ 66 #define QHINF_LIBPATH 5 /* Gets the entire libpath. */ 67 #define QHINF_FIXENTRY 6 /* NE only */ 68 #define QHINF_STE 7 /* NE only */ 69 #define QHINF_MAPSEL 8 /* NE only */ 70 71 #endif 72 73 49 74 /* 50 75 * Shell variables. … … 101 126 struct var vvers; 102 127 struct var voptind; 128 129 #ifdef PC_OS2_LIBPATHS 130 static struct var libpath_vars[4]; 131 static const char *libpath_envs[4] = {"LIBPATH=", "BEGINLIBPATH=", "ENDLIBPATH=", "LIBPATHSTRICT="}; 132 #endif 103 133 104 134 const struct varinit varinit[] = { … … 173 203 struct var **vpp; 174 204 205 #ifdef PC_OS2_LIBPATHS 206 char *psz = ckmalloc(2048); 207 int rc; 208 int i; 209 for (i = 0; i < 4; i++) 210 { 211 libpath_vars[i].flags = VSTRFIXED | VOS2LIBPATH; 212 libpath_vars[i].func = NULL; 213 214 if (i > 0) 215 rc = DosQueryExtLIBPATH(psz, i); 216 else 217 { 218 rc = DosQueryHeaderInfo(NULLHANDLE, 0, psz, 2048, QHINF_LIBPATH); 219 libpath_vars[i].flags |= VREADONLY; 220 } 221 if (!rc && *psz) 222 { 223 int cch1 = strlen(libpath_envs[i]); 224 int cch2 = strlen(psz) + 1; 225 libpath_vars[i].text = ckmalloc(cch1 + cch2); 226 memcpy(libpath_vars[i].text, libpath_envs[i], cch1); 227 memcpy(libpath_vars[i].text + cch1, psz, cch2); 228 } 229 else 230 { 231 libpath_vars[i].flags |= VUNSET | VTEXTFIXED; 232 libpath_vars[i].text = (char*)libpath_envs[i]; 233 } 234 if (find_var(libpath_vars[i].text, &vpp, &libpath_vars[i].name_len) != NULL) 235 continue; 236 libpath_vars[i].next = *vpp; 237 *vpp = &libpath_vars[i]; 238 } 239 free(psz); 240 #endif 241 175 242 for (ip = varinit ; (vp = ip->var) != NULL ; ip++) { 176 243 if (find_var(ip->text, &vpp, &vp->name_len) != NULL) … … 300 367 vp->flags |= flags & ~VNOFUNC; 301 368 vp->text = s; 369 #ifdef PC_OS2_LIBPATHS 370 if ((vp->flags & VOS2LIBPATH) && (vp->flags & VEXPORT)) 371 vp->flags &= ~VEXPORT; 372 #endif 302 373 303 374 /* … … 420 491 } 421 492 *ep = NULL; 493 494 #ifdef PC_OS2_LIBPATHS 495 /* 496 * Set the libpaths now as this is exec() time. 497 */ 498 for (nenv = 0; nenv < 3; nenv++) 499 DosSetExtLIBPATH(strchr(libpath_vars[nenv].text, '=') + 1, nenv); 500 #endif 501 422 502 return env; 423 503 } -
trunk/ash/var.h
r2462 r2463 48 48 #define VNOFUNC 0x40 /* don't call the callback function */ 49 49 #define VNOSET 0x80 /* do not set variable - just readonly test */ 50 #ifdef PC_OS2_LIBPATHS 51 #define VOS2LIBPATH 0x8000 /* OS/2 LIBPATH related variable. */ 52 #endif 50 53 51 54
Note:
See TracChangeset
for help on using the changeset viewer.