aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/upas/ml/mlmgr.c
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2005-10-29 16:26:44 +0000
committerrsc <devnull@localhost>2005-10-29 16:26:44 +0000
commit5cdb17983ae6e6367ad7a940cb219eab247a9304 (patch)
tree8ca1ef49af2a96e7daebe624d91fdf679814a057 /src/cmd/upas/ml/mlmgr.c
parentcd3745196389579fb78b9b01ef1daefb5a57aa71 (diff)
downloadplan9port-5cdb17983ae6e6367ad7a940cb219eab247a9304.tar.gz
plan9port-5cdb17983ae6e6367ad7a940cb219eab247a9304.tar.bz2
plan9port-5cdb17983ae6e6367ad7a940cb219eab247a9304.zip
Thanks to John Cummings.
Diffstat (limited to 'src/cmd/upas/ml/mlmgr.c')
-rw-r--r--src/cmd/upas/ml/mlmgr.c110
1 files changed, 110 insertions, 0 deletions
diff --git a/src/cmd/upas/ml/mlmgr.c b/src/cmd/upas/ml/mlmgr.c
new file mode 100644
index 00000000..a1d1b907
--- /dev/null
+++ b/src/cmd/upas/ml/mlmgr.c
@@ -0,0 +1,110 @@
+#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|RFREND);
+
+ 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;
+}