Lines Matching refs:shp

105 static int p_time(Shell_t *shp, Sfio_t *out, const char *format, clock_t *tm)
110 Stk_t *stkp = shp->stk;
395 int sh_debug(Shell_t *shp, const char *trap, const char *name, const char *subscript, char *const argv[], int flags)
397 Stk_t *stkp=shp->stk;
405 if(shp->indebug)
407 shp->indebug = 1;
438 shp->st.lineno = error_info.line;
439 level = shp->fn_depth+shp->dot_depth;
444 savst = shp->st;
445 shp->st.trap[SH_DEBUGTRAP] = 0;
448 shp->indebug = 0;
449 if(shp->st.cmdname)
450 error_info.id = shp->st.cmdname;
451 nv_putval(SH_PATHNAMENOD,shp->st.filename,NV_NOFREE);
452 nv_putval(SH_FUNNAMENOD,shp->st.funname,NV_NOFREE);
453 shp->st = savst;
467 Shell_t *shp = sh_getinterp();
468 struct slnod *saveslp = shp->st.staklist;
470 struct checkpt *pp = (struct checkpt*)shp->jmplist;
474 int binscript=shp->binscript;
476 shp->binscript = 0;
481 shp->fn_reset = 1;
490 lineno = shp->inlineno;
494 t = (Shnode_t*)sh_parse(shp,iop,(mode&(SH_READEVAL|SH_FUNEVAL))?mode&SH_FUNEVAL:SH_NL);
505 if((mode&~SH_FUNEVAL) && shp->hist_ptr)
507 hist_flush(shp->hist_ptr);
515 shp->binscript = binscript;
519 shp->inlineno = lineno;
522 sh_freeup(shp);
523 shp->st.staklist = saveslp;
524 shp->fn_reset = 0;
526 siglongjmp(*shp->jmplist,jmpval);
527 return(shp->exitval);
531 static int pipe_exec(Shell_t* shp,int pv[], Shnode_t *t, int errorflg)
544 pv[0] = shp->lim.open_max;
545 shp->fdstatus[pv[0]] = IOREAD|IODUP|IOSEEK;
546 pv[1] = shp->lim.open_max+1;
547 shp->fdstatus[pv[1]] = IOWRITE|IOSEEK;
549 shp->sftable[shp->lim.open_max+1] = iop;
552 sh_iosave(shp,0,shp->topfd,(char*)0);
553 sh_iosave(shp,1,shp->topfd,(char*)0);
558 sh_iorenumber(shp,shp->inpipe[0],0);
559 sh_iorenumber(shp,shp->lim.open_max+1,1);
566 shp->sftable[pv[0]] = iop;
567 shp->fdstatus[pv[0]] = IOREAD|IODUP|IOSEEK;
570 sh_iorestore(shp,buff.topfd,jmpval);
572 siglongjmp(*shp->jmplist,jmpval);
611 static int set_instance(Shell_t *shp,Namval_t *nq, Namval_t *node, struct Namref *nr)
619 shp->instance = 1;
622 shp->instance = 0;
655 register Shell_t *shp = &sh;
656 Stk_t *stkp = shp->stk;
658 if(t && !shp->st.execbrk && !sh_isoption(SH_NOEXEC))
671 int topfd = shp->topfd;
695 if(!shp->intrap)
696 shp->oldexit=shp->exitval;
697 shp->exitval=0;
698 shp->lastsig = 0;
699 shp->lastpath = 0;
709 shp->bltindata.invariant = type>>(COMBITS+2);
712 error_info.line = t->com.comline-shp->st.firstline;
713 com = sh_argbuild(shp,&argn,&(t->com),OPTIMIZE);
724 shp->xargexit = 0;
727 register int n = b_command(0,com,&shp->bltindata);
734 np = nv_bfsearch(com0, shp->bltin_tree, &nq, &cp);
736 if(shp->xargexit)
738 shp->xargmin -= command;
739 shp->xargmax -= command;
742 shp->xargmin = 0;
745 np = dtsearch(shp->fun_tree,np);
750 Dt_t *root = command?shp->bltin_tree:shp->fun_tree;
753 if(shp->namespace && !nq && !cp)
756 sfputr(stkp,nv_name(shp->namespace),-1);
767 if(shp->envlist = argp = t->com.comset)
784 if(!shp->st.var_local)
786 sh_scope(shp,(struct argnod*)0,0);
787 shp->st.var_local = shp->var_tree;
798 shp->typeinit = np;
807 else if(!shp->typeinit && (checkopt(com,'L') || checkopt(com,'R') || checkopt(com,'Z')))
812 shp->prefix = NV_CLASS;
817 if((shp->fn_depth && !shp->prefix) || np==SYSLOCAL)
831 if(np==shp->typeinit)
832 shp->typeinit = 0;
833 shp->envlist = argp;
837 last_table = shp->last_table;
838 shp->last_table = 0;
863 sh_redirect(shp,io,SH_SHOWME);
868 if(trap=shp->st.trap[SH_DEBUGTRAP])
870 int n = sh_debug(shp,trap,(char*)0,(char*)0, com, ARG_RAW);
871 if(n==255 && shp->fn_depth+shp->dot_depth)
884 sfsync(shp->outpool);
885 shp->lastpath = 0;
890 error_info.line = t->com.comline-shp->st.firstline;
891 if((np=nv_search(com0,shp->fun_tree,0)) && !np->nvalue.ip)
893 Namval_t *mp=nv_search(com0,shp->bltin_tree,0);
900 if((np=nv_search(com0,shp->track_tree,0)) && !nv_isattr(np,NV_NOALIAS) && np->nvalue.cp)
901 np=nv_search(nv_getval(np),shp->bltin_tree,0);
922 bp = &shp->bltindata;
956 type = (execflg && !shp->subshell && !shp->st.trapcom[0]);
957 sh_redirect(shp,io,type);
965 if(!shp->pwd)
967 if(shp->pwd)
975 save_prompt = shp->nextprompt;
976 shp->nextprompt = 0;
981 sh_scope(shp,argp,0);
987 shp->exitval = 0;
988 shp->bltinfun = funptr(np);
996 if(shp->subshell && nv_isattr(np,BLT_NOSFIO))
998 if(execflg && !shp->subshell &&
999 !shp->st.trapcom[0] && !shp->st.trap[SH_ERRTRAP] && shp->fn_depth==0 && !nv_isattr(np,BLT_ENV))
1003 for(fd=0; fd < shp->lim.open_max; fd++)
1004 if((shp->fdstatus[fd]&IOCLEX)&&fd!=shp->infd)
1008 shp->exitval = (*shp->bltinfun)(argn,com,(void*)bp);
1011 ((Shnode_t*)t)->com.comstate = shp->bltindata.data;
1013 if(!nv_isattr(np,BLT_EXIT) && shp->exitval!=SH_RUNPROG)
1014 shp->exitval &= SH_EXITMASK;
1024 if(shp->hist_ptr && item->strm == shp->hist_ptr->histfp)
1025 hist_close(shp->hist_ptr);
1030 if(shp->bltinfun && (error_info.flags&ERROR_NOTIFY))
1031 (*shp->bltinfun)(-2,com,(void*)bp);
1042 if(bp->nosfio && shp->pwd)
1048 chdir(shp->pwd);
1054 sfpool(sfstderr,shp->outpool,SF_WRITE);
1056 shp->nextprompt = save_prompt;
1061 shp->bltinfun = 0;
1071 sh_unscope(shp);
1075 if((shp->topfd>topfd) && !(shp->subshell && np==SYSEXEC))
1076 sh_iorestore(shp,topfd,jmpval);
1078 siglongjmp(*shp->jmplist,jmpval);
1083 if(shp->exitval >=0)
1102 np = nv_search(com0,shp->fun_tree,HASH_NOSCOPE);
1109 shp->exitval = ERROR_NOEXEC;
1114 shp->exitval = ERROR_NOENT;
1125 shp->last_table = last_table;
1126 mode = set_instance(shp,nq,&node,&nr);
1130 indx = shp->topfd;
1137 indx = sh_redirect(shp,io,execflg);
1138 sh_funct(shp,np,argn,com,t->com.comset,(flags&~OPTIMIZE_FLAG));
1145 sh_iorestore(shp,indx,jmpval);
1152 siglongjmp(*shp->jmplist,jmpval);
1168 if(shp->subshell)
1170 if(shp->subshare)
1176 !shp->st.trapcom[0] && !shp->st.trap[SH_ERRTRAP] &&
1177 ((struct checkpt*)shp->jmplist)->mode!=SH_JMPEVAL &&
1179 !shp->subshell && shp->fn_depth==0 &&
1182 if(sh_isstate(SH_PROFILE) || shp->dot_depth)
1209 coproc_init(shp,pipes);
1213 parent = sh_ntfork(shp,t,com,&jobid,ntflag);
1222 parent = sh_ntfork(shp,t,com,&jobid,ntflag);
1226 if((parent = sh_ntfork(shp,t,com,&jobid,ntflag))<=0)
1247 sh_close(shp->inpipe[0]);
1249 shp->bckpid = parent;
1252 if(shp->topfd > topfd)
1253 sh_iorestore(shp,topfd,0);
1256 if(!(shp->sigflag[SIGINT]&(SH_SIGFAULT|SH_SIGOFF)))
1258 shp->trapnote |= SH_SIGIGNORE;
1260 if(execflg && shp->subshell && !shp->subshare)
1262 shp->spid = parent;
1265 else if(shp->pipepid)
1266 shp->pipepid = parent;
1271 shp->trapnote &= ~SH_SIGIGNORE;
1272 if(shp->exitval == (SH_EXITSIG|SIGINT))
1308 if(!shp->st.ioset)
1322 sh_iorenumber(shp,shp->inpipe[0],0);
1324 sh_close(shp->inpipe[1]);
1328 sh_iorenumber(shp,shp->outpipe[1],1);
1329 sh_pclose(shp->outpipe);
1332 error_info.line = t->fork.forkline-shp->st.firstline;
1333 if(shp->topfd)
1334 sh_iounsave(shp);
1335 topfd = shp->topfd;
1336 sh_redirect(shp,t->tre.treio,1);
1337 if(shp->topfd > topfd)
1348 sh_iorestore(shp,topfd,SH_JMPCMD);
1349 sh_done(shp,(shp->exitval&SH_EXITSIG)?(shp->exitval&SH_EXITMASK):0);
1366 sh_freeup(shp);
1372 siglongjmp(*shp->jmplist,jmpval);
1373 sh_done(shp,0);
1387 if(shp->subshell)
1394 sh_iosave(shp,0,shp->topfd,(char*)0);
1395 shp->pipepid = simple;
1396 sh_iorenumber(shp,shp->inpipe[0],0);
1408 error_info.line = t->fork.forkline-shp->st.firstline;
1412 sh_redirect(shp,t->fork.forkio,execflg);
1417 sfsync(shp->outpool);
1419 sh_iorestore(shp,buff.topfd,jmpval);
1425 type = shp->exitval;
1429 if(shp->pipepid>1)
1431 job_wait(shp->pipepid);
1432 type = shp->exitval;
1437 shp->exitval = type;
1439 shp->pipepid = 0;
1440 shp->st.ioset = 0;
1448 siglongjmp(*shp->jmplist,jmpval);
1455 if(!shp->subshell && !shp->st.trapcom[0] && !shp->st.trap[SH_ERRTRAP] && (flags&sh_state(SH_NOFORK)))
1460 shp->st.otrapcom = 0;
1461 if((nsig=shp->st.trapmax*sizeof(char*))>0 || shp->st.trapcom[0])
1464 memcpy(savsig=malloc(nsig),(char*)&shp->st.trapcom[0],nsig);
1465 shp->st.otrapcom = (char**)savsig;
1474 siglongjmp(*shp->jmplist,jmpval);
1475 sh_done(shp,0);
1494 if(shp->subshell)
1496 if(shp->subshare)
1501 shp->inpipe = pvo;
1502 shp->outpipe = pvn;
1512 type = pipe_exec(shp,pvn,t->lst.lstlef, errorflg);
1530 shp->inpipe = pvn;
1531 shp->outpipe = 0;
1550 tcsetpgrp(JOBTTY,shp->pid);
1595 int jmpval = ((struct checkpt*)shp->jmplist)->mode;
1597 void *optlist = shp->optlist;
1598 shp->optlist = 0;
1605 error_info.line = t->for_.forline-shp->st.firstline;
1608 args=shp->st.dolv+1;
1609 nargs = shp->st.dolc;
1610 argsav=sh_arguse(shp);
1614 args=sh_argbuild(shp,&argn,tp,0);
1617 np = nv_open(t->for_.fornam, shp->var_tree,NV_NOASSIGN|NV_NOARRAY|NV_VARNAME|NV_NOREF);
1619 shp->st.loopcnt++;
1621 while(cp && shp->st.execbrk==0)
1633 save_prompt = shp->nextprompt;
1634 shp->nextprompt = 3;
1635 shp->timeout = 0;
1636 shp->exitval=sh_readline(shp,&nullptr,0,1,1000*shp->st.tmout);
1637 shp->nextprompt = save_prompt;
1638 if(shp->exitval||sfeof(sfstdin)||sferror(sfstdin))
1640 shp->exitval = 1;
1643 if(!(val=nv_getval(sh_scoped(shp,REPLYNOD))))
1672 if(trap=shp->st.trap[SH_DEBUGTRAP])
1679 sh_debug(shp,trap,(char*)0,(char*)0,av,0);
1685 if((cp=nv_getval(sh_scoped(shp,REPLYNOD))) && *cp==0)
1691 if(shp->st.breakcnt<0)
1692 shp->st.execbrk = (++shp->st.breakcnt !=0);
1698 sh_optclear(shp,optlist);
1700 siglongjmp(*shp->jmplist,jmpval);
1702 if(shp->st.breakcnt>0)
1703 shp->st.execbrk = (--shp->st.breakcnt !=0);
1704 shp->st.loopcnt--;
1705 sh_argfree(shp,argsav,0);
1720 int jmpval = ((struct checkpt*)shp->jmplist)->mode;
1722 void *optlist = shp->optlist;
1723 shp->optlist = 0;
1734 fd = sh_redirect(shp,tt->com.comio,3);
1741 shp->offsets[0] = -1;
1742 shp->offsets[1] = 0;
1747 shp->st.loopcnt++;
1748 while(shp->st.execbrk==0)
1753 if(!(shp->cur_line=sfgetr(iop,'\n',SF_STRING)))
1761 if(shp->st.breakcnt<0)
1762 shp->st.execbrk = (++shp->st.breakcnt !=0);
1764 if(shp->st.execbrk==0 && t->wh.whinc)
1769 shp->offsets[0] = -1;
1770 shp->offsets[1] = 0;
1778 sh_optclear(shp,optlist);
1780 siglongjmp(*shp->jmplist,jmpval);
1782 if(shp->st.breakcnt>0)
1783 shp->st.execbrk = (--shp->st.breakcnt !=0);
1784 shp->st.loopcnt--;
1785 shp->exitval= r;
1792 shp->cur_line = 0;
1801 error_info.line = t->ar.arline-shp->st.firstline;
1804 arg[1] = sh_macpat(shp,t->ar.arexpr,OPTIMIZE|ARG_ARITH);
1809 if(trap=shp->st.trap[SH_DEBUGTRAP])
1810 sh_debug(shp,trap,(char*)0, (char*)0, arg, ARG_ARITH);
1817 shp->exitval = !arith_exec((Arith_t*)t->ar.arcomp);
1819 shp->exitval = !sh_arith(arg[1]);
1829 shp->exitval=0; /* force zero exit for if-then-fi */
1835 char *trap, *r = sh_macpat(shp,tt->sw.swarg,OPTIMIZE);
1836 error_info.line = t->sw.swline-shp->st.firstline;
1838 if(trap=shp->st.trap[SH_DEBUGTRAP])
1845 sh_debug(shp,trap, (char*)0, (char*)0, av, 0);
1855 s = sh_macpat(shp,rex,OPTIMIZE|ARG_EXP);
1895 shp->exitval = !shp->exitval;
1926 at = shp->lim.clk_tck*(ta.tv_sec-tb.tv_sec);
1927 at += ((shp->lim.clk_tck*(((1000000L/2)/shp->lim.clk_tck)+(ta.tv_usec-tb.tv_usec)))/1000000L);
1934 Namval_t *np = nv_open("TIMEFORMAT",shp->var_tree,NV_NOADD);
1950 p_time(shp,sfstderr,sh_translate(format),tm);
1964 Namval_t *oldnspace = shp->namespace;
1966 long optindex = shp->st.optindex;
1971 np = nv_open(stkptr(stkp,offset),shp->var_base,NV_NOASSIGN|NV_NOARRAY|NV_VARNAME);
1973 shp->namespace = np;
1978 shp->st.optindex = 1;
1980 if(oldnspace && dtvnext(dtvnext(shp->var_tree)))
1981 top = dtview(shp->var_tree,0);
1982 else if(dtvnext(shp->var_tree))
1983 top = dtview(shp->var_tree,0);
1984 oldroot = shp->var_tree;
1985 dtview(root,shp->var_base);
1986 shp->var_tree = root;
1988 dtview(shp->var_tree,top);
1990 if(dtvnext(shp->var_tree))
1991 top = dtview(shp->var_tree,0);
1992 shp->var_tree = oldroot;
1994 dtview(top,shp->var_tree);
1995 shp->namespace = oldnspace;
1996 shp->st.optindex = optindex;
2001 error_info.line = t->funct.functline-shp->st.firstline;
2003 if(cp || shp->prefix)
2006 if(shp->prefix)
2008 cp = shp->prefix;
2009 shp->prefix = 0;
2010 npv = nv_open(cp,shp->var_tree,NV_NOASSIGN|NV_NOARRAY|NV_VARNAME);
2011 shp->prefix = cp;
2018 npv = nv_open(stkptr(stkp,offset),shp->var_tree,NV_NOASSIGN|NV_NOARRAY|NV_VARNAME);
2024 else if((np=nv_search(fname,shp->bltin_tree,0)) && nv_isattr(np,BLT_SPC))
2027 else if(shp->namespace)
2030 sfputr(stkp,nv_name(shp->namespace),-1);
2040 if(!shp->mktype)
2042 if(shp->typeinit)
2044 if(tp=nv_open(shp->typeinit->nvname,shp->typedict,NV_IDENT|NV_NOFAIL))
2060 if(shp->funload)
2069 np->nvalue.rp = new_of(struct Ufunction,shp->funload?sizeof(Dtlink_t):0);
2086 np->nvalue.rp->nspace = shp->namespace;
2088 np->nvalue.rp->fdict = shp->fun_tree;
2094 if(shp->funload)
2098 if(!shp->fpathdict)
2099 shp->fpathdict = dtopen(&_Rpdisc,Dtbag);
2100 if(shp->fpathdict)
2101 dtinsert(shp->fpathdict,rp);
2125 error_info.line = t->tst.tstline-shp->st.firstline;
2130 n = !shp->exitval;
2139 left = sh_macpat(shp,&(t->lst.lstlef->arg),OPTIMIZE);
2141 right = sh_macpat(shp,&(t->lst.lstrit->arg),((n==TEST_PEQ||n==TEST_PNE)?ARG_EXP:0)|OPTIMIZE);
2142 if(trap=shp->st.trap[SH_DEBUGTRAP])
2163 sh_debug(shp,trap,(char*)0,(char*)0,argv, 0);
2183 sh_debug(shp,trap,(char*)0,(char*)0,argv, pattern);
2198 shp->exitval = ((!n)^negate);
2204 if(shp->trapnote || (shp->exitval && sh_isstate(SH_ERREXIT)) &&
2213 sh_done(shp,0);
2214 if(shp->lastarg!= lastarg && shp->lastarg)
2215 free(shp->lastarg);
2219 shp->lastarg = strcpy(lastarg,comn);
2224 shp->lastarg = strdup(comn);
2236 if(shp->trapnote&SH_SIGSET)
2237 sh_exit(SH_EXITSIG|shp->lastsig);
2245 return(shp->exitval);
2300 Shell_t *shp = &sh;
2309 if(!(cp=nv_getval(sh_scoped(shp,PS4NOD))))
2314 cp = sh_mactry(shp,cp);
2333 if(decl && shp->prefix && cp!=argv0 && *cp!='-')
2336 cp = shp->prefix;
2338 sfputr(sfstderr,shp->prefix,'.');
2375 Shell_t *shp = &sh;
2404 shp->nforks++;
2428 shp->cpid = parent;
2448 if(shp->trapnote&SH_SIGTERM)
2450 shp->nforks=0;
2478 shp->login_sh = 0;
2482 if (shp->fn_reset)
2483 shp->fn_depth = shp->fn_reset = 0;
2491 shp->subshell = 0;
2492 if((flags&FAMP) && shp->coutpipe>1)
2493 sh_close(shp->coutpipe);
2494 sig = shp->savesig;
2495 shp->savesig = 0;
2555 register Shell_t *shp = &sh;
2557 struct sh_scoped savst, *prevscope = shp->st.self;
2564 Namval_t *nspace = shp->namespace;
2565 Dt_t *last_root = shp->last_root;
2566 Shopt_t options = shp->options;
2567 if(shp->fn_depth==0)
2568 shp->glob_options = shp->options;
2570 shp->options = shp->glob_options;
2572 shp->st.lineno = error_info.line;
2574 *prevscope = shp->st;
2576 shp->st.prevst = prevscope;
2577 shp->st.self = &savst;
2578 shp->topscope = (Shscope_t*)shp->st.self;
2579 shp->st.opterror = shp->st.optchar = 0;
2580 shp->st.optindex = 1;
2581 shp->st.loopcnt = 0;
2585 shp->st.real_fun = (fp->node)->nvalue.rp;
2588 prevscope->save_tree = shp->var_tree;
2589 sh_scope(shp,envlist,1);
2590 if(dtvnext(prevscope->save_tree)!= (shp->namespace?shp->var_base:0))
2595 shp->st.save_tree = shp->var_tree;
2604 if((np=(fp->node)->nvalue.rp->nspace) && np!=shp->namespace)
2606 Dt_t *dt = shp->var_tree;
2609 shp->var_tree = nv_dict(np);
2610 shp->namespace = np;
2614 shp->st.cmdname = argv[0];
2616 if((nsig=shp->st.trapmax*sizeof(char*))>0 || shp->st.trapcom[0])
2619 memcpy(savstak=stakalloc(nsig),(char*)&shp->st.trapcom[0],nsig);
2622 argsav = sh_argnew(shp,argv,&saveargfor);
2626 shp->st.var_local = shp->var_tree;
2630 shp->st.filename = fp->node->nvalue.rp->fname;
2631 shp->st.funname = nv_name(fp->node);
2632 nv_putval(SH_PATHNAMENOD,shp->st.filename,NV_NOFREE);
2633 nv_putval(SH_FUNNAMENOD,shp->st.funname,NV_NOFREE);
2637 if(shp->fn_depth++ > MAXDEPTH)
2639 shp->toomany = 1;
2640 siglongjmp(*shp->jmplist,SH_JMPERRFN);
2647 r = shp->exitval;
2650 if(--shp->fn_depth==1 && jmpval==SH_JMPERRFN)
2653 if (shp->st.self != &savst)
2654 shp->var_tree = (Dt_t*)savst.save_tree;
2655 sh_unscope(shp);
2656 shp->namespace = nspace;
2657 shp->var_tree = (Dt_t*)prevscope->save_tree;
2658 if(shp->topscope != (Shscope_t*)shp->st.self)
2659 sh_setscope(shp->topscope);
2660 sh_argreset(shp,argsav,saveargfor);
2661 trap = shp->st.trapcom[0];
2662 shp->st.trapcom[0] = 0;
2664 if (shp->st.self != &savst)
2665 *shp->st.self = shp->st;
2666 shp->st = *prevscope;
2667 shp->topscope = (Shscope_t*)prevscope;
2668 nv_getval(sh_scoped(shp,IFSNOD));
2670 memcpy((char*)&shp->st.trapcom[0],savstak,nsig);
2671 shp->trapnote=0;
2674 shp->options = options;
2675 shp->last_root = last_root;
2677 siglongjmp(*shp->jmplist,jmpval);
2683 if(shp->exitval > SH_EXITSIG)
2684 sh_fault(shp->exitval&SH_EXITMASK);
2688 siglongjmp(*shp->jmplist,jmpval);
2693 static void sh_funct(Shell_t *shp,Namval_t *np,int argn, char *argv[],struct argnod *envlist,int execflg)
2698 int level, pipepid=shp->pipepid;
2699 shp->pipepid = 0;
2703 if((struct sh_scoped*)shp->topscope != shp->st.self)
2704 sh_setscope(shp->topscope);
2705 level = lp->maxlevel = shp->dot_depth + shp->fn_depth+1;
2707 shp->st.lineno = error_info.line;
2711 int loopcnt = shp->st.loopcnt;
2712 shp->posix_fun = np;
2715 shp->st.funname = nv_name(np);
2719 shp->st.loopcnt = 0;
2720 b_dot_cmd(argn+1,argv-1,&shp->bltindata);
2721 shp->st.loopcnt = loopcnt;
2738 nv_putval(SH_FUNNAMENOD,shp->st.funname,NV_NOFREE);
2742 nv_putval(SH_PATHNAMENOD,shp->st.filename,NV_NOFREE);
2743 shp->pipepid = pipepid;
2753 Shell_t *shp = &sh;
2759 char *prefix = shp->prefix;
2766 shp->prefix = 0;
2776 mode = set_instance(shp,nq,&node, &nr);
2800 sh_funct(shp,np,n,argv,(struct argnod*)0,sh_isstate(SH_ERREXIT));
2806 shp->prefix = prefix;
2827 static void coproc_init(Shell_t *shp, int pipes[])
2830 if(shp->coutpipe>=0 && shp->cpid)
2832 shp->cpid = 0;
2833 if(shp->cpipe[0]<=0 || shp->cpipe[1]<=0)
2836 sh_pclose(shp->cpipe);
2837 sh_pipe(shp->cpipe);
2838 if((outfd=shp->cpipe[1]) < 10)
2840 int fd=fcntl(shp->cpipe[1],F_DUPFD,10);
2843 shp->fdstatus[fd] = (shp->fdstatus[outfd]&~IOCLEX);
2845 shp->fdstatus[outfd] = IOCLOSE;
2846 shp->cpipe[1] = fd;
2849 if(fcntl(*shp->cpipe,F_SETFD,FD_CLOEXEC)>=0)
2850 shp->fdstatus[shp->cpipe[0]] |= IOCLEX;
2851 shp->fdptrs[shp->cpipe[0]] = shp->cpipe;
2853 if(fcntl(shp->cpipe[1],F_SETFD,FD_CLOEXEC) >=0)
2854 shp->fdstatus[shp->cpipe[1]] |= IOCLEX;
2856 shp->outpipe = shp->cpipe;
2857 sh_pipe(shp->inpipe=pipes);
2858 shp->coutpipe = shp->inpipe[1];
2859 shp->fdptrs[shp->coutpipe] = &shp->coutpipe;
2860 if(fcntl(shp->outpipe[0],F_SETFD,FD_CLOEXEC)>=0)
2861 shp->fdstatus[shp->outpipe[0]] |= IOCLEX;
2976 static pid_t sh_ntfork(Shell_t *shp,const Shnode_t *t,char *argv[],int *jobid,int flag)
3023 if(!np && path && !nv_search(path,shp->fun_tree,0))
3034 if(!shp->st.ioset)
3036 sh_iosave(shp,0,buff.topfd,(char*)0);
3037 sh_iorenumber(shp,sh_chkopen(e_devnull),0);
3042 int fd = shp->inpipe[1];
3043 sh_iosave(shp,0,buff.topfd,(char*)0);
3044 sh_iorenumber(shp,shp->inpipe[0],0);
3046 shp->fdstatus[fd] |= IOCLEX;
3050 sh_iosave(shp,1,buff.topfd,(char*)0);
3051 sh_iorenumber(shp,sh_dup(shp->outpipe[1]),1);
3052 if(fcntl(shp->outpipe[0],F_SETFD,FD_CLOEXEC)>=0)
3053 shp->fdstatus[shp->outpipe[0]] |= IOCLEX;
3057 sh_redirect(shp,t->fork.forkio,0);
3091 if((otype&FPIN) && (!(otype&FPOU) || (otype&FCOOP)) && fcntl(shp->inpipe[1],F_SETFD,FD_CLOEXEC)>=0)
3092 shp->fdstatus[shp->inpipe[1]] &= ~IOCLEX;
3094 sh_iorestore(shp,buff.topfd,jmpval);
3114 siglongjmp(*shp->jmplist,jmpval);
3117 sh_close(shp->coutpipe);
3118 sh_close(shp->cpipe[1]);
3119 shp->cpipe[1] = -1;
3120 shp->coutpipe = -1;
3122 shp->exitval = 0;
3138 sh_redirect(shp,t->com.comio,0);
3143 sh_scope(shp,t->com.comset,0);
3148 if((np=nv_search(path,shp->track_tree,0)) && !nv_isattr(np,NV_NOALIAS) && np->nvalue.cp)
3152 path = stkptr(shp->stk,PATH_OFFSET);
3153 stkfreeze(shp->stk,0);
3176 shp->exitval = 0;
3214 if(!shp->shpath)
3215 shp->shpath = pathshell();
3216 spawnpid = path_spawn(shp->shpath,&argv[-1],arge,pp,(grp<<1)|1);
3222 if(spawnpid < 0) switch(errno=shp->path_err)
3246 sh_unscope(shp);
3251 sh_iorestore(shp,buff.topfd,jmpval);
3253 siglongjmp(*shp->jmplist,jmpval);