Blame


1 5cdb1798 2005-10-29 devnull #include "common.h"
2 5cdb1798 2005-10-29 devnull #include "dat.h"
3 5cdb1798 2005-10-29 devnull
4 5cdb1798 2005-10-29 devnull int cflag;
5 5cdb1798 2005-10-29 devnull int aflag;
6 5cdb1798 2005-10-29 devnull int rflag;
7 5cdb1798 2005-10-29 devnull
8 5cdb1798 2005-10-29 devnull int createpipeto(char *alfile, char *user, char *listname, int owner);
9 5cdb1798 2005-10-29 devnull
10 5cdb1798 2005-10-29 devnull void
11 5cdb1798 2005-10-29 devnull usage(void)
12 5cdb1798 2005-10-29 devnull {
13 5cdb1798 2005-10-29 devnull fprint(2, "usage:\t%s -c listname\n", argv0);
14 5cdb1798 2005-10-29 devnull fprint(2, "\t%s -[ar] listname addr\n", argv0);
15 5cdb1798 2005-10-29 devnull exits("usage");
16 5cdb1798 2005-10-29 devnull }
17 5cdb1798 2005-10-29 devnull
18 5cdb1798 2005-10-29 devnull void
19 5cdb1798 2005-10-29 devnull main(int argc, char **argv)
20 5cdb1798 2005-10-29 devnull {
21 5cdb1798 2005-10-29 devnull char *listname, *addr;
22 5cdb1798 2005-10-29 devnull String *owner, *alfile;
23 5cdb1798 2005-10-29 devnull
24 b5f65921 2006-02-11 devnull rfork(RFENVG);
25 5cdb1798 2005-10-29 devnull
26 5cdb1798 2005-10-29 devnull ARGBEGIN{
27 5cdb1798 2005-10-29 devnull case 'c':
28 5cdb1798 2005-10-29 devnull cflag = 1;
29 5cdb1798 2005-10-29 devnull break;
30 5cdb1798 2005-10-29 devnull case 'r':
31 5cdb1798 2005-10-29 devnull rflag = 1;
32 5cdb1798 2005-10-29 devnull break;
33 5cdb1798 2005-10-29 devnull case 'a':
34 5cdb1798 2005-10-29 devnull aflag = 1;
35 5cdb1798 2005-10-29 devnull break;
36 5cdb1798 2005-10-29 devnull }ARGEND;
37 5cdb1798 2005-10-29 devnull
38 5cdb1798 2005-10-29 devnull if(aflag + rflag + cflag > 1){
39 5cdb1798 2005-10-29 devnull fprint(2, "%s: -a, -r, and -c are mutually exclusive\n", argv0);
40 5cdb1798 2005-10-29 devnull exits("usage");
41 5cdb1798 2005-10-29 devnull }
42 5cdb1798 2005-10-29 devnull
43 5cdb1798 2005-10-29 devnull if(argc < 1)
44 5cdb1798 2005-10-29 devnull usage();
45 5cdb1798 2005-10-29 devnull
46 5cdb1798 2005-10-29 devnull listname = argv[0];
47 5cdb1798 2005-10-29 devnull alfile = s_new();
48 5cdb1798 2005-10-29 devnull mboxpath("address-list", listname, alfile, 0);
49 5cdb1798 2005-10-29 devnull
50 5cdb1798 2005-10-29 devnull if(cflag){
51 5cdb1798 2005-10-29 devnull owner = s_copy(listname);
52 5cdb1798 2005-10-29 devnull s_append(owner, "-owner");
53 5cdb1798 2005-10-29 devnull if(creatembox(listname, nil) < 0)
54 5cdb1798 2005-10-29 devnull sysfatal("creating %s's mbox: %r", listname);
55 5cdb1798 2005-10-29 devnull if(creatembox(s_to_c(owner), nil) < 0)
56 5cdb1798 2005-10-29 devnull sysfatal("creating %s's mbox: %r", s_to_c(owner));
57 5cdb1798 2005-10-29 devnull if(createpipeto(s_to_c(alfile), listname, listname, 0) < 0)
58 5cdb1798 2005-10-29 devnull sysfatal("creating %s's pipeto: %r", s_to_c(owner));
59 5cdb1798 2005-10-29 devnull if(createpipeto(s_to_c(alfile), s_to_c(owner), listname, 1) < 0)
60 5cdb1798 2005-10-29 devnull sysfatal("creating %s's pipeto: %r", s_to_c(owner));
61 5cdb1798 2005-10-29 devnull writeaddr(s_to_c(alfile), "# mlmgr c flag", 0, listname);
62 5cdb1798 2005-10-29 devnull } else if(rflag){
63 5cdb1798 2005-10-29 devnull if(argc != 2)
64 5cdb1798 2005-10-29 devnull usage();
65 5cdb1798 2005-10-29 devnull addr = argv[1];
66 5cdb1798 2005-10-29 devnull writeaddr(s_to_c(alfile), "# mlmgr r flag", 0, listname);
67 5cdb1798 2005-10-29 devnull writeaddr(s_to_c(alfile), addr, 1, listname);
68 5cdb1798 2005-10-29 devnull } else if(aflag){
69 5cdb1798 2005-10-29 devnull if(argc != 2)
70 5cdb1798 2005-10-29 devnull usage();
71 5cdb1798 2005-10-29 devnull addr = argv[1];
72 5cdb1798 2005-10-29 devnull writeaddr(s_to_c(alfile), "# mlmgr a flag", 0, listname);
73 5cdb1798 2005-10-29 devnull writeaddr(s_to_c(alfile), addr, 0, listname);
74 5cdb1798 2005-10-29 devnull } else
75 5cdb1798 2005-10-29 devnull usage();
76 5cdb1798 2005-10-29 devnull exits(0);
77 5cdb1798 2005-10-29 devnull }
78 5cdb1798 2005-10-29 devnull
79 5cdb1798 2005-10-29 devnull int
80 5cdb1798 2005-10-29 devnull createpipeto(char *alfile, char *user, char *listname, int owner)
81 5cdb1798 2005-10-29 devnull {
82 5cdb1798 2005-10-29 devnull String *f;
83 5cdb1798 2005-10-29 devnull int fd;
84 5cdb1798 2005-10-29 devnull Dir *d;
85 5cdb1798 2005-10-29 devnull
86 5cdb1798 2005-10-29 devnull f = s_new();
87 5cdb1798 2005-10-29 devnull mboxpath("pipeto", user, f, 0);
88 5cdb1798 2005-10-29 devnull fprint(2, "creating new pipeto: %s\n", s_to_c(f));
89 5cdb1798 2005-10-29 devnull fd = create(s_to_c(f), OWRITE, 0775);
90 5cdb1798 2005-10-29 devnull if(fd < 0)
91 5cdb1798 2005-10-29 devnull return -1;
92 5cdb1798 2005-10-29 devnull d = dirfstat(fd);
93 5cdb1798 2005-10-29 devnull if(d == nil){
94 5cdb1798 2005-10-29 devnull fprint(fd, "Couldn't stat %s: %r\n", s_to_c(f));
95 5cdb1798 2005-10-29 devnull return -1;
96 5cdb1798 2005-10-29 devnull }
97 5cdb1798 2005-10-29 devnull d->mode |= 0775;
98 5cdb1798 2005-10-29 devnull if(dirfwstat(fd, d) < 0)
99 5cdb1798 2005-10-29 devnull fprint(fd, "Couldn't wstat %s: %r\n", s_to_c(f));
100 5cdb1798 2005-10-29 devnull free(d);
101 5cdb1798 2005-10-29 devnull
102 5cdb1798 2005-10-29 devnull fprint(fd, "#!/bin/rc\n");
103 5cdb1798 2005-10-29 devnull if(owner)
104 5cdb1798 2005-10-29 devnull fprint(fd, "/bin/upas/mlowner %s %s\n", alfile, listname);
105 5cdb1798 2005-10-29 devnull else
106 5cdb1798 2005-10-29 devnull fprint(fd, "/bin/upas/ml %s %s\n", alfile, user);
107 5cdb1798 2005-10-29 devnull close(fd);
108 5cdb1798 2005-10-29 devnull
109 5cdb1798 2005-10-29 devnull return 0;
110 5cdb1798 2005-10-29 devnull }