Lines Matching refs:shp

72 static_fn void path_checkdup(Shell_t *shp, Pathcomp_t *);
73 static_fn Pathcomp_t *defpath_init(Shell_t *shp);
77 static_fn bool onstdpath(Shell_t *shp, const char *name) { in onstdpath() argument
78 if (!std_path) defpath_init(shp); in onstdpath()
116 static_fn pid_t path_pfexecve(Shell_t *shp, const char *path, char *argv[], char *const envp[], in path_pfexecve() argument
120 if (shp->vex->cur) { in path_pfexecve()
121 spawnvex_apply(shp->vex, 0, 0); in path_pfexecve()
122 spawnvex_apply(shp->vexp, 0, SPAWN_RESET); in path_pfexecve()
125 UNUSED(shp); in path_pfexecve()
144 static_fn pid_t _spawnveg(Shell_t *shp, const char *path, char *const argv[], char *const envp[], in _spawnveg() argument
146 UNUSED(shp); in _spawnveg()
157 static_fn pid_t _spawnveg(Shell_t *shp, const char *path, char *const argv[], char *const envp[], in _spawnveg() argument
174 pid = spawnvex(path, argv, envp, shp->vex); in _spawnveg()
176 if (pid > 0 && shp->comsub && (fd = sffileno(sfstdout)) != 1 && fd >= 0) { in _spawnveg()
177 spawnvex_add(shp->vex, fd, 1, 0, 0); in _spawnveg()
197 static_fn pid_t path_xargs(Shell_t *shp, const char *path, char *argv[], char *const envp[], in path_xargs() argument
200 char **avlast = &argv[shp->xargmax], **saveargs = NULL; in path_xargs()
207 if (shp->xargmin < 0) return (pid_t)-1; in path_xargs()
208 size = shp->gd->lim.arg_max - 1024; in path_xargs()
210 for (av = argv; *av && av < &argv[shp->xargmin]; av++) size -= strlen(*av) - 1; in path_xargs()
212 av = &argv[shp->xargmin]; in path_xargs()
213 if (!spawn) job_clear(shp); in path_xargs()
214 shp->exitval = 0; in path_xargs()
219 if (xv == &argv[shp->xargmin]) { in path_xargs()
225 for (n = shp->xargmin; xv < av; xv++) argv[n++] = *xv; in path_xargs()
230 if ((pid = _spawnveg(shp, path, argv, envp, 0)) < 0) return -1; in path_xargs()
231 job_post(shp, pid, 0); in path_xargs()
233 if (shp->exitval > exitval) exitval = shp->exitval; in path_xargs()
240 shp->xargexit = exitval; in path_xargs()
242 return _spawnveg(shp, path, argv, envp, spawn >> 1); in path_xargs()
245 return path_pfexecve(shp, path, argv, envp, spawn); in path_xargs()
256 char *path_pwd(Shell_t *shp) { in path_pwd() argument
260 if (shp->pwd) return (char *)shp->pwd; in path_pwd()
300 shp->pwd = FETCH_VT(VAR_PWD->nvalue, const_cp); in path_pwd()
329 static_fn char *path_lib(Shell_t *shp, Pathcomp_t *pp, char *path) { in path_lib() argument
344 if (!pp->dev && !pp->ino) path_checkdup(shp, pp); in path_lib()
355 memcpy(save, stkptr(shp->stk, PATH_OFFSET + pcomp.len), sizeof(save)); in path_lib()
356 if (path_chkpaths(shp, NULL, NULL, &pcomp, PATH_OFFSET)) return stkfreeze(shp->stk, 1); in path_lib()
357 memcpy(stkptr(shp->stk, PATH_OFFSET + pcomp.len), save, sizeof(save)); in path_lib()
364 static_fn void path_checkdup(Shell_t *shp, Pathcomp_t *pp) { in path_checkdup() argument
378 if (*name == '/' && onstdpath(shp, name)) flag = PATH_STD_DIR; in path_checkdup()
379 first = (pp->flags & PATH_CDPATH) ? shp->cdpathlist : path_get(shp, ""); in path_checkdup()
388 int offset = stktell(shp->stk); in path_checkdup()
389 sfputr(shp->stk, name, -1); in path_checkdup()
390 path_chkpaths(shp, first, 0, pp, offset); in path_checkdup()
391 stkseek(shp->stk, offset); in path_checkdup()
399 Pathcomp_t *path_nextcomp(Shell_t *shp, Pathcomp_t *pp, const char *name, Pathcomp_t *last) { in path_nextcomp() argument
401 stkseek(shp->stk, PATH_OFFSET); in path_nextcomp()
408 if (!pp->dev && !pp->ino) path_checkdup(shp, pp); in path_nextcomp()
418 sfputr(shp->stk, path_pwd(shp), -1); in path_nextcomp()
419 if (*stkptr(shp->stk, stktell(shp->stk) - 1) != '/') sfputc(shp->stk, '/'); in path_nextcomp()
421 sfwrite(shp->stk, pp->name, pp->len); in path_nextcomp()
422 if (pp->name[pp->len - 1] != '/') sfputc(shp->stk, '/'); in path_nextcomp()
424 sfputr(shp->stk, name, 0); in path_nextcomp()
431 static_fn Pathcomp_t *defpath_init(Shell_t *shp) { in defpath_init() argument
442 return path_addpath(shp, NULL, std_path, PATH_PATH); in defpath_init()
445 static_fn void path_init(Shell_t *shp) { in path_init() argument
446 const char *val = FETCH_VT(sh_scoped(shp, VAR_PATH)->nvalue, const_cp); in path_init()
448 shp->pathlist = path_addpath(shp, shp->pathlist, val, PATH_PATH); in path_init()
450 Pathcomp_t *pp = shp->defpathlist; in path_init()
451 if (!pp) pp = defpath_init(shp); in path_init()
452 shp->pathlist = path_dup(pp); in path_init()
454 val = FETCH_VT(sh_scoped(shp, VAR_FPATH)->nvalue, const_cp); in path_init()
455 if (val) (void)path_addpath(shp, shp->pathlist, val, PATH_FPATH); in path_init()
461 Pathcomp_t *path_get(Shell_t *shp, const char *name) { in path_get() argument
465 if (!sh_isstate(shp, SH_DEFPATH)) { in path_get()
466 if (!shp->pathlist) path_init(shp); in path_get()
467 pp = shp->pathlist; in path_get()
469 if ((!pp && !(FETCH_VT(sh_scoped(shp, VAR_PATH)->nvalue, const_cp))) || in path_get()
470 sh_isstate(shp, SH_DEFPATH)) { in path_get()
471 pp = shp->defpathlist; in path_get()
472 if (!pp) pp = defpath_init(shp); in path_get()
480 static_fn int path_opentype(Shell_t *shp, const char *name, Pathcomp_t *pp, int fun) { in path_opentype() argument
483 if (!pp && !shp->pathlist) path_init(shp); in path_opentype()
484 if (!fun && strchr(name, '/') && sh_isoption(shp, SH_RESTRICTED)) { in path_opentype()
493 next_pp = path_nextcomp(shp, pp, name, NULL); in path_opentype()
496 fd = sh_open(path_relative(shp, stkptr(shp->stk, PATH_OFFSET)), O_RDONLY | O_CLOEXEC, 0); in path_opentype()
505 assert(fd < 0 || sh_iovalidfd(shp, fd)); in path_opentype()
506 if (fd >= 0 && (fd = sh_iomovefd(shp, fd)) > 0) { in path_opentype()
508 shp->fdstatus[fd] |= IOCLEX; in path_opentype()
516 int path_open(Shell_t *shp, const char *name, Pathcomp_t *pp) { in path_open() argument
517 return path_opentype(shp, name, pp, 0); in path_open()
534 char *path_fullname(Shell_t *shp, const char *name) { in path_fullname() argument
538 pwd = path_pwd(shp); in path_fullname()
554 static_fn void funload(Shell_t *shp, int fno, const char *name) { in funload() argument
555 char *pname, *oldname = shp->st.filename, buff[IOBSIZE + 1]; in funload()
558 int savestates = sh_getstate(shp), oldload = shp->funload; in funload()
560 pname = path_fullname(shp, stkptr(shp->stk, PATH_OFFSET)); in funload()
561 if (shp->fpathdict && (rp = dtmatch(shp->fpathdict, pname))) { in funload()
562 Dt_t *funtree = sh_subfuntree(shp, true); in funload()
564 rpfirst = dtprev(shp->fpathdict, rp); in funload()
575 } while ((rp = dtnext(shp->fpathdict, rp)) && strcmp(pname, rp->fname) == 0); in funload()
580 sh_onstate(shp, SH_NOLOG); in funload()
581 sh_onstate(shp, SH_NOALIAS); in funload()
582 shp->readscript = (char *)name; in funload()
583 shp->st.filename = pname; in funload()
584 shp->funload = 1; in funload()
586 sh_eval(shp, sfnew(NULL, buff, IOBSIZE, fno, SF_READ), SH_FUNEVAL); in funload()
588 shp->readscript = NULL; in funload()
589 if (shp->namespace) { in funload()
590 np = sh_fsearch(shp, name, 0); in funload()
592 np = nv_search(name, shp->fun_tree, 0); in funload()
595 pname = stkcopy(shp->stk, shp->st.filename); in funload()
599 shp->funload = oldload; in funload()
600 free(shp->st.filename); in funload()
601 shp->st.filename = oldname; in funload()
602 sh_setstate(shp, savestates); in funload()
614 bool path_search(Shell_t *shp, const char *name, Pathcomp_t **oldpp, int flag) { in path_search() argument
621 stkseek(shp->stk, PATH_OFFSET); in path_search()
622 sfputr(shp->stk, name, -1); in path_search()
623 if (can_execute(shp, stkptr(shp->stk, PATH_OFFSET), 0) < 0) { in path_search()
624 *stkptr(shp->stk, PATH_OFFSET) = 0; in path_search()
628 stkseek(shp->stk, PATH_OFFSET); in path_search()
629 sfputr(shp->stk, path_pwd(shp), '/'); in path_search()
630 sfputr(shp->stk, name, 0); in path_search()
633 if (sh_isstate(shp, SH_DEFPATH)) { in path_search()
634 if (!shp->defpathlist) defpath_init(shp); in path_search()
635 } else if (!shp->pathlist) { in path_search()
636 path_init(shp); in path_search()
639 if (!(flag & 1) && (np = nv_search(name, shp->track_tree, 0)) && in path_search()
641 stkseek(shp->stk, PATH_OFFSET); in path_search()
642 path_nextcomp(shp, pp, name, pp); in path_search()
644 sfputc(shp->stk, 0); in path_search()
647 pp = path_absolute(shp, name, oldpp ? *oldpp : NULL); in path_search()
649 if (!pp && (np = nv_search(name, shp->fun_tree, 0)) && FETCH_VT(np->nvalue, ip)) { in path_search()
652 if (!pp) *stkptr(shp->stk, PATH_OFFSET) = 0; in path_search()
655 if (!pp) pp = sh_isstate(shp, SH_DEFPATH) ? shp->defpathlist : shp->pathlist; in path_search()
656 if (pp && strmatch(name, e_alphanum) && (fno = path_opentype(shp, name, pp, 1)) >= 0) { in path_search()
661 funload(shp, fno, name); in path_search()
664 *stkptr(shp->stk, PATH_OFFSET) = 0; in path_search()
666 } else if (pp && !sh_isstate(shp, SH_DEFPATH) && *name != '/' && flag < 3) { in path_search()
667 np = nv_search(name, shp->track_tree, NV_ADD); in path_search()
693 Pathcomp_t *path_absolute(Shell_t *shp, const char *name, Pathcomp_t *pp) { in path_absolute() argument
701 shp->path_err = ENOENT; in path_absolute()
702 if (!pp && !(pp = path_get(shp, ""))) return 0; in path_absolute()
703 shp->path_err = 0; in path_absolute()
705 sh_sigcheck(shp); in path_absolute()
706 shp->bltin_dir = NULL; in path_absolute()
710 pp = path_nextcomp(shp, pp, name, 0); in path_absolute()
714 shp->path_err = ENOENT; in path_absolute()
719 if (!isfun && !sh_isoption(shp, SH_RESTRICTED)) { in path_absolute()
724 if (*stkptr(shp->stk, PATH_OFFSET) == '/' && in path_absolute()
725 (np = nv_search(stkptr(shp->stk, PATH_OFFSET), shp->bltin_tree, 0)) && in path_absolute()
730 bp = stkptr(shp->stk, PATH_OFFSET + bp - oldpp->name); in path_absolute()
731 if (!(np = nv_search(bp, shp->bltin_tree, 0))) { in path_absolute()
735 np = nv_search(bp, shp->bltin_tree, 0); in path_absolute()
741 np = sh_addbuiltin(shp, stkptr(shp->stk, PATH_OFFSET), addr, NULL); in path_absolute()
746 n = stktell(shp->stk); in path_absolute()
747 sfputr(shp->stk, "b_", -1); in path_absolute()
748 sfputr(shp->stk, name, 0); in path_absolute()
749 if ((addr = sh_getlib(shp, stkptr(shp->stk, n), oldpp)) && in path_absolute()
750 (np = sh_addbuiltin(shp, stkptr(shp->stk, PATH_OFFSET), addr, NULL)) && in path_absolute()
752 shp->bltin_dir = NULL; in path_absolute()
755 stkseek(shp->stk, n); in path_absolute()
771 n = stktell(shp->stk); in path_absolute()
772 sfputr(shp->stk, "b_", 0); in path_absolute()
773 sfputr(shp->stk, name, 0); in path_absolute()
774 m = stktell(shp->stk); in path_absolute()
775 shp->bltin_dir = oldpp->name; in path_absolute()
776 if (*bp != '/') sfputr(shp->stk, oldpp->name, '/'); in path_absolute()
777 sfputr(shp->stk, bp, 0); in path_absolute()
778 cp = strrchr(stkptr(shp->stk, m), '/'); in path_absolute()
782 cp = stkptr(shp->stk, m); in path_absolute()
784 if (!strcmp(cp, LIBCMD) && (addr = (Shbltin_f)dlllook(NULL, stkptr(shp->stk, n))) && in path_absolute()
785 (np = sh_addbuiltin(shp, stkptr(shp->stk, PATH_OFFSET), addr, NULL)) && in path_absolute()
789 shp->bltin_dir = NULL; in path_absolute()
792 dll = dllplugin(SH_ID, stkptr(shp->stk, m), NULL, SH_PLUGIN_VERSION, NULL, in path_absolute()
794 if (dll) sh_addlib(shp, dll, stkptr(shp->stk, m), oldpp); in path_absolute()
795 if (dll && (addr = (Shbltin_f)dlllook(dll, stkptr(shp->stk, n))) && in path_absolute()
796 (!(np = sh_addbuiltin(shp, stkptr(shp->stk, PATH_OFFSET), NULL, NULL)) || in path_absolute()
798 (np = sh_addbuiltin(shp, stkptr(shp->stk, PATH_OFFSET), addr, NULL))) { in path_absolute()
802 if (*stkptr(shp->stk, PATH_OFFSET) == '/' && in path_absolute()
803 nv_search(stkptr(shp->stk, PATH_OFFSET), shp->bltin_tree, 0)) { in path_absolute()
807 stkseek(shp->stk, n); in path_absolute()
810 shp->bltin_dir = NULL; in path_absolute()
812 fd = can_execute(shp, stkptr(shp->stk, PATH_OFFSET), isfun); in path_absolute()
815 if (nv_open(name, sh_subfuntree(shp, true), NV_NOARRAY | NV_IDENT | NV_NOSCOPE)) { in path_absolute()
822 nv_onattr(nv_open(name, sh_subfuntree(shp, true), NV_NOARRAY | NV_IDENT | NV_NOSCOPE), in path_absolute()
824 funload(shp, fd, name); in path_absolute()
827 int n = stktell(shp->stk); in path_absolute()
828 sfputr(shp->stk, "/bin/", -1); in path_absolute()
829 sfputr(shp->stk, name, 0); in path_absolute()
830 np = nv_search(stkptr(shp->stk, n), shp->bltin_tree, 0); in path_absolute()
831 stkseek(shp->stk, n); in path_absolute()
834 np = sh_addbuiltin(shp, stkptr(shp->stk, PATH_OFFSET), in path_absolute()
848 shp->path_err = (noexec ? noexec : ENOENT); in path_absolute()
854 sfputc(shp->stk, 0); in path_absolute()
876 static_fn bool find_alternate(Shell_t *shp, char *path, int isfun, struct stat *statbp) { in find_alternate() argument
879 int offset = stktell(shp->stk) - 1; in find_alternate()
880 stkseek(shp->stk, offset); in find_alternate()
881 sfputr(shp->stk, ".bat", -1); in find_alternate()
882 path = stkptr(shp->stk, PATH_OFFSET); in find_alternate()
885 memcpy(stkptr(shp->stk, offset), ".sh", 4); in find_alternate()
895 #define find_alternate(shp, path, isfun, statbp) false argument
899 static_fn int can_execute(Shell_t *shp, char *path, int isfun) { in can_execute() argument
903 path = path_relative(shp, path); in can_execute()
908 if (!find_alternate(shp, path, isfun, &statb)) goto err; in can_execute()
925 char *path_relative(Shell_t *shp, const char *file) { in path_relative() argument
930 if (!(pwd = shp->pwd)) return (char *)fp; in path_relative()
948 void path_exec(Shell_t *shp, const char *arg0, char *argv[], struct argnod *local) { in path_exec() argument
956 sh_setlist(shp, local, NV_EXPORT | NV_IDENT | NV_ASSIGN, 0); in path_exec()
957 envp = sh_envgen(shp); in path_exec()
961 if (sh_isoption(shp, SH_RESTRICTED)) { in path_exec()
966 pp = path_get(shp, arg0); in path_exec()
968 shp->path_err = ENOENT; in path_exec()
975 sh_sigcheck(shp); in path_exec()
978 pp = path_nextcomp(shp, pp, arg0, 0); in path_exec()
979 opath = stkfreeze(shp->stk, 1) + PATH_OFFSET; in path_exec()
983 path_spawn(shp, opath, argv, envp, libpath, 0); in path_exec()
984 if ((shp->path_err != ENOENT) && (shp->path_err != EACCES) && in path_exec()
985 (shp->path_err != EISDIR)) { in path_exec()
989 } else if (shp->path_err == EACCES) { in path_exec()
996 while (pp && (pp->flags & PATH_FPATH)) pp = path_nextcomp(shp, pp, arg0, 0); in path_exec()
1000 shp->jmplist->mode = SH_JMPEXIT; in path_exec()
1018 Shell_t *shp = ep->handle; in vexexec() local
1026 if (!shp->subshell) { in vexexec()
1034 sfprintf(shp->strbuf, "/dev/fd/%d", fd); in vexexec()
1035 if (stat(devfd = sfstruse(shp->strbuf), &statb) >= 0) argv[0] = devfd; in vexexec()
1039 if (!shp->gd->shpath) shp->gd->shpath = pathshell(); in vexexec()
1040 execve(shp->gd->shpath, &argv[-1], ep->envv); in vexexec()
1045 pid_t path_spawn(Shell_t *shp, const char *opath, char **argv, char **envp, Pathcomp_t *libpath, in path_spawn() argument
1057 spawnvex_add(shp->vex, SPAWN_pgrp, spawn >> 1, 0, 0); in path_spawn()
1059 spawnvex_add(shp->vex, SPAWN_noexec, 0, vexexec, shp); in path_spawn()
1064 stkseek(shp->stk, PATH_OFFSET); in path_spawn()
1066 sfputr(shp->stk, opath, -1); in path_spawn()
1067 opath = stkfreeze(shp->stk, 1) + PATH_OFFSET + pidsize; in path_spawn()
1068 np = nv_search(argv[0], shp->track_tree, 0); in path_spawn()
1074 stkseek(shp->stk, PATH_OFFSET); in path_spawn()
1075 sfputr(shp->stk, opath, -1); in path_spawn()
1076 path = stkptr(shp->stk, PATH_OFFSET); in path_spawn()
1089 stkseek(shp->stk, n); in path_spawn()
1090 sfputr(shp->stk, buff, 0); in path_spawn()
1091 n = stktell(shp->stk); in path_spawn()
1092 path = stkptr(shp->stk, PATH_OFFSET); in path_spawn()
1100 libenv = path_lib(shp, libpath, path); in path_spawn()
1103 stkseek(shp->stk, 0); in path_spawn()
1108 np = nv_open(libenv, shp->var_tree, 0); in path_spawn()
1111 sfputr(shp->stk, libenv, -1); in path_spawn()
1113 sfputc(shp->stk, ':'); in path_spawn()
1114 sfputr(shp->stk, s, -1); in path_spawn()
1116 v = stkfreeze(shp->stk, 1); in path_spawn()
1137 sh_sigcheck(shp); in path_spawn()
1138 path = path_relative(shp, opath); in path_spawn()
1140 pid = _spawnveg(shp, opath, &argv[0], envp, spawn >> 1); in path_spawn()
1142 pid = path_pfexecve(shp, opath, &argv[0], envp, spawn); in path_spawn()
1147 shp->path_err = errno; in path_spawn()
1148 switch (shp->path_err) { in path_spawn()
1157 if (shp->subshell) return -1; in path_spawn()
1161 } while (_sh_fork(shp, pid, 0, NULL) < 0); in path_spawn()
1163 if (shp->vex) spawnvex_apply(shp->vex, 0, 0); in path_spawn()
1165 shp->jmplist->mode = SH_JMPEXIT; in path_spawn()
1167 exscript(shp, path, argv, envp); in path_spawn()
1176 if (S_ISSOCK(statb.st_mode)) exscript(shp, path, argv, envp); in path_spawn()
1195 if (shp->xargmin) { in path_spawn()
1196 pid = path_xargs(shp, opath, &argv[0], envp, spawn); in path_spawn()
1214 static_fn void exscript(Shell_t *shp, char *path, char *argv[], char *const *envp) { in exscript() argument
1218 path = path_relative(shp, path); in exscript()
1219 shp->comdiv = NULL; in exscript()
1220 shp->bckpid = 0; in exscript()
1221 shp->coshell = NULL; in exscript()
1222 shp->st.ioset = 0; in exscript()
1224 if (shp->cpipe[0] > 0) sh_pclose(shp->cpipe); in exscript()
1225 if (shp->cpid && shp->outpipe) sh_close(*shp->outpipe); in exscript()
1226 shp->cpid = 0; in exscript()
1233 job_clear(shp); in exscript()
1234 if (shp->infd > 0 && (shp->fdstatus[shp->infd] & IOCLEX)) sh_close(shp->infd); in exscript()
1235 sh_setstate(shp, sh_state(SH_FORKED)); in exscript()
1248 n = sh_iomovefd(shp, n); in exscript()
1254 if ((euserid = geteuid()) != shp->gd->userid) { in exscript()
1291 path_pfexecve(shp, e_suidexec, argv, envp, 0); in exscript()
1304 shp->infd = n; in exscript()
1306 shp->infd = sh_iomovefd(shp, shp->infd); in exscript()
1307 shp->arglist = sh_argcreate(argv); in exscript()
1308 shp->lastarg = strdup(path); in exscript()
1310 shp->readscript = error_info.id; in exscript()
1312 if (shp->gd->hist_ptr && (path = nv_getval(VAR_HISTFILE)) && in exscript()
1313 strcmp(path, shp->gd->hist_ptr->histname)) { in exscript()
1314 hist_close(shp->gd->hist_ptr); in exscript()
1317 sh_offstate(shp, SH_FORKED); in exscript()
1318 if (shp->sigflag[SIGCHLD] == SH_SIGOFF) shp->sigflag[SIGCHLD] = SH_SIGFAULT; in exscript()
1319 siglongjmp(shp->jmplist->buff, SH_JMPSCRIPT); in exscript()
1326 static_fn Pathcomp_t *path_addcomp(Shell_t *shp, Pathcomp_t *first, Pathcomp_t *old, in path_addcomp() argument
1329 int offset = stktell(shp->stk); in path_addcomp()
1334 while (*cp && *cp != ':') sfputc(shp->stk, *cp++); in path_addcomp()
1335 len = stktell(shp->stk) - offset; in path_addcomp()
1336 sfputc(shp->stk, 0); in path_addcomp()
1337 stkseek(shp->stk, offset); in path_addcomp()
1338 name = (const char *)stkptr(shp->stk, offset); in path_addcomp()
1352 pp->shp = shp; in path_addcomp()
1370 if ((old || shp->pathinit) && ((flag & (PATH_PATH | PATH_SKIP)) == PATH_PATH)) { in path_addcomp()
1371 path_chkpaths(shp, first, old, pp, offset); in path_addcomp()
1376 bool path_cmdlib(Shell_t *shp, const char *dir, bool on) { in path_cmdlib() argument
1378 for (pp = shp->pathlist; pp; pp = pp->next) { in path_cmdlib()
1394 static_fn bool path_chkpaths(Shell_t *shp, Pathcomp_t *first, Pathcomp_t *old, Pathcomp_t *pp, in path_chkpaths() argument
1400 stkseek(shp->stk, offset + pp->len); in path_chkpaths()
1401 if (pp->len == 1 && *stkptr(shp->stk, offset) == '/') stkseek(shp->stk, offset); in path_chkpaths()
1402 sfputr(shp->stk, "/.paths", -1); in path_chkpaths()
1403 fd = sh_open(stkptr(shp->stk, offset), O_RDONLY | O_CLOEXEC); in path_chkpaths()
1407 stkseek(shp->stk, offset + pp->len + n + 2); in path_chkpaths()
1408 sp = stkptr(shp->stk, offset + pp->len); in path_chkpaths()
1428 char *ptr = stkptr(shp->stk, offset + pp->len + 1); in path_chkpaths()
1434 path_addcomp(shp, first, old, stkptr(shp->stk, offset), in path_chkpaths()
1447 memcpy(&pp->lib[m], stkptr(shp->stk, offset), pp->len); in path_chkpaths()
1452 stkseek(shp->stk, 0); in path_chkpaths()
1453 sfputr(shp->stk, pp->lib, -1); in path_chkpaths()
1465 Pathcomp_t *path_addpath(Shell_t *shp, Pathcomp_t *first, const char *path, int type) { in path_addpath() argument
1468 int offset = stktell(shp->stk); in path_addpath()
1476 if (offset) savptr = stkfreeze(shp->stk, 0); in path_addpath()
1480 if (type != PATH_FPATH) first = path_addcomp(shp, first, old, ".", type); in path_addpath()
1488 first = path_addcomp(shp, first, old, cp, type); in path_addpath()
1496 Pathcomp_t *pp = shp->defpathlist; in path_addpath()
1497 if (!pp) pp = defpath_init(shp); in path_addpath()
1500 cp = FETCH_VT(sh_scoped(shp, VAR_FPATH)->nvalue, const_cp); in path_addpath()
1502 first = path_addpath(shp, first, cp, PATH_FPATH); in path_addpath()
1507 stkset(shp->stk, savptr, offset); in path_addpath()
1509 stkseek(shp->stk, 0); in path_addpath()
1530 void path_newdir(Shell_t *shp, Pathcomp_t *first) { in path_newdir() argument
1559 int offset = stktell(shp->stk); in path_newdir()
1560 sfputr(shp->stk, pp->name, -1); in path_newdir()
1561 stkseek(shp->stk, offset); in path_newdir()
1564 path_chkpaths(shp, first, NULL, pp, offset); in path_newdir()
1571 Pathcomp_t *path_unsetfpath(Shell_t *shp) { in path_unsetfpath() argument
1572 Pathcomp_t *first = shp->pathlist; in path_unsetfpath()
1576 if (shp->fpathdict) { in path_unsetfpath()
1578 for (rp = (struct Ufunction *)dtfirst(shp->fpathdict); rp; rp = rpnext) { in path_unsetfpath()
1579 rpnext = (struct Ufunction *)dtnext(shp->fpathdict, rp); in path_unsetfpath()
1624 Shell_t *shp = sh_ptr(np); in talias_get() local
1629 pp->shp->last_table = NULL; in talias_get()
1630 path_nextcomp(pp->shp, pp, nv_name(np), pp); in talias_get()
1631 ptr = stkfreeze(shp->stk, 0); in talias_get()
1651 Shell_t *shp = sh_ptr(np); in path_alias() local
1664 path_nextcomp(pp->shp, pp, nv_name(np), pp); in path_alias()
1665 sp = stkptr(shp->stk, PATH_OFFSET); in path_alias()
1679 int sh_diropenat(Shell_t *shp, int dir, const char *path) { in sh_diropenat() argument
1680 UNUSED(shp); in sh_diropenat()