12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- #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 ridiculous */
- 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);
- }
|