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