Blame


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