Annotation of 40BSD/cmd/berknet/prmail.c, revision 1.1.1.1

1.1       root        1: /*
                      2:        prmail -f fromaddress [-l username] [-c] [-k]
                      3: 
                      4:        Print/forward mail on this machine to another machine.
                      5:        
                      6: Preferred usage (Has two modes):
                      7:        Mail check-
                      8:                A message is printed that there is mail.
                      9:                This is intended for people who put netmail -c addr
                     10:                in their .login files, and don't want to
                     11:                be prompted for their password.
                     12:                Mail check is indicated by a -c option.
                     13:        Mail forward-
                     14:                The mail is "mailed" to the fetcher.
                     15:                If the -r option is given, the mail is also
                     16:                appended to the mbox file and then removed.
                     17:                Forward is indicated by the lack of a -c option.
                     18: 
                     19:        Options:
                     20:                -l username     read username's mail
                     21:                -f fromaddress  forward mail to this address
                     22:                -c              is a mail check, don't forward mail.
                     23:                -k              print "No Mail" for all to see
                     24:        
                     25: */
                     26: 
                     27: # include "defs.h"
                     28: 
                     29: /* 
                     30:   mail seems to reside in one of three places:
                     31:        1. the user's home directory/.mail
                     32:        2. /usr/mail/username
                     33:        3. /usr/spool/mail/username
                     34:   the conditional compilation flags for these three forms are:
                     35:        1. OLDMAIL
                     36:        2. USRMAIL
                     37:        3. is the default
                     38: */
                     39: # ifdef USRMAIL
                     40: # define MAILDIR "/usr/mail"
                     41: # else
                     42: # define MAILDIR "/usr/spool/mail"
                     43: # endif
                     44: 
                     45: char _sobuf[BUFSIZ];
                     46: main(argc,argv)
                     47:        char **argv;
                     48: {                      
                     49:        long ltimeMail;
                     50:        struct stat statbuf;
                     51:        struct passwd *pwd;
                     52:        FILE *f;
                     53:        char fn[BUFSIZ],*s,username[20],
                     54:                fromaddress[BUFSIZ],toaddress[BUFSIZ],
                     55:                fMailCheck=0, *stimeMail,fquiet = 1;
                     56:        int ret,pid;
                     57:        fromaddress[0] = 0;
                     58:        username[0] = 0;
                     59:        setbuf(stdout,_sobuf);
                     60:        while(argc > 1){
                     61:                argc--, argv++;
                     62:                if(argv[0][0] == '-'){
                     63:                        switch(argv[0][1]){
                     64:                        case 'c': fMailCheck++; break;
                     65:                        case 'f': harg(fromaddress,&argc,&argv); break;
                     66:                        case 'k': fquiet = 0; break;
                     67:                        case 'l': harg(username,&argc,&argv); break;
                     68:                        /* it is important to ignore unknown flags for
                     69:                           compatibilty reasons */
                     70:                        }
                     71:                }
                     72:        }
                     73: 
                     74:        /* get the name of the user who's mail we're reading */
                     75:        if(username[0] == 0){
                     76:                s = SnFromUid(getuid());
                     77:                if(s == NULL){
                     78:                        fprintf(stderr,"Unknown user\n");
                     79:                        exit(EX_OSFILE);
                     80:                        }
                     81:                strcpy(username,s);
                     82:        }
                     83: 
                     84: # ifdef OLDMAIL
                     85:        /* handle mail directory in user's directory */
                     86:        /* can't do getenv because may be logging in as "network" */
                     87:        pwd = getpwnam(username);
                     88:        if(pwd == NULL){
                     89:                fprintf(stderr,"no passwd file\n");
                     90:                exit(EX_OSFILE);
                     91:        }
                     92:        sprintf(fn,"%s/.mail",pwd->pw_dir);
                     93: # else
                     94:        sprintf(fn,"%s/%s",MAILDIR,username);
                     95: # endif
                     96:        sprintf(toaddress,"%s:%s", longname(local),username);
                     97:        if(fromaddress[0] == 0){
                     98:                fprintf(stderr,"Need a From Address\n");
                     99:                exit(EX_USAGE);
                    100:        }
                    101: 
                    102:        /* don't send  anything back if nothing to send */
                    103:        if(stat(fn,&statbuf) < 0 || getsize(&statbuf) == 0L) {
                    104:                if(!fquiet)
                    105:                        printf("No mail for %s on the %s machine.\n",
                    106:                                username,longname(local));
                    107:                exit(EX_OK);
                    108:        }
                    109: 
                    110:        /* if a mail check, print message and exit */
                    111:        if(fMailCheck){
                    112:                ltimeMail = statbuf.st_mtime;
                    113:                stimeMail = ctime(&ltimeMail);
                    114:                stimeMail[strlen(stimeMail) - 6] = 0;
                    115:                printf(
                    116: "\"%s\" has mail on the %s machine.   \nLast updated on %s.   \n",
                    117:                        username,longname(local),stimeMail);
                    118:                printf("File %s:%s, Length %ld characters.   \n",
                    119:                        longname(local),fn,getsize(&statbuf));
                    120:                exit(EX_OK);
                    121:        }
                    122: 
                    123:        /* read the mail and mail it to the account asking for it */
                    124:        /* send mail to "fromaddress", as from "toaddress" */
                    125:        ret = mailmail(fn,fromaddress);
                    126:        if(ret == 0){
                    127:                ret = RcAppendMail(fn,username);
                    128:                if(ret == 0){
                    129: # ifndef OLDMAIL
                    130:                        ret = unlink(fn);
                    131:                        if(ret < 0)
                    132: # endif
                    133:                                ret = creat(fn,0644);
                    134:                        if(ret >= 0)close(ret);
                    135:                }
                    136:        }
                    137:        if(ret < 0)fprintf(stderr,"Mail not removed\n");
                    138:        exit(ret);
                    139: }
                    140: /* mail contents of file fn to user "toaddress" */
                    141: /* read file and mail each message separately */
                    142: /* returns return code of executing the mail prorgam */
                    143: mailmail(fn,toaddress)
                    144: char *fn, *toaddress;
                    145: {
                    146:        FILE *fdfile, *fdcmd;
                    147:        FILE *mailopen();
                    148:        char line[BUFSIZ];
                    149:        int ret;
                    150:        int more;
                    151: 
                    152:        fdfile = fopen(fn,"r");
                    153:        if(fdfile == NULL){
                    154:                perror(fn);
                    155:                exit(EX_DATAERR);
                    156:        }
                    157:        more = 1;
                    158:        line[0] = 0;
                    159:        while(more){
                    160:                fdcmd = mailopen(toaddress,NULL,1,0);
                    161:                if(fdcmd == NULL){
                    162:                        perror("mail command");
                    163:                        exit(EX_UNAVAILABLE);
                    164:                }
                    165:                /* read line with from on it */
                    166:                if(line[0] == 0)fgets(line,BUFSIZ,fdfile);
                    167:                /* insert a > before the first from line */
                    168:                fprintf(fdcmd,">%s",line);
                    169:                more = 0;
                    170:                while(fgets(line,BUFSIZ,fdfile) != NULL){
                    171:                        if(strncmp(line,"From ",5) == 0){
                    172:                                more++;
                    173:                                break;
                    174:                        }
                    175:                        fputs(line,fdcmd);
                    176:                }
                    177:                ret = mailclose(fdcmd);
                    178:                ret >>= 8;
                    179:                if(ret != 0){
                    180:                        fprintf(stderr,
                    181:                        "Non-zero return code (%d) from the mail program\n",
                    182:                                ret);
                    183:                        break;
                    184:                }
                    185:        }
                    186:        fclose(fdfile);
                    187:        return(ret);
                    188: }
                    189: 
                    190: /*
                    191:        RcAppendMail(fnFrom) returns a return code
                    192: 
                    193:        Copy mail from fnFrom to the end of the mbox file in the user's
                    194:        home directory.
                    195:        Returns -1 if error, 0 if ok.
                    196:        Can't use getenv() because if there's no entry in utmp
                    197:        for machines with multiple names per uid, the getenv() will
                    198:        return the homedir of the first name/uid pair it finds.
                    199: */
                    200: RcAppendMail(fnFrom,sn)
                    201:        char *fnFrom;
                    202:        char *sn;
                    203: {
                    204:        FILE *fdFrom, *fdTo;
                    205:        char *shdir, fnTo[BUFSIZ], sBuf[BUFSIZ];
                    206:        int nchar;
                    207: 
                    208: # ifdef MULTNAMS
                    209:        struct passwd *pwd;
                    210: 
                    211:        pwd = getpwnam(sn);
                    212:        if(pwd == NULL)return(-1);
                    213:        shdir = pwd->pw_dir;
                    214: # else
                    215:        shdir = getenv("HOME");
                    216:        if(shdir == NULL)return(-1);
                    217: # endif
                    218:        sprintf(fnTo,"%s/mbox",shdir);
                    219:        fdTo = fopen(fnTo,"a");
                    220:        if(fdTo == NULL){
                    221:                perror(fnTo);
                    222:                return(-1);
                    223:        }
                    224: 
                    225:        fdFrom = fopen(fnFrom,"r");
                    226:        if(fdFrom == NULL){
                    227:                perror(fdFrom);
                    228:                return(-1);
                    229:        }
                    230: 
                    231:        while((nchar = fread(sBuf,1,BUFSIZ,fdFrom)) > 0){
                    232:                if(fwrite(sBuf,1,nchar,fdTo) != nchar){
                    233:                        perror(fnTo);
                    234:                        return(-1);
                    235:                }
                    236:        }
                    237:        fclose(fdFrom);
                    238:        fclose(fdTo);
                    239:        return(0);
                    240: }

unix.superglobalmegacorp.com

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