STATIC char * find_dot_file(char *basename) { char *fullname; const char *path = pathval(); struct stat statb; /* don't try this for absolute or relative paths */ if (strchr(basename, '/')) return basename; while ((fullname = padvance(&path, basename)) != NULL) { if ((stat(fullname, &statb) == 0) && S_ISREG(statb.st_mode)) { /* * Don't bother freeing here, since it will * be freed by the caller. */ return fullname; } stunalloc(fullname); } /* not found in the PATH */ sh_error("%s: not found", basename); /* NOTREACHED */ }
void shellexec(char **argv, char **envp, const char *path, int idx) { char *cmdname; int e; if (strchr(argv[0], '/') != NULL) { tryexec(argv[0], argv, envp); e = errno; } else { e = ENOENT; while ((cmdname = padvance(&path, argv[0])) != NULL) { if (--idx < 0 && pathopt == NULL) { tryexec(cmdname, argv, envp); if (errno != ENOENT && errno != ENOTDIR) e = errno; if (e == ENOEXEC) break; } stunalloc(cmdname); } } /* Map to POSIX errors */ if (e == ENOENT || e == ENOTDIR) { exerrno = 127; exerror(EXEXEC, "%s: not found", argv[0]); } else { exerrno = 126; exerror(EXEXEC, "%s: %s", argv[0], strerror(e)); } }
static void growstackblock(int min) { char *p; int newlen; char *oldspace; int oldlen; struct stack_block *sp; struct stack_block *oldstackp; struct stackmark *xmark; if (min < stacknleft) min = stacknleft; if (min >= INT_MAX / 2 - ALIGN(sizeof(struct stack_block))) error("Out of space"); min += stacknleft; min += ALIGN(sizeof(struct stack_block)); newlen = 512; while (newlen < min) newlen <<= 1; oldspace = stacknxt; oldlen = stacknleft; if (stackp != NULL && stacknxt == SPACE(stackp)) { INTOFF; oldstackp = stackp; stackp = oldstackp->prev; sp = ckrealloc((pointer)oldstackp, newlen); sp->prev = stackp; stackp = sp; stacknxt = SPACE(sp); stacknleft = newlen - (stacknxt - (char*)sp); sstrend = stacknxt + stacknleft; /* * Stack marks pointing to the start of the old block * must be relocated to point to the new block */ xmark = markp; while (xmark != NULL && xmark->stackp == oldstackp) { xmark->stackp = stackp; xmark->stacknxt = stacknxt; xmark->stacknleft = stacknleft; xmark = xmark->marknext; } INTON; } else { newlen -= ALIGN(sizeof(struct stack_block)); p = stalloc(newlen); if (oldlen != 0) memcpy(p, oldspace, oldlen); stunalloc(p); } }
void growstackblock(void) { char *p; int newlen; char *oldspace; int oldlen; struct stack_block *sp; struct stack_block *oldstackp; struct stackmark *xmark; newlen = (stacknleft == 0) ? MINSIZE : stacknleft * 2 + 100; newlen = ALIGN(newlen); oldspace = stacknxt; oldlen = stacknleft; if (stackp != NULL && stacknxt == SPACE(stackp)) { INTOFF; oldstackp = stackp; stackp = oldstackp->prev; sp = ckrealloc((pointer)oldstackp, newlen); sp->prev = stackp; stackp = sp; stacknxt = SPACE(sp); stacknleft = newlen - (stacknxt - (char*)sp); /* * Stack marks pointing to the start of the old block * must be relocated to point to the new block */ xmark = markp; while (xmark != NULL && xmark->stackp == oldstackp) { xmark->stackp = stackp; xmark->stacknxt = stacknxt; xmark->stacknleft = stacknleft; xmark = xmark->marknext; } INTON; } else { p = stalloc(newlen); if (oldlen != 0) memcpy(p, oldspace, oldlen); stunalloc(p); } }
static void growstackblock(int min) { char *p; int newlen; char *oldspace; int oldlen; struct stack_block *sp; struct stack_block *oldstackp; if (min < stacknleft) min = stacknleft; if ((unsigned int)min >= INT_MAX / 2 - ALIGN(sizeof(struct stack_block))) error("Out of space"); min += stacknleft; min += ALIGN(sizeof(struct stack_block)); newlen = 512; while (newlen < min) newlen <<= 1; oldspace = stacknxt; oldlen = stacknleft; if (stackp != NULL && stacknxt == SPACE(stackp)) { INTOFF; oldstackp = stackp; stackp = oldstackp->prev; sp = ckrealloc((pointer)oldstackp, newlen); sp->prev = stackp; stackp = sp; stacknxt = SPACE(sp); stacknleft = newlen - (stacknxt - (char*)sp); sstrend = stacknxt + stacknleft; INTON; } else { newlen -= ALIGN(sizeof(struct stack_block)); p = stalloc(newlen); if (oldlen != 0) memcpy(p, oldspace, oldlen); stunalloc(p); } }
static const char * find_dot_file(const char *basename) { static char localname[FILENAME_MAX+1]; char *fullname; const char *path = pathval(); struct stat statb; /* don't try this for absolute or relative paths */ if( strchr(basename, '/')) return basename; while ((fullname = padvance(&path, basename)) != NULL) { strcpy(localname, fullname); stunalloc(fullname); if ((stat(fullname, &statb) == 0) && S_ISREG(statb.st_mode)) return localname; } return basename; }
void shellexec(char **argv, char **envp, char *path, int index) { char *cmdname; int e; if (strchr(argv[0], '/') != NULL) { tryexec(argv[0], argv, envp); e = errno; } else { e = ENOENT; while ((cmdname = padvance(&path, argv[0])) != NULL) { if (--index < 0 && pathopt == NULL) { tryexec(cmdname, argv, envp); if (errno != ENOENT && errno != ENOTDIR) e = errno; } stunalloc(cmdname); } } /* Map to POSIX errors */ switch (e) { case EACCES: exerrno = 126; break; case ENOENT: exerrno = 127; break; default: exerrno = 2; break; } if (e == ENOENT || e == ENOTDIR) exerror(EXEXEC, "%s: not found", argv[0]); exerror(EXEXEC, "%s: %s", argv[0], strerror(e)); }