]> andersk Git - moira.git/blobdiff - clients/blanche/blanche.c
Make a half-hearted attempt at returning a useful exit status, instead
[moira.git] / clients / blanche / blanche.c
index 875691e31764fc3b7e55ebdf1161232714ea4481..e867faf00a6f01bca25c1b84d08a0c5a5c36281d 100644 (file)
@@ -17,6 +17,7 @@
 #include <mit-copyright.h>
 #include <errno.h>
 #include <stdio.h>
+#include <stdlib.h>
 #include <ctype.h>
 #include <string.h>
 #include <moira.h>
@@ -52,7 +53,6 @@ struct save_queue *addlist, *dellist, *memberlist, *synclist;
 char *listname, *whoami;
 
 #ifndef POSIX
-extern char *index();
 extern int errno;
 #endif
 
@@ -66,7 +66,7 @@ main(argc, argv)
 int argc;
 char **argv;
 {
-    int status;
+    int status, success;
     char **arg = argv;
     char *membervec[3], *motd;
     struct member *memberstruct;
@@ -82,6 +82,8 @@ char **argv;
     synclist = sq_create();
     whoami = argv[0];
 
+    success = 1;
+
     /* parse args, building addlist, dellist, & synclist */
     while (++arg - argv < argc) {
        if  (**arg == '-')
@@ -106,7 +108,7 @@ char **argv;
              verbose++;
            else if (argis("r","recursive"))
              recursflg++;
-           else if (argis("S","server"))
+           else if (argis("S","server") || argis("db","database"))
                if (arg - argv < argc - 1) {
                    ++arg;
                    server = *arg;
@@ -215,8 +217,10 @@ char **argv;
     if (syncflg) {
        status = mr_query("get_members_of_list", 1, &listname,
                           get_list_members, (char *)memberlist);
-       if (status)
-         com_err(whoami, status, "getting members of list %s", listname);
+       if (status) {
+           com_err(whoami, status, "getting members of list %s", listname);
+           exit (2);
+       }
        while (sq_get_data(synclist, &memberstruct)) {
            struct save_queue *q;
            int removed = 0;
@@ -291,34 +295,57 @@ char **argv;
            else if (status != MR_USER || memberstruct->type != M_ANY) {
                com_err(whoami, status, "while adding member %s to %s",
                        memberstruct->name, listname);
+               success = 0;
                break;
            }
        case M_LIST:
            membervec[1] = "LIST";
            status = mr_query("add_member_to_list", 3, membervec,
                               scream, NULL);
-           if (status == MR_SUCCESS)
-             break;
-           else if (status != MR_LIST || memberstruct->type != M_ANY) {
+           if (status == MR_SUCCESS) {
+               if (!strcmp(membervec[0], getenv("USER"))) {
+                   fprintf(stderr, "\nWARNING: \"LIST:%s\" was just added to list \"%s\".\n",
+                           membervec[2], membervec[0]);
+                   fprintf(stderr, "If you meant to add yourself to the list \"%s\", type:\n", membervec[2]);
+                   fprintf(stderr, "\tblanche %s -d %s\t(to undo this)\n",
+                           membervec[0], membervec[2]);
+                   fprintf(stderr, "\tblanche %s -a %s\t(to add yourself to that list)\n",
+                           membervec[2], membervec[0]);
+               }
+               break;
+           } else if (status != MR_LIST || memberstruct->type != M_ANY) {
                com_err(whoami, status, "while adding member %s to %s",
                        memberstruct->name, listname);
+               success = 0;
                break;
            }
        case M_STRING:
            membervec[1] = "STRING";
            status = mr_query("add_member_to_list", 3, membervec,
                               scream, NULL);
-           if (status != MR_SUCCESS)
+           if (status != MR_SUCCESS) {
              com_err(whoami, status, "while adding member %s to %s",
                      memberstruct->name, listname);
+             success = 0;
+           }
+           else if (!strchr(memberstruct->name, '@') &&
+                    !strchr(memberstruct->name, '!') &&
+                    !strchr(memberstruct->name, '%')) {
+               fprintf(stderr, "\nWARNING: \"STRING:%s\" was just added to list \"%s\".\n",
+                       memberstruct->name, listname);
+               fprintf(stderr, "\tIf %s is a mailing list, this may cause it to stop working.\n", listname);
+               fprintf(stderr, "\tYou should consider removing \"STRING:%s\" from the list.\n", memberstruct->name);
+           }
            break;
        case M_KERBEROS:
            membervec[1] = "KERBEROS";
            status = mr_query("add_member_to_list", 3, membervec,
                               scream, NULL);
-           if (status != MR_SUCCESS)
+           if (status != MR_SUCCESS) {
              com_err(whoami, status, "while adding member %s to %s",
                      memberstruct->name, listname);
+             success = 0;
+           }
        }
     }
 
@@ -342,6 +369,7 @@ char **argv;
                     memberstruct->type != M_ANY) {
                com_err(whoami, status, "while deleting member %s from %s",
                        memberstruct->name, listname);
+               success = 0;
                break;
            }
        case M_LIST:
@@ -368,26 +396,37 @@ char **argv;
                }
                com_err(whoami, status, "while deleting member %s from %s",
                        memberstruct->name, listname);
+               success = 0;
                break;
            }
        case M_STRING:
            membervec[1] = "STRING";
            status = mr_query("delete_member_from_list", 3, membervec,
                               scream, NULL);
-           if (status == MR_STRING && memberstruct->type == M_ANY)
+           if (status == MR_STRING && memberstruct->type == M_ANY) {
              com_err(whoami, 0, " Unable to find member %s to delete from %s",
                      memberstruct->name, listname);
-           else if (status != MR_SUCCESS)
+             success = 0;
+             if (!strcmp(membervec[0], getenv("USER"))) {
+               fprintf(stderr, "(If you were trying to remove yourself from the list \"%s\",\n", membervec[2]);
+               fprintf(stderr, "the correct command is \"blanche %s -d %s\".)\n",
+                       membervec[2], membervec[0]);
+             }
+           } else if (status != MR_SUCCESS) {
              com_err(whoami, status, "while deleting member %s from %s",
                      memberstruct->name, listname);
+             success = 0;
+           }
            break;
        case M_KERBEROS:
            membervec[1] = "KERBEROS";
            status = mr_query("delete_member_from_list", 3, membervec,
                               scream, NULL);
-           if (status != MR_SUCCESS)
+           if (status != MR_SUCCESS) {
              com_err(whoami, status, "while deleting member %s from %s",
                      memberstruct->name, listname);
+             success = 0;
+           }
        }
     }
 
@@ -408,7 +447,7 @@ char **argv;
 
     /* We're done! */
     mr_disconnect();
-    exit(0);
+    exit(success?0:1);
 }
 
 usage(argv)
@@ -430,7 +469,7 @@ char **argv;
     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, "   -db | -database host[:port]\n");
     fprintf(stderr, "   -D | -debug\n");
     exit(1);
 }
@@ -642,8 +681,10 @@ struct save_queue *queue;
     while (fgets(buf, BUFSIZ, in))
       if (memberstruct = parse_member(buf))
        sq_save_data(queue, memberstruct);
-    if (!feof(in))
+    if (!feof(in)) {
       com_err(whoami, errno, "while reading from %s", filename);
+      exit(2);
+    }
 }
 
 
This page took 0.05832 seconds and 4 git commands to generate.