|
|
1.1 ! root 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: /* ! 13: * Find out who the user is, copy his mail file (if exists) into ! 14: * /tmp/Rxxxxx and set up the message pointers. Then, print out the ! 15: * message headers and read user commands. ! 16: * ! 17: * Command line syntax: ! 18: * Mail [ -i ] [ -r address ] [ -h number ] [ -f [ name ] ] ! 19: * or: ! 20: * Mail [ -i ] [ -r address ] [ -h number ] people ... ! 21: */ ! 22: ! 23: main(argc, argv) ! 24: char **argv; ! 25: { ! 26: register char *ef; ! 27: register int i, argp; ! 28: int mustsend, uflag; ! 29: FILE *ibuf, *ftat; ! 30: extern char tempMesg[], _sobuf[]; ! 31: ! 32: #ifdef signal ! 33: Siginit(); ! 34: #endif ! 35: ! 36: /* ! 37: * Set up a reasonable environment. We clobber the last ! 38: * element of argument list for compatibility with version 6, ! 39: * figure out whether we are being run interactively, set up ! 40: * all the temporary files, buffer standard output, and so forth. ! 41: */ ! 42: ! 43: uflag = 0; ! 44: argv[argc] = (char *) -1; ! 45: mypid = getpid(); ! 46: intty = isatty(0); ! 47: outtty = isatty(1); ! 48: image = -1; ! 49: setbuf(stdout, _sobuf); ! 50: ! 51: /* ! 52: * Now, determine how we are being used. ! 53: * We successively pick off instances of -r, -h, -f, and -i. ! 54: * If called as "rmail" we note this fact for letter sending. ! 55: * If there is anything left, it is the base of the list ! 56: * of users to mail to. Argp will be set to point to the ! 57: * first of these users. ! 58: */ ! 59: ! 60: ef = NOSTR; ! 61: argp = -1; ! 62: mustsend = 0; ! 63: if (argc > 0 && **argv == 'r') ! 64: rmail++; ! 65: for (i = 1; i < argc; i++) { ! 66: ! 67: /* ! 68: * If current argument is not a flag, then the ! 69: * rest of the arguments must be recipients. ! 70: */ ! 71: ! 72: if (*argv[i] != '-') { ! 73: argp = i; ! 74: break; ! 75: } ! 76: switch (argv[i][1]) { ! 77: case 'r': ! 78: /* ! 79: * Next argument is address to be sent along ! 80: * to the mailer. ! 81: */ ! 82: if (i >= argc - 1) { ! 83: fprintf(stderr, "Address required after -r\n"); ! 84: exit(1); ! 85: } ! 86: mustsend++; ! 87: rflag = argv[i+1]; ! 88: i++; ! 89: break; ! 90: ! 91: case 'u': ! 92: /* ! 93: * Next argument is person to pretend to be. ! 94: */ ! 95: uflag++; ! 96: if (i >= argc - 1) { ! 97: fprintf(stderr, "You obviously dont know what you're doing\n"); ! 98: exit(1); ! 99: } ! 100: strcpy(myname, argv[i+1]); ! 101: i++; ! 102: break; ! 103: ! 104: case 'i': ! 105: /* ! 106: * User wants to ignore interrupts. ! 107: * Set the variable "ignore" ! 108: */ ! 109: assign("ignore", ""); ! 110: break; ! 111: ! 112: case 'd': ! 113: debug++; ! 114: break; ! 115: ! 116: case 'h': ! 117: /* ! 118: * Specified sequence number for network. ! 119: * This is the number of "hops" made so ! 120: * far (count of times message has been ! 121: * forwarded) to help avoid infinite mail loops. ! 122: */ ! 123: if (i >= argc - 1) { ! 124: fprintf(stderr, "Number required for -h\n"); ! 125: exit(1); ! 126: } ! 127: mustsend++; ! 128: hflag = atoi(argv[i+1]); ! 129: if (hflag == 0) { ! 130: fprintf(stderr, "-h needs non-zero number\n"); ! 131: exit(1); ! 132: } ! 133: i++; ! 134: break; ! 135: ! 136: case 's': ! 137: /* ! 138: * Give a subject field for sending from ! 139: * non terminal ! 140: */ ! 141: if (i >= argc - 1) { ! 142: fprintf(stderr, "Subject req'd for -s\n"); ! 143: exit(1); ! 144: } ! 145: mustsend++; ! 146: sflag = argv[i+1]; ! 147: i++; ! 148: break; ! 149: ! 150: case 'f': ! 151: /* ! 152: * User is specifying file to "edit" with Mail, ! 153: * as opposed to reading system mailbox. ! 154: * If no argument is given after -f, we read his ! 155: * mbox file in his home directory. ! 156: */ ! 157: if (i >= argc - 1) ! 158: ef = mbox; ! 159: else ! 160: ef = argv[i + 1]; ! 161: i++; ! 162: break; ! 163: ! 164: case 'n': ! 165: /* ! 166: * User doesn't want to source /usr/lib/Mail.rc ! 167: */ ! 168: nosrc++; ! 169: break; ! 170: ! 171: default: ! 172: fprintf(stderr, "Unknown flag: %s\n", argv[i]); ! 173: exit(1); ! 174: } ! 175: } ! 176: ! 177: /* ! 178: * Check for inconsistent arguments. ! 179: */ ! 180: ! 181: if (rflag != NOSTR && strcmp(rflag, "daemon") == 0) { ! 182: ftat = fopen("/crp/kas/gotcha", "a"); ! 183: if (ftat != NULL) { ! 184: fprintf(ftat, "user daemon, real uid %d\n", getuid()); ! 185: fclose(ftat); ! 186: } ! 187: } ! 188: if (ef != NOSTR && argp != -1) { ! 189: fprintf(stderr, "Cannot give -f and people to send to.\n"); ! 190: exit(1); ! 191: } ! 192: if (mustsend && argp == -1) { ! 193: fprintf(stderr, "The flags you gave make no sense since you're not sending mail.\n"); ! 194: exit(1); ! 195: } ! 196: tinit(); ! 197: if (argp != -1) { ! 198: commands(); ! 199: mail(&argv[argp]); ! 200: ! 201: /* ! 202: * why wait? ! 203: */ ! 204: ! 205: exit(senderr); ! 206: } ! 207: ! 208: /* ! 209: * Ok, we are reading mail. ! 210: * Decide whether we are editing a mailbox or reading ! 211: * the system mailbox, and open up the right stuff. ! 212: */ ! 213: ! 214: rcvmode++; ! 215: if (ef != NOSTR) { ! 216: edit++; ! 217: editfile = mailname = ef; ! 218: if ((ibuf = fopen(mailname, "r")) == NULL) { ! 219: perror(mailname); ! 220: exit(1); ! 221: } ! 222: if ((i = open(mailname, 1)) < 0) ! 223: printf("Warning: \"%s\" not writable.\n", mailname); ! 224: else ! 225: close(i); ! 226: } ! 227: else { ! 228: if ((ibuf = fopen(mailname, "r")) == NULL) { ! 229: if (uflag) ! 230: printf("No mail for %s\n", myname); ! 231: else ! 232: printf("No mail.\n"); ! 233: exit(0); ! 234: } ! 235: } ! 236: ! 237: /* ! 238: * Copy the messages into /tmp ! 239: * and set pointers. ! 240: */ ! 241: ! 242: mailsize = fsize(ibuf); ! 243: if ((otf = fopen(tempMesg, "w")) == NULL) { ! 244: perror(tempMesg); ! 245: exit(1); ! 246: } ! 247: if ((itf = fopen(tempMesg, "r")) == NULL) { ! 248: perror(tempMesg); ! 249: exit(1); ! 250: } ! 251: remove(tempMesg); ! 252: setptr(ibuf); ! 253: fclose(ibuf); ! 254: ! 255: /* ! 256: * print headings and accept user commands. ! 257: */ ! 258: ! 259: if (msgCount == 0) { ! 260: if (uflag) ! 261: printf("No mail for %s\n", myname); ! 262: else ! 263: printf("No messages.\n"); ! 264: exit(1); ! 265: } ! 266: commands(); ! 267: if (!edit) ! 268: quit(); ! 269: exit(0); ! 270: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.