Blob


1 #include "common.h"
2 #include "send.h"
5 /* dispose of local addresses */
6 int
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;
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);
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 }