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