| #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; |
| } |