|  | #include "common.h" | 
|  | #include "send.h" | 
|  |  | 
|  |  | 
|  | /* dispose of local addresses */ | 
|  | int | 
|  | cat_mail(dest *dp, message *mp) | 
|  | { | 
|  | Biobuf *fp; | 
|  | char *rcvr, *cp; | 
|  | Mlock *l; | 
|  | String *tmp, *s; | 
|  | int i, n; | 
|  |  | 
|  | s = unescapespecial(s_clone(dp->repl1)); | 
|  | if (nflg) { | 
|  | if(!xflg) | 
|  | print("cat >> %s\n", s_to_c(s)); | 
|  | else | 
|  | print("%s\n", s_to_c(dp->addr)); | 
|  | s_free(s); | 
|  | return 0; | 
|  | } | 
|  | for(i = 0;; i++){ | 
|  | l = syslock(s_to_c(s)); | 
|  | if(l == 0) | 
|  | return refuse(dp, mp, "can't lock mail file", 0, 0); | 
|  |  | 
|  | fp = sysopen(s_to_c(s), "al", MBOXMODE); | 
|  | if(fp) | 
|  | break; | 
|  | tmp = s_append(0, s_to_c(s)); | 
|  | s_append(tmp, ".tmp"); | 
|  | fp = sysopen(s_to_c(tmp), "al", MBOXMODE); | 
|  | if(fp){ | 
|  | syslog(0, "mail", "error: used %s", s_to_c(tmp)); | 
|  | s_free(tmp); | 
|  | break; | 
|  | } | 
|  | s_free(tmp); | 
|  | sysunlock(l); | 
|  | if(i >= 5) | 
|  | return refuse(dp, mp, "mail file cannot be opened", 0, 0); | 
|  | sleep(1000); | 
|  | } | 
|  | s_free(s); | 
|  | n = m_print(mp, fp, (char *)0, 1); | 
|  | if (Bprint(fp, "\n") < 0 || Bflush(fp) < 0 || n < 0){ | 
|  | sysclose(fp); | 
|  | sysunlock(l); | 
|  | return refuse(dp, mp, "error writing mail file", 0, 0); | 
|  | } | 
|  | sysclose(fp); | 
|  | sysunlock(l); | 
|  | rcvr = s_to_c(dp->addr); | 
|  | if(cp = strrchr(rcvr, '!')) | 
|  | rcvr = cp+1; | 
|  | logdelivery(dp, rcvr, mp); | 
|  | return 0; | 
|  | } |