19a747e4fSDavid du Colombier #include "common.h"
29a747e4fSDavid du Colombier #include "dat.h"
39a747e4fSDavid du Colombier
49a747e4fSDavid du Colombier Biobuf in;
59a747e4fSDavid du Colombier
69a747e4fSDavid du Colombier String *from;
79a747e4fSDavid du Colombier String *sender;
89a747e4fSDavid du Colombier
99a747e4fSDavid du Colombier
109a747e4fSDavid du Colombier void
usage(void)119a747e4fSDavid du Colombier usage(void)
129a747e4fSDavid du Colombier {
139a747e4fSDavid du Colombier fprint(2, "usage: %s address-list-file listname\n", argv0);
149a747e4fSDavid du Colombier exits("usage");
159a747e4fSDavid du Colombier }
169a747e4fSDavid du Colombier
179a747e4fSDavid du Colombier void
main(int argc,char ** argv)189a747e4fSDavid du Colombier main(int argc, char **argv)
199a747e4fSDavid du Colombier {
209a747e4fSDavid du Colombier String *msg;
219a747e4fSDavid du Colombier char *alfile;
229a747e4fSDavid du Colombier char *listname;
239a747e4fSDavid du Colombier
249a747e4fSDavid du Colombier ARGBEGIN{
259a747e4fSDavid du Colombier }ARGEND;
269a747e4fSDavid du Colombier
279a747e4fSDavid du Colombier rfork(RFENVG|RFREND);
289a747e4fSDavid du Colombier
299a747e4fSDavid du Colombier if(argc < 2)
309a747e4fSDavid du Colombier usage();
319a747e4fSDavid du Colombier alfile = argv[0];
329a747e4fSDavid du Colombier listname = argv[1];
339a747e4fSDavid du Colombier
349a747e4fSDavid du Colombier if(Binit(&in, 0, OREAD) < 0)
359a747e4fSDavid du Colombier sysfatal("opening input: %r");
369a747e4fSDavid du Colombier
379a747e4fSDavid du Colombier msg = s_new();
389a747e4fSDavid du Colombier
399a747e4fSDavid du Colombier /* discard the 'From ' line */
409a747e4fSDavid du Colombier if(s_read_line(&in, msg) == nil)
419a747e4fSDavid du Colombier sysfatal("reading input: %r");
429a747e4fSDavid du Colombier
43*86a363ceSDavid du Colombier /* read up to the first 128k of the message. more is ridiculous */
449a747e4fSDavid du Colombier if(s_read(&in, s_restart(msg), 128*1024) <= 0)
459a747e4fSDavid du Colombier sysfatal("reading input: %r");
469a747e4fSDavid du Colombier
479a747e4fSDavid du Colombier /* parse the header */
489a747e4fSDavid du Colombier yyinit(s_to_c(msg), s_len(msg));
499a747e4fSDavid du Colombier yyparse();
509a747e4fSDavid du Colombier
519a747e4fSDavid du Colombier /* get the sender */
529a747e4fSDavid du Colombier getaddrs();
539a747e4fSDavid du Colombier if(from == nil)
549a747e4fSDavid du Colombier from = sender;
559a747e4fSDavid du Colombier if(from == nil)
569a747e4fSDavid du Colombier sysfatal("message must contain From: or Sender:");
579a747e4fSDavid du Colombier
589a747e4fSDavid du Colombier if(strstr(s_to_c(msg), "remove")||strstr(s_to_c(msg), "unsubscribe"))
599a747e4fSDavid du Colombier writeaddr(alfile, s_to_c(from), 1, listname);
609a747e4fSDavid du Colombier else if(strstr(s_to_c(msg), "subscribe"))
619a747e4fSDavid du Colombier writeaddr(alfile, s_to_c(from), 0, listname);
629a747e4fSDavid du Colombier
639a747e4fSDavid du Colombier exits(0);
649a747e4fSDavid du Colombier }
65