summaryrefslogtreecommitdiff
path: root/shells/v7sh/files/patch-main.c
diff options
context:
space:
mode:
Diffstat (limited to 'shells/v7sh/files/patch-main.c')
-rw-r--r--shells/v7sh/files/patch-main.c251
1 files changed, 251 insertions, 0 deletions
diff --git a/shells/v7sh/files/patch-main.c b/shells/v7sh/files/patch-main.c
new file mode 100644
index 000000000000..ebc7b24377c9
--- /dev/null
+++ b/shells/v7sh/files/patch-main.c
@@ -0,0 +1,251 @@
+diff -u -x CVS -x work -x core -x *.core -x #* -x *~ -x *.orig -x *.rej -I $Id.*$ -I $.+BSD.*$ main.c.orig main.c
+--- main.c.orig Fri Jun 4 02:51:01 2004
++++ main.c Sat Jun 19 18:42:23 2004
+@@ -8,30 +8,43 @@
+ */
+
+ #include "defs.h"
+-#include "dup.h"
+ #include "sym.h"
+ #include "timeout.h"
+-#include <sys/types.h>
+-#include <sys/stat.h>
+-#include <sgtty.h>
+-
+-UFD output = 2;
+-LOCAL BOOL beenhere = FALSE;
+-CHAR tmpout[20] = "/tmp/sh-";
+-FILEBLK stdfile;
+-FILE standin = &stdfile;
++#include "pathnames.h"
++#ifdef stupid
+ #include <execargs.h>
++#endif
+
+-PROC VOID exfile();
++LOCAL VOID exfile(BOOL);
++LOCAL VOID Ldup(INT, INT);
+
++LOCAL BOOL beenhere = FALSE;
++LOCAL FILEBLK stdfile;
+
++UFD output = 2;
++CHAR tmpout[20] = _PATH_TMPOUT;
++STRING tmpnam;
++FILEPTR standin = &stdfile;
++INT dolc;
++STRING *dolv;
++STRING dolladr;
++STRING cmdadr;
++STRING pidadr;
++STRING comdiv;
++INT flags;
++INT serial;
++jmp_buf subshell;
++jmp_buf errshell;
+
+
+-main(c, v)
++INT main(c, v)
+ INT c;
+ STRING v[];
+ {
+ REG INT rflag=ttyflg;
++#if defined(SYSIII)
++ INT rsflag=1; /* local restricted flag */
++#endif
+
+ /* initialise storage allocation */
+ stdsigs();
+@@ -39,42 +52,72 @@
+ addblok((POS)0);
+
+ /* set names from userenv */
++#if !defined(SYSIII)
+ getenv();
++#else /* SYSIII */
++ /* 'rsflag' is non-zero if SHELL variable is
++ set in environment and contains an 'r' in
++ the simple file part of the value. */
++ rsflag=getenv();
+
+ /* look for restricted */
+-/* IF c>0 ANDF any('r', *v) THEN rflag=0 FI */
+-
++ /* a shell is also restricted if argv(0) has
++ an 'r' in its simple name */
++ IF c>0 ANDF any('r', simple(*v)) THEN rflag=0 FI
++#endif
+ /* look for options */
++ /* dolc is $# */
+ dolc=options(c,v);
+ IF dolc<2 THEN flags |= stdflg FI
++#if defined(SYSIII)
++ IF dolc < 2
++ THEN REG STRING flagc = flagadr;
++ WHILE *flagc DO flagc++ OD
++ *flagc = STDFLG;
++ FI
++#endif
+ IF (flags&stdflg)==0
+ THEN dolc--;
+ FI
+ dolv=v+c-dolc; dolc--;
+
+ /* return here for shell file execution */
++ /* but not for parenthesis subshells */
+ setjmp(subshell);
+
+- /* number of positional parameters */
++ /* number of positional parameters '$#' */
+ assnum(&dolladr,dolc);
++ /* comadr is $0 */
+ cmdadr=dolv[0];
+
+- /* set pidname */
++ /* set pidname '$$' */
+ assnum(&pidadr, getpid());
+
+ /* set up temp file names */
+ settmp();
+
+- /* default ifs */
++ /* default internal field separators - $IFS */
+ dfault(&ifsnod, sptbnl);
+
+ IF (beenhere++)==FALSE
+ THEN /* ? profile */
++#if defined(SYSIII)
++ IF *simple(cmdadr) == '-'
++ THEN IF (input=pathopen(nullstr, sysprofile))>=0
++ THEN exfile(rflag); /* file exists */
++ FI
++ IF (input=pathopen(homenod.namenv, profile))>=0
++ THEN exfile(rflag); flags &= ~ttyflg;
++ FI
++ FI
++ IF rsflag==0 ORF rflag==0 THEN flags |= rshflg FI
++#else /* V7 */
+ IF *cmdadr=='-'
+ ANDF (input=pathopen(nullstr, profile))>=0
+ THEN exfile(rflag); flags &= ~ttyflg;
+ FI
+ IF rflag==0 THEN flags |= rshflg FI
++#endif
+
+ /* open input file if specified */
+ IF comdiv
+@@ -82,18 +125,22 @@
+ ELSE input=((flags&stdflg) ? 0 : chkopen(cmdadr));
+ comdiv--;
+ FI
+- ELSE *execargs=dolv; /* for `ps' cmd */
++#ifdef stupid
++ ELSE *execargs=(STRING) dolv; /* for `ps' cmd */
++#endif
+ FI
+
+ exfile(0);
+ done();
++ /*NOTREACHED*/
++ return(exitval); /* GCC */
+ }
+
+ LOCAL VOID exfile(prof)
+-BOOL prof;
++ BOOL prof;
+ {
+- REG L_INT mailtime = 0;
+- REG INT userid;
++ REG TIME mailtime = 0;
++ REG UID userid;
+ struct stat statb;
+
+ /* move input */
+@@ -108,10 +155,14 @@
+ output=OTIO;
+ FI
+
++#if defined(SYSIII)
++ userid=geteuid();
++#else /* V7 */
+ userid=getuid();
++#endif
+
+ /* decide whether interactive */
+- IF (flags&intflg) ORF ((flags&oneflg)==0 ANDF gtty(output,&statb)==0 ANDF gtty(input,&statb)==0)
++ IF (flags&intflg) ORF ((flags&oneflg)==0 ANDF isatty(output) ANDF isatty(input))
+ THEN dfault(&ps1nod, (userid?stdprompt:supprompt));
+ dfault(&ps2nod, readmsg);
+ flags |= ttyflg|prompt; ignsig(KILL);
+@@ -132,43 +183,63 @@
+ exitset();
+ IF (flags&prompt) ANDF standin->fstak==0 ANDF !eof
+ THEN IF mailnod.namval
++#if defined(SYSIII)
++ THEN IF stat(mailnod.namval,&statb)>=0
++ THEN IF statb.st_size
++ ANDF mailtime
++ ANDF (statb.st_mtime != mailtime)
++ THEN prs(mailmsg)
++ FI
++ mailtime=statb.st_mtime;
++ ELIF mailtime==0
++ THEN mailtime=1
++ FI
++ FI
++#else /* V7 */
+ ANDF stat(mailnod.namval,&statb)>=0 ANDF statb.st_size
+ ANDF (statb.st_mtime != mailtime)
+ ANDF mailtime
+ THEN prs(mailmsg)
+ FI
+ mailtime=statb.st_mtime;
++#endif
++#if TIMEOUT > 0
+ prs(ps1nod.namval); alarm(TIMEOUT); flags |= waiting;
++#else /* !TIMEOUT */
++ prs(ps1nod.namval);
++#endif
+ FI
+
+ trapnote=0; peekc=readc();
+ IF eof
+ THEN return;
+ FI
++#if TIMEOUT > 0
+ alarm(0); flags &= ~waiting;
+- execute(cmd(NL,MTFLG),0);
++#endif
++ execute(cmd(NL,MTFLG),0,0,0);
+ eof |= (flags&oneflg);
+ POOL
+ }
+
+-chkpr(eor)
+-char eor;
++VOID chkpr(eor)
++ INT eor;
+ {
+ IF (flags&prompt) ANDF standin->fstak==0 ANDF eor==NL
+ THEN prs(ps2nod.namval);
+ FI
+ }
+
+-settmp()
++VOID settmp()
+ {
+ itos(getpid()); serial=0;
+ tmpnam=movstr(numbuf,&tmpout[TMPNAM]);
+ }
+
+-Ldup(fa, fb)
++LOCAL VOID Ldup(fa, fb)
+ REG INT fa, fb;
+ {
+- dup(fa|DUPFLG, fb);
++ dup2(fa, fb);
+ close(fa);
+- ioctl(fb, FIOCLEX, 0);
++ fcntl(fb, F_SETFD, FD_CLOEXEC);
+ }