Annotation of researchv10no/lbin/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:  * 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: }

unix.superglobalmegacorp.com

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