aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/upas/send/cat_mail.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/upas/send/cat_mail.c')
-rw-r--r--src/cmd/upas/send/cat_mail.c60
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;
+}