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