tmlmgr.c - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       tmlmgr.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 }