Annotation of 41BSD/cmd/berknet/v6mail.c, revision 1.1

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

unix.superglobalmegacorp.com

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