|
|
1.1 ! root 1: /* @(#)main.c 1.7 */ ! 2: /* ! 3: * UNIX shell ! 4: * ! 5: * Bell Telephone Laboratories ! 6: * ! 7: */ ! 8: ! 9: #include "defs.h" ! 10: #include "sym.h" ! 11: #include "timeout.h" ! 12: #include <sys/types.h> ! 13: #include <sys/stat.h> ! 14: #include <sgtty.h> ! 15: ! 16: static BOOL beenhere = FALSE; ! 17: char tmpout[20] = "/tmp/sh-"; ! 18: struct fileblk stdfile; ! 19: struct fileblk *standin = &stdfile; ! 20: ! 21: static int mailchk = 180; ! 22: static char *mailp; ! 23: static long mod_time = 0; ! 24: ! 25: #ifdef pdp11 ! 26: #include <execargs.h> ! 27: #endif ! 28: ! 29: static int exfile(); ! 30: extern char *simple(); ! 31: ! 32: ! 33: ! 34: main(c, v, e) ! 35: int c; ! 36: char *v[]; ! 37: char *e[]; ! 38: { ! 39: stdsigs(); ! 40: ! 41: /* ! 42: * initialise storage allocation ! 43: */ ! 44: ! 45: stakbot = 0; ! 46: addblok((unsigned)0); ! 47: ! 48: /* ! 49: * set names from userenv ! 50: */ ! 51: ! 52: setup_env(); ! 53: ! 54: /* ! 55: * look for options ! 56: * dolc is $# ! 57: */ ! 58: dolc = options(c, v); ! 59: ! 60: if (dolc < 2) ! 61: { ! 62: flags |= stdflg; ! 63: { ! 64: register char *flagc = flagadr; ! 65: ! 66: while (*flagc) ! 67: flagc++; ! 68: *flagc++ = STDFLG; ! 69: *flagc = 0; ! 70: } ! 71: } ! 72: if ((flags & stdflg) == 0) ! 73: dolc--; ! 74: dolv = v + c - dolc; ! 75: dolc--; ! 76: ! 77: /* ! 78: * return here for shell file execution ! 79: * but not for parenthesis subshells ! 80: */ ! 81: setjmp(subshell); ! 82: ! 83: /* ! 84: * number of positional parameters ! 85: */ ! 86: replace(&cmdadr, dolv[0]); /* cmdadr is $0 */ ! 87: ! 88: /* ! 89: * set pidname '$$' ! 90: */ ! 91: assnum(&pidadr, getpid()); ! 92: ! 93: /* ! 94: * set up temp file names ! 95: */ ! 96: settmp(); ! 97: ! 98: /* ! 99: * default internal field separators - $IFS ! 100: */ ! 101: dfault(&ifsnod, sptbnl); ! 102: ! 103: if ((beenhere++) == FALSE) /* ? profile */ ! 104: { ! 105: if ((flags&protflg)==0 && *(simple(cmdadr)) == '-') ! 106: { ! 107: if ((input = pathopen(nullstr, profile)) >= 0) ! 108: { ! 109: exfile(ttyflg); ! 110: flags &= ~ttyflg; ! 111: } ! 112: } ! 113: /* ! 114: * open input file if specified ! 115: */ ! 116: if (comdiv) ! 117: { ! 118: estabf(comdiv); ! 119: input = -1; ! 120: } ! 121: else ! 122: { ! 123: input = ((flags & stdflg) ? 0 : chkopen(cmdadr)); ! 124: ! 125: #ifdef ACCT ! 126: if (input != 0) ! 127: preacct(cmdadr); ! 128: #endif ! 129: comdiv--; ! 130: } ! 131: } ! 132: #ifdef pdp11 ! 133: else ! 134: *execargs = (char *)dolv; /* for `ps' cmd */ ! 135: #endif ! 136: ! 137: exfile(0); ! 138: done(); ! 139: } ! 140: ! 141: static int ! 142: exfile(prof) ! 143: BOOL prof; ! 144: { ! 145: long mailtime = 0; /* Must not be a register variable */ ! 146: long curtime = 0; ! 147: register int userid; ! 148: ! 149: /* ! 150: * move input ! 151: */ ! 152: if (input > 0) ! 153: { ! 154: Ldup(input, INIO); ! 155: input = INIO; ! 156: } ! 157: ! 158: userid = geteuid(); ! 159: ! 160: /* ! 161: * decide whether interactive ! 162: */ ! 163: if ((flags & intflg) || ! 164: ((flags&oneflg) == 0 && ! 165: isatty(output) && ! 166: isatty(input)) ) ! 167: ! 168: { ! 169: dfault(&ps1nod, (userid ? stdprompt : supprompt)); ! 170: dfault(&ps2nod, readmsg); ! 171: flags |= ttyflg | prompt; ! 172: ignsig(SIGTERM); ! 173: setmail(mailnod.namval.val); ! 174: } ! 175: else ! 176: { ! 177: flags |= prof; ! 178: flags &= ~prompt; ! 179: } ! 180: ! 181: if (setjmp(errshell) && prof) ! 182: { ! 183: close(input); ! 184: return; ! 185: } ! 186: /* ! 187: * error return here ! 188: */ ! 189: ! 190: loopcnt = peekc = peekn = 0; ! 191: fndef = 0; ! 192: iopend = 0; ! 193: ! 194: if (input >= 0) ! 195: initf(input); ! 196: /* ! 197: * command loop ! 198: */ ! 199: for (;;) ! 200: { ! 201: tdystak((char *)0); ! 202: stakchk(); /* may reduce sbrk */ ! 203: exitset(); ! 204: ! 205: if ((flags & prompt) && standin->fstak == 0 && !eof) ! 206: { ! 207: ! 208: if (mailp) ! 209: { ! 210: time(&curtime); ! 211: ! 212: if ((curtime - mailtime) >= mailchk) ! 213: { ! 214: chkmail(); ! 215: mailtime = curtime; ! 216: } ! 217: } ! 218: ! 219: prs(ps1nod.namval.val); ! 220: ! 221: #ifdef TIME_OUT ! 222: alarm(TIMEOUT); ! 223: #endif ! 224: ! 225: flags |= waiting; ! 226: } ! 227: ! 228: trapnote = 0; ! 229: peekc = readc(); ! 230: if (eof) ! 231: return; ! 232: ! 233: #ifdef TIME_OUT ! 234: alarm(0); ! 235: #endif ! 236: ! 237: flags &= ~waiting; ! 238: ! 239: execute(cmd(NL, MTFLG), 0, eflag); ! 240: eof |= (flags & oneflg); ! 241: } ! 242: } ! 243: ! 244: chkpr() ! 245: { ! 246: if ((flags & prompt) && standin->fstak == 0) ! 247: prs(ps2nod.namval.val); ! 248: } ! 249: ! 250: settmp() ! 251: { ! 252: itos(getpid()); ! 253: serial = 0; ! 254: tmpname = movstr(numbuf, &tmpout[TMPNAM]); ! 255: } ! 256: ! 257: Ldup(fa, fb) ! 258: register int fa, fb; ! 259: { ! 260: ! 261: #ifndef SYSV ! 262: dup2(fa, fb); ! 263: close(fa); ! 264: ioctl(fb, FIOCLEX, 0); ! 265: #else ! 266: if (fa >= 0) ! 267: { close(fb); ! 268: fcntl(fa,0,fb); /* normal dup */ ! 269: close(fa); ! 270: fcntl(fb, 2, 1); /* autoclose for fb */ ! 271: } ! 272: #endif ! 273: } ! 274: ! 275: ! 276: chkmail() ! 277: { ! 278: struct stat statb; ! 279: ! 280: if (mailp && stat(mailp, &statb) >= 0) ! 281: { ! 282: if(statb.st_size && mod_time ! 283: && statb.st_mtime != mod_time) ! 284: { ! 285: prs(mailmsg); ! 286: } ! 287: mod_time = statb.st_mtime; ! 288: } ! 289: else if (mod_time == 0) ! 290: mod_time = 1; ! 291: } ! 292: ! 293: ! 294: setmail(mailpath) ! 295: char *mailpath; ! 296: { ! 297: ! 298: if (mailp = mailpath) ! 299: mod_time=0; ! 300: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.