diff options
Diffstat (limited to 'shells/v7sh/files/patch-xec.c')
-rw-r--r-- | shells/v7sh/files/patch-xec.c | 657 |
1 files changed, 657 insertions, 0 deletions
diff --git a/shells/v7sh/files/patch-xec.c b/shells/v7sh/files/patch-xec.c new file mode 100644 index 000000000000..4a793954cfe7 --- /dev/null +++ b/shells/v7sh/files/patch-xec.c @@ -0,0 +1,657 @@ +diff -u -x CVS -x work -x core -x *.core -x #* -x *~ -x *.orig -x *.rej -I $Id.*$ -I $.+BSD.*$ xec.c.orig xec.c +--- xec.c.orig Fri Jun 4 02:51:03 2004 ++++ xec.c Sat Jun 19 18:42:25 2004 +@@ -12,29 +12,36 @@ + + LOCAL INT parent; + +-SYSTAB commands; +- ++INT ioset; ++STRING pcsadr; ++INT loopcnt; ++INT breakcnt; ++BOOL execbrk; + + + /* ======== command execution ========*/ + + +-execute(argt, execflg, pf1, pf2) ++INT execute(argt, execflg, pf1, pf2) + TREPTR argt; ++ INT execflg; + INT *pf1, *pf2; + { + /* `stakbot' is preserved by this routine */ + REG TREPTR t; + STKPTR sav=savstak(); ++#if defined(SYSIII) ++ INT bltflg=0; ++#endif + + sigchk(); + + IF (t=argt) ANDF execbrk==0 + THEN REG INT treeflgs; + INT oldexit, type; +- REG STRING *com; ++ REG STRING *com=NIL; /* GCC */ + +- treeflgs = t->tretyp; type = treeflgs&COMMSK; ++ treeflgs = t->treio.tretyp; type = treeflgs&COMMSK; + oldexit=exitval; exitval=0; + + SWITCH type IN +@@ -42,16 +49,20 @@ + case TCOM: + BEGIN + STRING a1; +- INT argn, internal; ++ INT argn, internal=0; /* GCC */ + ARGPTR schain=gchain; +- IOPTR io=t->treio; ++ IOPTR io=t->treio.treio; + gchain=0; +- argn = getarg(t); ++ argn = getarg((COMPTR) t); + com=scan(argn); + a1=com[1]; gchain=schain; + ++#ifdef RENO ++ IF argn==0 ORF (internal=syslook(com[0],commands)) ++#else /* V7 */ + IF (internal=syslook(com[0],commands)) ORF argn==0 +- THEN setlist(t->comset, 0); ++#endif ++ THEN setlist(t->comnod.comset, 0); + FI + + IF argn ANDF (flags&noexec)==0 +@@ -71,44 +82,77 @@ + + IF (f=pathopen(getpath(a1), a1)) < 0 + THEN failed(a1,notfound); ++ /*NOTREACHED*/ + ELSE execexp(0,f); + FI + FI + break; + + case SYSTIMES: +- { +- L_INT t[4]; times(t); +- prt(t[2]); blank(); prt(t[3]); newline(); +- } ++ BEGIN ++ TIMEBUF timeb; times(&timeb); ++ prt(((CLOCK *)&timeb)[2]); blank(); ++ prt(((CLOCK *)&timeb)[3]); newline(); ++ END + break; + + case SYSEXIT: ++#if defined(SYSIII) ++ flags |= forked; /* force exit */ ++#endif + exitsh(a1?stoi(a1):oldexit); ++ /*NOTREACHED*/ + + case SYSNULL: + io=0; + break; + + case SYSCONT: ++#if defined(ULTRIX) ++ IF loopcnt ++ THEN execbrk = breakcnt = 1; ++ IF a1 ++ THEN breakcnt = stoi(a1) FI ++ breakcnt = breakcnt > loopcnt ? ++ loopcnt : -breakcnt; ++ FI ++ break; ++#elif defined(SYSIII) ++ IF (execbrk=-loopcnt)!=0 ANDF a1 ++ THEN breakcnt=stoi(a1); ++ FI ++ break; ++#else /* V7 */ + execbrk = -loopcnt; break; ++#endif + + case SYSBREAK: +- IF (execbrk=loopcnt) ANDF a1 ++#if defined(ULTRIX) ++ IF loopcnt ++ THEN execbrk = breakcnt = 1; ++ IF a1 ++ THEN breakcnt = stoi(a1) FI ++ IF breakcnt > loopcnt ++ THEN breakcnt = loopcnt FI ++ FI ++#else /* V7 */ ++ IF (execbrk=loopcnt)!=0 ANDF a1 /*GCC*/ + THEN breakcnt=stoi(a1); + FI ++#endif + break; + + case SYSTRAP: + IF a1 + THEN BOOL clear; +- IF (clear=digit(*a1))==0 ++ IF (clear=digit((INT) *a1))==0 + THEN ++com; + FI + WHILE *++com + DO INT i; + IF (i=stoi(*com))>=MAXTRAP ORF i<MINTRAP + THEN failed(*com,badtrap); ++ /*NOTREACHED*/ + ELIF clear + THEN clrsig(i); + ELSE replace(&trapcom[i],a1); +@@ -133,41 +177,67 @@ + com++; + initio(io); ioset=0; io=0; + IF a1==0 THEN break FI ++ /*FALLTHROUGH*/ + + case SYSLOGIN: ++#if !defined(SYSIII) + flags |= forked; ++#endif + oldsigs(); execa(com); done(); +- ++ /*NOTREACHED*/ ++#if defined(SYSIII) ++ case SYSNEWGRP: ++ IF flags&rshflg ++ THEN failed(com[0],restricted); ++ /*NOTREACHED*/ ++ ELSE /* force bad exec to terminate shell */ ++ flags |= forked; ++ oldsigs(); execa(com); done(); ++ /*NOTREACHED*/ ++ FI ++#endif + case SYSCD: + IF flags&rshflg + THEN failed(com[0],restricted); ++ /*NOTREACHED*/ ++#if defined(SYSIII) ++ ELIF (argn >2) ++ THEN failed(com[0],argcount); ++ /*NOTREACHED*/ ++#endif + ELIF (a1==0 ANDF (a1=homenod.namval)==0) ORF chdir(a1)<0 + THEN failed(a1,baddir); ++ /*NOTREACHED*/ + FI + break; + + case SYSSHFT: + IF dolc<1 + THEN error(badshift); ++ /*NOTREACHED*/ + ELSE dolv++; dolc--; + FI + assnum(&dolladr, dolc); + break; + + case SYSWAIT: ++#if defined(SYSIII) ++ await(a1?stoi(a1):-1,1); ++#else /* V7 */ + await(-1); ++#endif + break; + + case SYSREAD: ++#if defined(SYSIII) ++ rwait=1; ++#endif + exitval=readvar(&com[1]); ++#if defined(SYSIII) ++ rwait=0; ++#endif + break; + +-/* +- case SYSTST: +- exitval=testcmd(com); +- break; +-*/ +- + case SYSSET: + IF a1 + THEN INT argc; +@@ -175,7 +245,7 @@ + IF argc>1 + THEN setargs(com+argn-argc); + FI +- ELIF t->comset==0 ++ ELIF ((COMPTR) t)->comset==0 + THEN /*scan name chain and print*/ + namscan(printnam); + FI +@@ -183,6 +253,8 @@ + + case SYSRDONLY: + exitval=N_RDONLY; ++ /*FALLTHROUGH*/ ++ + case SYSXPORT: + IF exitval==0 THEN exitval=N_EXPORT; FI + +@@ -196,48 +268,120 @@ + + case SYSEVAL: + IF a1 +- THEN execexp(a1,&com[2]); ++ THEN execexp(a1,(UFD) &com[2]); + FI + break; +- ++#if defined(ULTRIX) ++ case SYSULIMIT: ++ BEGIN ++ LONG i = 0; ++ INT command = 2; ++ ++ IF **++com == '-' ++ THEN IF *(*com+1) != 'f' ++ THEN error(badopt) FI ++ com++; ++ FI ++ IF *com ++ THEN WHILE **com >= '0' && **com <= '9' ++ DO i *= 10; ++ i += **com - '0'; ++ IF i < 0 ++ THEN error(badulimit) FI ++ (*com)++; ++ OD ++ IF **com ++ THEN error(badulimit) FI ++ ELSE command--; ++ FI ++ i = ulimit(command,i); ++ IF i < 0 THEN error(badulimit) FI ++ IF command == i ++ THEN prl(i); newline(); FI ++ END ++ break; ++#endif + case SYSUMASK: +- if (a1) { +- int c, i ++ IF a1 ++ THEN INT c, i; + i = 0; +- while ((c = *a1++) >= '0' && ++ WHILE ((c = *a1++) >= '0' ANDF + c <= '7') +- i = (i << 3) + c - '0'; ++ DO i = (i << 3) + c - '0'; ++ OD + umask(i); +- } else { +- int i, j; ++ ELSE MODE i; INT j; + umask(i = umask(0)); + prc('0'); +- for (j = 6; j >= 0; j -= 3) +- prc(((i>>j)&07) + '0'); ++ FOR j = 6; j >= 0; j -= 3 ++ DO prc(((i>>j)&07) + '0'); ++ OD + newline(); +- } ++ FI + break; + + default: ++#if defined(SYSIII) ++ IF (internal=syslook(com[0],builtins))>0 ++ THEN builtin(internal, argn, com); ++ bltflg=1; ++ FI ++#else /* V7 */ + internal=builtin(argn,com); +- ++#endif + ENDSW + + IF internal ++#if defined(SYSIII) ++ THEN IF io ANDF !bltflg ++ THEN error(illegal); ++ /*NOTREACHED*/ ++ FI ++#else /* V7 */ + THEN IF io THEN error(illegal) FI ++#endif + chktrap(); + break; + FI +- ELIF t->treio==0 ++ ELIF t->treio.treio==0 ++#if defined(SYSIII) ++ THEN chktrap(); ++ break; ++#else /* V7 */ + THEN break; ++#endif + FI + END ++ /*FALLTHROUGH*/ + + case TFORK: + IF execflg ANDF (treeflgs&(FAMP|FPOU))==0 + THEN parent=0; ++#if defined(SYSIII) ++ ELSE UINT forkcnt=1; ++ /* FORKLIM is the max period between forks - ++ power of 2 usually. Currently shell tries ++ after 2,4,8,16, and 32 seconds and then quits */ ++ WHILE (parent=fork()) == -1 ++ DO IF (forkcnt=(forkcnt*2)) > FORKLIM /* 32 */ ++ THEN SWITCH errno IN ++ case ENOMEM: ++ error(noswap); ++ /*NOTREACHED*/ ++ break; ++ default: ++ /* case EAGAIN: */ ++ error(nofork); ++ /*NOTREACHED*/ ++ break; ++ ENDSW ++ FI ++ sigchk(); alarm(forkcnt); pause(); ++ OD ++#else /* V7 */ + ELSE WHILE (parent=fork()) == -1 + DO sigchk(); alarm(10); pause() OD ++#endif + FI + + IF parent +@@ -248,7 +392,11 @@ + FI + IF treeflgs&FPCL THEN closepipe(pf1) FI + IF (treeflgs&(FAMP|FPOU))==0 ++#if defined(SYSIII) ++ THEN await(parent,0); ++#else /* V7 */ + THEN await(parent); ++#endif + ELIF (treeflgs&FAMP)==0 + THEN post(parent); + ELSE assnum(&pcsadr, parent); +@@ -268,7 +416,8 @@ + /* except for those `lost' by trap */ + oldsigs(); + IF treeflgs&FINT +- THEN signal(INTR,1); signal(QUIT,1); ++ THEN signal(INTR,SIG_IGN); ++ signal(QUIT,SIG_IGN); + FI + + /* pipe in or out */ +@@ -287,111 +436,203 @@ + FI + + /* io redirection */ +- initio(t->treio); ++ initio(t->treio.treio); + IF type!=TCOM +- THEN execute(t->forktre,1); ++ THEN execute(t->forknod.forktre,1,0,0); + ELIF com[0]!=ENDARGS +- THEN setlist(t->comset,N_EXPORT); ++ THEN setlist(t->comnod.comset,N_EXPORT); + execa(com); + FI + done(); ++ /*NOTREACHED*/ + FI + + case TPAR: + rename(dup(2),output); +- execute(t->partre,execflg); ++ execute(t->parnod.partre,execflg,0,0); + done(); ++ /*NOTREACHED*/ + + case TFIL: + BEGIN + INT pv[2]; chkpipe(pv); +- IF execute(t->lstlef, 0, pf1, pv)==0 +- THEN execute(t->lstrit, execflg, pv, pf2); ++ IF execute(t->lstnod.lstlef, 0, pf1, pv)==0 ++ THEN execute(t->lstnod.lstrit, execflg, pv, pf2); + ELSE closepipe(pv); + FI + END + break; + + case TLST: +- execute(t->lstlef,0); +- execute(t->lstrit,execflg); ++ execute(t->lstnod.lstlef,0,0,0); ++ execute(t->lstnod.lstrit,execflg,0,0); + break; + + case TAND: +- IF execute(t->lstlef,0)==0 +- THEN execute(t->lstrit,execflg); ++ IF execute(t->lstnod.lstlef,0,0,0)==0 ++ THEN execute(t->lstnod.lstrit,execflg,0,0); + FI + break; + + case TORF: +- IF execute(t->lstlef,0)!=0 +- THEN execute(t->lstrit,execflg); ++ IF execute(t->lstnod.lstlef,0,0,0)!=0 ++ THEN execute(t->lstnod.lstrit,execflg,0,0); + FI + break; + + case TFOR: ++ /* for.. do */ + BEGIN +- NAMPTR n = lookup(t->fornam); ++ NAMPTR n = lookup(t->fornod.fornam); + STRING *args; + DOLPTR argsav=0; + +- IF t->forlst==0 ++ IF t->fornod.forlst==0 + THEN args=dolv+1; + argsav=useargs(); + ELSE ARGPTR schain=gchain; + gchain=0; +- trim((args=scan(getarg(t->forlst)))[0]); ++ trim((args=scan(getarg(t->fornod.forlst)))[0]); + gchain=schain; + FI + loopcnt++; ++#if defined(SYSIII) ++ WHILE *args!=ENDARGS ANDF execbrk<=0 ++#else /* V7 */ + WHILE *args!=ENDARGS ANDF execbrk==0 ++#endif + DO assign(n,*args++); +- execute(t->fortre,0); ++ execute(t->fornod.fortre,0,0,0); ++#if defined(ULTRIX) ++ IF breakcnt < 0 ++ THEN execbrk = (++breakcnt != 0) FI ++#elif defined(SYSIII) ++ IF execbrk ++ THEN IF breakcnt > 1 ORF execbrk > 0 ++ THEN break; ++ ELSE execbrk = breakcnt = 0; ++ FI ++ FI ++#else /* V7 */ + IF execbrk<0 THEN execbrk=0 FI ++#endif + OD ++#if defined(ULTRIX) ++ IF breakcnt > 0 ++ THEN execbrk = (--breakcnt != 0) FI ++ loopcnt--; ++#else /* V7 */ + IF breakcnt THEN breakcnt-- FI ++#if defined(SYSIII) ++ execbrk = (execbrk < 0 ? -breakcnt : breakcnt); ++ loopcnt--; ++#else /* V7 */ + execbrk=breakcnt; loopcnt--; +- argfor=freeargs(argsav); ++#endif ++#endif ++ argfor=(DOLPTR) freeargs(argsav); + END + break; + + case TWH: ++ /* while.. do */ + case TUN: ++ /* do.. until */ + BEGIN + INT i=0; ++#if defined(RENO) ++ INT saveflg; + ++ saveflg = flags&errflg; ++#endif + loopcnt++; +- WHILE execbrk==0 ANDF (execute(t->whtre,0)==0)==(type==TWH) +- DO i=execute(t->dotre,0); ++#if defined(RENO) ++#if defined(SYSIII) ++ WHILE execbrk<=0 ++#else /* RENO */ ++ WHILE execbrk==0 ++#endif ++ DO flags &= ~errflg; ++ i=execute(t->whnod.whtre,0,0,0); ++ flags |= saveflg; ++ IF (i==0)!=(type==TWH) THEN break FI ++ i=execute(t->whnod.dotre,0,0,0); ++#else /* V7 */ ++ WHILE execbrk==0 ANDF (execute(t->whnod.whtre,0,0,0)==0)==(type==TWH) ++ DO (i=execute(t->whnod.dotre,0,0,0))!=0; /* GCC */ ++#endif ++#if defined(ULTRIX) ++ IF breakcnt < 0 ++ THEN execbrk = (++breakcnt != 0) FI ++#elif defined(SYSIII) ++ IF execbrk ++ THEN IF breakcnt > 1 ORF execbrk > 0 ++ THEN break; ++ ELSE execbrk = breakcnt = 0; ++ FI ++ FI ++#else /* V7 */ + IF execbrk<0 THEN execbrk=0 FI ++#endif + OD ++#if defined(ULTRIX) ++ IF breakcnt > 0 ++ THEN execbrk = (--breakcnt != 0) FI ++ loopcnt--; exitval= i; ++#else /* V7 */ + IF breakcnt THEN breakcnt-- FI ++#if defined(SYSIII) ++ execbrk = (execbrk < 0 ? -breakcnt : breakcnt); ++ loopcnt--; exitval= i; ++#else /* V7 */ + execbrk=breakcnt; loopcnt--; exitval=i; ++#endif ++#endif + END + break; + + case TIF: +- IF execute(t->iftre,0)==0 +- THEN execute(t->thtre,execflg); +- ELSE execute(t->eltre,execflg); +- FI ++#if RENO ++ BEGIN ++ INT i, saveflg; ++ ++ saveflg = flags&errflg; ++ flags &= ~errflg; ++ i=execute(t->ifnod.iftre,0,0,0); ++ flags |= saveflg; ++ IF i==0 ++#else /* V7 */ ++ IF execute(t->ifnod.iftre,0,0,0)==0 ++#endif ++ THEN execute(t->ifnod.thtre,execflg,0,0); ++#if defined(SYSIII) ++ ELIF t->ifnod.eltre ++ THEN execute(t->ifnod.eltre,execflg,0,0); ++ ELSE exitval=0; /* force zero exit for if-then-fi */ ++#else /* V7 */ ++ ELSE execute(t->ifnod.eltre,execflg,0,0); ++#endif ++ FI ++#if RENO ++ END ++#endif + break; + + case TSW: + BEGIN +- REG STRING r = mactrim(t->swarg); +- t=t->swlst; +- WHILE t +- DO ARGPTR rex=t->regptr; ++ REG STRING r = mactrim(t->swnod.swarg); ++ REG REGPTR eg = t->swnod.swlst; ++ WHILE eg ++ DO ARGPTR rex=eg->regptr; + WHILE rex + DO REG STRING s; + IF gmatch(r,s=macro(rex->argval)) ORF (trim(s), eq(r,s)) +- THEN execute(t->regcom,0); ++ THEN execute(eg->regcom,0,0,0); + t=0; break; + ELSE rex=rex->argnxt; + FI + OD +- IF t THEN t=t->regnxt FI ++ IF eg THEN eg=eg->regnxt FI + OD + END + break; +@@ -405,17 +646,17 @@ + } + + +-execexp(s,f) ++VOID execexp(s,f) + STRING s; + UFD f; + { + FILEBLK fb; + push(&fb); + IF s +- THEN estabf(s); fb.feval=f; ++ THEN estabf(s); fb.feval=(STRING *)f; + ELIF f>=0 + THEN initf(f); + FI +- execute(cmd(NL, NLFLG|MTFLG),0); ++ execute(cmd(NL, NLFLG|MTFLG),0,0,0); + pop(); + } |