1: # 2: 3: #include "rcv.h" 4: #include <sys/stat.h> 5: 6: /* 7: * Mail -- a mail program 8: * 9: * Startup -- interface with user. 10: */ 11: 12: static char *SccsId = "@(#)main.c 2.11 6/12/83"; 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: sigrelse(SIGINT); 312: longjmp(hdrjmp, 1); 313: }