Annotation of 42BSD/ucb/Mail/main.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.