|
|
1.1 ! root 1: #ifndef lint ! 2: static char sccsid[] = "@(#)main.c 2.12 (Berkeley) 8/11/83"; ! 3: #endif ! 4: ! 5: #include "rcv.h" ! 6: #include <sys/stat.h> ! 7: ! 8: /* ! 9: * Mail -- a mail program ! 10: * ! 11: * Startup -- interface with user. ! 12: */ ! 13: ! 14: jmp_buf hdrjmp; ! 15: ! 16: /* ! 17: * Find out who the user is, copy his mail file (if exists) into ! 18: * /tmp/Rxxxxx and set up the message pointers. Then, print out the ! 19: * message headers and read user commands. ! 20: * ! 21: * Command line syntax: ! 22: * Mail [ -i ] [ -r address ] [ -h number ] [ -f [ name ] ] ! 23: * or: ! 24: * Mail [ -i ] [ -r address ] [ -h number ] people ... ! 25: */ ! 26: ! 27: main(argc, argv) ! 28: char **argv; ! 29: { ! 30: register char *ef; ! 31: register int i, argp; ! 32: int mustsend, uflag, hdrstop(), (*prevint)(), f; ! 33: FILE *ibuf, *ftat; ! 34: extern char _sobuf[]; ! 35: struct sgttyb tbuf; ! 36: ! 37: #ifdef signal ! 38: Siginit(); ! 39: #endif ! 40: ! 41: /* ! 42: * Set up a reasonable environment. We clobber the last ! 43: * element of argument list for compatibility with version 6, ! 44: * figure out whether we are being run interactively, set up ! 45: * all the temporary files, buffer standard output, and so forth. ! 46: */ ! 47: ! 48: uflag = 0; ! 49: argv[argc] = (char *) -1; ! 50: #ifdef GETHOST ! 51: inithost(); ! 52: #endif GETHOST ! 53: mypid = getpid(); ! 54: intty = isatty(0); ! 55: outtty = isatty(1); ! 56: if (outtty) { ! 57: gtty(1, &tbuf); ! 58: baud = tbuf.sg_ospeed; ! 59: } ! 60: else ! 61: baud = B9600; ! 62: image = -1; ! 63: setbuf(stdout, _sobuf); ! 64: ! 65: /* ! 66: * Now, determine how we are being used. ! 67: * We successively pick off instances of -r, -h, -f, and -i. ! 68: * If called as "rmail" we note this fact for letter sending. ! 69: * If there is anything left, it is the base of the list ! 70: * of users to mail to. Argp will be set to point to the ! 71: * first of these users. ! 72: */ ! 73: ! 74: ef = NOSTR; ! 75: argp = -1; ! 76: mustsend = 0; ! 77: if (argc > 0 && **argv == 'r') ! 78: rmail++; ! 79: for (i = 1; i < argc; i++) { ! 80: ! 81: /* ! 82: * If current argument is not a flag, then the ! 83: * rest of the arguments must be recipients. ! 84: */ ! 85: ! 86: if (*argv[i] != '-') { ! 87: argp = i; ! 88: break; ! 89: } ! 90: switch (argv[i][1]) { ! 91: case 'r': ! 92: /* ! 93: * Next argument is address to be sent along ! 94: * to the mailer. ! 95: */ ! 96: if (i >= argc - 1) { ! 97: fprintf(stderr, "Address required after -r\n"); ! 98: exit(1); ! 99: } ! 100: mustsend++; ! 101: rflag = argv[i+1]; ! 102: i++; ! 103: break; ! 104: ! 105: case 'T': ! 106: /* ! 107: * Next argument is temp file to write which ! 108: * articles have been read/deleted for netnews. ! 109: */ ! 110: if (i >= argc - 1) { ! 111: fprintf(stderr, "Name required after -T\n"); ! 112: exit(1); ! 113: } ! 114: Tflag = argv[i+1]; ! 115: if ((f = creat(Tflag, 0600)) < 0) { ! 116: perror(Tflag); ! 117: exit(1); ! 118: } ! 119: close(f); ! 120: i++; ! 121: break; ! 122: ! 123: case 'u': ! 124: /* ! 125: * Next argument is person to pretend to be. ! 126: */ ! 127: uflag++; ! 128: if (i >= argc - 1) { ! 129: fprintf(stderr, "Missing user name for -u\n"); ! 130: exit(1); ! 131: } ! 132: strcpy(myname, argv[i+1]); ! 133: i++; ! 134: break; ! 135: ! 136: case 'i': ! 137: /* ! 138: * User wants to ignore interrupts. ! 139: * Set the variable "ignore" ! 140: */ ! 141: assign("ignore", ""); ! 142: break; ! 143: ! 144: case 'd': ! 145: debug++; ! 146: break; ! 147: ! 148: case 'h': ! 149: /* ! 150: * Specified sequence number for network. ! 151: * This is the number of "hops" made so ! 152: * far (count of times message has been ! 153: * forwarded) to help avoid infinite mail loops. ! 154: */ ! 155: if (i >= argc - 1) { ! 156: fprintf(stderr, "Number required for -h\n"); ! 157: exit(1); ! 158: } ! 159: mustsend++; ! 160: hflag = atoi(argv[i+1]); ! 161: if (hflag == 0) { ! 162: fprintf(stderr, "-h needs non-zero number\n"); ! 163: exit(1); ! 164: } ! 165: i++; ! 166: break; ! 167: ! 168: case 's': ! 169: /* ! 170: * Give a subject field for sending from ! 171: * non terminal ! 172: */ ! 173: if (i >= argc - 1) { ! 174: fprintf(stderr, "Subject req'd for -s\n"); ! 175: exit(1); ! 176: } ! 177: mustsend++; ! 178: sflag = argv[i+1]; ! 179: i++; ! 180: break; ! 181: ! 182: case 'f': ! 183: /* ! 184: * User is specifying file to "edit" with Mail, ! 185: * as opposed to reading system mailbox. ! 186: * If no argument is given after -f, we read his ! 187: * mbox file in his home directory. ! 188: */ ! 189: if (i >= argc - 1) ! 190: ef = mbox; ! 191: else ! 192: ef = argv[i + 1]; ! 193: i++; ! 194: break; ! 195: ! 196: case 'n': ! 197: /* ! 198: * User doesn't want to source /usr/lib/Mail.rc ! 199: */ ! 200: nosrc++; ! 201: break; ! 202: ! 203: case 'N': ! 204: /* ! 205: * Avoid initial header printing. ! 206: */ ! 207: noheader++; ! 208: break; ! 209: ! 210: case 'v': ! 211: /* ! 212: * Send mailer verbose flag ! 213: */ ! 214: assign("verbose", ""); ! 215: break; ! 216: ! 217: default: ! 218: fprintf(stderr, "Unknown flag: %s\n", argv[i]); ! 219: exit(1); ! 220: } ! 221: } ! 222: ! 223: /* ! 224: * Check for inconsistent arguments. ! 225: */ ! 226: ! 227: if (ef != NOSTR && argp != -1) { ! 228: fprintf(stderr, "Cannot give -f and people to send to.\n"); ! 229: exit(1); ! 230: } ! 231: if (mustsend && argp == -1) { ! 232: fprintf(stderr, "The flags you gave make no sense since you're not sending mail.\n"); ! 233: exit(1); ! 234: } ! 235: tinit(); ! 236: input = stdin; ! 237: rcvmode = argp == -1; ! 238: if (!nosrc) ! 239: load(MASTER); ! 240: load(mailrc); ! 241: if (argp != -1) { ! 242: mail(&argv[argp]); ! 243: ! 244: /* ! 245: * why wait? ! 246: */ ! 247: ! 248: exit(senderr); ! 249: } ! 250: ! 251: /* ! 252: * Ok, we are reading mail. ! 253: * Decide whether we are editing a mailbox or reading ! 254: * the system mailbox, and open up the right stuff. ! 255: */ ! 256: ! 257: if (ef != NOSTR) { ! 258: char *ename; ! 259: ! 260: edit++; ! 261: ename = expand(ef); ! 262: if (ename != ef) { ! 263: ef = (char *) calloc(1, strlen(ename) + 1); ! 264: strcpy(ef, ename); ! 265: } ! 266: editfile = ef; ! 267: strcpy(mailname, ef); ! 268: } ! 269: if (setfile(mailname, edit) < 0) { ! 270: if (edit) ! 271: perror(mailname); ! 272: else ! 273: fprintf(stderr, "No mail for %s\n", myname); ! 274: exit(1); ! 275: } ! 276: if (!edit && !noheader && value("noheader") == NOSTR) { ! 277: if (setjmp(hdrjmp) == 0) { ! 278: if ((prevint = sigset(SIGINT, SIG_IGN)) != SIG_IGN) ! 279: sigset(SIGINT, hdrstop); ! 280: announce(!0); ! 281: fflush(stdout); ! 282: sigset(SIGINT, prevint); ! 283: } ! 284: } ! 285: if (edit) ! 286: newfileinfo(); ! 287: if (!edit && msgCount == 0) { ! 288: printf("No mail\n"); ! 289: fflush(stdout); ! 290: exit(0); ! 291: } ! 292: commands(); ! 293: if (!edit) { ! 294: sigset(SIGHUP, SIG_IGN); ! 295: sigset(SIGINT, SIG_IGN); ! 296: sigset(SIGQUIT, SIG_IGN); ! 297: quit(); ! 298: } ! 299: exit(0); ! 300: } ! 301: ! 302: /* ! 303: * Interrupt printing of the headers. ! 304: */ ! 305: hdrstop() ! 306: { ! 307: ! 308: clrbuf(stdout); ! 309: printf("\nInterrupt\n"); ! 310: fflush(stdout); ! 311: longjmp(hdrjmp, 1); ! 312: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.