Annotation of 43BSD/old/berknet/v6mail.c, revision 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.