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