]> andersk Git - moira.git/blobdiff - clients/blanche/blanche.c
Wildcards now work on gubl! users.type is no longer VARCHAR.
[moira.git] / clients / blanche / blanche.c
index f13a18fc8562bde48a45e62e975607ecf7797aef..119e12b76117a6d21e28cc6e9e6e3bd9108b9dd0 100644 (file)
@@ -53,7 +53,7 @@ extern char *index();
 extern int errno;
 
 int show_list_info(), show_list_count(), get_list_members(), scream();
-int show_list_members();
+int show_list_members(), membercmp();
 struct member *parse_member();
 
 
@@ -66,7 +66,7 @@ char **argv;
     char **arg = argv;
     char *membervec[3], *motd;
     struct member *memberstruct;
-    char *server = NULL;
+    char *server = NULL, *p;
 
     /* clear all flags & lists */
     infoflg = verbose = syncflg = memberflg = debugflg = recursflg = 0;
@@ -115,6 +115,12 @@ char **argv;
                        sq_save_data(addlist, memberstruct);
                } else
                    usage(argv);
+           else if (argis("al","addlist"))
+               if (arg - argv < argc - 1) {
+                   ++arg;
+                   get_members_from_file(*arg, addlist);
+               } else
+                 usage(argv);
            else if (argis("d","delete"))
                if (arg - argv < argc - 1) {
                    ++arg;
@@ -122,28 +128,17 @@ char **argv;
                        sq_save_data(dellist, memberstruct);
                } else
                    usage(argv);
+           else if (argis("dl","deletelist"))
+               if (arg - argv < argc - 1) {
+                   ++arg;
+                   get_members_from_file(*arg, dellist);
+               } else
+                 usage(argv);
            else if (argis("f","file"))
                if (arg - argv < argc - 1) {
-                   FILE *in;
-                   char buf[BUFSIZ];
-
                    syncflg++;
                    ++arg;
-                   if (!strcmp(*arg, "-"))
-                     in = stdin;
-                   else {
-                       in = fopen(*arg, "r");
-                       if (!in) {
-                           com_err(whoami, errno, 
-                                   "while opening %s for input", *arg);
-                           exit(2);
-                       }
-                   }
-                   while (fgets(buf, BUFSIZ, in))
-                     if (memberstruct = parse_member(buf))
-                       sq_save_data(synclist, memberstruct);
-                   if (!feof(in))
-                     com_err(whoami, errno, "while reading from %s", *arg);
+                   get_members_from_file(*arg, synclist);
                } else
                  usage(argv);
            else
