aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/upas/filterkit/deliver.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/upas/filterkit/deliver.c')
-rw-r--r--src/cmd/upas/filterkit/deliver.c60
1 files changed, 60 insertions, 0 deletions
diff --git a/src/cmd/upas/filterkit/deliver.c b/src/cmd/upas/filterkit/deliver.c
new file mode 100644
index 00000000..33903708
--- /dev/null
+++ b/src/cmd/upas/filterkit/deliver.c
@@ -0,0 +1,60 @@
+#include "dat.h"
+#include "common.h"
+
+void
+usage(void)
+{
+ fprint(2, "usage: %s recipient fromaddr-file mbox\n", argv0);
+ exits("usage");
+}
+
+void
+main(int argc, char **argv)
+{
+ int fd;
+ char now[30];
+ Addr *a;
+ char *deliveredto;
+ Mlock *l;
+ int bytes;
+
+ ARGBEGIN{
+ }ARGEND;
+
+ if(argc != 3)
+ usage();
+
+ deliveredto = strrchr(argv[0], '!');
+ if(deliveredto == nil)
+ deliveredto = argv[0];
+ else
+ deliveredto++;
+ a = readaddrs(argv[1], nil);
+ if(a == nil)
+ sysfatal("missing from address");
+
+ l = syslock(argv[2]);
+
+ /* append to mbox */
+ fd = open(argv[2], OWRITE);
+ if(fd < 0)
+ sysfatal("opening mailbox: %r");
+ seek(fd, 0, 2);
+ strncpy(now, ctime(time(0)), sizeof(now));
+ now[28] = 0;
+ if(fprint(fd, "From %s %s\n", a->val, now) < 0)
+ sysfatal("writing mailbox: %r");
+
+ /* copy message handles escapes and any needed new lines */
+ bytes = appendfiletombox(0, fd);
+ if(bytes < 0)
+ sysfatal("writing mailbox: %r");
+
+ close(fd);
+ sysunlock(l);
+
+ /* log it */
+ syslog(0, "mail", "delivered %s From %s %s (%s) %d", deliveredto,
+ a->val, now, argv[0], bytes);
+ exits(0);
+}