diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2017-03-12 17:15:03 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2017-03-12 17:15:03 +0100 |
commit | 963cfc9a6f6e721f52aa949e6d1af0c3e8dc2ecc (patch) | |
tree | 749b74875dbc49bcf6ed0776648b8f0ef9417407 /sys/src/cmd/upas/ml/mlmgr.c | |
parent | 8177d20fb2709ba9290dfd41308b8e5bee4e00f8 (diff) |
merging erik quanstros nupas
Diffstat (limited to 'sys/src/cmd/upas/ml/mlmgr.c')
-rw-r--r-- | sys/src/cmd/upas/ml/mlmgr.c | 152 |
1 files changed, 84 insertions, 68 deletions
diff --git a/sys/src/cmd/upas/ml/mlmgr.c b/sys/src/cmd/upas/ml/mlmgr.c index a1d1b907e..4ac4435ad 100644 --- a/sys/src/cmd/upas/ml/mlmgr.c +++ b/sys/src/cmd/upas/ml/mlmgr.c @@ -1,11 +1,63 @@ #include "common.h" #include "dat.h" -int cflag; -int aflag; -int rflag; +enum { + Bounces, + Owner, + List, + Nboxes, +}; -int createpipeto(char *alfile, char *user, char *listname, int owner); +char *suffix[Nboxes] = { +[Bounces] "-bounces", +[Owner] "-owner", +[List] "", +}; + +int +createpipeto(char *alfile, char *user, char *listname, char *dom, int which) +{ + char buf[Pathlen], rflag[64]; + int fd; + Dir *d; + + mboxpathbuf(buf, sizeof buf, user, "pipeto"); + + fprint(2, "creating new pipeto: %s\n", buf); + fd = create(buf, OWRITE, 0775); + if(fd < 0) + return -1; + d = dirfstat(fd); + if(d == nil){ + fprint(fd, "Couldn't stat %s: %r\n", buf); + return -1; + } + d->mode |= 0775; + if(dirfwstat(fd, d) < 0) + fprint(fd, "Couldn't wstat %s: %r\n", buf); + free(d); + + if(dom != nil) + snprint(rflag, sizeof rflag, "-r%s@%s ", listname, dom); + else + rflag[0] = 0; + + fprint(fd, "#!/bin/rc\n"); + switch(which){ + case Owner: + fprint(fd, "/bin/upas/mlowner %s %s\n", alfile, listname); + break; + case List: + fprint(fd, "/bin/upas/ml %s%s %s\n", rflag, alfile, user); + break; + case Bounces: + fprint(fd, "exit ''\n"); + break; + } + close(fd); + + return 0; +} void usage(void) @@ -18,24 +70,24 @@ usage(void) void main(int argc, char **argv) { - char *listname, *addr; - String *owner, *alfile; + char *listname, *dom, *addr, alfile[Pathlen], buf[64], flag[127]; + int i; + rfork(RFENVG|RFREND); + memset(flag, 0, sizeof flag); ARGBEGIN{ case 'c': - cflag = 1; - break; case 'r': - rflag = 1; - break; case 'a': - aflag = 1; + flag[ARGC()] = 1; break; + default: + usage(); }ARGEND; - if(aflag + rflag + cflag > 1){ + if(flag['a'] + flag['r'] + flag['c'] > 1){ fprint(2, "%s: -a, -r, and -c are mutually exclusive\n", argv0); exits("usage"); } @@ -44,67 +96,31 @@ main(int argc, char **argv) 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((dom = strchr(listname, '@')) != nil) + *dom++ = 0; + mboxpathbuf(alfile, sizeof alfile, listname, "address-list"); + + if(flag['c']){ + for(i = 0; i < Nboxes; i++){ + snprint(buf, sizeof buf, "%s%s", listname, suffix[i]); + if(creatembox(buf, nil) < 0) + sysfatal("creating %s's mbox: %r", buf); + if(createpipeto(alfile, buf, listname, dom, i) < 0) + sysfatal("creating %s's pipeto: %r", buf); + } + writeaddr(alfile, "# mlmgr c flag", 0, listname); + } else if(flag['r']){ 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){ + writeaddr(alfile, "# mlmgr r flag", 0, listname); + writeaddr(alfile, addr, 1, listname); + } else if(flag['a']){ 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; + writeaddr(alfile, "# mlmgr a flag", 0, listname); + writeaddr(alfile, addr, 0, listname); } - 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; + exits(0); } |