#include "common.h"
#include "dat.h"

int cflag;
int aflag;
int rflag;

int createpipeto(char *alfile, char *user, char *listname, int owner);

void
usage(void)
{
	fprint(2, "usage:\t%s -c listname\n", argv0);
	fprint(2, "\t%s -[ar] listname addr\n", argv0);
	exits("usage");
}

void
main(int argc, char **argv)
{
	char *listname, *addr;
	String *owner, *alfile;

	rfork(RFENVG);

	ARGBEGIN{
	case 'c':
		cflag = 1;
		break;
	case 'r':
		rflag = 1;
		break;
	case 'a':
		aflag = 1;
		break;
	}ARGEND;

	if(aflag + rflag + cflag > 1){
		fprint(2, "%s: -a, -r, and -c are mutually exclusive\n", argv0);
		exits("usage");
	}

	if(argc < 1)
		usage();

	listname = argv[0];
	alfile = s_new();
	mboxpath("address-list", listname, alfile, 0);

	if(cflag){
		owner = s_copy(listname);
		s_append(owner, "-owner");
		if(creatembox(listname, nil) < 0)
			sysfatal("creating %s's mbox: %r", listname);
		if(creatembox(s_to_c(owner), nil) < 0)
			sysfatal("creating %s's mbox: %r", s_to_c(owner));
		if(createpipeto(s_to_c(alfile), listname, listname, 0) < 0)
			sysfatal("creating %s's pipeto: %r", s_to_c(owner));
		if(createpipeto(s_to_c(alfile), s_to_c(owner), listname, 1) < 0)
			sysfatal("creating %s's pipeto: %r", s_to_c(owner));
		writeaddr(s_to_c(alfile), "# mlmgr c flag", 0, listname);
	} else if(rflag){
		if(argc != 2)
			usage();
		addr = argv[1];
		writeaddr(s_to_c(alfile), "# mlmgr r flag", 0, listname);
		writeaddr(s_to_c(alfile), addr, 1, listname);
	} else if(aflag){
		if(argc != 2)
			usage();
		addr = argv[1];
		writeaddr(s_to_c(alfile), "# mlmgr a flag", 0, listname);
		writeaddr(s_to_c(alfile), addr, 0, listname);
	} else
		usage();
	exits(0);
}

int
createpipeto(char *alfile, char *user, char *listname, int owner)
{
	String *f;
	int fd;
	Dir *d;

	f = s_new();
	mboxpath("pipeto", user, f, 0);
	fprint(2, "creating new pipeto: %s\n", s_to_c(f));
	fd = create(s_to_c(f), OWRITE, 0775);
	if(fd < 0)
		return -1;
	d = dirfstat(fd);
	if(d == nil){
		fprint(fd, "Couldn't stat %s: %r\n", s_to_c(f));
		return -1;
	}
	d->mode |= 0775;
	if(dirfwstat(fd, d) < 0)
		fprint(fd, "Couldn't wstat %s: %r\n", s_to_c(f));
	free(d);

	fprint(fd, "#!/bin/rc\n");
	if(owner)
		fprint(fd, "/bin/upas/mlowner %s %s\n", alfile, listname);
	else
		fprint(fd, "/bin/upas/ml %s %s\n", alfile, user);
	close(fd);

	return 0;
}
