plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

mlowner.c (1135B)


      1 #include "common.h"
      2 #include "dat.h"
      3 
      4 Biobuf in;
      5 
      6 String *from;
      7 String *sender;
      8 
      9 
     10 void
     11 usage(void)
     12 {
     13 	fprint(2, "usage: %s address-list-file listname\n", argv0);
     14 	exits("usage");
     15 }
     16 
     17 void
     18 main(int argc, char **argv)
     19 {
     20 	String *msg;
     21 	char *alfile;
     22 	char *listname;
     23 
     24 	ARGBEGIN{
     25 	}ARGEND;
     26 
     27 	rfork(RFENVG);
     28 
     29 	if(argc < 2)
     30 		usage();
     31 	alfile = argv[0];
     32 	listname = argv[1];
     33 
     34 	if(Binit(&in, 0, OREAD) < 0)
     35 		sysfatal("opening input: %r");
     36 
     37 	msg = s_new();
     38 
     39 	/* discard the 'From ' line */
     40 	if(s_read_line(&in, msg) == nil)
     41 		sysfatal("reading input: %r");
     42 
     43 	/* read up to the first 128k of the message.  more is redculous */
     44 	if(s_read(&in, s_restart(msg), 128*1024) <= 0)
     45 		sysfatal("reading input: %r");
     46 
     47 	/* parse the header */
     48 	yyinit(s_to_c(msg), s_len(msg));
     49 	yyparse();
     50 
     51 	/* get the sender */
     52 	getaddrs();
     53 	if(from == nil)
     54 		from = sender;
     55 	if(from == nil)
     56 		sysfatal("message must contain From: or Sender:");
     57 
     58 	if(strstr(s_to_c(msg), "remove")||strstr(s_to_c(msg), "unsubscribe"))
     59 		writeaddr(alfile, s_to_c(from), 1, listname);
     60 	else if(strstr(s_to_c(msg), "subscribe"))
     61 		writeaddr(alfile, s_to_c(from), 0, listname);
     62 
     63 	exits(0);
     64 }