shithub: riscv

ref: bf645afaac246967b9590ae7463f243c11d97480
dir: /sys/src/cmd/upas/ml/mlowner.c/

View raw version
#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{
	default:
		usage();
	}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);
}