Annotation of 3BSD/cmd/net/prmail.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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