cat_mail.c (1190B)
1 #include "common.h" 2 #include "send.h" 3 4 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; 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 }