@@ -241,6 +236,40 @@ char **argv;
 
     /* Process the add list */
     while (sq_get_data(addlist, &memberstruct)) {
+       /* canonicalize string if necessary */
+       if (memberstruct->type == M_STRING &&
+           (p = index(memberstruct->name, '@'))) {
+           char *host = canonicalize_hostname(strsave(++p));
+           static char **mailhubs = NULL;
+           char *argv[4];
+           int i, collect();
+
+           if (!mailhubs) {
+               argv[0] = "mailhub";
+               argv[1] = "TYPE";
+               argv[2] = "*";
+               mailhubs = (char **)malloc(sizeof(char *));
+               mailhubs[0] = NULL;
+               status = mr_query("get_alias", 3, argv, collect, &mailhubs);
+               if (status != MR_SUCCESS && status != MR_NO_MATCH) {
+                   com_err(whoami, status,
+                           " while reading list of MAILHUB servers");
+                   mailhubs[0] = NULL;
+               }
+           }
+           for (i = 0; p = mailhubs[i]; i++) {
+               if (!strcasecmp(p, host)) {
+                   host = strsave(memberstruct->name);
+                   *(index(memberstruct->name, '@')) = 0;
+                   memberstruct->type = M_ANY;
+                   fprintf(stderr, "Warning: \"STRING:%s\" converted to \"%s\" because it is a local name.\n",
+                           host, memberstruct->name);
+                   break;
+               }
+           }
+           free(host);
+       }
+       /* now continue adding member */
        membervec[0] = listname;
        membervec[2] = memberstruct->name;
        if (verbose) {
@@ -378,9 +407,11 @@ char **argv;
     fprintf(stderr, "   -r | -recursive\n");
     fprintf(stderr, "   -a | -add member\n");
     fprintf(stderr, "   -d | -delete member\n");
+    fprintf(stderr, "   -al | -addlist filename\n");
+    fprintf(stderr, "   -dl | -deletelist filename\n");
     fprintf(stderr, "   -f | -file filename\n");
     fprintf(stderr, "   -n | -noauth\n");
-    fprintf(stderr, "   -S | -server host:port\n");
+    fprintf(stderr, "   -S | -server host[:port]\n");
     fprintf(stderr, "   -D | -debug\n");
     exit(1);
 }
@@ -391,7 +422,7 @@ char **argv;
 show_list_member(memberstruct)
 struct member *memberstruct;
 {
-    char *s;
+    char *s = "";
 
     switch (memberstruct->type) {
     case M_USER:
@@ -570,23 +601,70 @@ scream()
 }
 
 
+/* Open file, parse members from file, and put them on the specified queue */
+get_members_from_file(filename, queue)
+char *filename;
+struct save_queue *queue;
+{
+    FILE *in;
+    char buf[BUFSIZ];
+    struct member *memberstruct;
+
+    if (!strcmp(filename, "-"))
+      in = stdin;
+    else {
+       in = fopen(filename, "r");
+       if (!in) {
+           com_err(whoami, errno, "while opening %s for input", filename);
+           exit(2);
+       }
+    }
+
+    while (fgets(buf, BUFSIZ, in))
+      if (memberstruct = parse_member(buf))
+       sq_save_data(queue, memberstruct);
+    if (!feof(in))
+      com_err(whoami, errno, "while reading from %s", filename);
+}
+
+
+/* Collect the possible expansions of the alias MAILHUB */
+
+int collect(argc, argv, list)
+int argc;
+char **argv;
+char ***list;
+{
+    int i;
+
+    for (i = 0; (*list)[i]; i++);
+    *list = (char **)realloc(*list, (i + 2) * sizeof(char *));
+    (*list)[i] = strsave(argv[2]);
+    (*list)[i+1] = NULL;
+    return(MR_CONT);
+}
+
+
 /* Parse a line of input, fetching a member.  NULL is returned if a member
- * is not found.  Only the first token on the line is parsed.  ';' is a
- * comment character.
+ * is not found.  ';' is a comment character.
  */
 
 struct member *parse_member(s)
 register char *s;
 {
     register struct member *m;
-    char *p;
+    char *p, *lastchar;
 
     while (*s && isspace(*s))
       s++;
-    p = s;
-    while (*p && isprint(*p) && !isspace(*p) && *p != ';')
-      p++;
-    *p = 0;
+    lastchar = p = s;
+    while (*p && *p != '\n' && *p != ';')
+      if (isprint(*p) && !isspace(*p))
+       lastchar = p++;
+      else
+       p++;
+    lastchar++;
+    *lastchar = 0;
     if (p == s || strlen(s) == 0)
       return(NULL);
 
@@ -610,13 +688,13 @@ register char *s;
            m->name = s;
        }
        m->name = strsave(m->name);
-       return(m);
+    } else {
+       m->name = strsave(s);
+       if (index(s, '@') || index(s, '!') || index(s, '%') || index(s, ' '))
+         m->type = M_STRING;
+       else
+         m->type = M_ANY;
     }
-    m->name = strsave(s);
-    if (index(s, '@') || index(s, '!') || index(s, '%'))
-      m->type = M_STRING;
-    else
-      m->type = M_ANY;
     return(m);
 }
 
This page took 0.041328 seconds and 4 git commands to generate.