diff options
Diffstat (limited to 'src/cmd/upas/send/cat_mail.c')
-rw-r--r-- | src/cmd/upas/send/cat_mail.c | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/src/cmd/upas/send/cat_mail.c b/src/cmd/upas/send/cat_mail.c new file mode 100644 index 00000000..cdd16ece --- /dev/null +++ b/src/cmd/upas/send/cat_mail.c @@ -0,0 +1,60 @@ +#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; +} |