Lines Matching refs:shp

58 static void		path_checkdup(Shell_t *shp,register Pathcomp_t*);
77 int path_xattr(Shell_t *shp, const char *path, char *rpath)
80 if (shp->gd->user && *shp->gd->user)
87 if(pf=getexecuser(shp->gd->user, KV_COMMAND, resolvedpath, GET_ONE))
103 static pid_t path_pfexecve(Shell_t *shp,const char *path, char *argv[],char *const envp[],int spawn)
111 _sh_fork(shp,pid, 0, (int*)0);
122 if(!path_xattr(shp,path,resolvedpath))
134 static pid_t _spawnveg(Shell_t *shp,const char *path, char* const argv[], char* const envp[], pid_t pgid)
152 static pid_t path_xargs(Shell_t *shp,const char *path, char *argv[],char *const envp[], int spawn)
155 char **avlast= &argv[shp->xargmax], **saveargs=0;
160 if(shp->xargmin < 0)
162 size = shp->gd->lim.arg_max-1024;
165 for(av=argv; (cp= *av) && av< &argv[shp->xargmin]; av++)
169 av = &argv[shp->xargmin];
172 shp->exitval = 0;
180 if(xv==&argv[shp->xargmin])
189 for(n=shp->xargmin; xv < av; xv++)
197 if((pid=_spawnveg(shp,path,argv,envp,0)) < 0)
199 job_post(shp,pid,0);
201 if(shp->exitval>exitval)
202 exitval = shp->exitval;
212 shp->xargexit = exitval;
215 return(_spawnveg(shp,path,argv,envp,spawn>>1));
221 return(path_pfexecve(shp,path,argv,envp,spawn));
235 char *path_pwd(Shell_t *shp,int flag)
240 if(shp->pwd)
241 return((char*)shp->pwd);
285 shp->pwd = (char*)(PWDNOD->nvalue.cp);
318 static char *path_lib(Shell_t *shp,Pathcomp_t *pp, char *path)
336 path_checkdup(shp,pp);
344 if(path_chkpaths(shp,(Pathcomp_t*)0,(Pathcomp_t*)0,&pcomp,PATH_OFFSET))
367 static void path_checkdup(Shell_t *shp,register Pathcomp_t *pp)
384 first = (pp->flags&PATH_CDPATH)?(Pathcomp_t*)shp->cdpathlist:path_get(shp,"");
398 path_chkpaths(shp,first,0,pp,offset);
408 Pathcomp_t *path_nextcomp(Shell_t *shp,register Pathcomp_t *pp, const char *name, Pathcomp_t *last)
420 path_checkdup(shp,pp);
433 stakputs(path_pwd(shp,1));
451 static Pathcomp_t* defpath_init(Shell_t *shp)
453 Pathcomp_t *pp = (void*)path_addpath(shp,(Pathcomp_t*)0,(std_path),PATH_PATH);
457 static void path_init(Shell_t *shp)
463 if(val=sh_scoped(shp,(PATHNOD))->nvalue.cp)
465 shp->pathlist = pp = (void*)path_addpath(shp,(Pathcomp_t*)shp->pathlist,val,PATH_PATH);
469 if(!(pp=(Pathcomp_t*)shp->defpathlist))
470 pp = defpath_init(shp);
471 shp->pathlist = (void*)path_dup(pp);
473 if(val=sh_scoped(shp,(FPATHNOD))->nvalue.cp)
475 pp = (void*)path_addpath(shp,(Pathcomp_t*)shp->pathlist,val,PATH_FPATH);
482 Pathcomp_t *path_get(register Shell_t *shp,register const char *name)
489 if(!shp->pathlist)
490 path_init(shp);
491 pp = (Pathcomp_t*)shp->pathlist;
493 if(!pp && (!(sh_scoped(shp,PATHNOD)->nvalue.cp)) || sh_isstate(SH_DEFPATH))
495 if(!(pp=(Pathcomp_t*)shp->defpathlist))
496 pp = defpath_init(shp);
504 static int path_opentype(Shell_t *shp,const char *name, register Pathcomp_t *pp, int fun)
509 if(!pp && !shp->pathlist)
510 path_init(shp);
518 pp = path_nextcomp(shp,oldpp=pp,name,0);
523 if((fd = sh_open(path_relative(shp,stakptr(PATH_OFFSET)),O_RDONLY,0)) >= 0)
537 shp->fdstatus[fd] |= IOCLEX;
545 int path_open(Shell_t *shp,const char *name, register Pathcomp_t *pp)
547 return(path_opentype(shp,name,pp,0));
563 char *path_fullname(Shell_t *shp,const char *name)
569 pwd = path_pwd(shp,1);
586 static void funload(Shell_t *shp,int fno, const char *name)
588 char *pname,*oldname=shp->st.filename, buff[IOBSIZE+1];
591 int savestates = sh_getstate(), oldload=shp->funload;
592 pname = path_fullname(shp,stakptr(PATH_OFFSET));
593 if(shp->fpathdict && (rp = dtmatch(shp->fpathdict,(void*)pname)))
598 rpfirst = dtprev(shp->fpathdict,rp);
614 while((rp=dtnext(shp->fpathdict,rp)) && strcmp(pname,rp->fname)==0);
620 shp->readscript = (char*)name;
621 shp->st.filename = pname;
622 shp->funload = 1;
626 shp->readscript = 0;
628 if(shp->namespace)
629 np = sh_fsearch(shp,name,0);
632 np = nv_search(name,shp->fun_tree,0);
634 pname = stakcopy(shp->st.filename);
637 free((void*)shp->st.filename);
638 shp->funload = oldload;
639 shp->st.filename = oldname;
655 int path_search(Shell_t *shp,register const char *name,Pathcomp_t **oldpp, int flag)
664 if(canexecute(shp,stakptr(PATH_OFFSET),0)<0)
672 stakputs(path_pwd(shp,1));
680 if(!shp->defpathlist)
681 defpath_init(shp);
683 else if(!shp->pathlist)
684 path_init(shp);
687 if(!(flag&1) && (np=nv_search(name,shp->track_tree,0)) && !nv_isattr(np,NV_NOALIAS) && (pp=(Pathcomp_t*)np->nvalue.cp))
690 path_nextcomp(shp,pp,name,pp);
696 pp = path_absolute(shp,name,oldpp?*oldpp:NIL(Pathcomp_t*));
699 if(!pp && (np=nv_search(name,shp->fun_tree,0))&&np->nvalue.ip)
707 pp=sh_isstate(SH_DEFPATH)?shp->defpathlist:shp->pathlist;
708 if(pp && strmatch(name,e_alphanum) && (fno=path_opentype(shp,name,pp,1))>=0)
715 funload(shp,fno,name);
723 if(np=nv_search(name,shp->track_tree,NV_ADD))
732 Pathcomp_t *path_absolute(Shell_t *shp,register const char *name, Pathcomp_t *pp)
740 shp->path_err = ENOENT;
741 if(!pp && !(pp=path_get(shp,"")))
743 shp->path_err = 0;
746 sh_sigcheck(shp);
747 shp->bltin_dir = 0;
750 pp = path_nextcomp(shp,pp,name,0);
756 shp->path_err = ENOENT;
766 if(*stakptr(PATH_OFFSET)=='/' && nv_search(stakptr(PATH_OFFSET),shp->bltin_tree,0))
773 if((addr = sh_getlib(shp, stakptr(n), oldpp)) &&
777 shp->bltin_dir = 0;
802 shp->bltin_dir = oldpp->name;
822 shp->bltin_dir = 0;
827 sh_addlib(shp,dll,stakptr(m),oldpp);
846 sh_addlib(shp,dll,stakptr(m),oldpp);
857 if(*stakptr(PATH_OFFSET)=='/' && nv_search(stakptr(PATH_OFFSET),shp->bltin_tree,0))
865 shp->bltin_dir = 0;
867 f = canexecute(shp,stakptr(PATH_OFFSET),isfun);
878 funload(shp,f,name);
889 np = nv_search(stakptr(n),shp->bltin_tree,0);
905 shp->path_err = (noexec?noexec:ENOENT);
927 static int canexecute(Shell_t *shp,register char *path, int isfun)
931 path = path_relative(shp,path);
976 char *path_relative(Shell_t *shp,register const char* file)
980 /* can't relpath when shp->pwd not set */
981 if(!(pwd=shp->pwd))
999 void path_exec(Shell_t *shp,register const char *arg0,register char *argv[],struct argnod *local)
1015 pp=path_get(shp,arg0);
1016 shp->path_err= ENOENT;
1024 sh_sigcheck(shp);
1027 pp = path_nextcomp(shp,pp,arg0,0);
1032 path_spawn(shp,opath,argv,envp,libpath,0);
1034 pp = path_nextcomp(shp,pp,arg0,0);
1038 ((struct checkpt*)shp->jmplist)->mode = SH_JMPEXIT;
1039 if((errno=shp->path_err)==ENOENT)
1045 pid_t path_spawn(Shell_t *shp,const char *opath,register char **argv, char **envp, Pathcomp_t *libpath, int spawn)
1061 np=nv_search(argv[0],shp->track_tree,0);
1098 if(libenv = path_lib(shp,libpath,path))
1108 np = nv_open(libenv,shp->var_tree,0);
1142 sh_sigcheck(shp);
1143 path = path_relative(shp,opath);
1159 pid = _spawnveg(shp,opath, &argv[0],envp, spawn>>1);
1161 pid = path_pfexecve(shp,opath, &argv[0] ,envp,spawn);
1168 path = path_relative(shp,opath);
1174 switch(shp->path_err = errno)
1194 if(shp->subshell)
1201 while(_sh_fork(shp,pid,0,(int*)0) < 0);
1202 ((struct checkpt*)shp->jmplist)->mode = SH_JMPEXIT;
1207 exscript(shp,path,argv,envp);
1218 exscript(shp,path,argv,envp);
1230 shp->path_err = errno;
1240 if(shp->xargmin)
1242 pid = path_xargs(shp,opath, &argv[0] ,envp,spawn);
1258 static void exscript(Shell_t *shp,register char *path,register char *argv[],char **envp)
1261 path = path_relative(shp,path);
1262 shp->comdiv=0;
1263 shp->bckpid = 0;
1264 shp->coshell = 0;
1265 shp->st.ioset=0;
1267 if(shp->cpipe[0]>0)
1268 sh_pclose(shp->cpipe);
1269 if(shp->cpid && shp->outpipe)
1270 sh_close(*shp->outpipe);
1271 shp->cpid = 0;
1275 if(shp->infd>0 && (shp->fdstatus[shp->infd]&IOCLEX))
1276 sh_close(shp->infd);
1295 if((euserid=geteuid()) != shp->gd->userid)
1315 path_pfexecve(shp,e_suidexec,argv,envp,0);
1325 shp->infd = n;
1328 if((shp->infd = sh_open(path,O_RDONLY,0)) < 0)
1331 shp->infd = sh_iomovefd(shp->infd);
1335 shp->arglist = sh_argcreate(argv);
1336 shp->lastarg = strdup(path);
1338 shp->readscript = error_info.id;
1340 if(shp->gd->hist_ptr && (path=nv_getval(HISTFILE)) && strcmp(path,shp->gd->hist_ptr->histname))
1342 hist_close(shp->gd->hist_ptr);
1346 if(shp->sigflag[SIGCHLD]==SH_SIGOFF)
1347 shp->sigflag[SIGCHLD] = SH_SIGFAULT;
1348 siglongjmp(*shp->jmplist,SH_JMPSCRIPT);
1448 static Pathcomp_t *path_addcomp(Shell_t *shp,Pathcomp_t *first, Pathcomp_t *old,const char *name, int flag)
1474 pp->shp = shp;
1492 if((old||shp->pathinit) && ((flag&(PATH_PATH|PATH_SKIP))==PATH_PATH))
1493 path_chkpaths(shp,first,old,pp,offset);
1501 static int path_chkpaths(Shell_t *shp,Pathcomp_t *first, Pathcomp_t* old,Pathcomp_t *pp, int offset)
1543 path_addcomp(shp,first,old,stakptr(offset),PATH_FPATH|PATH_BFPATH);
1576 Pathcomp_t *path_addpath(Shell_t *shp,Pathcomp_t *first, register const char *path,int type)
1597 first = path_addcomp(shp,first,old,".",type);
1606 first = path_addcomp(shp,first,old,cp,type);
1617 Pathcomp_t *pp = (Pathcomp_t*)shp->defpathlist;
1619 pp = defpath_init(shp);
1622 if(cp=(sh_scoped(shp,FPATHNOD))->nvalue.cp)
1623 first = (void*)path_addpath(shp,(Pathcomp_t*)first,cp,PATH_FPATH);
1650 void path_newdir(Shell_t *shp,Pathcomp_t *first)
1693 path_chkpaths(shp,first,(Pathcomp_t*)0,pp,offset);
1704 Pathcomp_t *path_unsetfpath(Shell_t *shp)
1706 Pathcomp_t *first = (Pathcomp_t*)shp->pathlist;
1708 if(shp->fpathdict)
1711 for(rp=(struct Ufunction*)dtfirst(shp->fpathdict);rp;rp=rpnext)
1713 rpnext = (struct Ufunction*)dtnext(shp->fpathdict,rp);
1770 pp->shp->last_table = 0;
1771 path_nextcomp(pp->shp,pp,nv_name(np),pp);
1804 path_nextcomp(pp->shp,pp,nv_name(np),pp);