Annotation of 42BSD/old/berknet/v6mail.c, revision 1.1.1.1

1.1       root        1: static char sccsid[] = "@(#)v6mail.c   4.4     (Berkeley)      1/9/83";
                      2: 
                      3: /*
                      4:  * Version 6 Cory mail--
                      5:  *     a clean and simple mail program
                      6:  *     machine and version independent
                      7:  *             Eric Schmidt
                      8:  *     must run as setuid root to chown the destination mailbox
                      9:  *     if NOTROOT defined, doesn't need to run as root
                     10:  *     
                     11:  *     DON'T CHANGE THIS CODE
                     12:  *             bitch to "csvax:schmidt" instead
                     13:  */
                     14: 
                     15: /*
                     16:  * mail command usage
                     17:  *     mail [-yn]
                     18:  *             prints your mail
                     19:  *     mail people
                     20:  *             sends standard input to people
                     21:  *
                     22:  *     mail -r fromaddr people
                     23:  *             sends mail from the network
                     24:  *
                     25:  *     mail -d people
                     26:  *             don't call sendmail, send mail directly
                     27:  *     mail msgs
                     28:  *             send to "msgs"
                     29:  *     mail filename
                     30:  *             mail to filename instead of user (must be at least one /)
                     31:  *     mail -D
                     32:  *             delete the invokers mailbox (more efficient than 
                     33:  *                     mail -n >/dev/null)
                     34:  */
                     35: 
                     36: /*
                     37:  *     bugs:
                     38:  *             Ingres 11/70 multiple names/uid?
                     39:  *     additions:
                     40:  *             Save? type 'x' - doesn't unlink the mail file
                     41:  */
                     42: /*
                     43:  * BIFF is an immediate notification flag using the IPC stuff
                     44:  */
                     45: # include "local.h"
                     46: # include <stdio.h>
                     47: # include "mach.h"
                     48: 
                     49: # ifdef RAND
                     50: 
                     51: /* for all machines at RAND */
                     52: # define MAILMODE 0644
                     53: 
                     54: # endif RAND
                     55: 
                     56: # ifdef NOSC
                     57: 
                     58: /* for all machines at NOSC */
                     59: # define MAILMODE 0644
                     60: 
                     61: # endif NOSC
                     62: 
                     63: # ifdef BERKELEY
                     64: /* for Berkeley */
                     65: /* for each machine */
                     66: /* lump the CC machines into one */
                     67: # ifdef CCV7
                     68: # define MAILMODE 0600
                     69: # define MSGSCMD "/usr/ucb/bin/msgs"
                     70: # endif
                     71: 
                     72: # ifdef CCV6
                     73: # define MSGSCMD "/usr/bin/eecs/msgs"
                     74: # define MAILMODE 0600
                     75: # endif
                     76: 
                     77: # ifdef ING70
                     78: # define MAILMODE 0666
                     79: # define MSGSCMD "/usr/bin/msgs"
                     80: # define NOTROOT
                     81: # endif
                     82: 
                     83: # ifdef INGVAX
                     84: # define MAILMODE 0644
                     85: # define MSGSCMD "/usr/ucb/msgs"
                     86: # endif
                     87: 
                     88: /*
                     89: # ifdef VIRUS
                     90: # define MAILMODE 0644
                     91: # define MSGSCMD "/usr/bin/msgs"
                     92: # endif
                     93: */
                     94: 
                     95: # ifdef UCBVAX
                     96: # define MAILMODE 0644
                     97: # define MSGSCMD "/usr/ucb/msgs"
                     98: # define BIFF
                     99: # endif
                    100: 
                    101: # ifdef IMAGE
                    102: # define MAILMODE 0644
                    103: # define MSGSCMD "/usr/bin/msgs"
                    104: # endif
                    105: 
                    106: # ifdef KIM
                    107: # define MAILMODE 0644
                    108: # define MSGSCMD "/usr/ucb/msgs"
                    109: # endif
                    110: 
                    111: # ifdef ESVAX
                    112: # define MAILMODE 0644
                    113: # define MSGSCMD "/usr/ucb/msgs"
                    114: # endif
                    115: 
                    116: # ifdef Q
                    117: # define MAILMODE 0600
                    118: # define MSGSCMD "/usr/bin/eecs/msgs"
                    119: # endif
                    120: 
                    121: # ifdef ARPAVAX
                    122: # define MAILMODE 0644
                    123: # define MSGSCMD "/usr/ucb/msgs"
                    124: # define BIFF
                    125: # endif
                    126: 
                    127: # ifdef SRC
                    128: # define MAILMODE 0600
                    129: # define MSGSCMD "/usr/bin/msgs"
                    130: # endif
                    131: 
                    132: # ifdef MATHSTAT
                    133: # define MAILMODE 0600
                    134: # define MSGSCMD "/usr/bin/msgs"
                    135: # endif
                    136: 
                    137: # ifdef CSVAX
                    138: # define MAILMODE 0644
                    139: # define MSGSCMD "/usr/ucb/msgs"
                    140: # define BIFF
                    141: # endif
                    142: 
                    143: # ifdef ONYX
                    144: # define MAILMODE 0644
                    145: # define MSGSCMD "/usr/ucb/bin/msgs"
                    146: # endif
                    147: 
                    148: # ifdef CORY
                    149: # define MAILMODE 0600
                    150: # define MSGSCMD "/usr/bin/eecs/msgs"
                    151: # endif
                    152: 
                    153: # ifdef EECS40
                    154: # define MAILMODE 0644
                    155: # define MSGSCMD "/usr/bin/msgs"
                    156: # endif
                    157: /* end of berkeley defsn */
                    158: 
                    159: # endif
                    160: /* end of per-machine ifdefs */
                    161: 
                    162: # ifdef USRMAIL
                    163: # define MAILDIR "/usr/mail"
                    164: # else
                    165: # define MAILDIR "/usr/spool/mail"
                    166: # endif
                    167: 
                    168: char   lettmp[]  = "/tmp/MaXXXXX";     /* keep letter before sending it */
                    169: char   preptmp[] = "/tmp/mbXXXXX";     /* if prepending msg, use this file */
                    170: int    chew;                           /* if true, strip extra from lines */
                    171: int    dflag;                          /* if true, don't call sendmail */
                    172: char   shopcnt[30] = "0";              /* hop count parameter for rmt mail */
                    173: int    errs;                           /* no of errs in sending */
                    174: char   deleteonly;                     /* if true, just delete mailbox */
                    175: char   remname[50];                    /* if non-empty, from line extra */
                    176: 
                    177: char _sobuf[BUFSIZ];
                    178: main(argc, argv)
                    179: char **argv;
                    180: {
                    181:        register int myuid;
                    182:        int delexit();
                    183:        char namebuf[128], *sn = NULL, logindir[60];
                    184:        struct passwd *pwd;
                    185: 
                    186:        setbuf(stdout,_sobuf);
                    187:        mktemp(lettmp);
                    188:        mktemp(preptmp);
                    189:        unlink(lettmp);
                    190:        unlink(preptmp);
                    191:        myuid = getuid();
                    192:        logindir[0] = 0;
                    193:        sn = getlogin();
                    194:        if(sn == NULL || *sn == 0 || *sn == ' '){
                    195:                pwd = getpwuid(myuid);          /* will read passwd file */
                    196:                if(pwd != NULL){
                    197:                        sn = pwd->pw_name;
                    198:                        strcpy(logindir,pwd->pw_dir);
                    199:                }
                    200:                if(sn == NULL){
                    201:                        fprintf(stderr,"Who are you?\n");
                    202:                        delexit(EX_OSFILE);
                    203:                }
                    204:        }
                    205:        strcpy(namebuf,sn);
                    206:        if (argc < 2)
                    207:                goto hitit;
                    208:        for (argc--, argv++; argc > 0 && argv[0][0] == '-'; argc--, argv++)
                    209:        switch(argv[0][1]) {
                    210:                case 'y':
                    211:                case 'n':
                    212:                        argc++, argv--;
                    213: hitit:
                    214:                        printmail(argc, argv, namebuf,logindir);
                    215:                        delexit(EX_OK);
                    216: 
                    217:                case 'r':       /* one-arg -r--   -r addr */
                    218:                        if (argc < 2)
                    219:                                continue;
                    220:                        /* ignore -r if not network or root */
                    221:                        if (strcmp("network", namebuf) == 0 || myuid == 0 ||
                    222:                            strcmp("uucp", namebuf) == 0 || index(argv[1], '!') != NULL) {
                    223:                                strcpy(namebuf,argv[1]);
                    224:                                chew++;         /* eat From lines */
                    225:                        }
                    226:                        else strcpy(remname, argv[1]);
                    227:                        argc--, argv++;
                    228:                        continue;
                    229:                case 'h':       /* hop count - used by network */
                    230:                        if(argc < 2) continue;
                    231:                        strcpy(shopcnt,argv[1]);
                    232:                        argc--, argv++;
                    233:                        continue;
                    234:                case 'd':       /* really deliver this message */
                    235:                        dflag++;
                    236:                        continue;
                    237:                case 'D':       /* only delete the invokers mailbox */
                    238:                        deleteonly++;
                    239:                        goto hitit;             /* delete mail box, thats all */
                    240:        }
                    241:        /* if we are already ignoring signals, catch sigint */
                    242:        if(signal(SIGINT,SIG_IGN) != SIG_IGN)
                    243:                signal(SIGINT, delexit);
                    244:        argc++, argv--;
                    245:        bulkmail(argc, argv, namebuf);
                    246:        delexit(EX_OK);
                    247: }
                    248: 
                    249: printmail(argc, argv, name, logindir)
                    250: char **argv;
                    251: char *name, *logindir;
                    252: {
                    253:        register int c;
                    254:        FILE *fdin;
                    255:        char sfnmail[60], mbox[120];
                    256:        struct stat statbuf;
                    257: 
                    258: # ifdef OLDMAIL
                    259:        if(logindir[0] == 0){
                    260:                pwd = getpwuid(getuid());
                    261:                if(pwd == NULL){
                    262:                        fprintf(stderr,"Can't get directory\n");
                    263:                        exit(EX_OSFILE);
                    264:                }
                    265:                strcpy(logindir, pwd->pw_dir);
                    266:        }
                    267:        sprintf(sfnmail,"%s/.mail",logindir);
                    268: # else
                    269:        sprintf(sfnmail,"%s/%s",MAILDIR,name);
                    270: # endif
                    271:        if(deleteonly){
                    272:                remove(sfnmail);
                    273:                return;
                    274:        }
                    275:        if (stat(sfnmail, &statbuf)>=0 && statbuf.st_nlink==1 &&
                    276:                getsize(&statbuf) > 0L && (fdin = fopen(sfnmail, "r")) != NULL){
                    277:                getput(fdin, stdout);
                    278:                fclose(fdin);
                    279:                fflush(stdout);
                    280:                c = 'y';
                    281:                if (argc<2) {
                    282:                        if(isatty(0)){
                    283:                                printf("Save(y-n) ?");
                    284:                                fflush(stdout);
                    285:                                c = getchar();
                    286:                        }
                    287:                } else
                    288:                        c = argv[1][1];
                    289:                if (!any(c, "xyn"))
                    290:                        delexit(EX_OK);
                    291:                if (c == 'y') {
                    292:                        sprintf(mbox,"%s/mbox",logindir);
                    293:                        if (accesss(mbox)) {
                    294:                                printf("Saved mail in 'mbox'\n");
                    295:                                if(insert(sfnmail, mbox, getuid(),getgid()))
                    296:                                        remove(sfnmail);
                    297:                        }
                    298:                        else printf("In wrong directory\n");
                    299:                }
                    300:                else if(c != 'x') remove(sfnmail);
                    301:        } else
                    302:                printf("No mail.\n");
                    303: }
                    304: 
                    305: bulkmail(argc, argv, from)
                    306: char **argv, *from;
                    307: {
                    308:        extern int errno;
                    309:        char linebuf[BUFSIZ];
                    310:        char *getdate();
                    311:        FILE *fdout;
                    312: 
                    313: # ifdef SENDMAIL
                    314:        /*
                    315:        **  Ship off to sendmail if appropriate (and possible)
                    316:        */
                    317: 
                    318:        if (!dflag)
                    319:        {
                    320:                argv[0] = "-sendmail";
                    321:                argv[argc] = 0;
                    322:                execv("/usr/lib/sendmail", argv);
                    323:                /* oops...  better just deliver it. */
                    324:                fprintf(stderr, "Not using sendmail\n");
                    325:                errno = 0;
                    326:                argv[argc] = (char *)-1;
                    327:        }
                    328: # endif
                    329: 
                    330:        fdout = fopen(lettmp, "w");
                    331:        if (fdout == NULL) {
                    332:                perror(lettmp);
                    333:                delexit(EX_OSFILE);
                    334:        }
                    335:        /*
                    336:         * If delivering mail from the network via mail -r,
                    337:         * Strip the leading line and throw it away, as long
                    338:         * as it begins with "From ..." (and preserve the date if poss.)
                    339:         */
                    340:        if (chew) {
                    341:                fgets(linebuf,BUFSIZ,stdin);
                    342:                if(strncmp(linebuf,"From ",5) != 0){
                    343:                        fline(fdout,NULL,from);
                    344:                        fprintf(fdout,"%s", linebuf);
                    345:                }
                    346:                else fline(fdout,getdate(linebuf),from);
                    347:        }
                    348:        else fline(fdout,NULL,from);
                    349:        if(remname[0]) fprintf(fdout,"(from %s)\n",remname);
                    350: 
                    351:        /* on the image machine, promt with subj */
                    352:        if(getput(stdin,fdout) == 0)
                    353:                delexit(EX_OSERR);
                    354:        putc('\n',fdout);
                    355:        fclose(fdout);
                    356:        while (--argc > 0)
                    357:                sendto(*++argv,from);
                    358:        delexit(errs);
                    359: }
                    360: /* print from line, with date date, if date = NULL, compute it */
                    361: fline(fdout,date,from)
                    362: FILE *fdout;
                    363: char *date;
                    364: char *from;
                    365: {
                    366:        int tbuf[2];
                    367: 
                    368:        if(date == NULL){
                    369:                time(tbuf);
                    370:                date = ctime(tbuf);
                    371:        }
                    372:        fprintf(fdout,"From %s  %s", from, date);
                    373: }
                    374: /* look over linebuf and return ptr to date, NULL if error */
                    375: char *getdate(linebuf)
                    376: char *linebuf;
                    377: {
                    378:        register char *s;
                    379:        s = linebuf;
                    380:        while(*s){
                    381:                if(strncmp(s," Sun ",5) == 0
                    382:                || strncmp(s," Mon ",5) == 0
                    383:                || strncmp(s," Tue ",5) == 0
                    384:                || strncmp(s," Wed ",5) == 0
                    385:                || strncmp(s," Thu ",5) == 0
                    386:                || strncmp(s," Fri ",5) == 0
                    387:                || strncmp(s," Sat ",5) == 0)
                    388:                        return(++s);
                    389:                s++;
                    390:        }
                    391:        return(NULL);
                    392: }
                    393: 
                    394: sendto(person, fromaddr)
                    395: char *person;
                    396: char *fromaddr;
                    397: {
                    398:        static int saved = 0;
                    399:        register int hisuid, hisgid;
                    400:        char sfnmail[60], logindir[60];
                    401:        struct passwd *pwd;
                    402: 
                    403:        stripmach(&person);
                    404:        if(person[0] == ':')person++;
                    405:        /* sendmail provides these services */
                    406:        if(any(':',person)
                    407: # ifdef MSGSCMD
                    408:                || strcmp(person,"msgs") == 0
                    409: # endif
                    410:                ){
                    411:                int pid;
                    412:                int pidchild;
                    413: 
                    414:                while((pid = fork()) == -1)sleep(2);
                    415:                if (pid < 0) {
                    416:                        perror("fork");
                    417:                        goto assback;
                    418:                }
                    419:                if (pid == 0) {
                    420:                        fclose(stdin);
                    421:                        freopen(lettmp,"r",stdin);
                    422:                        setuid(getuid());       /* insure no security hole*/
                    423:                        if (strcmp(person,"msgs") != 0) {
                    424:                                /* 
                    425:                                sendberkmail will add the machine, e.g.
                    426:                                CSVAX:schmidt, if the -f flag is not set
                    427:                                */
                    428:                                execl("/usr/net/bin/sendberkmail",
                    429:                                "sendberkmail", "-t",person,"-h",shopcnt,
                    430:                                chew ? "-f" : 0,fromaddr,0);
                    431:                                perror("/usr/net/bin/sendberkmail");
                    432:                        }
                    433: # ifdef MSGSCMD
                    434:                        else {
                    435:                                execl(MSGSCMD, "msgs", "-s", 0);
                    436:                                perror(MSGSCMD);
                    437:                        }
                    438: # endif
                    439:                        exit(EX_UNAVAILABLE);
                    440:                }
                    441:                for (;;) {
                    442:                        register int rcode = wait(&pidchild);
                    443:                        if (rcode == -1)
                    444:                                goto assback;
                    445:                        if (rcode == pid)
                    446:                                break;
                    447:                }
                    448:                if ((pidchild & 0377) != 0 || (pidchild >> 8) != 0)
                    449:                        goto assback;
                    450:                return;
                    451:        }
                    452: 
                    453:        if(!any('/',person)){
                    454:        /* if name has no / in it, we assume it is a user's name */
                    455: # ifdef HPASSWD
                    456:                hisuid = uidfromsn(person);
                    457: # else
                    458:                pwd = getpwnam(person);
                    459:                if(pwd != NULL){
                    460:                        hisuid = guid(pwd->pw_uid,pwd->pw_gid);
                    461:                        hisgid = pwd->pw_gid;
                    462:                        strcpy(logindir,pwd->pw_dir);
                    463:                }
                    464:                else hisuid = -1;
                    465: # endif
                    466:                if(hisuid == -1){
                    467:        assback:
                    468:                        fflush(stdout);
                    469:                        fprintf(stderr,"Can't send to %s.\n", person);
                    470:                        errs++;
                    471:                        if (isatty(0) && saved==0) {
                    472:                                saved++;
                    473:                                if (accesss("dead.letter")) {
                    474:                                        printf("Letter saved in 'dead.letter'\n");
                    475:                                        insert(lettmp, "dead.letter",
                    476:                                                getuid(),getgid());
                    477:                                } else
                    478:                                        printf("In wrong directory\n");
                    479:                        }
                    480:                        return;
                    481:                }
                    482: # ifdef OLDMAIL
                    483:                sprintf(sfnmail,"%s/.mail",logindir);
                    484: # else
                    485:                sprintf(sfnmail,"%s/%s",MAILDIR,person);
                    486: # endif
                    487:                lock(sfnmail);
                    488:                insert(lettmp, sfnmail, hisuid, hisgid);
                    489:                unlock();
                    490:                }
                    491:        else {          /* it has / in it, "person" is a file */
                    492:                if(accesss(person)){
                    493:                        lock(person);
                    494:                        insert(lettmp, person, -1, -1);
                    495:                        unlock();
                    496:                }
                    497:                else
                    498:                        fprintf(stderr,"Can't access %s\n",person);
                    499:        }
                    500: }
                    501: 
                    502: /* return 1 if success, 0 otherwise */
                    503: insert(from, to, uid, gid)
                    504: char *from, *to;
                    505: {
                    506: # ifdef V6
                    507:        return(prepend(from,to,uid, gid));
                    508: # else
                    509:        return(append(from,to,uid, gid));
                    510: # endif
                    511: }
                    512: 
                    513: #ifdef BIFF
                    514: #include <sys/socket.h>
                    515: #include <netinet/in.h>
                    516: #include <netdb.h>
                    517: #endif
                    518: 
                    519: /* return 1 if success, 0 otherwise */
                    520: append(from,to,uid, gid)
                    521: char *from, *to;
                    522: {
                    523:        register FILE *fdin, *fdout;
                    524:        int ret;
                    525:        struct stat statbuf;
                    526: #ifdef BIFF
                    527:        char *cp, buf[100], *rindex();
                    528:        int s;
                    529:        struct hostent *hp;
                    530:        struct sockaddr_in sin;
                    531:        struct servent *sp;
                    532: #endif
                    533:        if (stat(to, &statbuf) >= 0 && (statbuf.st_mode&S_IFDIR) != 0) {
                    534:                fprintf(stderr, "Exotic destination %s\n", to);
                    535:                errs++;
                    536:                return(0);
                    537:        }
                    538:        if ((fdout = fopen(to, "a")) == NULL) {
                    539:                perror(to);
                    540:                errs++;
                    541:                return(0);
                    542:        }
                    543: # ifndef NOTROOT
                    544:        if(uid != -1)mchown(to, uid, gid);
                    545: # endif
                    546:        if(uid != -1)chmod(to, MAILMODE);
                    547:        if ((fdin = fopen(from, "r")) == NULL) {
                    548:                perror(from);
                    549:                return(0);
                    550:        }
                    551: #ifdef BIFF
                    552:        { s = socket(AF_INET, SOCK_STREAM, 0, 0);
                    553:          cp = rindex(to, '/');
                    554:          if (cp) 
                    555:                sprintf(buf, "%s@%d\n", cp+1, ftell(fdout));
                    556:        }
                    557: #endif
                    558:        ret = getput(fdin,fdout);
                    559:        fclose(fdin);
                    560:        fclose(fdout);
                    561: #ifdef BIFF
                    562:        if (cp && s >= 0) {
                    563:                hp = gethostbyname("localhost");
                    564:                sp = getservent("biff", "udp");
                    565:                if (hp && sp) {
                    566:                        bcopy(hp->h_addr, &sin.sin_addr, hp->h_length);
                    567:                        sin.sin_family = hp->h_addrtype;
                    568:                        sin.sin_port = sp->s_port;
                    569:                        (void) sendto(s, buf, strlen(buf) + 1, 0,
                    570:                                &sin, sizeof (sin));
                    571:                }
                    572:                close(s);
                    573:        }
                    574: #endif
                    575:        return(ret);
                    576: }
                    577: 
                    578: /* return 1 if success, 0 otherwise */
                    579: prepend(from, to, uid, gid)
                    580: char *from, *to;
                    581: {
                    582:        register int (*sig)();
                    583:        struct stat statbuf;
                    584:        FILE *fdout, *fdin;
                    585:        int ret;
                    586: 
                    587:        if (stat(to, &statbuf) >= 0 && (statbuf.st_mode&S_IFDIR) != 0) {
                    588:                fprintf(stderr, "Exotic destination %s\n", to);
                    589:                goto badexit;
                    590:        }
                    591:        unlink(preptmp);
                    592:        if ((fdout = fopen(preptmp, "w")) == NULL) {
                    593:                perror("mail");
                    594:                goto badexit;
                    595:        }
                    596:        chmod(preptmp, MAILMODE);
                    597:        if ((fdin = fopen(from, "r")) == NULL) {
                    598:                perror("mail");
                    599:                goto badexit;
                    600:        }
                    601:        if(getput(fdin,fdout) == 0){
                    602:                perror("file i/o");
                    603:                goto badexit;
                    604:        }
                    605:        fclose(fdin);
                    606:        fdin = fopen(to, "r");
                    607:        /* ignore error since may not exist */
                    608:        if(fdin != NULL && getput(fdin,fdout) == 0){
                    609:                perror("file i/o");
                    610:                goto badexit;
                    611:        }
                    612:        if(fdin != NULL)fclose(fdin);
                    613:        fclose(fdout);
                    614:        sig = signal(SIGINT, SIG_IGN);
                    615:        remove(to);
                    616:        if ((fdout = fopen(to, "w")) == NULL) {
                    617:                perror(to);
                    618:                unlink(preptmp);
                    619:                signal(SIGINT, sig);
                    620:                goto badexit;
                    621:        }
                    622: # ifdef NOTROOT
                    623:        if(uid != -1)chmod(to,0666);
                    624: # else
                    625:        if(uid != -1)mchown(to, uid, gid);
                    626: # endif
                    627:        if(stat(to, &statbuf) < 0 || statbuf.st_nlink != 1) {
                    628:                fclose(fdout);
                    629:                signal(SIGINT, sig);
                    630:                goto badexit;
                    631:        }
                    632:        if ((fdin = fopen(preptmp, "r"))  == NULL) {
                    633:                perror("mail");
                    634:                signal(SIGINT, sig);
                    635:                goto badexit;
                    636:        }
                    637:        ret = getput(fdin,fdout);
                    638:        fclose(fdout);
                    639:        fclose(fdin);
                    640:        signal(SIGINT, sig);
                    641:        return(ret);
                    642: badexit:
                    643:        unlink(preptmp);
                    644:        errs++;
                    645:        return(0);
                    646: }
                    647: 
                    648: delexit(ex)
                    649: {
                    650:        unlink(lettmp);
                    651:        unlink(preptmp);
                    652:        exit(ex);
                    653: }
                    654: 
                    655: /* return 1 if ok, 0 otherwise */
                    656: getput(fdin, fdout)
                    657: register FILE *fdin, *fdout;
                    658: {
                    659:        extern int errno;
                    660:        register int c;
                    661: 
                    662:        while((c = getc(fdin)) != EOF) {
                    663:                errno = 0;
                    664:                putc(c,fdout);
                    665:                if(errno) {
                    666:                        perror("mail");
                    667:                        return(0);
                    668:                }
                    669:        }
                    670:        return(1);
                    671: }
                    672: 
                    673: accesss(s1)
                    674: register char *s1;
                    675: {
                    676:        struct stat statbuf;
                    677:                if(stat(s1,&statbuf)<0 || access(s1,2) == 0)
                    678:                return(1);
                    679:        return(0);
                    680: }
                    681: 
                    682: any(c, str)
                    683:        register char *str, c;
                    684: {
                    685:        register char *f;
                    686: 
                    687:        f = str;
                    688:        while (*f)
                    689:                if (c == *f++)
                    690:                        return(1);
                    691:        return(0);
                    692: }
                    693: char   locktmp[30];                            /* Usable lock temporary */
                    694: char   curlock[50];                            /* Last used name of lock */
                    695: int    locked;                                 /* To note that we locked it */
                    696: 
                    697: /*
                    698:  * Lock the specified mail file by setting the file mailfile.lock.
                    699:  * We must, of course, be careful to unlink the lock file by a call
                    700:  * to unlock before we stop.  The algorithm used here is to see if
                    701:  * the lock exists, and if it does, to check its modify time.  If it
                    702:  * is older than 30 seconds, we assume error and set our own file.
                    703:  * Otherwise, we wait for 5 seconds and try again.
                    704:  */
                    705: 
                    706: lock(file)
                    707: char *file;
                    708: {
                    709:        register int f;
                    710:        struct stat statbuf;
                    711:        long curtime;
                    712: /* 
                    713:    if using OLDMAIL, and NOTROOT, cann't lock since can't necessarily
                    714:    write on user's login directory
                    715: */
                    716: # ifdef OLDMAIL
                    717:        return;
                    718: # endif
                    719: 
                    720:        if (file == NULL) {
                    721:                printf("Locked = %d\n", locked);
                    722:                return(0);
                    723:        }
                    724:        if (locked)
                    725:                return(0);
                    726:        sprintf(curlock,"%s%s",file,".lock");
                    727:        sprintf(locktmp,"%s/tmXXXXXX",MAILDIR);
                    728:        mktemp(locktmp);
                    729:        unlink(locktmp);
                    730:        for (;;) {
                    731:                f = lock1(locktmp, curlock);
                    732:                if (f == 0) {
                    733:                        locked = 1;
                    734:                        return(0);
                    735:                }
                    736:                if (stat(curlock, &statbuf) < 0)
                    737:                        return(0);
                    738:                time(&curtime);
                    739:                if (curtime < statbuf.st_mtime + 30) {
                    740:                        sleep(5);
                    741:                        continue;
                    742:                }
                    743:                unlink(curlock);
                    744:        }
                    745: }
                    746: 
                    747: /*
                    748:  * Remove the mail lock, and note that we no longer
                    749:  * have it locked.
                    750:  */
                    751: 
                    752: unlock()
                    753: {
                    754: 
                    755:        if (locked)
                    756:                unlink(curlock);
                    757:        locked = 0;
                    758: }
                    759: 
                    760: /*
                    761:  * Attempt to set the lock by creating the temporary file,
                    762:  * then doing a link/unlink.  If it fails, return -1 else 0
                    763:  */
                    764: 
                    765: lock1(tempfile, name)
                    766:        char tempfile[], name[];
                    767: {
                    768:        int fno;
                    769: 
                    770:        fno = creat(tempfile, 0400);
                    771:        if (fno < 0)
                    772:                return(-1);
                    773:        close(fno);
                    774:        if (link(tempfile, name) < 0) {
                    775:                unlink(tempfile);
                    776:                return(-1);
                    777:        }
                    778:        unlink(tempfile);
                    779:        return(0);
                    780: }
                    781: 
                    782: /*
                    783:        stripfx(prefix string, pointer to string)
                    784: 
                    785:        takes a ptr to string and compares it to prefix string.
                    786:        may be called multiple times
                    787:        returns ":username"
                    788: */
                    789: stripfx(pfx, name)
                    790:        register char *pfx;
                    791:        register char **name;
                    792: {
                    793:        register char *cp = *name;
                    794: 
                    795:        while (*pfx && (*cp == *pfx || *cp == toupper(*pfx)))
                    796:                cp++, pfx++;
                    797:        if (*cp != ':' || *pfx != 0)
                    798:                return;
                    799:        *name = cp;
                    800: }
                    801: stripmach(pperson)
                    802: register char **pperson;
                    803: {
                    804: # ifdef RAND
                    805: /* for machines at RAND */
                    806: # ifdef GRAPHICS
                    807:        stripfx("g",pperson);
                    808:        stripfx("graphics",pperson);
                    809: # endif
                    810: # ifdef TP
                    811:        stripfx("t",pperson);
                    812:        stripfx("tp",pperson);
                    813: # endif
                    814: # ifdef VAX
                    815:        stripfx("v",pperson);
                    816:        stripfx("vax",pperson);
                    817: # endif
                    818: /* end of defns for Rand */
                    819: # endif
                    820: 
                    821: # ifdef NOSC
                    822: /* for machines at NOSC */
                    823: # ifdef ATTS
                    824:        stripfx("a",pperson);
                    825:        stripfx("atts",pperson);
                    826: # endif
                    827: # ifdef CCMM
                    828:        stripfx("c",pperson);
                    829:        stripfx("ccmm",pperson);
                    830: # endif
                    831: # ifdef MSSF
                    832:        stripfx("m",pperson);
                    833:        stripfx("mssf",pperson);
                    834: # endif
                    835: /* end of defns for NOSC */
                    836: # endif
                    837: 
                    838: # ifdef BERKELEY
                    839: 
                    840: /* for Berkeley */
                    841: # ifdef A
                    842:        stripfx("a",pperson);
                    843: # endif
                    844: # ifdef B
                    845:        stripfx("b",pperson);
                    846: # endif
                    847: # ifdef C
                    848:        stripfx("c",pperson);
                    849: # endif
                    850: # ifdef D
                    851:        stripfx("d",pperson);
                    852: # endif
                    853: # ifdef E
                    854:        stripfx("e",pperson);
                    855: # endif
                    856: # ifdef ING70
                    857:        stripfx("i",pperson);
                    858:        stripfx("ing70",pperson);
                    859:        stripfx("ingres",pperson);
                    860: # endif
                    861: # ifdef INGVAX
                    862:        stripfx("j",pperson);
                    863:        stripfx("ingvax",pperson);
                    864: # endif
                    865: # ifdef VIRUS
                    866:        stripfx("k",pperson);
                    867:        stripfx("virus",pperson);
                    868: # endif
                    869: # ifdef IMAGE
                    870:        stripfx("m",pperson);
                    871:        stripfx("image",pperson);
                    872: # endif
                    873: # ifdef KIM
                    874:        stripfx("n",pperson);
                    875:        stripfx("kim",pperson);
                    876: # endif
                    877: # ifdef ESVAX
                    878:        stripfx("o",pperson);
                    879:        stripfx("esvax",pperson);
                    880: # endif
                    881: # ifdef Q
                    882:        stripfx("q",pperson);
                    883: # endif
                    884: # ifdef ARPAVAX
                    885:        stripfx("r",pperson);
                    886:        stripfx("arpavax",pperson);
                    887: # endif
                    888: # ifdef SRC
                    889:        stripfx("s",pperson);
                    890:        stripfx("src",pperson);
                    891: # endif
                    892: # ifdef MATHSTAT
                    893:        stripfx("t",pperson);
                    894:        stripfx("mathstat",pperson);
                    895: # endif
                    896: # ifdef CSVAX
                    897:        stripfx("v",pperson);
                    898:        stripfx("vax",pperson);
                    899:        stripfx("csvax",pperson);
                    900: # endif
                    901: # ifdef CORY
                    902:        stripfx("y",pperson);
                    903:        stripfx("cory",pperson);
                    904: # endif
                    905: # ifdef EECS40
                    906:        stripfx("z",pperson);
                    907:        stripfx("eecs40",pperson);
                    908: # endif
                    909: /* end of berkeley defns */
                    910: # endif
                    911: }
                    912: /* 
                    913:    this removes the mail file sfn by either truncating it, as required
                    914:    on OLDMAIL systems, or unlinking it. If the unlink fails, we truncate it.
                    915: */
                    916: remove(sfn)
                    917: char *sfn;
                    918: {
                    919:        int i;
                    920: # ifdef OLDMAIL
                    921:        i = creat(sfn,0666);
                    922:        if(i >= 0)close(i);
                    923: # else
                    924:        if(unlink(sfn) < 0){
                    925:                i = creat(sfn,MAILMODE);
                    926:                if(i >= 0)close(i);
                    927:        }
                    928: # endif
                    929: }

unix.superglobalmegacorp.com

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