-#if (!defined(lint) && !defined(SABER))
- static char rcsid_module_c[] = "$Header$";
-#endif
-
-/* This is the file lists.c for the MOIRA Client, which allows a nieve
- * user to quickly and easily maintain most parts of the MOIRA database.
+/* $Id$
+ *
+ * This is the file lists.c for the Moira Client, which allows users
+ * to quickly and easily maintain most parts of the Moira database.
* It Contains: All list manipulation functions, except delete.
*
* Created: 4/12/88
* By: Chris D. Peterson
*
- * $Source$
- * $Author$
- * $Header$
- *
- * Copyright 1988 by the Massachusetts Institute of Technology.
- *
- * For further information on copyright and distribution
- * see the file mit-copyright.h
+ * Copyright (C) 1988-1998 by the Massachusetts Institute of Technology.
+ * For copying and distribution information, please see the file
+ * <mit-copyright.h>.
*/
-#include <stdio.h>
-#include <string.h>
+#include <mit-copyright.h>
#include <moira.h>
+#include <mrclient.h>
#include <moira_site.h>
-#include <menu.h>
-
-#include "mit-copyright.h"
#include "defs.h"
#include "f_defs.h"
#include "globals.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+RCSID("$Header$");
+
+struct mqelem *GetListInfo(int type, char *name1, char *name2);
+char **AskListInfo(char **info, Bool name);
+int AddList(int argc, char **argv);
+void ListMembersByType(char *type, int tags);
+int GetMemberInfo(char *action, char **ret_argv);
+
#define LIST 0
#define MEMBERS 1
#define GLOM 2
#define DEFAULT_MAILLIST DEFAULT_YES
#define DEFAULT_GROUP DEFAULT_NO
#define DEFAULT_GID UNIQUE_GID
+#define DEFAULT_NFSGROUP DEFAULT_NO
#define DEFAULT_ACE_TYPE "user"
#define DEFAULT_ACE_NAME (user)
+#define DEFAULT_MEMACE_TYPE "NONE"
+#define DEFAULT_MEMACE_NAME "NONE"
#define DEFAULT_DESCRIPTION DEFAULT_COMMENT
/* globals only for this file. */
static char current_list[BUFSIZ];
+
/* Function Name: PrintListAce
* Description: This function prints the list ace information.
* Arguments: info - an info structure.
Put_message("This list is NOT a mailing list.");
if (atoi(info[L_GROUP]))
{
- sprintf(buf, "This list is a Group and its ID number is %s",
+ sprintf(buf, "This list is a Group%s and its ID number is %s",
+ atoi(info[L_NFSGROUP]) ? " and an NFS Group," : "",
info[L_GID]);
Put_message(buf);
}
Put_message(buf);
}
+ if (strcmp(info[L_MEMACE_TYPE], "NONE"))
+ {
+ sprintf(buf, "The Membership Administrator of this list is the %s: %s",
+ info[L_MEMACE_TYPE], info[L_MEMACE_NAME]);
+ Put_message(buf);
+ }
+
sprintf(buf, "This list is: %s, %s, and %s",
atoi(info[L_ACTIVE]) ? "active" : "inactive",
atoi(info[L_PUBLIC]) ? "public" : "private",
* Returns: the first element in the queue.
*/
-struct qelem *GetListInfo(int type, char *name1, char *name2)
+struct mqelem *GetListInfo(int type, char *name1, char *name2)
{
char *args[2];
- struct qelem *elem = NULL;
+ struct mqelem *elem = NULL;
int status;
switch (type)
{
case LIST:
args[0] = name1;
- if ((status = do_mr_query("get_list_info", 1, args,
- StoreInfo, (char *) &elem)))
+ if ((status = do_mr_query("get_list_info", 1, args, StoreInfo, &elem)))
{
com_err(program_name, status, " in get_list_info");
return NULL;
case MEMBERS:
args[0] = name1;
if ((status = do_mr_query("get_members_of_list", 1, args,
- StoreInfo, (char *) &elem)))
+ StoreInfo, &elem)))
{
com_err(program_name, status, " in get_members_of_list");
return NULL;
args[0] = name1;
args[1] = name2;
if ((status = do_mr_query("get_lists_of_member", 2, args,
- StoreInfo, (char *) &elem)))
+ StoreInfo, &elem)))
{
com_err(program_name, status, " in get_list_of_members");
return NULL;
case ACE_USE:
args[0] = name1;
args[1] = name2;
- if ((status = do_mr_query("get_ace_use", 2, args,
- StoreInfo, (char *) &elem)))
+ if ((status = do_mr_query("get_ace_use", 2, args, StoreInfo, &elem)))
{
com_err(program_name, status, " in get_ace_use");
return NULL;
{
while (1)
{
- newname = Strsave(info[L_NAME]);
+ newname = strdup(info[L_NAME]);
if (GetValueFromUser("The new name for this list", &newname) ==
SUB_ERROR)
return NULL;
return NULL;
if (atoi(info[L_GROUP]))
{
+ if (GetYesNoValueFromUser("Is this an NFS group", &info[L_NFSGROUP]) ==
+ SUB_ERROR)
+ return NULL;
if (GetValueFromUser("What is the GID for this group.", &info[L_GID]) ==
SUB_ERROR)
return NULL;
}
- if (GetTypeFromUser("What Type of Administrator", "ace_type",
- &info[L_ACE_TYPE]) == SUB_ERROR)
+ do {
+ if (GetTypeFromUser("What Type of Administrator", "ace_type",
+ &info[L_ACE_TYPE]) == SUB_ERROR)
+ return NULL;
+ if (strcasecmp(info[L_ACE_TYPE], "none"))
+ {
+ sprintf(temp_buf, "Which %s will be the administrator of this list: ",
+ info[L_ACE_TYPE]);
+ if (GetValueFromUser(temp_buf, &info[L_ACE_NAME]) == SUB_ERROR)
+ return NULL;
+ }
+ else
+ {
+ Put_message("Setting the administrator of this list to 'NONE'");
+ Put_message("will make you unable to further modify the list.");
+ if (YesNoQuestion("Do you really want to do this?", FALSE) == TRUE)
+ break;
+ }
+ } while (!strcasecmp(info[L_ACE_TYPE], "none"));
+
+ if (!strcasecmp(info[L_ACE_TYPE], "kerberos"))
+ {
+ char *canon;
+
+ mrcl_validate_kerberos_member(info[L_ACE_NAME], &canon);
+ if (mrcl_get_message())
+ Put_message(mrcl_get_message());
+ free(info[L_ACE_NAME]);
+ info[L_ACE_NAME] = canon;
+ }
+ if (GetTypeFromUser("What Type of Membership Administrator", "ace_type",
+ &info[L_MEMACE_TYPE]) == SUB_ERROR)
return NULL;
- if (strcasecmp(info[L_ACE_TYPE], "NONE") &&
- strcasecmp(info[L_ACE_TYPE], "none"))
+ if (strcasecmp(info[L_MEMACE_TYPE], "none"))
{
- sprintf(temp_buf, "Which %s will be the administrator of this list: ",
- info[L_ACE_TYPE]);
- if (GetValueFromUser(temp_buf, &info[L_ACE_NAME]) == SUB_ERROR)
+ sprintf(temp_buf, "Which %s will be the membership administrator of this list: ",
+ info[L_MEMACE_TYPE]);
+ if (GetValueFromUser(temp_buf, &info[L_MEMACE_NAME]) == SUB_ERROR)
return NULL;
}
+ if (!strcasecmp(info[L_MEMACE_TYPE], "kerberos"))
+ {
+ char *canon;
+
+ mrcl_validate_kerberos_member(info[L_MEMACE_NAME], &canon);
+ if (mrcl_get_message())
+ Put_message(mrcl_get_message());
+ free(info[L_MEMACE_NAME]);
+ info[L_MEMACE_NAME] = canon;
+ }
if (GetValueFromUser("Description: ", &info[L_DESC]) == SUB_ERROR)
return NULL;
int ShowListInfo(int argc, char **argv)
{
- struct qelem *top, *list;
+ struct mqelem *top, *list;
top = list = GetListInfo(LIST, argv[1], NULL);
while (list)
{
- PrintListInfo((char **) list->q_data);
+ PrintListInfo(list->q_data);
list = list->q_forw;
}
{
int stat;
char **args;
- struct qelem *elem = NULL;
+ struct mqelem *elem = NULL;
if (!(args = AskListInfo(info, TRUE)))
{
*/
if ((strlen(args[2]) <= 8) &&
do_mr_query("get_user_account_by_login", 1, args + 1,
- StoreInfo, (char *) &elem) != MR_NO_MATCH)
+ StoreInfo, &elem) != MR_NO_MATCH)
{
char buf[256];
}
if ((stat = do_mr_query("update_list", CountArgs(args), args,
- Scream, (char *) NULL)) != MR_SUCCESS)
+ NULL, NULL)) != MR_SUCCESS)
{
com_err(program_name, stat, " in UpdateList.");
Put_message("List ** NOT ** Updated.");
int UpdateList(int argc, char **argv)
{
- struct qelem *top;
+ struct mqelem *top;
top = GetListInfo(LIST, argv[1], (char *) NULL);
QueryLoop(top, NullPrint, RealUpdateList, "Update the list");
static char **SetDefaults(char **info, char *name)
{
- info[L_NAME] = Strsave(name);
- info[L_ACTIVE] = Strsave(DEFAULT_ACTIVE);
- info[L_PUBLIC] = Strsave(DEFAULT_PUBLIC);
- info[L_HIDDEN] = Strsave(DEFAULT_HIDDEN);
- info[L_MAILLIST] = Strsave(DEFAULT_MAILLIST);
- info[L_GROUP] = Strsave(DEFAULT_GROUP);
- info[L_GID] = Strsave(DEFAULT_GID);
- info[L_ACE_TYPE] = Strsave(DEFAULT_ACE_TYPE);
- info[L_ACE_NAME] = Strsave(DEFAULT_ACE_NAME);
- info[L_DESC] = Strsave(DEFAULT_DESCRIPTION);
+ info[L_NAME] = strdup(name);
+ info[L_ACTIVE] = strdup(DEFAULT_ACTIVE);
+ info[L_PUBLIC] = strdup(DEFAULT_PUBLIC);
+ info[L_HIDDEN] = strdup(DEFAULT_HIDDEN);
+ info[L_MAILLIST] = strdup(DEFAULT_MAILLIST);
+ info[L_GROUP] = strdup(DEFAULT_GROUP);
+ info[L_GID] = strdup(DEFAULT_GID);
+ info[L_NFSGROUP] = strdup(DEFAULT_NFSGROUP);
+ info[L_ACE_TYPE] = strdup(DEFAULT_ACE_TYPE);
+ info[L_ACE_NAME] = strdup(DEFAULT_ACE_NAME);
+ info[L_MEMACE_TYPE] = strdup(DEFAULT_MEMACE_TYPE);
+ info[L_MEMACE_NAME] = strdup(DEFAULT_MEMACE_NAME);
+ info[L_DESC] = strdup(DEFAULT_DESCRIPTION);
info[L_MODTIME] = info[L_MODBY] = info[L_MODWITH] = info[L_END] = NULL;
return info;
}
{
static char *info[MAX_ARGS_SIZE], **add_args;
int status, ret_code = SUB_NORMAL;
- struct qelem *elem = NULL;
+ struct mqelem *elem = NULL;
if (!ValidName(argv[1]))
return DM_NORMAL;
- status = do_mr_query("get_list_info", 1, argv + 1, NullFunc, NULL);
+ status = do_mr_query("get_list_info", 1, argv + 1, NULL, NULL);
if (status != MR_NO_MATCH)
{
if (status == MR_SUCCESS)
*/
if ((strlen(argv[1]) <= 8) &&
do_mr_query("get_user_account_by_login", 1, argv + 1,
- StoreInfo, (char *) &elem) != MR_NO_MATCH)
+ StoreInfo, &elem) != MR_NO_MATCH)
{
char buf[256];
Put_message(buf);
Loop(QueueTop(elem), FreeInfo);
FreeQueue(elem);
- if (YesNoQuestion("Crate a list with the same name", FALSE) != TRUE)
+ if (YesNoQuestion("Create a list with the same name", FALSE) != TRUE)
return SUB_ERROR;
}
}
if ((status = do_mr_query("add_list", CountArgs(add_args), add_args,
- Scream, (char *) NULL)) != MR_SUCCESS)
+ NULL, NULL)) != MR_SUCCESS)
{
com_err(program_name, status, " in AddList.");
Put_message("List Not Created.");
* Returns: DM Status Code.
*/
-int ListHelp(void)
+int ListHelp(int argc, char **argv)
{
static char *message[] = {
"Listmaint handles the creation, deletion, and updating of lists.",
else
/* All we want to know is if it exists. */
switch ((stat = do_mr_query("count_members_of_list", 1, argv + 1,
- NullFunc, NULL)))
+ NULL, NULL)))
{
case MR_SUCCESS:
break;
}
sprintf(temp_buf, "Change/Display membership of '%s'", list_name);
- m->m_title = Strsave(temp_buf);
+ m->m_title = strdup(temp_buf);
strcpy(current_list, list_name);
return DM_NORMAL;
}
/* Function Name: ListMembersByType
* Description: This function lists the users of a list by type.
* Arguments: type - the type of the list "USER", "LIST", or "STRING".
+ * tags - whether or not to display tags
* Returns: none.
* NOTE: if type is NULL, all lists members are listed.
*/
-int ListMembersByType(char *type)
+void ListMembersByType(char *type, int tags)
{
char temp_buf[BUFSIZ];
int status;
args[1] = NULL;
found_some = FALSE;
- if ((status = do_mr_query("get_members_of_list", CountArgs(args), args,
- PrintByType, type)))
- {
- com_err(program_name, status, " in ListMembersByType");
- return DM_NORMAL;
- }
+ if ((status = do_mr_query(tags ? "get_tagged_members_of_list" :
+ "get_members_of_list", CountArgs(args),
+ args, PrintByType, type)))
+ com_err(program_name, status, " in ListMembersByType");
if (!found_some)
{
if (!type)
* Returns: DM_NORMAL
*/
-int ListAllMembers(void)
+int ListAllMembers(int argc, char **argv)
{
- ListMembersByType(NULL);
+ ListMembersByType(NULL, 0);
return DM_NORMAL;
}
* Returns: DM_NORMAL.
*/
-int ListUserMembers(void)
+int ListUserMembers(int argc, char **argv)
{
- ListMembersByType("USER");
+ ListMembersByType("USER", 0);
return DM_NORMAL;
}
* Returns: DM_NORMAL.
*/
-int ListListMembers(void)
+int ListListMembers(int argc, char **argv)
{
- ListMembersByType("LIST");
+ ListMembersByType("LIST", 0);
return DM_NORMAL;
}
* Returns: DM_NORMAL.
*/
-int ListStringMembers(void)
+int ListStringMembers(int argc, char **argv)
{
- ListMembersByType("STRING");
+ ListMembersByType("STRING", 0);
return DM_NORMAL;
}
{
char temp_buf[BUFSIZ];
- ret_argv[LM_LIST] = Strsave(current_list);
+ ret_argv[LM_LIST] = strdup(current_list);
- ret_argv[LM_TYPE] = Strsave("user");
+ ret_argv[LM_TYPE] = strdup("user");
if (GetTypeFromUser("Type of member", "member", &ret_argv[LM_TYPE]) ==
SUB_ERROR)
return SUB_ERROR;
sprintf(temp_buf, "Name of %s to %s", ret_argv[LM_TYPE], action);
- ret_argv[LM_MEMBER] = Strsave(user);
+ ret_argv[LM_MEMBER] = strdup(user);
if (GetValueFromUser(temp_buf, &ret_argv[LM_MEMBER]) == SUB_ERROR)
return SUB_ERROR;
ret_argv[LM_END] = NULL; /* NULL terminate this list. */
* Returns: DM_NORMAL.
*/
-int AddMember(void)
+int AddMember(int argc, char **argv)
{
char *args[10], temp_buf[BUFSIZ], *p;
int status;
- struct qelem *mailhubs, *elem, *GetTypeValues();
+ struct mqelem *mailhubs, *elem;
if (GetMemberInfo("add", args) == SUB_ERROR)
return DM_NORMAL;
if (!strcmp(args[LM_TYPE], "STRING"))
{
- if ((p = strchr(args[LM_MEMBER], '@')))
- {
- char *host = canonicalize_hostname(strsave(++p));
- mailhubs = GetTypeValues("mailhub");
- for (elem = mailhubs; elem; elem = elem->q_forw)
- {
- if (!strcasecmp(host, elem->q_data))
- {
- free(host);
- host = strsave(args[LM_MEMBER]);
- *(--p) = 0;
- sprintf(temp_buf, "String \"%s\" should be USER or LIST "
- "\"%s\" because it is a local name.", host,
- args[LM_MEMBER]);
- Put_message(temp_buf);
- free(args[LM_TYPE]);
- free(host);
- return DM_NORMAL;
- }
- }
- free(host);
- }
- else if (!strchr(args[LM_MEMBER], '!'))
- {
- Put_message("Member which is not a foreign mail address "
- "should not be type STRING.");
- return DM_NORMAL;
- }
+ status = mrcl_validate_string_member(args[LM_MEMBER]);
+ if (status != MRCL_SUCCESS)
+ Put_message(mrcl_get_message());
+ if (status == MRCL_REJECT)
+ return DM_NORMAL;
+ }
+ else if (!strcmp(args[LM_TYPE], "KERBEROS"))
+ {
+ char *canon;
+
+ mrcl_validate_kerberos_member(args[LM_MEMBER], &canon);
+ if (mrcl_get_message())
+ Put_message(mrcl_get_message());
+ free(args[LM_MEMBER]);
+ args[LM_MEMBER] = canon;
}
if ((status = do_mr_query("add_member_to_list", CountArgs(args), args,
- Scream, NULL)) != MR_SUCCESS)
+ NULL, NULL)) != MR_SUCCESS)
{
if (status == MR_EXISTS)
{
* Returns: DM_NORMAL
*/
-int DeleteMember(void)
+int DeleteMember(int argc, char **argv)
{
char *args[10];
int status;
if (Confirm("Are you sure you want to delete this member?"))
{
if ((status = do_mr_query("delete_member_from_list", CountArgs(args),
- args, Scream, NULL)))
+ args, NULL, NULL)))
+ {
+ if ((status == MR_STRING || status == MR_NO_MATCH) &&
+ !strcmp(args[LM_TYPE], "KERBEROS"))
+ {
+ char *canon;
+ mrcl_validate_kerberos_member(args[LM_MEMBER], &canon);
+ if (mrcl_get_message())
+ {
+ free(args[LM_MEMBER]);
+ args[LM_MEMBER] = canon;
+ if (do_mr_query("delete_member_from_list", CountArgs(args),
+ args, NULL, NULL) == MR_SUCCESS)
+ {
+ Put_message(mrcl_get_message());
+ status = MR_SUCCESS;
+ }
+ }
+ }
+ }
+ if (status)
com_err(program_name, status, " in DeleteMember");
else
Put_message("Deletion Completed.");
return DM_NORMAL;
}
+/* Function Name: TagMember
+ * Description: Add a tag to a list member
+ * Arguments:
+ * Returns: DM_NORMAL
+ */
+
+int TagMember(int argc, char **argv)
+{
+ char *args[10];
+ int status;
+
+ if (GetMemberInfo("tag", args) == SUB_ERROR)
+ return DM_NORMAL;
+
+ args[LM_TAG] = strdup("");
+ if (GetValueFromUser("Tag" , &args[LM_TAG]) == SUB_ERROR)
+ {
+ Put_message("Aborted.");
+ return DM_NORMAL;
+ }
+ args[LM_TAG_END] = NULL; /* NULL terminate this list. */
+
+ if ((status = do_mr_query("tag_member_of_list", CountArgs(args),
+ args, NULL, NULL)))
+ com_err(program_name, status, " in TagMember");
+
+ FreeInfo(args);
+ return DM_NORMAL;
+}
+
+/* Function Name: ListAllMembers
+ * Description: lists all members of the current list.
+ * Arguments:
+ * Returns: DM_NORMAL
+ */
+
+int ListMembersWithTags(int argc, char **argv)
+{
+ ListMembersByType(NULL, 1);
+ return DM_NORMAL;
+}
+
/* Function Name: InterRemoveItemFromLists
* Description: This function allows interactive removal of an item
* (user, string, list) for all list that it is on.
* enough information in it to delete the member from the list.
*/
-int InterRemoveItemFromLists(void)
+int InterRemoveItemFromLists(int argc, char **argv)
{
int status;
char *type, *name, *args[10], buf[BUFSIZ];
- struct qelem *top, *elem;
+ struct mqelem *top, *elem;
- type = strsave("USER");
+ type = strdup("USER");
if (GetTypeFromUser("Type of member", "member", &type) == SUB_ERROR)
return DM_NORMAL;
sprintf(buf, "Name of %s", type);
- name = strsave(user);
+ name = strdup(user);
if (GetValueFromUser(buf, &name) == SUB_ERROR)
return DM_NORMAL;
while (elem)
{
char line[BUFSIZ];
- char **info = (char **) elem->q_data;
+ char **info = elem->q_data;
sprintf(line, "Delete %s %s from the list \"%s\" (y/n/q)? ", type,
name, info[GLOM_NAME]);
switch (YesNoQuitQuestion(line, FALSE))
args[DM_TYPE] = type;
args[DM_MEMBER] = name;
if ((status = do_mr_query("delete_member_from_list", 3, args,
- Scream, (char *) NULL)))
+ NULL, NULL)))
{
/* should probabally check to delete list. */
com_err(program_name, status, " in delete_member");
* Returns: DM_NORMAL.
*/
-int ListByMember(void)
+int ListByMember(int argc, char **argv)
{
char buf[BUFSIZ], temp_buf[BUFSIZ], *type, *name, **info;
- Bool maillist, group;
- struct qelem *top, *elem;
+ Bool maillist, group, neither;
+ struct mqelem *top, *elem;
- type = strsave("USER");
+ type = strdup("USER");
if (GetTypeFromUser("Type of member", "member", &type) == SUB_ERROR)
return DM_NORMAL;
sprintf(buf, "Name of %s", type);
- name = strsave(user);
+ name = strdup(user);
if (GetValueFromUser(buf, &name) == SUB_ERROR)
return DM_NORMAL;
- /* What we really want is a recursive search */
- sprintf(temp_buf, "R%s", type);
- free(type);
- type = Strsave(temp_buf);
+ switch (YesNoQuestion("Do you want a recursive search (y/n)", TRUE))
+ {
+ case TRUE:
+ sprintf(temp_buf, "R%s", type); /* "USER" to "RUSER" etc. */
+ free(type);
+ type = strdup(temp_buf);
+ break;
+ case FALSE:
+ break;
+ default:
+ return DM_NORMAL;
+ }
if ((maillist = YesNoQuestion("Show Lists that are Maillists (y/n) ?",
TRUE)) == -1)
TRUE)) == -1)
return DM_NORMAL;
+ if ((neither = YesNoQuestion("Show Lists that are neither Maillists nor Groups (y/n) ?",
+ TRUE)) == -1)
+ return DM_NORMAL;
+
elem = top = GetListInfo(GLOM, type, name);
while (elem)
{
- info = (char **) elem->q_data;
+ info = elem->q_data;
if ((maillist == TRUE && !strcmp(info[GLOM_MAILLIST], "1")) ||
(group == TRUE && !strcmp(info[GLOM_GROUP], "1")))
Put_message(info[GLOM_NAME]);
+ if (neither == TRUE && !strcmp(info[GLOM_MAILLIST], "0") &&
+ !strcmp(info[GLOM_GROUP], "0"))
+ Put_message(info[GLOM_NAME]);
elem = elem->q_forw;
}
FreeQueue(top);
* Returns: DM_NORMAL.
*/
-int ListByAdministrator(void)
+int ListByAdministrator(int argc, char **argv)
{
char buf[BUFSIZ], temp_buf[BUFSIZ], *type, *name;
- struct qelem *top;
+ struct mqelem *top;
- type = strsave("USER");
+ type = strdup("USER");
if (GetTypeFromUser("Type of member", "member", &type) == SUB_ERROR)
return DM_NORMAL;
sprintf(buf, "Name of %s", type);
- name = strsave(user);
+ name = strdup(user);
if (GetValueFromUser(buf, &name) == SUB_ERROR)
return DM_NORMAL;
case TRUE:
sprintf(temp_buf, "R%s", type); /* "USER" to "RUSER" etc. */
free(type);
- type = Strsave(temp_buf);
+ type = strdup(temp_buf);
break;
case FALSE:
break;
* Returns: DM_NORMAL.
*/
-int ListAllPublicMailLists(void)
+int ListAllPublicMailLists(int argc, char **argv)
{
int status;
static char *args[] = {
if (YesNoQuestion("This query will take a while. Do you wish to continue?",
TRUE) == TRUE)
{
- if (status = do_mr_query("qualified_get_lists", 5, args,
- Print, NULL) != MR_SUCCESS)
+ if ((status = do_mr_query("qualified_get_lists", 5, args,
+ Print, NULL)) != MR_SUCCESS)
com_err(program_name, status, " in ListAllGroups");
}