xref: /plan9-contrib/sys/src/cmd/upas/send/cat_mail.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
1 #include "common.h"
2 #include "send.h"
3 
4 
5 /* dispose of local addresses */
6 int
cat_mail(dest * dp,message * mp)7 cat_mail(dest *dp, message *mp)
8 {
9 	Biobuf *fp;
10 	char *rcvr, *cp;
11 	Mlock *l;
12 	String *tmp, *s;
13 	int i, n;
14 
15 	s = unescapespecial(s_clone(dp->repl1));
16 	if (nflg) {
17 		if(!xflg)
18 			print("cat >> %s\n", s_to_c(s));
19 		else
20 			print("%s\n", s_to_c(dp->addr));
21 		s_free(s);
22 		return 0;
23 	}
24 	for(i = 0;; i++){
25 		l = syslock(s_to_c(s));
26 		if(l == 0)
27 			return refuse(dp, mp, "can't lock mail file", 0, 0);
28 
29 		fp = sysopen(s_to_c(s), "al", MBOXMODE);
30 		if(fp)
31 			break;
32 		tmp = s_append(0, s_to_c(s));
33 		s_append(tmp, ".tmp");
34 		fp = sysopen(s_to_c(tmp), "al", MBOXMODE);
35 		if(fp){
36 			syslog(0, "mail", "error: used %s", s_to_c(tmp));
37 			s_free(tmp);
38 			break;
39 		}
40 		s_free(tmp);
41 		sysunlock(l);
42 		if(i >= 5)
43 			return refuse(dp, mp, "mail file cannot be opened", 0, 0);
44 		sleep(1000);
45 	}
46 	s_free(s);
47 	n = m_print(mp, fp, (char *)0, 1);
48 	if (Bprint(fp, "\n") < 0 || Bflush(fp) < 0 || n < 0){
49 		sysclose(fp);
50 		sysunlock(l);
51 		return refuse(dp, mp, "error writing mail file", 0, 0);
52 	}
53 	sysclose(fp);
54 	sysunlock(l);
55 	rcvr = s_to_c(dp->addr);
56 	if(cp = strrchr(rcvr, '!'))
57 		rcvr = cp+1;
58 	logdelivery(dp, rcvr, mp);
59 	return 0;
60 }
61