|
|
1.1 ! root 1: #ident "@(#)main.c 1.6 'attmail mail(1) command'" ! 2: #ident "@(#)mailx:main.c 1.13.3.1" ! 3: /* Copyright (c) 1984 AT&T */ ! 4: /* All Rights Reserved */ ! 5: ! 6: /* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T */ ! 7: /* The copyright notice above does not evidence any */ ! 8: /* actual or intended publication of such source code. */ ! 9: ! 10: #ident "@(#)mailx:main.c 1.13.1.2" ! 11: ! 12: #include "rcv.h" ! 13: #ifndef preSVr4 ! 14: #include <locale.h> ! 15: #endif ! 16: ! 17: /* ! 18: * mailx -- a modified version of a University of California at Berkeley ! 19: * mail program ! 20: * ! 21: * Startup -- interface with user. ! 22: */ ! 23: ! 24: static void hdrstop(); ! 25: ! 26: static jmp_buf hdrjmp; ! 27: ! 28: /* ! 29: * Find out who the user is, copy his mail file (if exists) into ! 30: * /tmp/Rxxxxx and set up the message pointers. Then, print out the ! 31: * message headers and read user commands. ! 32: * ! 33: * Command line syntax: ! 34: * mailx [ -i ] [ -r address ] [ -h number ] [ -f [ name ] ] ! 35: * or: ! 36: * mailx [ -i ] [ -r address ] [ -h number ] people ... ! 37: * ! 38: * and a bunch of other options. ! 39: */ ! 40: ! 41: main(argc, argv) ! 42: char **argv; ! 43: { ! 44: register char *ef; ! 45: register int argp; ! 46: int mustsend, uflag, f, goerr = 0; ! 47: void (*prevint)(); ! 48: /* struct termio tbuf; adb */ ! 49: int c; ! 50: char *cwd, *mf; ! 51: ! 52: /* ! 53: * Set up a reasonable environment. ! 54: * Figure out whether we are being run interactively, set up ! 55: * all the temporary files, buffer standard output, and so forth. ! 56: */ ! 57: ! 58: #ifndef preSVr4 ! 59: /* (void)setlocale(LC_ALL, ""); */ ! 60: #endif ! 61: #ifdef SIGCONT ! 62: # ifdef preSVr4 ! 63: sigset(SIGCONT, SIG_DFL); ! 64: # else ! 65: { ! 66: struct sigaction nsig; ! 67: nsig.sa_handler = SIG_DFL; ! 68: sigemptyset(&nsig.sa_mask); ! 69: nsig.sa_flags = SA_RESTART; ! 70: (void) sigaction(SIGCONT, &nsig, (struct sigaction*)0); ! 71: } ! 72: # endif ! 73: #endif ! 74: progname = argv[0]; ! 75: uflag = 0; ! 76: myegid = getegid(); ! 77: myrgid = getgid(); ! 78: myeuid = geteuid(); ! 79: myruid = getuid(); ! 80: mypid = getpid(); ! 81: setgid(myrgid); ! 82: setuid(myruid); ! 83: inithost(); ! 84: intty = isatty(0); ! 85: baud = getbaud(); /* adb */ ! 86: image = -1; ! 87: ! 88: /* ! 89: * Now, determine how we are being used. ! 90: * We successively pick off instances of -r, -h, -f, and -i. ! 91: * If called as "rmail" we note this fact for letter sending. ! 92: * If there is anything left, it is the base of the list ! 93: * of users to mail to. Argp will be set to point to the ! 94: * first of these users. ! 95: */ ! 96: ! 97: ef = NOSTR; ! 98: argp = -1; ! 99: mustsend = 0; ! 100: if (argc > 0 && **argv == 'r') ! 101: rmail++; ! 102: while ((c = getopt(argc, argv, "efFh:HinNr:s:u:UdIT:V")) != EOF) ! 103: switch (c) { ! 104: case 'e': ! 105: /* ! 106: * exit status only ! 107: */ ! 108: exitflg++; ! 109: break; ! 110: ! 111: case 'r': ! 112: /* ! 113: * Next argument is address to be sent along ! 114: * to the mailer. ! 115: */ ! 116: mustsend++; ! 117: rflag = optarg; ! 118: break; ! 119: ! 120: case 'T': ! 121: /* ! 122: * Next argument is temp file to write which ! 123: * articles have been read/deleted for netnews. ! 124: */ ! 125: Tflag = optarg; ! 126: if ((f = creat(Tflag, TEMPPERM)) < 0) { ! 127: perror(Tflag); ! 128: exit(1); ! 129: } ! 130: close(f); ! 131: /* fall through for -I too */ ! 132: /* FALLTHROUGH */ ! 133: ! 134: case 'I': ! 135: /* ! 136: * print newsgroup in header summary ! 137: */ ! 138: newsflg++; ! 139: break; ! 140: ! 141: case 'u': ! 142: /* ! 143: * Next argument is person to pretend to be. ! 144: */ ! 145: uflag++; ! 146: strncpy(myname, optarg, PATHSIZE); ! 147: break; ! 148: ! 149: case 'i': ! 150: /* ! 151: * User wants to ignore interrupts. ! 152: * Set the variable "ignore" ! 153: */ ! 154: assign("ignore", ""); ! 155: break; ! 156: ! 157: case 'U': ! 158: UnUUCP++; ! 159: break; ! 160: ! 161: case 'd': ! 162: assign("debug", ""); ! 163: break; ! 164: ! 165: case 'h': ! 166: /* ! 167: * Specified sequence number for network. ! 168: * This is the number of "hops" made so ! 169: * far (count of times message has been ! 170: * forwarded) to help avoid infinite mail loops. ! 171: */ ! 172: mustsend++; ! 173: hflag = atoi(optarg); ! 174: if (hflag == 0) { ! 175: fprintf(stderr, "-h needs non-zero number\n"); ! 176: goerr++; ! 177: } ! 178: break; ! 179: ! 180: case 's': ! 181: /* ! 182: * Give a subject field for sending from ! 183: * non terminal ! 184: */ ! 185: mustsend++; ! 186: sflag = optarg; ! 187: break; ! 188: ! 189: case 'f': ! 190: /* ! 191: * User is specifying file to "edit" with mailx, ! 192: * as opposed to reading system mailbox. ! 193: * If no argument is given after -f, we read his/her ! 194: * $MBOX file or mbox in his/her home directory. ! 195: */ ! 196: ef = (argc == optind || *argv[optind] == '-') ! 197: ? "" : argv[optind++]; ! 198: if (*ef && *ef != '/' && *ef != '+') ! 199: cwd = getcwd(NOSTR, PATHSIZE); ! 200: break; ! 201: ! 202: case 'F': ! 203: Fflag++; ! 204: mustsend++; ! 205: break; ! 206: ! 207: case 'n': ! 208: /* ! 209: * User doesn't want to source ! 210: * /etc/mail/mailx.rc ! 211: */ ! 212: nosrc++; ! 213: break; ! 214: ! 215: case 'N': ! 216: /* ! 217: * Avoid initial header printing. ! 218: */ ! 219: noheader++; ! 220: break; ! 221: ! 222: case 'H': ! 223: /* ! 224: * Print headers and exit ! 225: */ ! 226: Hflag++; ! 227: break; ! 228: ! 229: case 'V': ! 230: puts(version); ! 231: return 0; ! 232: ! 233: case '?': ! 234: default: ! 235: goerr++; ! 236: break; ! 237: } ! 238: ! 239: if ( optind != argc ) ! 240: argp = optind; ! 241: ! 242: /* ! 243: * Check for inconsistent arguments. ! 244: */ ! 245: ! 246: if (newsflg && ef==NOSTR) { ! 247: fprintf(stderr, "Need -f with -I flag\n"); ! 248: goerr++; ! 249: } ! 250: if (ef != NOSTR && argp != -1) { ! 251: fprintf(stderr, "Cannot give -f and people to send to.\n"); ! 252: goerr++; ! 253: } ! 254: if (exitflg && (mustsend || argp != -1)) ! 255: exit(1); /* nonsense flags involving -e simply exit */ ! 256: if (mustsend && argp == -1) { ! 257: fprintf(stderr, "The flags you gave are used only when sending mail.\n"); ! 258: goerr++; ! 259: } ! 260: if (goerr) { ! 261: fprintf(stderr,"Usage: %s -eiIUdFnNHV -T FILE -u USER -h hops -r address -s SUBJECT -f FILE users\n", progname); ! 262: exit(1); ! 263: } ! 264: tinit(); ! 265: input = stdin; ! 266: rcvmode = argp == -1; ! 267: if (!nosrc) ! 268: load(MASTER); ! 269: load(Getf("MAILRC")); ! 270: check_environment(); ! 271: ! 272: if (argp != -1) { ! 273: mail(&argv[argp]); ! 274: exit(senderr); ! 275: } ! 276: ! 277: /* ! 278: * Ok, we are reading mail. ! 279: * Decide whether we are editing a mailbox or reading ! 280: * the system mailbox, and open up the right stuff. ! 281: */ ! 282: ! 283: strcpy(origname, mailname); ! 284: ! 285: if (ef != NOSTR) { ! 286: edit++; ! 287: ef = *ef ? expand(ef) : Getf("MBOX"); ! 288: strcpy(origname, ef); ! 289: if (ef[0] != '/') { ! 290: if (cwd == NOSTR) ! 291: cwd = getcwd(NOSTR, PATHSIZE); ! 292: strcat(cwd, "/"); ! 293: strcat(cwd, ef); ! 294: ef = cwd; ! 295: } ! 296: strcpy(mailname, ef); ! 297: editfile = ef; ! 298: } ! 299: ! 300: if (setfile(mailname, edit) < 0) ! 301: exit(1); ! 302: ! 303: if (msgCount > 0 && !noheader && value("header") != NOSTR) { ! 304: if (setjmp(hdrjmp) == 0) { ! 305: if ((prevint = sigset(SIGINT, SIG_IGN)) != (void (*)())SIG_IGN) /* adb */ ! 306: sigset(SIGINT, hdrstop); ! 307: announce(); ! 308: fflush(stdout); ! 309: sigset(SIGINT, prevint); ! 310: } ! 311: } ! 312: if (Hflag || (!edit && msgCount == 0)) { ! 313: if (!Hflag) ! 314: fprintf(stderr, "No mail for %s\n", myname); ! 315: fflush(stdout); ! 316: exit(0); ! 317: } ! 318: commands(); ! 319: if (!edit) { ! 320: sigset(SIGHUP, SIG_IGN); ! 321: sigset(SIGINT, SIG_IGN); ! 322: sigset(SIGQUIT, SIG_IGN); ! 323: quit(); ! 324: Verhogen(); ! 325: } ! 326: exit(0); ! 327: /* NOTREACHED */ ! 328: } ! 329: ! 330: /* ! 331: * Interrupt printing of the headers. ! 332: */ ! 333: static void ! 334: hdrstop() ! 335: { ! 336: ! 337: clrbuf(stdout); ! 338: printf("\nInterrupt\n"); ! 339: fflush(stdout); ! 340: sigrelse(SIGINT); ! 341: longjmp(hdrjmp, 1); ! 342: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.