diff options
Diffstat (limited to 'src/cmd/upas/ml/mlowner.c')
-rw-r--r-- | src/cmd/upas/ml/mlowner.c | 64 |
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); +} |