Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

#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);
}