]> andersk Git - moira.git/blame - clients/moira/lists.c
Diane Delgado's changes for a fixed table-locking order
[moira.git] / clients / moira / lists.c
CommitLineData
402461ad 1#if (!defined(lint) && !defined(SABER))
08345b74 2 static char rcsid_module_c[] = "$Header$";
3#endif lint
4
8defc06b 5/* This is the file lists.c for the MOIRA Client, which allows a nieve
6 * user to quickly and easily maintain most parts of the MOIRA database.
0a2c64cb 7 * It Contains: All list manipulation functions, except delete.
08345b74 8 *
0a2c64cb 9 * Created: 4/12/88
10 * By: Chris D. Peterson
08345b74 11 *
12 * $Source$
13 * $Author$
14 * $Header$
15 *
0a2c64cb 16 * Copyright 1988 by the Massachusetts Institute of Technology.
08345b74 17 *
18 * For further information on copyright and distribution
19 * see the file mit-copyright.h
20 */
21
22#include <stdio.h>
f071d8a7 23#include <string.h>
8defc06b 24#include <moira.h>
25#include <moira_site.h>
08345b74 26#include <menu.h>
27
28#include "mit-copyright.h"
0a2c64cb 29#include "defs.h"
30#include "f_defs.h"
08345b74 31#include "globals.h"
08345b74 32
33#define LIST 0
34#define MEMBERS 1
35#define GLOM 2
075fe5bb 36#define ACE_USE 3
08345b74 37
85ca828a 38#define DEFAULT_ACTIVE DEFAULT_YES
39#define DEFAULT_PUBLIC DEFAULT_YES
40#define DEFAULT_HIDDEN DEFAULT_NO
41#define DEFAULT_MAILLIST DEFAULT_YES
42#define DEFAULT_GROUP DEFAULT_NO
43#define DEFAULT_GID UNIQUE_GID
075fe5bb 44#define DEFAULT_ACE_TYPE "user"
45#define DEFAULT_ACE_NAME (user)
85ca828a 46#define DEFAULT_DESCRIPTION DEFAULT_COMMENT
47
461c03b6 48/* globals only for this file. */
49
85ca828a 50static char current_list[BUFSIZ];
461c03b6 51
075fe5bb 52/* Function Name: PrintListAce
53 * Description: This function prints the list ace information.
402461ad 54 * Arguments: info - an info structure.
55 * Returns: none.
56 */
57
58static void
075fe5bb 59PrintListAce(info)
402461ad 60char ** info;
61{
62 char buf[BUFSIZ];
63
6d9ec158 64 sprintf(buf, "Item: %-20s Name: %s", info[ACE_TYPE],
075fe5bb 65 info[ACE_NAME]);
402461ad 66 Put_message(buf);
67}
68
08345b74 69/* Function Name: PrintListInfo
70 * Description: This function Prints out the List info in a coherent form.
71 * Arguments: info - the List info.
72 * Returns: none.
73 */
74
402461ad 75static void
08345b74 76PrintListInfo(info)
77char ** info;
78{
79 char buf[BUFSIZ];
80
402461ad 81 Put_message(" ");
82 (void) sprintf(buf, "%20sList: %s", "", info[L_NAME]);
08345b74 83 (void) Put_message(buf);
85ca828a 84 (void) sprintf(buf, "Description: %s", info[L_DESC]);
08345b74 85 (void) Put_message(buf);
86 if ( atoi(info[L_MAILLIST]))
87 Put_message("This list is a mailing list.");
88 else
89 Put_message("This list is NOT a mailing list.");
90 if ( atoi(info[L_GROUP]) ) {
589fdf24 91 (void) sprintf(buf,"This list is a Group and its ID number is %s",
08345b74 92 info[L_GID]);
93 Put_message(buf);
94 }
95 else
402461ad 96 Put_message("This list is NOT a Group.");
08345b74 97
075fe5bb 98 if (strcmp(info[L_ACE_TYPE],"NONE") == 0)
08345b74 99 Put_message("This list has no Administrator, how strange?!");
100 else {
402461ad 101 sprintf(buf, "The Administrator of this list is the %s: %s",
075fe5bb 102 info[L_ACE_TYPE], info[L_ACE_NAME]);
08345b74 103 Put_message(buf);
104 }
105
106 (void) sprintf(buf, "This list is: %s, %s, and %s",
85ca828a 107 atoi(info[L_ACTIVE]) ? "active" : "inactive",
108 atoi(info[L_PUBLIC]) ? "public" : "private",
109 atoi(info[L_HIDDEN]) ? "hidden" : "visible");
08345b74 110 (void) Put_message(buf);
075fe5bb 111 sprintf(buf, MOD_FORMAT, info[L_MODBY], info[L_MODTIME], info[L_MODWITH]);
08345b74 112 (void) Put_message(buf);
113}
114
115/* Function Name: GetListInfo
116 * Description: Stores all info about a group of lists in a queue.
117 * Arguments: type - type of info to store.
118 * name - name of the info.
119 * Returns: the first element in the queue.
120 */
121
122/* ARGSUSED */
123struct qelem *
124GetListInfo(type, name1, name2)
125int type;
461c03b6 126char * name1, *name2;
08345b74 127{
128 char *args[2];
461c03b6 129 struct qelem * elem = NULL;
130 register int status;
08345b74 131
132 switch(type) {
133 case LIST:
134 args[0] = name1;
8defc06b 135 if ( (status = do_mr_query("get_list_info", 1, args,
08345b74 136 StoreInfo, (char *) &elem)) != 0) {
85ca828a 137 com_err(program_name, status, " in get_list_info");
08345b74 138 return (NULL);
139 }
140 break;
141 case MEMBERS:
142 args[0] = name1;
8defc06b 143 if ( (status = do_mr_query("get_members_of_list", 1, args,
08345b74 144 StoreInfo, (char *) &elem)) != 0) {
85ca828a 145 com_err(program_name, status, " in get_members_of_list");
08345b74 146 return (NULL);
147 }
148 break;
149 case GLOM:
150 args[0] = name1;
151 args[1] = name2;
8defc06b 152 if ( (status = do_mr_query("get_lists_of_member", 2, args,
08345b74 153 StoreInfo, (char *) &elem)) != 0) {
85ca828a 154 com_err(program_name, status, " in get_list_of_members");
08345b74 155 return (NULL);
156 }
157 break;
075fe5bb 158 case ACE_USE:
08345b74 159 args[0] = name1;
160 args[1] = name2;
8defc06b 161 if ( (status = do_mr_query("get_ace_use", 2, args,
08345b74 162 StoreInfo, (char *) &elem)) != 0) {
075fe5bb 163 com_err(program_name, status, " in get_ace_use");
08345b74 164 return (NULL);
165 }
166 break;
167 }
168 return( QueueTop(elem) );
169}
170
171/* Function Name: AskListInfo.
172 * Description: This function askes the user for information about a
173 * machine and saves it into a structure.
174 * Arguments: info - a pointer the the structure to put the
175 * info into.
176 * name - add a newname field? (T/F)
177 * Returns: SUB_ERROR or SUB_NORMAL.
178 */
179
180char **
461c03b6 181AskListInfo(info, name)
08345b74 182char ** info;
183Bool name;
184{
461c03b6 185 char temp_buf[BUFSIZ], *newname;
08345b74 186
402461ad 187 Put_message(" ");
188 sprintf(temp_buf,"Setting information of list %s.",info[L_NAME]);
08345b74 189 Put_message(temp_buf);
402461ad 190 Put_message(" ");
08345b74 191
192 if (name) {
5df6f171 193 while (1) {
194 newname = Strsave(info[L_NAME]);
eb5eb5de 195 if (GetValueFromUser("The new name for this list", &newname) ==
196 SUB_ERROR)
197 return(NULL);
5df6f171 198 if (ValidName(newname))
199 break;
200 }
08345b74 201 }
eb5eb5de 202 if (GetYesNoValueFromUser("Is this an active list", &info[L_ACTIVE]) ==
203 SUB_ERROR)
204 return(NULL);
205 if (GetYesNoValueFromUser("Is this a public list", &info[L_PUBLIC]) ==
206 SUB_ERROR)
207 return(NULL);
208 if (GetYesNoValueFromUser("Is this a hidden list", &info[L_HIDDEN]) ==
209 SUB_ERROR)
210 return(NULL);
211 if (GetYesNoValueFromUser("Is this a maillist", &info[L_MAILLIST]) ==
212 SUB_ERROR)
213 return(NULL);
214 if (GetYesNoValueFromUser("Is this a group", &info[L_GROUP]) == SUB_ERROR)
215 return(NULL);
85ca828a 216 if (atoi(info[L_GROUP]))
eb5eb5de 217 if (GetValueFromUser("What is the GID for this group.", &info[L_GID]) ==
218 SUB_ERROR)
219 return(NULL);
85ca828a 220
eb5eb5de 221 if (GetTypeFromUser("What Type of Administrator", "ace_type",
222 &info[L_ACE_TYPE]) == SUB_ERROR)
223 return(NULL);
20b2d2f0 224 if ((strcasecmp(info[L_ACE_TYPE], "NONE") != 0) &&
225 (strcasecmp(info[L_ACE_TYPE], "none") != 0)) {
226 sprintf(temp_buf, "Which %s will be the administrator of this list: ",
227 info[L_ACE_TYPE]);
eb5eb5de 228 if (GetValueFromUser(temp_buf, &info[L_ACE_NAME]) == SUB_ERROR)
229 return(NULL);
20b2d2f0 230 }
eb5eb5de 231 if (GetValueFromUser("Description: ", &info[L_DESC]) == SUB_ERROR)
232 return(NULL);
08345b74 233
234 FreeAndClear(&info[L_MODTIME], TRUE);
235 FreeAndClear(&info[L_MODBY], TRUE);
236 FreeAndClear(&info[L_MODWITH], TRUE);
237/*
238 * Slide the newname into the #2 slot, this screws up all future references
239 * to this list.
240 */
241 if (name) /* slide the newname into the #2 slot. */
242 SlipInNewName(info, newname);
243
244 return(info);
245}
246
247/* -------------- List functions. -------------- */
248
249/* Function Name: ShowListInfo.
250 * Description: shows info on a list.
461c03b6 251 * Arguments: argc, argv - name of list in argv[1].
08345b74 252 * Returns: DM status code.
253 */
254
85ca828a 255/* ARGSUSED */
08345b74 256int
257ShowListInfo(argc, argv)
258int argc;
259char **argv;
260{
261 struct qelem *top, *list;
262
461c03b6 263 top = list = GetListInfo(LIST, argv[1], (char *) NULL);
08345b74 264 while (list != NULL) {
265 PrintListInfo( (char **) list->q_data);
266 list = list->q_forw;
267 }
268
269 FreeQueue(top);
270 return(DM_NORMAL);
271}
272
402461ad 273/* Function Name: RealUpdateList
274 * Description: performs the actual update of the list.
275 * Arguments: info - all information needed to update the list.
276 * junk - an UNUSED boolean.
277 * Returns: none.
278 */
279
280/* ARGSUSED */
281static void
282RealUpdateList(info, junk)
283char ** info;
284Bool junk;
285{
286 register int stat;
287 char ** args;
288
eb5eb5de 289 if ((args = AskListInfo(info, TRUE)) == NULL) {
290 Put_message("Aborted.");
291 return;
292 }
8defc06b 293 if ( (stat = do_mr_query("update_list", CountArgs(args), args,
294 Scream, (char *) NULL)) != MR_SUCCESS) {
402461ad 295 com_err(program_name, stat, " in UpdateList.");
296 Put_message("List ** NOT ** Updated.");
297 }
298 else
299 Put_message("List successfully updated.");
300}
301
08345b74 302/* Function Name: UpdateList
85ca828a 303 * Description: updates the information on a list.
08345b74 304 * Arguments: argc, argv - name of list in argv[1].
305 * Returns: DM Status code.
306 */
307
85ca828a 308/* ARGSUSED */
08345b74 309int
310UpdateList(argc, argv)
311int argc;
312char **argv;
313{
402461ad 314 struct qelem *top;
315
316 top = GetListInfo(LIST, argv[1], (char *) NULL);
317 QueryLoop(top, NullPrint, RealUpdateList, "Update the list");
08345b74 318
08345b74 319 FreeQueue(top);
320 return(DM_NORMAL);
321}
322
85ca828a 323/* Function Name: SetDefaults
324 * Description: sets defaults for AddList function
325 * Arguments: info - the array to add them to.
326 * name - name of the program to add.
327 * Returns: defaults - the default information.
328 */
329
330static char **
331SetDefaults(info, name)
332char ** info;
333char * name;
334{
335 info[L_NAME] = Strsave(name);
336 info[L_ACTIVE] = Strsave(DEFAULT_ACTIVE);
337 info[L_PUBLIC] = Strsave(DEFAULT_PUBLIC);
338 info[L_HIDDEN] = Strsave(DEFAULT_HIDDEN);
339 info[L_MAILLIST] = Strsave(DEFAULT_MAILLIST);
340 info[L_GROUP] = Strsave(DEFAULT_GROUP);
341 info[L_GID] = Strsave(DEFAULT_GID);
075fe5bb 342 info[L_ACE_TYPE] = Strsave(DEFAULT_ACE_TYPE);
343 info[L_ACE_NAME] = Strsave(DEFAULT_ACE_NAME);
85ca828a 344 info[L_DESC] = Strsave(DEFAULT_DESCRIPTION);
345 info[L_MODTIME] = info[L_MODBY] = info[L_MODWITH] = info[L_END] = NULL;
346 return(info);
347}
348
08345b74 349/* Function Name: AddList
350 * Description:
351 * Arguments: argc, argv - name of list in argv[1].
402461ad 352 * Returns: SUB_ERROR if list not created.
08345b74 353 */
354
85ca828a 355/* ARGSUSED */
08345b74 356int
357AddList(argc, argv)
358int argc;
359char **argv;
360{
361 static char *info[MAX_ARGS_SIZE], **add_args;
402461ad 362 int status, ret_code = SUB_NORMAL;
dcc803de 363 struct qelem *elem = NULL;
08345b74 364
5df6f171 365 if (!ValidName(argv[1]))
366 return(DM_NORMAL);
8defc06b 367 status = do_mr_query("get_list_info", 1, argv + 1, NullFunc,
461c03b6 368 (char *) NULL);
8defc06b 369 if (status != MR_NO_MATCH) {
370 if (status == MR_SUCCESS)
08345b74 371 Put_message("This list already exists.");
372 else
461c03b6 373 com_err(program_name, status, " in AddList.");
402461ad 374 return(SUB_ERROR);
08345b74 375 }
376
7b131d22 377 /*
378 * If the listname is less than 8 characters, make sure it doesn't
379 * collide with a username.
380 */
381 if ((strlen(argv[1]) <= 8) &&
382 do_mr_query("get_user_account_by_login", 1, argv + 1,
dcc803de 383 StoreInfo, (char *) &elem) == 0) {
384 Put_message("A user by that name already exists in the database.");
385 Loop(QueueTop(elem), FreeInfo);
386 FreeQueue(elem);
387 if (YesNoQuestion("Crate a list with the same name",
388 FALSE) != TRUE)
389 return(SUB_ERROR);
390 }
391
eb5eb5de 392 if ((add_args = AskListInfo(SetDefaults(info,argv[1]), FALSE)) == NULL) {
393 Put_message("Aborted.");
394 return(SUB_ERROR);
395 }
08345b74 396
8defc06b 397 if ( (status = do_mr_query("add_list", CountArgs(add_args), add_args,
398 Scream, (char *) NULL)) != MR_SUCCESS) {
461c03b6 399 com_err(program_name, status, " in AddList.");
08345b74 400 Put_message("List Not Created.");
402461ad 401 ret_code = SUB_ERROR;
08345b74 402 }
403
404 FreeInfo(info);
402461ad 405 return(ret_code);
08345b74 406}
407
408/* Function Name: Instructions
409 * Description: This func prints out instruction on manipulating lists.
410 * Arguments: none
411 * Returns: DM Status Code.
412 */
413
414int
461c03b6 415ListHelp()
08345b74 416{
417 static char * message[] = {
402461ad 418 "Listmaint handles the creation, deletion, and updating of lists.",
419 "A list can be a mailing list, a group list, or both.",
08345b74 420 "The concept behind lists is that a list has an owner",
402461ad 421 "- administrator - and members.",
422 "The administrator of a list may be another list.",
08345b74 423 "The members of a list can be users (login names), other lists,",
402461ad 424 "or address strings.",
08345b74 425 "You can use certain keys to do the following:",
402461ad 426 " Refresh the screen - Type ctrl-L.",
427 " Escape from a function - Type ctrl-C.",
428 " Suspend the program (temporarily) - Type ctrl-Z.",
08345b74 429 NULL,
461c03b6 430 };
08345b74 431
432 return(PrintHelp(message));
433}
434
435/*-*-* LISTMAINT UPDATE MENU *-*-*/
436
437/* Function Name: ListmaintMemberMenuEntry
438 * Description: entry routine into the listmaint member menu.
439 * Arguments: m - the member menu.
440 * argc, argv - name of the list in argv[1].
441 * Returns: none.
442 */
443
444/* ARGSUSED */
445int
446ListmaintMemberMenuEntry(m, argc, argv)
447Menu *m;
448int argc;
449char **argv;
450{
461c03b6 451 char temp_buf[BUFSIZ];
08345b74 452 char *list_name = argv[1];
075fe5bb 453 register int stat;
454
402461ad 455 if (!ValidName(list_name))
456 return(DM_QUIT);
08345b74 457
458 if (*argv[0] == 'a') { /* add_list */
402461ad 459 if (AddList(argc, argv) == SUB_ERROR)
08345b74 460 return(DM_QUIT);
461 (void) sprintf(temp_buf, "List '%s' created. Do you want to %s",
402461ad 462 list_name, "change its membership (y/n)? ");
08345b74 463 if (YesNoQuestion(temp_buf, TRUE) != TRUE )
464 return(DM_QUIT);
465 }
075fe5bb 466 else
467 /* All we want to know is if it exists. */
8defc06b 468 switch( (stat = do_mr_query("count_members_of_list", 1, argv + 1,
075fe5bb 469 NullFunc, (char *) NULL))) {
8defc06b 470 case MR_SUCCESS:
075fe5bb 471 break;
8defc06b 472 case MR_LIST:
075fe5bb 473 Put_message("This list does not exist.");
474 return(DM_QUIT);
8defc06b 475 case MR_PERM:
075fe5bb 476 Put_message("You are not allowed to view this list.");
31791cff 477 break;
075fe5bb 478 default:
479 com_err(program_name, stat, " in get_list_info");
480 return(DM_QUIT);
481 }
08345b74 482
483 (void) sprintf(temp_buf,
484 "Change/Display membership of '%s'", list_name);
485 m->m_title = Strsave(temp_buf);
486 strcpy(current_list, list_name);
487 return(DM_NORMAL);
488}
489
490/* Function Name: ListmaintMemberMenuExit
491 * Description: This is the function called when the member menu is
492 * exited, it frees the memory that is storing the name.
493 * Arguments: m - the menu
494 * Returns: DM_NORMAL
495 */
496
497int
498ListmaintMemberMenuExit(m)
499Menu *m;
500{
501 free(m->m_title);
502 strcpy(current_list, "");
503 return(DM_NORMAL);
504}
505
506/* Function Name: ListMembersByType
507 * Description: This function lists the users of a list by type.
508 * Arguments: type - the type of the list "USER", "LIST", or "STRING".
509 * Returns: none.
510 * NOTE: if type is NULL, all lists members are listed.
511 */
512
84b46f02 513int
461c03b6 514ListMembersByType(type)
08345b74 515char * type;
516{
517 char temp_buf[BUFSIZ];
461c03b6 518 register int status;
402461ad 519 char * args[10];
520
521 args[0] = current_list;
522 args[1] = NULL;
08345b74 523
524 found_some = FALSE;
8defc06b 525 if ( (status = do_mr_query("get_members_of_list", CountArgs(args), args,
a42a06d7 526 PrintByType, type)) != 0) {
402461ad 527 com_err(program_name, status, " in ListMembersByType");
a42a06d7 528 return(DM_NORMAL);
529 }
08345b74 530 if (!found_some) {
531 if (type == NULL)
532 Put_message("List is empty (no members).");
533 else {
534 sprintf(temp_buf,"No %s Members",type);
535 Put_message(temp_buf);
536 }
537 }
538}
539
540/* Function Name: ListAllMembers
541 * Description: lists all members of the current list.
542 * Arguments:
543 * Returns: DM_NORMAL
544 */
545
546int
547ListAllMembers()
548{
549 ListMembersByType(NULL);
550 return (DM_NORMAL);
551}
552
553/* Function Name: ListUserMembers
554 * Description: This function lists all members of a list of type "USER".
555 * Arguments: none
556 * Returns: DM_NORMAL.
557 */
558
559ListUserMembers()
560{
561 ListMembersByType("USER");
562 return(DM_NORMAL);
563}
564
565/* Function Name: ListListMembers
566 * Description: This function lists all members of a list of type "LIST".
567 * Arguments: none
568 * Returns: DM_NORMAL.
569 */
570
571ListListMembers()
572{
573 ListMembersByType("LIST");
574 return(DM_NORMAL);
575}
576
577/* Function Name: ListStringMembers
578 * Description:This function lists all members of a list of type "STRING".
579 * Arguments: none
580 * Returns: DM_NORMAL.
581 */
582
583ListStringMembers()
584{
585 ListMembersByType("STRING");
586 return(DM_NORMAL);
587}
588
589/* Function Name: GetMemberInfo
590 * Description: This function gets the information needed to
591 * add or delete a user from a list.
592 * Arguments: argc, argv - standard.
593 * action - name of the action to be performed either
594 * "add" or "delete".
595 * ret_argc, ret_argv - the returned value of argc and argv.
596 * Returns: SUB_ERROR or SUB_NORMAL.
597 */
598
599int
600GetMemberInfo(action, ret_argv)
601char *action, **ret_argv;
602{
7b53f00f 603 char temp_buf[BUFSIZ];
08345b74 604
605 ret_argv[LM_LIST] = Strsave(current_list);
08345b74 606
31791cff 607 ret_argv[LM_TYPE] = Strsave("user");
eb5eb5de 608 if (GetTypeFromUser("Type of member", "member", &ret_argv[LM_TYPE]) ==
609 SUB_ERROR)
610 return(SUB_ERROR);
0a2c64cb 611
402461ad 612 sprintf(temp_buf,"Name of %s to %s", ret_argv[LM_TYPE], action);
31791cff 613 ret_argv[LM_MEMBER] = Strsave(user);
eb5eb5de 614 if (GetValueFromUser(temp_buf, &ret_argv[LM_MEMBER]) == SUB_ERROR)
615 return(SUB_ERROR);
402461ad 616 ret_argv[LM_END] = NULL; /* NULL terminate this list. */
617
68c57b15 618 if (strcasecmp(ret_argv[LM_TYPE], "string") &&
619 !ValidName( ret_argv[LM_MEMBER] ) ) {
402461ad 620 FreeInfo(ret_argv);
621 return(SUB_ERROR);
622 }
08345b74 623 return(SUB_NORMAL);
624}
625
626/* Function Name: AddMember
627 * Description: This function adds a member to a list.
628 * Arguments: none.
629 * Returns: DM_NORMAL.
630 */
631
632int
633AddMember()
634{
fc2df2d9 635 char *args[10], temp_buf[BUFSIZ], *p;
461c03b6 636 register int status;
fc2df2d9 637 struct qelem *mailhubs, *elem, *GetTypeValues();
08345b74 638
402461ad 639 if ( GetMemberInfo("add", args) == SUB_ERROR )
08345b74 640 return(DM_NORMAL);
641
fc2df2d9 642 if (!strcmp(args[LM_TYPE], "STRING")) {
f071d8a7 643 if (p = strchr(args[LM_MEMBER], '@')) {
fc2df2d9 644 char *host = canonicalize_hostname(strsave(++p));
645 mailhubs = GetTypeValues("mailhub");
646 for (elem = mailhubs; elem; elem = elem->q_forw) {
647 if (!strcasecmp(host, elem->q_data)) {
648 free(host);
649 host = strsave(args[LM_MEMBER]);
650 *(--p) = 0;
651 sprintf(temp_buf, "String \"%s\" should be USER or LIST \"%s\" because it is a local name.",
652 host, args[LM_MEMBER]);
653 Put_message(temp_buf);
654 free(args[LM_TYPE]);
655 free(host);
656 return(DM_NORMAL);
657 }
658 }
659 free(host);
f071d8a7 660 } else if (!strchr(args[LM_MEMBER], '!')) {
fc2df2d9 661 Put_message("Member which is not a foreign mail address should not be type STRING.");
662 return(DM_NORMAL);
663 }
664 }
665
8defc06b 666 if ( (status = do_mr_query("add_member_to_list", CountArgs(args), args,
667 Scream, NULL)) != MR_SUCCESS) {
668 if (status == MR_EXISTS) {
402461ad 669 sprintf(temp_buf, "The %s %s is already a member of LIST %s.",
670 args[LM_TYPE], args[LM_MEMBER], args[LM_LIST]);
671 Put_message(temp_buf);
672 }
673 else
674 com_err(program_name, status, " in AddMember");
675 }
08345b74 676
677 FreeInfo(args);
402461ad 678 return(DM_NORMAL);
08345b74 679}
680
681/* Function Name: DeleteMember
682 * Description: This function deletes a member from a list.
683 * Arguments: none.
684 * Returns: DM_NORMAL
685 */
686
687int
688DeleteMember()
689{
690 char *args[10];
461c03b6 691 register int status;
08345b74 692
693 if( GetMemberInfo("delete", args) == SUB_ERROR )
694 return(DM_NORMAL);
695
696 if (Confirm("Are you sure you want to delete this member?") ) {
8defc06b 697 if (status = do_mr_query("delete_member_from_list", CountArgs(args),
08345b74 698 args, Scream, NULL))
402461ad 699 com_err(program_name, status, " in DeleteMember");
08345b74 700 else
701 Put_message("Deletion Completed.");
702 }
703 else
704 Put_message("Deletion has been Aborted.");
705
706 FreeInfo(args);
707 return(DM_NORMAL);
708}
709
08345b74 710/* Function Name: InterRemoveItemFromLists
711 * Description: This function allows interactive removal of an item
712 * (user, string, list) for all list that it is on.
713 * Arguments: none.
714 * Returns: DM_NORMAL.
402461ad 715 * NOTES: QueryLoop() does not work here because info does not have
716 * enough information in it to delete the member from the list.
08345b74 717 */
718
719int
720InterRemoveItemFromLists()
721{
461c03b6 722 register int status;
eb5eb5de 723 char *type, *name, *args[10], buf[BUFSIZ];
461c03b6 724 struct qelem *top, *elem;
08345b74 725
eb5eb5de 726 type = strsave("USER");
727 if (GetTypeFromUser("Type of member", "member", &type) == SUB_ERROR)
08345b74 728 return(DM_NORMAL);
729
402461ad 730 sprintf(buf, "Name of %s", type);
eb5eb5de 731 name = strsave(user);
732 if (GetValueFromUser(buf, &name) == SUB_ERROR)
733 return(DM_NORMAL);
08345b74 734
402461ad 735 if (!ValidName(name))
736 return(DM_NORMAL);
737
08345b74 738 top = elem = GetListInfo(GLOM, type, name);
739
740 while(elem != NULL) {
402461ad 741 char line[BUFSIZ];
461c03b6 742 char ** info = (char **) elem->q_data;
402461ad 743 sprintf(line, "Delete %s %s from the list \"%s\" (y/n/q)? ", type,
744 name, info[GLOM_NAME]);
745 switch (YesNoQuitQuestion(line, FALSE)) {
746 case TRUE:
08345b74 747 Put_message("deleting...");
461c03b6 748 args[DM_LIST] = info[GLOM_NAME];
08345b74 749 args[DM_TYPE] = type;
750 args[DM_MEMBER] = name;
8defc06b 751 if ( (status = do_mr_query("delete_member_from_list", 3, args,
08345b74 752 Scream, (char *) NULL)) != 0)
402461ad 753 /* should probabally check to delete list. */
461c03b6 754 com_err(program_name, status, " in delete_member");
08345b74 755 break;
402461ad 756 case FALSE:
757 break;
758 default:
759 Put_message("Aborting...");
760 FreeQueue(top);
761 return(DM_NORMAL);
08345b74 762 }
763 elem = elem->q_forw;
764 }
765 FreeQueue(top);
766 return(DM_NORMAL);
767}
768
769/*-*-* LIST MENU *-*-*/
770
771/* Function Name: ListByMember
772 * Description: This gets all lists that a given member is a member of.
461c03b6 773 * Arguments: none.
08345b74 774 * Returns: DM_NORMAL.
775 */
776
777int
461c03b6 778ListByMember()
08345b74 779{
402461ad 780 char buf[BUFSIZ], temp_buf[BUFSIZ], *type, *name, **info;
461c03b6 781 Bool maillist, group;
782 struct qelem *top, *elem;
08345b74 783
eb5eb5de 784 type = strsave("USER");
785 if (GetTypeFromUser("Type of member", "member", &type) == SUB_ERROR)
08345b74 786 return(DM_NORMAL);
eb5eb5de 787
788 sprintf(buf, "Name of %s", type);
789 name = strsave(user);
790 if (GetValueFromUser(buf, &name) == SUB_ERROR)
791 return(DM_NORMAL);
08345b74 792
402461ad 793 /* What we really want is a recursive search */
eb5eb5de 794 sprintf(temp_buf, "R%s", type);
795 free(type); type = Strsave(temp_buf);
402461ad 796
eb5eb5de 797 if ((maillist = YesNoQuestion("Show Lists that are Maillists (y/n) ?",
798 TRUE)) == -1)
799 return(DM_NORMAL);
800 if ((group = YesNoQuestion("Show Lists that are Groups (y/n) ?",
801 TRUE)) == -1)
802 return(DM_NORMAL);
08345b74 803
804 elem = top = GetListInfo(GLOM, type, name);
805
806 while (elem != NULL) {
807 info = (char**) elem->q_data;
5151666e 808 if ((maillist == TRUE && !strcmp(info[GLOM_MAILLIST], "1")) ||
809 (group == TRUE && !strcmp(info[GLOM_GROUP], "1")))
08345b74 810 Put_message(info[GLOM_NAME]);
811 elem = elem->q_forw;
812 }
813 FreeQueue(top);
814 return (DM_NORMAL);
815}
816
817/* Function Name: ListByAdministrator
818 * Description: This function prints all lists which a given user or
819 * group administers.
461c03b6 820 * Arguments: none.
08345b74 821 * Returns: DM_NORMAL.
822 */
823
824int
461c03b6 825ListByAdministrator()
08345b74 826{
402461ad 827 char buf[BUFSIZ], temp_buf[BUFSIZ], *type, *name;
828 struct qelem *top;
08345b74 829
eb5eb5de 830 type = strsave("USER");
831 if (GetTypeFromUser("Type of member", "member", &type) == SUB_ERROR)
08345b74 832 return(DM_NORMAL);
08345b74 833
eb5eb5de 834 sprintf(buf, "Name of %s", type);
835 name = strsave(user);
836 if (GetValueFromUser(buf, &name) == SUB_ERROR)
837 return(DM_NORMAL);
838
839 switch (YesNoQuestion("Do you want a recursive search (y/n)", FALSE)) {
840 case TRUE:
841 sprintf(temp_buf, "R%s", type); /* "USER" to "RUSER" etc. */
08345b74 842 free(type);
eb5eb5de 843 type = Strsave(temp_buf);
844 break;
845 case FALSE:
846 break;
847 default:
08345b74 848 return(DM_NORMAL);
849 }
eb5eb5de 850
075fe5bb 851 top = GetListInfo(ACE_USE, type, name);
852 Loop(top, PrintListAce);
402461ad 853
08345b74 854 FreeQueue(top);
855 return (DM_NORMAL);
856}
857
08345b74 858/* Function Name: ListAllPublicMailLists
859 * Description: This function lists all public mailing lists.
860 * Arguments: none
861 * Returns: DM_NORMAL.
862 */
863
864ListAllPublicMailLists()
865{
461c03b6 866 register int status;
08345b74 867 static char * args[] = {
868 "TRUE", /* active */
869 "TRUE", /* public */
870 "FALSE", /* hidden */
871 "TRUE", /* maillist */
872 "DONTCARE", /* group. */
461c03b6 873 };
08345b74 874
875 if (YesNoQuestion("This query will take a while. Do you wish to continue?",
461c03b6 876 TRUE) == TRUE )
8defc06b 877 if (status = do_mr_query("qualified_get_lists", 5, args,
08345b74 878 Print, (char *) NULL) != 0)
402461ad 879 com_err(program_name, status, " in ListAllGroups");
08345b74 880
881 return (DM_NORMAL);
882}
This page took 0.211148 seconds and 5 git commands to generate.