X-Git-Url: http://andersk.mit.edu/gitweb/moira.git/blobdiff_plain/f1f92ff741afce557351964fdb1d4126e83c239a..e681e918d9651f673c209d5cbca880d128ad69fc:/clients/blanche/blanche.c diff --git a/clients/blanche/blanche.c b/clients/blanche/blanche.c index 02107188..e867faf0 100644 --- a/clients/blanche/blanche.c +++ b/clients/blanche/blanche.c @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -65,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; @@ -81,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 == '-') @@ -105,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; @@ -214,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; @@ -239,14 +244,6 @@ char **argv; /* Process the add list */ while (sq_get_data(addlist, &memberstruct)) { - if ((memberstruct->type == M_STRING || - memberstruct->type == M_ANY) && - strchr(memberstruct->name, '\'')) { - fprintf(stderr, "Illegal character \"'\" in \"STRING:%s\", aborting blanche.\n", - memberstruct->name); - fprintf(stderr, "No changes were made.\n"); - exit(1); - } /* canonicalize string if necessary */ if (memberstruct->type == M_STRING && (p = strchr(memberstruct->name, '@'))) { @@ -298,26 +295,39 @@ 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, '%')) { @@ -331,9 +341,11 @@ char **argv; 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; + } } } @@ -357,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: @@ -383,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; + } } } @@ -423,7 +447,7 @@ char **argv; /* We're done! */ mr_disconnect(); - exit(0); + exit(success?0:1); } usage(argv) @@ -445,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); } @@ -657,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); + } }