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