]> andersk Git - moira.git/blobdiff - clients/moira/lists.c
Need to fill in the "user" variable with mrcl_krb_user().
[moira.git] / clients / moira / lists.c
index 1bd5f7f85f8e435a0d5426cfb367eb2da2d2d3d3..b839836fb6a5f09908d636b3395d8b5f646dab77 100644 (file)
@@ -1,35 +1,37 @@
-#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.
@@ -84,7 +90,8 @@ static void PrintListInfo(char **info)
     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);
     }
@@ -100,6 +107,13 @@ static void PrintListInfo(char **info)
       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",
@@ -116,18 +130,17 @@ static void PrintListInfo(char **info)
  *     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;
-  register int status;
+  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;
@@ -136,7 +149,7 @@ struct qelem *GetListInfo(int type, char *name1, char *name2)
     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;
@@ -146,7 +159,7 @@ struct qelem *GetListInfo(int type, char *name1, char *name2)
       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;
@@ -155,8 +168,7 @@ struct qelem *GetListInfo(int type, char *name1, char *name2)
     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;
@@ -188,7 +200,7 @@ char **AskListInfo(char **info, Bool name)
     {
       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;
@@ -212,22 +224,64 @@ char **AskListInfo(char **info, Bool name)
     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;
 
@@ -254,12 +308,12 @@ char **AskListInfo(char **info, Bool name)
 
 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;
     }
 
@@ -276,9 +330,9 @@ int ShowListInfo(int argc, char **argv)
 
 static void RealUpdateList(char **info, Bool junk)
 {
-  register int stat;
+  int stat;
   char **args;
-  struct qelem *elem = NULL;
+  struct mqelem *elem = NULL;
 
   if (!(args = AskListInfo(info, TRUE)))
     {
@@ -292,7 +346,7 @@ static void RealUpdateList(char **info, Bool junk)
    */
   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];
 
@@ -310,7 +364,7 @@ static void RealUpdateList(char **info, Bool junk)
     }
 
   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.");
@@ -327,7 +381,7 @@ static void RealUpdateList(char **info, Bool junk)
 
 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");
@@ -345,16 +399,19 @@ int UpdateList(int argc, char **argv)
 
 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;
 }
@@ -369,11 +426,11 @@ int AddList(int argc, char **argv)
 {
   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)
@@ -389,7 +446,7 @@ int AddList(int argc, char **argv)
    */
   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];
 
@@ -398,7 +455,7 @@ int AddList(int argc, char **argv)
       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;
     }
 
@@ -409,7 +466,7 @@ int AddList(int argc, char **argv)
     }
 
   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.");
@@ -426,7 +483,7 @@ int AddList(int argc, char **argv)
  *     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.",
@@ -459,7 +516,7 @@ int ListmaintMemberMenuEntry(Menu *m, int argc, char **argv)
 {
   char temp_buf[BUFSIZ];
   char *list_name = argv[1];
-  register int stat;
+  int stat;
 
   if (!ValidName(list_name))
     return DM_QUIT;
@@ -476,7 +533,7 @@ int ListmaintMemberMenuEntry(Menu *m, int argc, char **argv)
   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;
@@ -492,7 +549,7 @@ int ListmaintMemberMenuEntry(Menu *m, int argc, char **argv)
       }
 
   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;
 }
@@ -514,26 +571,25 @@ int ListmaintMemberMenuExit(Menu *m)
 /*     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];
-  register int status;
+  int status;
   char *args[10];
 
   args[0] = current_list;
   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)
@@ -552,9 +608,9 @@ int ListMembersByType(char *type)
  *     Returns: DM_NORMAL
  */
 
-int ListAllMembers(void)
+int ListAllMembers(int argc, char **argv)
 {
-  ListMembersByType(NULL);
+  ListMembersByType(NULL, 0);
   return DM_NORMAL;
 }
 
@@ -564,9 +620,9 @@ int ListAllMembers(void)
  *     Returns: DM_NORMAL.
  */
 
-int ListUserMembers(void)
+int ListUserMembers(int argc, char **argv)
 {
-  ListMembersByType("USER");
+  ListMembersByType("USER", 0);
   return DM_NORMAL;
 }
 
@@ -576,9 +632,9 @@ int ListUserMembers(void)
  *     Returns: DM_NORMAL.
  */
 
-int ListListMembers(void)
+int ListListMembers(int argc, char **argv)
 {
-  ListMembersByType("LIST");
+  ListMembersByType("LIST", 0);
   return DM_NORMAL;
 }
 
@@ -588,9 +644,9 @@ int ListListMembers(void)
  *     Returns: DM_NORMAL.
  */
 
-int ListStringMembers(void)
+int ListStringMembers(int argc, char **argv)
 {
-  ListMembersByType("STRING");
+  ListMembersByType("STRING", 0);
   return DM_NORMAL;
 }
 
@@ -608,15 +664,15 @@ int GetMemberInfo(char *action, char **ret_argv)
 {
   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. */
@@ -636,49 +692,36 @@ int GetMemberInfo(char *action, char **ret_argv)
  *     Returns: DM_NORMAL.
  */
 
-int AddMember(void)
+int AddMember(int argc, char **argv)
 {
   char *args[10], temp_buf[BUFSIZ], *p;
-  register int status;
-  struct qelem *mailhubs, *elem, *GetTypeValues();
+  int status;
+  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)
        {
@@ -700,10 +743,10 @@ int AddMember(void)
  *     Returns: DM_NORMAL
  */
 
-int DeleteMember(void)
+int DeleteMember(int argc, char **argv)
 {
   char *args[10];
-  register int status;
+  int status;
 
   if (GetMemberInfo("delete", args) == SUB_ERROR)
     return DM_NORMAL;
@@ -711,7 +754,27 @@ int DeleteMember(void)
   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.");
@@ -723,6 +786,48 @@ int DeleteMember(void)
   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.
@@ -732,18 +837,18 @@ int DeleteMember(void)
  *             enough information in it to delete the member from the list.
  */
 
-int InterRemoveItemFromLists(void)
+int InterRemoveItemFromLists(int argc, char **argv)
 {
-  register int status;
+  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;
 
@@ -755,7 +860,7 @@ int InterRemoveItemFromLists(void)
   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))
@@ -766,7 +871,7 @@ int InterRemoveItemFromLists(void)
          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");
@@ -793,25 +898,33 @@ int InterRemoveItemFromLists(void)
  *     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)
@@ -820,14 +933,21 @@ int ListByMember(void)
                             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);
@@ -841,17 +961,17 @@ int ListByMember(void)
  *     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;
 
@@ -860,7 +980,7 @@ int ListByAdministrator(void)
     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;
@@ -881,9 +1001,9 @@ int ListByAdministrator(void)
  *     Returns: DM_NORMAL.
  */
 
-int ListAllPublicMailLists(void)
+int ListAllPublicMailLists(int argc, char **argv)
 {
-  register int status;
+  int status;
   static char *args[] = {
     "TRUE",                    /* active */
     "TRUE",                    /* public */
@@ -895,8 +1015,8 @@ int ListAllPublicMailLists(void)
   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");
     }
 
This page took 0.535071 seconds and 4 git commands to generate.