aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/upas/ml/mlowner.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/upas/ml/mlowner.c')
-rw-r--r--src/cmd/upas/ml/mlowner.c64
1 files changed, 64 insertions, 0 deletions
diff --git a/src/cmd/upas/ml/mlowner.c b/src/cmd/upas/ml/mlowner.c
new file mode 100644
index 00000000..5bb98a29
--- /dev/null
+++ b/src/cmd/upas/ml/mlowner.c
@@ -0,0 +1,64 @@
+#include "common.h"
+#include "dat.h"
+
+Biobuf in;
+
+String *from;
+String *sender;
+
+
+void
+usage(void)
+{
+ fprint(2, "usage: %s address-list-file listname\n", argv0);
+ exits("usage");
+}
+
+void
+main(int argc, char **argv)
+{
+ String *msg;
+ char *alfile;
+ char *listname;
+
+ ARGBEGIN{
+ }ARGEND;
+
+ rfork(RFENVG|RFREND);
+
+ if(argc < 2)
+ usage();
+ alfile = argv[0];
+ listname = argv[1];
+
+ if(Binit(&in, 0, OREAD) < 0)
+ sysfatal("opening input: %r");
+
+ msg = s_new();
+
+ /* discard the 'From ' line */
+ if(s_read_line(&in, msg) == nil)
+ sysfatal("reading input: %r");
+
+ /* read up to the first 128k of the message. more is redculous */
+ if(s_read(&in, s_restart(msg), 128*1024) <= 0)
+ sysfatal("reading input: %r");
+
+ /* parse the header */
+ yyinit(s_to_c(msg), s_len(msg));
+ yyparse();
+
+ /* get the sender */
+ getaddrs();
+ if(from == nil)
+ from = sender;
+ if(from == nil)
+ sysfatal("message must contain From: or Sender:");
+
+ if(strstr(s_to_c(msg), "remove")||strstr(s_to_c(msg), "unsubscribe"))
+ writeaddr(alfile, s_to_c(from), 1, listname);
+ else if(strstr(s_to_c(msg), "subscribe"))
+ writeaddr(alfile, s_to_c(from), 0, listname);
+
+ exits(0);
+}