]> andersk Git - moira.git/blobdiff - clients/moira/user.c
tcsh is dead. Long live bash.
[moira.git] / clients / moira / user.c
index 3c21191ed3305db65e845e9cdc469c0e75cb4706..0ed1762ec22f3a7ff710a5e87b3fd9fd7ed68fbe 100644 (file)
@@ -1,44 +1,56 @@
-#if (!defined(lint) && !defined(SABER))
-  static char rcsid_module_c[] = "$Header$";
-#endif lint
-
-/*     This is the file user.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 user.c for the Moira Client, which allows users
+ *      to quickly and easily maintain most parts of the Moira database.
  *     It Contains: Functions for manipulating user information.
- *     
+ *
  *     Created:        5/9/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 <strings.h>
+#include <mit-copyright.h>
 #include <moira.h>
 #include <moira_site.h>
-#include <menu.h>
-#include <ctype.h>
-
-#include "mit-copyright.h"
 #include "defs.h"
 #include "f_defs.h"
 #include "globals.h"
 
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+#include <krb.h>
+
+RCSID("$Header$");
+
+void CorrectCapitalization(char **name);
+char **AskUserInfo(char **info, Bool name);
+struct mqelem *GetUserInfo(int type, char *name1, char *name2);
+static void PrintLogin(char **info);
+struct mqelem *GetUserBySponsor(char *type, char *name);
+
 #define LOGIN 0
 #define UID   1
 #define BY_NAME  2
 #define CLASS 3
+#define ID 4
 
-#define DEFAULT_SHELL "/bin/csh"
+#ifdef ATHENA
+#define DEFAULT_SHELL "/bin/athena/bash"
+#else
+#define DEFAULT_SHELL "/bin/bash"
+#endif
 #define DEFAULT_CLASS "?"
 
+#define DEFAULT_WINCONSOLESHELL "cmd"
+#define DEFAULT_WINHOMEDIR "[DFS]"
+#define DEFAULT_WINPROFILEDIR "[DFS]"
 
 /*     Function Name: UserState
  *     Description: Convert a numeric state into a descriptive string.
  *     Returns: pointer to statically allocated string.
  */
 
-static char *states[] = { "Registerable (0)",
-                         "Active (1)",
-                         "Half Registered (2)",
-                         "Deleted (3)",
-                         "Not registerable (4)",
-                         "Enrolled/Registerable (5)",
-                         "Enrolled/Not Registerable (6)",
-                         "Half Enrolled (7)" };
-
-static char *UserState(state)
-int state;
+static char *states[] = {
+  "Registerable (0)",
+  "Active (1)",
+  "Half Registered (2)",
+  "Deleted (3)",
+  "Not registerable (4)",
+  "Enrolled/Registerable (5)",
+  "Enrolled/Not Registerable (6)",
+  "Half Enrolled (7)",
+  "Registerable, Kerberos only (8)",
+  "Active, Kerberos only (9)"
+};
+
+static char *UserState(int state)
 {
-    char buf[BUFSIZ];
+  static char buf[BUFSIZ];
 
-    if (state < 0 || state >= US_END) {
-       sprintf(buf, "Unknown (%d)", state);
-       return(buf);
+  if (state < 0 || state >= US_END)
+    {
+      sprintf(buf, "Unknown (%d)", state);
+      return buf;
     }
-    return(states[state]);
+  return states[state];
 }
 
 
@@ -74,14 +90,12 @@ int state;
  *     Returns: none.
  */
 
-static void
-PrintUserName(info)
-char ** info;
+static void PrintUserName(char **info)
 {
-    char buf[BUFSIZ], print_buf[BUFSIZ];
-    sprintf(buf, "%s, %s %s", info[U_LAST], info[U_FIRST], info[U_MIDDLE]);
-    sprintf(print_buf, "%-40s User Name: %s", buf, info[U_NAME]);
-    Put_message(print_buf);
+  char buf[BUFSIZ], print_buf[BUFSIZ];
+  sprintf(buf, "%s, %s %s", info[U_LAST], info[U_FIRST], info[U_MIDDLE]);
+  sprintf(print_buf, "%-40s User Name: %s", buf, info[U_NAME]);
+  Put_message(print_buf);
 }
 
 /*     Function Name: PrintUserInfo
@@ -91,23 +105,43 @@ char ** info;
  *     Returns: none
  */
 
-static void
-PrintUserInfo(info)
-char ** info;
+static void PrintUserInfo(char **info)
 {
-    char name[BUFSIZ], buf[BUFSIZ];
-
-    sprintf(name, "%s, %s %s", info[U_LAST], info[U_FIRST], info[U_MIDDLE]);
-    sprintf(buf, "Login name: %-20s Full name: %s", info[U_NAME], name);
-    Put_message(buf);
-    sprintf(buf, "User id: %-23s Login shell %-10s Class: %s", 
-           info[U_UID], info[U_SHELL], info[U_CLASS]);
-    Put_message(buf);
-    sprintf(buf, "Account is: %-20s Encrypted MIT ID number: %s",
-           UserState(atoi(info[U_STATE])), info[U_MITID]);
-    Put_message(buf);
-    sprintf(buf, MOD_FORMAT, info[U_MODBY], info[U_MODTIME],info[U_MODWITH]);
-    Put_message(buf);
+  char name[BUFSIZ], buf[BUFSIZ], sponsor[BUFSIZ];
+  int status;
+
+  sprintf(name, "%s, %s %s", info[U_LAST], info[U_FIRST], info[U_MIDDLE]);
+  sprintf(buf, "Login name: %-20s Full name: %s", info[U_NAME], name);
+  Put_message(buf);
+  sprintf(buf, "User id: %-23s Login shell: %-10s",
+         info[U_UID], info[U_SHELL]);
+  Put_message(buf);
+  sprintf(buf, "Class: %-25s Windows Console Shell: %-10s",
+         info[U_CLASS], info[U_WINCONSOLESHELL]);
+  Put_message(buf);
+  sprintf(sponsor, "%s %s", info[U_SPONSOR_TYPE], info[U_SPONSOR_NAME]);
+  sprintf(buf, "Sponsor: %-23s Expiration date: %s", sponsor,  info[U_EXPIRATION]);
+  Put_message(buf);
+  sprintf(buf, "Account is: %-20s MIT ID number: %s",
+         UserState(atoi(info[U_STATE])), info[U_MITID]);
+  Put_message(buf);
+  sprintf(buf, "Windows Home Directory: %s", info[U_WINHOMEDIR]);
+  Put_message(buf);
+  sprintf(buf, "Windows Profile Directory: %s", info[U_WINPROFILEDIR]);
+  Put_message(buf);
+  status = atoi(info[U_STATE]);
+  if (status == 0 || status == 2)
+    {
+      sprintf(buf, "User %s secure Account Coupon to register",
+             atoi(info[U_SECURE]) ? "needs" : "does not need");
+      Put_message(buf);
+    }
+  sprintf(buf, "Comments: %s", info[U_COMMENT]);
+  Put_message(buf);
+  sprintf(buf, "Created  by %s on %s.", info[U_CREATOR], info[U_CREATED]);
+  Put_message(buf);
+  sprintf(buf, MOD_FORMAT, info[U_MODBY], info[U_MODTIME], info[U_MODWITH]);
+  Put_message(buf);
 }
 
 /*     Function Name: SetUserDefaults
@@ -116,25 +150,57 @@ char ** info;
  *     Returns: args - the filled info structure.
  */
 
-static char **
-SetUserDefaults(info)
-char ** info;
+static char **SetUserDefaults(char **info)
+{
+  info[U_NAME] = strdup(UNIQUE_LOGIN);
+  info[U_UID] = strdup(UNIQUE_UID);
+  info[U_SHELL] = strdup(DEFAULT_SHELL);
+  info[U_WINCONSOLESHELL] = strdup(DEFAULT_WINCONSOLESHELL);
+  info[U_LAST] = strdup(DEFAULT_NONE);
+  info[U_FIRST] = strdup(DEFAULT_NONE);
+  info[U_MIDDLE] = strdup(DEFAULT_NONE);
+  info[U_STATE] = strdup(DEFAULT_NO);
+  info[U_MITID] = strdup(DEFAULT_NONE);
+  info[U_CLASS] = strdup(DEFAULT_CLASS);
+  info[U_COMMENT] = strdup("");
+  info[U_SIGNATURE] = strdup("");
+  info[U_SECURE] = strdup("0");
+  info[U_WINHOMEDIR] = strdup(DEFAULT_WINHOMEDIR);
+  info[U_WINPROFILEDIR] = strdup(DEFAULT_WINPROFILEDIR);
+  info[U_SPONSOR_TYPE] = strdup("NONE");
+  info[U_SPONSOR_NAME] = strdup("NONE");
+  info[U_EXPIRATION] = strdup("");
+  info[U_MODTIME] = info[U_MODBY] = info[U_MODWITH] = info[U_END] = NULL;
+  info[U_CREATED] = info[U_CREATOR] = NULL;
+  return info;
+}
+
+
+/* Check that the supplied name follows the capitalization rules, and
+ * offer to correct it if not.
+ */
+
+void CorrectCapitalization(char **name)
 {
-    info[U_NAME] = Strsave(UNIQUE_LOGIN);
-    info[U_UID] = Strsave(UNIQUE_UID);
-    info[U_SHELL] = Strsave(DEFAULT_SHELL);
-    info[U_LAST] = Strsave(DEFAULT_NONE);
-    info[U_FIRST] = Strsave(DEFAULT_NONE);
-    info[U_MIDDLE] = Strsave(DEFAULT_NONE);
-    info[U_STATE] = Strsave(DEFAULT_NO);
-    info[U_MITID] = Strsave(DEFAULT_NONE);
-    info[U_CLASS] = Strsave(DEFAULT_CLASS);
-    info[U_MODTIME] = info[U_MODBY] = info[U_MODWITH] = info[U_END] = NULL;
-    return(info);
+  char temp_buf[BUFSIZ], fixname[BUFSIZ];
+
+  strcpy(fixname, *name);
+  FixCase(fixname);
+  if (strcmp(fixname, *name))
+    {
+      Put_message("You entered a name which does not follow the capitalization conventions.");
+      sprintf(temp_buf, "Correct it to \"%s\"", fixname);
+      if (YesNoQuestion(temp_buf, 0) == TRUE)
+       {
+         free(*name);
+         *name = strdup(fixname);
+       }
+    }
 }
 
+
 /*     Function Name: AskUserInfo.
- *     Description: This function askes the user for information about a 
+ *     Description: This function askes the user for information about a
  *                   machine and saves it into a structure.
  *     Arguments: info - a pointer the the structure to put the info into.
  *                 flags - Flags asking us which info we want.
@@ -143,84 +209,162 @@ char ** info;
  *             use the #defined names (e.g args[UID] is not the uid anymore).
  */
 
-char **
-AskUserInfo(info, name)
-char ** info;
-Bool name;
-{
-    char temp_buf[BUFSIZ], *newname, *temp_ptr;
-
-    if (name) {
-       sprintf(temp_buf,"\nChanging Attributes of user %s.\n",info[U_NAME]);
-       Put_message(temp_buf);
-    } else {
-       struct qelem *elem = NULL;
-       char *argv[3];
-
-       GetValueFromUser("User's last name", &info[U_LAST]);
-       GetValueFromUser("User's first name", &info[U_FIRST]);
-       GetValueFromUser("User's middle name", &info[U_MIDDLE]);
-       argv[0] = info[U_FIRST];
-       argv[1] = info[U_LAST];
-       if (do_mr_query("get_user_by_name", 2, argv,
-                        StoreInfo, (char *) &elem) == 0) {
-           Put_message("A user by that name already exists in the database.");
-           Loop(QueueTop(elem), PrintUserInfo);
-           Loop(QueueTop(elem), FreeInfo);
-           FreeQueue(elem);
-           if (YesNoQuestion("Add new user anyway", TRUE) == FALSE)
-             return(NULL);
+char **AskUserInfo(char **info, Bool name)
+{
+  int state;
+  char temp_buf[BUFSIZ], *newname;
+
+  if (name)
+    {
+      sprintf(temp_buf, "\nChanging Attributes of user %s.\n", info[U_NAME]);
+      Put_message(temp_buf);
+    }
+  else
+    {
+      struct mqelem *elem = NULL;
+      char *argv[3];
+
+      if (GetValueFromUser("User's last name", &info[U_LAST]) == SUB_ERROR)
+       return NULL;
+      CorrectCapitalization(&info[U_LAST]);
+      if (GetValueFromUser("User's first name", &info[U_FIRST]) == SUB_ERROR)
+       return NULL;
+      CorrectCapitalization(&info[U_FIRST]);
+      if (GetValueFromUser("User's middle name", &info[U_MIDDLE]) == SUB_ERROR)
+       return NULL;
+      CorrectCapitalization(&info[U_MIDDLE]);
+      argv[0] = info[U_FIRST];
+      argv[1] = info[U_LAST];
+      if (do_mr_query("get_user_account_by_name", 2, argv,
+                     StoreInfo, &elem) == MR_SUCCESS)
+       {
+         Put_message("A user by that name already exists in the database.");
+         Loop(QueueTop(elem), PrintUserInfo);
+         Loop(QueueTop(elem), FreeInfo);
+         FreeQueue(elem);
+         if (YesNoQuestion("Add new user anyway", TRUE) != TRUE)
+           return NULL;
        }
     }
-    if (name) {
-       newname = Strsave(info[U_NAME]);
-       GetValueFromUser("The new login name for this user", &newname);
+  if (name)
+    {
+      newname = strdup(info[U_NAME]);
+      if (GetValueFromUser("The new login name for this user", &newname) ==
+         SUB_ERROR)
+       return NULL;
+    }
+  else if (GetValueFromUser("Login name for this user", &info[U_NAME]) ==
+          SUB_ERROR)
+    return NULL;
+
+  strcpy(temp_buf, info[U_UID]);
+  if (GetValueFromUser("User's UID", &info[U_UID]) == SUB_ERROR)
+    return NULL;
+  if (strcmp(info[U_UID], UNIQUE_UID) && strcmp(info[U_UID], temp_buf))
+    {
+      struct mqelem *elem = NULL;
+      if (do_mr_query("get_user_account_by_uid", 1, &info[U_UID],
+                     StoreInfo, &elem) == MR_SUCCESS)
+       {
+         Put_message("A user with that uid already exists in the database.");
+         Loop(QueueTop(elem), PrintUserInfo);
+         Loop(QueueTop(elem), FreeInfo);
+         FreeQueue(elem);
+         if (YesNoQuestion("Add new user anyway", TRUE) != TRUE)
+           return NULL;
+       }
     }
-    else
-       GetValueFromUser("Login name for this user", &info[U_NAME]);
 
-    GetValueFromUser("User's UID", &info[U_UID]);
-    GetValueFromUser("User's shell", &info[U_SHELL]);
-    if (name) {
-       GetValueFromUser("User's last name", &info[U_LAST]);
-       GetValueFromUser("User's first name", &info[U_FIRST]);
-       GetValueFromUser("User's middle name", &info[U_MIDDLE]);
+  if (GetValueFromUser("User's shell", &info[U_SHELL]) == SUB_ERROR)
+    return NULL;
+  if (GetValueFromUser("Windows console shell", &info[U_WINCONSOLESHELL])
+      == SUB_ERROR)
+    return NULL;
+  if (name)
+    {
+      if (GetValueFromUser("User's last name", &info[U_LAST]) == SUB_ERROR)
+       return NULL;
+      CorrectCapitalization(&info[U_LAST]);
+      if (GetValueFromUser("User's first name", &info[U_FIRST]) == SUB_ERROR)
+       return NULL;
+      CorrectCapitalization(&info[U_FIRST]);
+      if (GetValueFromUser("User's middle name", &info[U_MIDDLE]) == SUB_ERROR)
+       return NULL;
+      CorrectCapitalization(&info[U_MIDDLE]);
     }
-    while (1) {
-       int i;
-       GetValueFromUser("User's status (? for help)", &info[U_STATE]);
-       if (isdigit(info[U_STATE][0]))
-         break;
-       Put_message("Valid status numbers:");
-       for (i = 0; i < US_END; i++) {
-           sprintf(temp_buf, "  %d: %s", i, states[i]);
-           Put_message(temp_buf);
+  while (1)
+    {
+      int i;
+      if (GetValueFromUser("User's status (? for help)", &info[U_STATE]) ==
+         SUB_ERROR)
+       return NULL;
+      if (isdigit(info[U_STATE][0]))
+       break;
+      Put_message("Valid status numbers:");
+      for (i = 0; i < US_END; i++)
+       {
+         sprintf(temp_buf, "  %d: %s", i, states[i]);
+         Put_message(temp_buf);
+       }
+    }
+  if (GetValueFromUser("User's MIT ID number", &info[U_MITID]) == SUB_ERROR)
+    return NULL;
+  RemoveHyphens(info[U_MITID]);
+  if (GetTypeFromUser("User's MIT Year (class)", "class", &info[U_CLASS]) ==
+      SUB_ERROR)
+    return NULL;
+  if (GetValueFromUser("Comments", &info[U_COMMENT]) == SUB_ERROR)
+    return NULL;
+
+  if (GetValueFromUser("Windows Home Directory", &info[U_WINHOMEDIR]) ==
+      SUB_ERROR)
+    return NULL;
+
+  if (GetValueFromUser("Windows Profile Directory", &info[U_WINPROFILEDIR]) ==
+      SUB_ERROR)
+    return NULL;
+
+  if (GetTypeFromUser("User's sponsor type", "ace_type", &info[U_SPONSOR_TYPE])
+      == SUB_ERROR)
+    return NULL;
+  if (strcmp(info[U_SPONSOR_TYPE], "NONE") &&
+      GetValueFromUser("Sponsor's Name", &info[U_SPONSOR_NAME]) == SUB_ERROR)
+    return NULL;
+
+  if (GetValueFromUser("Expiration date", &info[U_EXPIRATION]) == SUB_ERROR)
+    return NULL;
+
+  state = atoi(info[U_STATE]);
+  if (!name || state == 0 || state == 2)
+    {
+      if (YesNoQuestion("User needs secure Account Coupon to register",
+                       atoi(info[U_SECURE]) ? TRUE : FALSE) == FALSE)
+       {
+         free(info[U_SECURE]);
+         info[U_SECURE] = strdup("0");
+       }
+      else
+       {
+         free(info[U_SECURE]);
+         info[U_SECURE] = strdup("1");
        }
     }
-    temp_ptr = Strsave(info[U_MITID]);
-    Put_message("User's MIT ID number (type a new unencrypted number, or keep same encryption)");
-    GetValueFromUser("", &temp_ptr);
-    if ( strcmp( temp_ptr, info[U_MITID] ) != 0) {
-       EncryptID(temp_buf, temp_ptr, info[U_FIRST], info[U_LAST]);
-       free(info[U_MITID]);
-       info[U_MITID] = Strsave(temp_buf);
-    }
-    free(temp_ptr);
-    GetTypeFromUser("User's MIT Year (class)", "class", &info[U_CLASS]);
-    
-    FreeAndClear(&info[U_MODTIME], TRUE);
-    FreeAndClear(&info[U_MODBY], TRUE);
-    FreeAndClear(&info[U_MODWITH], TRUE);
-
-/* 
- * Slide the newname into the #2 slot, this screws up all future references 
- * to this list, since we slip the pointer into a info list it gets freed 
- * when the rest of the list gets freed.
- */
-    if (name)                  
-       SlipInNewName(info, newname);
 
-    return(info);
+  info[U_SIGNATURE] = strdup("");
+
+  FreeAndClear(&info[U_MODTIME], TRUE);
+  FreeAndClear(&info[U_MODBY], TRUE);
+  FreeAndClear(&info[U_MODWITH], TRUE);
+
+  /*
+   * Slide the newname into the #2 slot, this screws up all future references
+   * to this list, since we slip the pointer into a info list it gets freed
+   * when the rest of the list gets freed.
+   */
+  if (name)
+    SlipInNewName(info, newname);
+
+  return info;
 }
 
 /*     Function Name: GetUserInfo
@@ -231,57 +375,70 @@ Bool name;
  *                 name2 - other name, only used in get user by first and last.
  *                         (wildcards okay).
  *     Returns: the first element of the queue containing the user info.
+ *
  */
 
-struct qelem *
-GetUserInfo(type, name1, name2)
-int type;
-char *name1, *name2;
+struct mqelem *GetUserInfo(int type, char *name1, char *name2)
 {
-    char * args[2];
-    register int status;
-    struct qelem * elem = NULL;
+  char *args[2];
+  int status;
+  struct mqelem *elem = NULL;
 
-    switch(type) {
+  switch (type)
+    {
     case LOGIN:
-       args[0] = name1;
-       if ( (status = do_mr_query("get_user_by_login", 1, args,
-                                   StoreInfo, (char *) &elem)) != 0) {
-           com_err(program_name, status, 
-                   " when attempting to get_user_by_login.");
-           return (NULL);               
+      args[0] = name1;
+      if ((status = do_mr_query("get_user_account_by_login", 1, args,
+                               StoreInfo, &elem)))
+       {
+         com_err(program_name, status,
+                 " when attempting to get_user_account_by_login.");
+         return NULL;
        }
-       break;
+      break;
     case UID:
-       args[0] = name1;
-       if ( (status = do_mr_query("get_user_by_uid", 1, args,
-                                   StoreInfo, (char *) &elem)) != 0) {
-           com_err(program_name, status, 
-                   " when attempting to get_user_by_uid.");
-           return (NULL);      
+      args[0] = name1;
+      if ((status = do_mr_query("get_user_account_by_uid", 1, args,
+                               StoreInfo, &elem)))
+       {
+         com_err(program_name, status,
+                 " when attempting to get_user_account_by_uid.");
+         return NULL;
        }
-       break;
+      break;
     case BY_NAME:
-       args[0] = name1;
-       args[1] = name2;    
-       if ( (status = do_mr_query("get_user_by_name", 2, args,
-                                   StoreInfo, (char *) &elem)) != 0) {
-           com_err(program_name, status, 
-                   " when attempting to get_user_by_name.");
-           return (NULL);      
+      args[0] = name1;
+      args[1] = name2;
+      if ((status = do_mr_query("get_user_account_by_name", 2, args,
+                               StoreInfo, &elem)))
+       {
+         com_err(program_name, status,
+                 " when attempting to get_user_account_by_name.");
+         return NULL;
        }
-       break;
+      break;
     case CLASS:
-       args[0] = name1;
-       if ( (status = do_mr_query("get_user_by_class", 1, args,
-                                   StoreInfo, (char *) &elem)) != 0) {
-           com_err(program_name, status, 
-                   " when attempting to get_user_by_class.");
-           return (NULL);      
+      args[0] = name1;
+      if ((status = do_mr_query("get_user_account_by_class", 1, args,
+                               StoreInfo, &elem)))
+       {
+         com_err(program_name, status,
+                 " when attempting to get_user_account_by_class.");
+         return NULL;
        }
-       break;
+      break;
+    case ID:
+      args[0] = name1;
+      if ((status = do_mr_query("get_user_account_by_id", 1, args,
+                               StoreInfo, &elem)))
+       {
+         com_err(program_name, status,
+                 " when attempting to get_user_account_by_id.");
+         return NULL;
+       }
+      break;
     }
-    return( QueueTop(elem) );
+  return QueueTop(elem) ;
 }
 
 /*     Function Name: AddNewUser
@@ -290,23 +447,23 @@ char *name1, *name2;
  *     Returns: DM_NORMAL.
  */
 
-/* ARGSUSED */
-int
-AddNewUser()
+int AddNewUser(int argc, char **argv)
 {
-    register int status;
-    char ** args, *info[MAX_ARGS_SIZE];
+  int status;
+  char **args, *info[MAX_ARGS_SIZE];
 
-    args = AskUserInfo(SetUserDefaults(info), FALSE);
-    if (args == NULL)
-      return(DM_NORMAL);
-    if ( (status = do_mr_query("add_user", CountArgs(args), 
-                               args, Scream, (char *) NULL)) != MR_SUCCESS)
-       com_err(program_name, status, " in add_user");
-    else
-       Put_message("New user added to database.");
-    FreeInfo(args);
-    return(DM_NORMAL);
+  if (!(args = AskUserInfo(SetUserDefaults(info), FALSE)))
+    {
+      Put_message("Aborted.");
+      return DM_NORMAL;
+    }
+  if ((status = do_mr_query("add_user_account", CountArgs(args),
+                           args, NULL, NULL)))
+    com_err(program_name, status, " in add_user_account");
+  else
+    Put_message("New user added to database.");
+  FreeInfo(args);
+  return DM_NORMAL;
 }
 
 
@@ -317,17 +474,15 @@ AddNewUser()
  *     Returns: a malloced login name for the user.
  */
 
-static char *
-GetLoginName()
+static char *GetLoginName(void)
 {
-    char name[BUFSIZ];
-
-    Prompt_input("Login name for this user? ", name, BUFSIZ);
-    
-    Put_message(
-             "KERBEROS code not added, did not reserve name with kerberos.");
+  char *name;
 
-    return(Strsave(name));
+  name = strdup("");
+  if (GetValueFromUser("Login name for this user? ", &name) == SUB_ERROR)
+    return NULL;
+  Put_message("KERBEROS code not added, did not reserve name with kerberos.");
+  return name;
 }
 
 
@@ -337,24 +492,24 @@ GetLoginName()
  *     Returns: uid - the malloced uid of the user that was chosen.
  */
 
-static char *
-ChooseUser(elem)
-struct qelem * elem;
+static char *ChooseUser(struct mqelem *elem)
 {
-    while (elem != NULL) {
-       char ** info = (char **)  elem->q_data;
-       PrintUserInfo(info);
-       switch(YesNoQuitQuestion("Is this the user you want (y/n/q)", FALSE)) {
+  while (elem)
+    {
+      char **info = elem->q_data;
+      PrintUserInfo(info);
+      switch (YesNoQuitQuestion("Is this the user you want (y/n/q)", FALSE))
+       {
        case TRUE:
-           return(Strsave(info[U_UID]));
+         return strdup(info[U_UID]);
        case FALSE:
-           break;
+         break;
        default:                /* quit or ^C. */
-           return(NULL);
+         return NULL;
        }
-       elem = elem->q_forw;
+      elem = elem->q_forw;
     }
-    return(NULL);
+  return NULL;
 }
 
 /*     Function Name: GetUidNumberFromName
@@ -363,46 +518,51 @@ struct qelem * elem;
  *     Returns: uid - a malloced string containing the uid.
  */
 
-static char *
-GetUidNumberFromName()
-{
-    char *args[5], *uid, first[BUFSIZ], last[BUFSIZ];
-    register int status;
-    struct qelem * top = NULL;
-    
-    Prompt_input("First Name: ", first, BUFSIZ);
-    Prompt_input("Last  Name: ", last, BUFSIZ);
-
-    args[0] = first;
-    args[1] = last;
-    
-    switch (status = do_mr_query("get_user_by_name", 2, args,
-                                 StoreInfo, (char *) &top)) {
+static char *GetUidNumberFromName(void)
+{
+  char *args[5], *uid, first[BUFSIZ], last[BUFSIZ];
+  int status;
+  struct mqelem *top = NULL;
+
+  if (!Prompt_input("First Name: ", first, BUFSIZ))
+    return NULL;
+  if (!Prompt_input("Last  Name: ", last, BUFSIZ))
+    return NULL;
+  FixCase(first);
+  FixCase(last);
+
+  args[0] = first;
+  args[1] = last;
+
+  switch ((status = do_mr_query("get_user_account_by_name", 2, args,
+                               StoreInfo, &top)))
+    {
     case MR_SUCCESS:
-       break;
+      break;
     case MR_NO_MATCH:
-       Put_message("There is no user in the database with that name.");
-       return(NULL);
+      Put_message("There is no user in the database with that name.");
+      return NULL;
     default:
-       com_err(program_name, status, " in get_user_by_name.");
-       return(NULL);
+      com_err(program_name, status, " in get_account_user_by_name.");
+      return NULL;
     }
-    
-    top = QueueTop(top);
-    if (QueueCount(top) == 1) /* This is a unique name. */ {
-       char ** info = (char **) top->q_data;
-       Put_message("User ID Number retrieved for the user: ");
-       Put_message("");
-       PrintUserName(info);
-       uid = Strsave(info[U_UID]);
-       FreeQueue(top);
-       return(Strsave(uid));
+
+  top = QueueTop(top);
+  if (QueueCount(top) == 1) /* This is a unique name. */
+    {
+      char **info = top->q_data;
+      Put_message("User ID Number retrieved for the user: ");
+      Put_message("");
+      PrintUserName(info);
+      uid = strdup(info[U_UID]);
+      FreeQueue(top);
+      return strdup(uid);
     }
 
-    Put_message("That name is not unique, choose the user that you want.");
-    uid = ChooseUser(top);
-    FreeQueue(top);
-    return(uid);
+  Put_message("That name is not unique, choose the user that you want.");
+  uid = ChooseUser(top);
+  FreeQueue(top);
+  return uid;
 }
 
 /*     Function Name: SetUserPassword
@@ -411,13 +571,11 @@ GetUidNumberFromName()
  *     Returns: none.
  */
 
-static void
-SetUserPassword(name)
-char * name;
+static void SetUserPassword(char *name)
 {
-    name = name;                       /* make saber happy. */
-    Put_message("Kerberos password not changed, code non-existant.");
-    /* clever message to call account_admin, if this fails. */
+  name = name;                 /* make saber happy. */
+  Put_message("Kerberos password not changed, code non-existant.");
+  /* clever message to call account_admin, if this fails. */
 }
 
 /*     Function Name:  GiveBackLogin
@@ -426,13 +584,11 @@ char * name;
  *     Returns: void.
  */
 
-static void
-GiveBackLogin(name)
-char * name;
+static void GiveBackLogin(char *name)
 {
-    name = name;                       /* make saber happy. */
-    Put_message("kerberos code not implimented, name not given back.");
-    /* send mail to db maintainer if this fails. */
+  name = name;                 /* make saber happy. */
+  Put_message("kerberos code not implemented, name not given back.");
+  /* send mail to db maintainer if this fails. */
 }
 
 /*     Function Name: RegisterUser
@@ -441,56 +597,81 @@ char * name;
  *     Returns: DM_NORMAL.
  */
 
-int
-RegisterUser()
+int RegisterUser(int argc, char **argv)
 {
-    char * args[MAX_ARGS_SIZE];
-    char *login, *fstype = NULL;
-    char temp_buf[BUFSIZ];
-    register int status;
-    
-    Put_message("This function has NO kerberos support, so stange things");
-    Put_message("may happen if you use it to register a user.");
+  char *args[MAX_ARGS_SIZE];
+  char *login, *potype = NULL;
+  char temp_buf[BUFSIZ];
+  int status, i;
+
+  for (i = 0; i < MAX_ARGS_SIZE; i++)
+    args[i] = NULL;
 
-    switch (YesNoQuestion("Do you know the users UID Number (y/n)", FALSE)) {
+  Put_message("This function has NO kerberos support, so strange things");
+  Put_message("may happen if you use it to register a user.");
+
+  switch (YesNoQuestion("Do you know the users UID Number (y/n)", FALSE))
+    {
     case TRUE:
-       Prompt_input("What is the UID number of the user? ", temp_buf, BUFSIZ);
-       args[0] = Strsave(temp_buf);
-       break;
+      Prompt_input("What is the UID number of the user? ", temp_buf, BUFSIZ);
+      args[0] = strdup(temp_buf);
+      break;
     case FALSE:
-       if ( (args[0] = GetUidNumberFromName()) == NULL)
-           return(DM_NORMAL);
-       break;
+      if (!(args[0] = GetUidNumberFromName()))
+       return DM_NORMAL;
+      break;
     default:
-       return(DM_NORMAL);
+      return DM_NORMAL;
     }
 
-    if ( ((login = args[1] = GetLoginName()) == NULL) ||
-       ( GetFSTypes(&fstype) == SUB_ERROR ) ) {
-       FreeInfo(args);    /* This work because the NULL temination is ok. */
-       return(DM_NORMAL);
+  sprintf(temp_buf, "u%s", args[0]);
+  login = strdup(temp_buf);
+  if (GetValueFromUser("Login name for this user? ", &login) == SUB_ERROR)
+    {
+      args[1] = login;
+      FreeInfo(args);     /* This work because the NULL temination is ok. */
+      return DM_NORMAL;
+    }
+  Put_message("KERBEROS code not added, did not reserve name with kerberos.");
+  args[1] = login;
+  
+  sprintf(temp_buf, "IMAP");
+  potype = strdup(temp_buf);
+  if (GetValueFromUser("P.O. Box Type for this user? ", &potype) == SUB_ERROR)
+    {
+      args[2] = potype;
+      FreeInfo(args);
+      return DM_NORMAL;
+    }
+  if (strcmp(potype, "POP") && strcmp(potype, "IMAP") && strcmp(potype, "EXCHANGE"))
+    {
+      sprintf(temp_buf, "Unknown P.O. Box type.");
+      Put_message(temp_buf);
+      FreeInfo(args);
+      return DM_NORMAL;
     }
-    args[2] = fstype;
-    args[3] = NULL;
-    
-    switch (status = do_mr_query("register_user", CountArgs(args),
-                                 args, Scream, (char *) NULL)) {
+  args[2] = potype;
+  args[3] = NULL;
+
+  switch ((status = do_mr_query("register_user", CountArgs(args),
+                               args, NULL, NULL)))
+    {
     case MR_SUCCESS:
-       sprintf(temp_buf, "User %s successfully registered.", login);
-       Put_message(temp_buf);
-       SetUserPassword(login);
-       break;
+      sprintf(temp_buf, "User %s successfully registered.", login);
+      Put_message(temp_buf);
+      SetUserPassword(login);
+      break;
     case MR_IN_USE:
-       GiveBackLogin(login);
-       sprintf(temp_buf, "The username %s is already in use.", login);
-       Put_message(temp_buf);
-       break;
+      GiveBackLogin(login);
+      sprintf(temp_buf, "The username %s is already in use.", login);
+      Put_message(temp_buf);
+      break;
     default:
-       com_err(program_name, status, " in register_user");
-       break;
+      com_err(program_name, status, " in register_user");
+      break;
     }
-    FreeInfo(args);
-    return(DM_NORMAL);
+  FreeInfo(args);
+  return DM_NORMAL;
 }
 
 /*     Function Name: RealUpdateUser
@@ -500,21 +681,23 @@ RegisterUser()
  *     Returns: none.
  */
 
-/* ARGSUSED */
-static void
-RealUpdateUser(info, junk)
-char ** info;
-Bool junk;
+static void RealUpdateUser(char **info, Bool junk)
 {
-    register int status;
-    char error_buf[BUFSIZ];
-    char ** args = AskUserInfo(info, TRUE);
-    
-    if ( (status = do_mr_query("update_user", CountArgs(args), 
-                               args, Scream, (char *) NULL)) != MR_SUCCESS) {
-       com_err(program_name, status, " in ModifyFields");
-       sprintf(error_buf, "User %s not updated due to errors.", info[NAME]);
-       Put_message(error_buf);
+  int status;
+  char error_buf[BUFSIZ];
+  char **args = AskUserInfo(info, TRUE);
+
+  if (!args)
+    {
+      Put_message("Aborted.");
+      return;
+    }
+  if ((status = do_mr_query("update_user_account", CountArgs(args),
+                           args, NULL, NULL)))
+    {
+      com_err(program_name, status, " in ModifyFields");
+      sprintf(error_buf, "User %s not updated due to errors.", info[NAME]);
+      Put_message(error_buf);
     }
 }
 
@@ -524,19 +707,15 @@ Bool junk;
  *     Returns: DM_NORMAL.
  */
 
-/* ARGSUSED */
-int
-UpdateUser(argc, argv)
-int argc;
-char **argv;
+int UpdateUser(int argc, char **argv)
 {
-    struct qelem * elem;
+  struct mqelem *elem;
+
+  elem = GetUserInfo(LOGIN, argv[1], NULL);
+  QueryLoop(elem, NullPrint, RealUpdateUser, "Update the user");
 
-    elem = GetUserInfo(LOGIN, argv[1], (char *) NULL);
-    QueryLoop(elem, NullPrint, RealUpdateUser, "Update the user");
-    
-    FreeQueue(elem);
-    return(DM_NORMAL);
+  FreeQueue(elem);
+  return DM_NORMAL;
 }
 
 /*     Function Name: RealDeactivateUser
@@ -546,28 +725,89 @@ char **argv;
  *     Returns: none.
  */
 
-static void
-RealDeactivateUser(info, one_item)
-char ** info;
-Bool one_item;
+static void RealDeactivateUser(char **info, Bool one_item)
 {
-    register int status;
-    char txt_buf[BUFSIZ];
-    char * qargs[2];
+  int status;
+  char txt_buf[BUFSIZ];
+  char *qargs[2], **args;
+  struct mqelem *elem = NULL;
+
+  if (one_item)
+    {
+      sprintf(txt_buf, "Deactivate user %s (y/n)", info[NAME]);
+      if (YesNoQuestion(txt_buf, FALSE) != TRUE)
+       return;
+    }
 
-    if (one_item) {
-       sprintf(txt_buf, "Deactivate user %s (y/n)", info[NAME]);
-       if (!YesNoQuestion(txt_buf, 2))
-           return;
+  qargs[0] = info[NAME];
+  qargs[1] = "3";
+  if ((status = do_mr_query("update_user_status", 2, qargs, NULL, NULL)))
+    {
+      com_err(program_name, status, " in update_user_status");
+      sprintf(txt_buf, "User %s not deactivated due to errors.", info[NAME]);
+      Put_message(txt_buf);
     }
+  else if (YesNoQuestion("Also deactivate matching list and filesystem (y/n)",
+                        FALSE) == TRUE)
+    {
+      status = do_mr_query("get_list_info", 1, &(info[NAME]), StoreInfo,
+                          &elem);
+      if (status == MR_SUCCESS)
+       {
+         args = QueueTop(elem)->q_data;
+         free(args[L_ACTIVE]);
+         args[L_ACTIVE] = strdup("0");
+         FreeAndClear(&args[L_MODTIME], TRUE);
+         FreeAndClear(&args[L_MODBY], TRUE);
+         FreeAndClear(&args[L_MODWITH], TRUE);
+         SlipInNewName(args, strdup(args[L_NAME]));
+         if ((status = do_mr_query("update_list", CountArgs(args), args,
+                                   NULL, NULL)))
+           {
+             com_err(program_name, status, " updating list, "
+                     "not deactivating list or filesystem");
+             FreeInfo(args);
+             FreeQueue(elem);
+             return;
+           }
+         FreeInfo(args);
+         FreeQueue(elem);
+         elem = NULL;
+       }
+      else if (status != MR_NO_MATCH)
+       {
+         com_err(program_name, status, " getting list info, "
+                 "not deactivating list or filesystem");
+         return;
+       }
 
-    qargs[0] = info[NAME];
-    qargs[1] = "3";
-    if ((status = do_mr_query("update_user_status", 2, qargs, Scream,
-                              (char *) NULL)) != MR_SUCCESS) {
-       com_err(program_name, status, " in update_user_status");
-       sprintf(txt_buf, "User %s not deactivated due to errors.", info[NAME]);
-       Put_message(txt_buf);
+      if ((status = do_mr_query("get_filesys_by_label", 1, &(info[NAME]),
+                               StoreInfo, &elem)))
+       {
+         com_err(program_name, status, " getting filsys info, "
+                 "not deactivating filesystem");
+         return;
+       }
+      args = QueueTop(elem)->q_data;
+      free(args[FS_TYPE]);
+      args[FS_TYPE] = strdup("ERR");
+      free(args[FS_COMMENTS]);
+      args[FS_COMMENTS] = strdup("Locker disabled; call 3-1325 for help");
+      FreeAndClear(&args[FS_MODTIME], TRUE);
+      FreeAndClear(&args[FS_MODBY], TRUE);
+      FreeAndClear(&args[FS_MODWITH], TRUE);
+      SlipInNewName(args, strdup(args[FS_NAME]));
+      if ((status = do_mr_query("update_filesys", CountArgs(args), args,
+                               NULL, NULL)))
+       {
+         com_err(program_name, status, " updating filesystem, "
+                 "not deactivating filesystem");
+         FreeInfo(args);
+         FreeQueue(elem);
+         return;
+       }
+      FreeInfo(args);
+      FreeQueue(elem);
     }
 }
 
@@ -578,19 +818,15 @@ Bool one_item;
  *     Returns: DM_NORMAL.
  */
 
-/* ARGSUSED */
-int
-DeactivateUser(argc, argv)
-int argc;
-char **argv;
+int DeactivateUser(int argc, char **argv)
 {
-    struct qelem * elem;
+  struct mqelem *elem;
+
+  elem = GetUserInfo(LOGIN, argv[1], NULL);
+  QueryLoop(elem, NullPrint, RealDeactivateUser, "Deactivate user");
 
-    elem = GetUserInfo(LOGIN, argv[1], (char *) NULL);
-    QueryLoop(elem, NullPrint, RealDeactivateUser, "Deactivate user");
-    
-    FreeQueue(elem);
-    return(DM_NORMAL);
+  FreeQueue(elem);
+  return DM_NORMAL;
 }
 
 
@@ -602,32 +838,29 @@ char **argv;
  *     Description: Deletes the user given a uid number.
  *     Arguments: argc, argv - uid if user in argv[1].
  *     Returns: DM_NORMAL.
- *      NOTES: This just gets the username from the mr server 
+ *      NOTES: This just gets the username from the mr server
  *             and performs a DeleteUser().
  */
 
-int
-DeleteUserByUid(argc, argv)
-int argc;
-char **argv;
-{
-    int status;
-    struct qelem *elem = NULL;
-    char ** info;
-
-    if(!ValidName(argv[1]))
-       return(DM_NORMAL);
-    
-    if ( (status = do_mr_query("get_user_by_uid", 1, argv+1, StoreInfo,
-                               (char * ) &elem)) != MR_SUCCESS)
-       com_err(program_name, status, " in get_user_by_uid");
-    
-    info = (char **) elem->q_data;
-    argv[1] = info[U_NAME];
-
-    (void) DeleteUser(argc, argv);
-    return(DM_NORMAL);
-} 
+int DeleteUserByUid(int argc, char **argv)
+{
+  int status;
+  struct mqelem *elem = NULL;
+  char **info;
+
+  if (!ValidName(argv[1]))
+    return DM_NORMAL;
+
+  if ((status = do_mr_query("get_user_account_by_uid", 1, argv + 1, StoreInfo,
+                           &elem)))
+    com_err(program_name, status, " in get_user_account_by_uid");
+
+  info = elem->q_data;
+  argv[1] = info[U_NAME];
+
+  DeleteUser(argc, argv);
+  return DM_NORMAL;
+}
 
 /* ------------------------- Show User Information ------------------------- */
 
@@ -637,19 +870,15 @@ char **argv;
  *     Returns: DM_NORMAL
  */
 
-/* ARGSUSED */
-int
-ShowUserByLogin(argc, argv)
-int argc;
-char *argv[];
+int ShowUserByLogin(int argc, char *argv[])
 {
-    struct qelem *top, *elem;
+  struct mqelem *top, *elem;
 
-    elem = top = GetUserInfo(LOGIN, argv[1], (char *) NULL);
-    Loop(elem, PrintUserInfo);
+  elem = top = GetUserInfo(LOGIN, argv[1], NULL);
+  Loop(elem, PrintUserInfo);
 
-    FreeQueue(top);
-    return (DM_NORMAL);
+  FreeQueue(top);
+  return DM_NORMAL;
 }
 
 /*     Function Name: RetrieveUserByName
@@ -659,37 +888,34 @@ char *argv[];
  *     Returns: DM_NORMAL.
  */
 
-/* ARGSUSED */
-int
-ShowUserByName(argc, argv)
-int argc;
-char *argv[];
+int ShowUserByName(int argc, char *argv[])
 {
-    struct qelem *top;
-    char buf[BUFSIZ];
+  struct mqelem *top;
+  char buf[BUFSIZ];
 
-    top = GetUserInfo(BY_NAME, argv[1], argv[2]);
+  top = GetUserInfo(BY_NAME, argv[1], argv[2]);
 
-    if (top == NULL)           /* if there was an error then return. */
-       return(DM_NORMAL);
+  if (!top)            /* if there was an error then return. */
+    return DM_NORMAL;
 
-    if (!PromptWithDefault("Print full information, or just the names (f/n)?",
-                          buf, 2, "f"))
-       return(DM_NORMAL);
+  if (!PromptWithDefault("Print full information, or just the names (f/n)?",
+                        buf, 2, "f"))
+    return DM_NORMAL;
 
-    switch(buf[0]) {
+  switch (buf[0])
+    {
     case 'F':
     case 'f':
-       Loop(top, PrintUserInfo);
-       break;
+      Loop(top, PrintUserInfo);
+      break;
     case 'N':
     case 'n':
-       Loop(top, PrintUserName);
-       break;
+      Loop(top, PrintUserName);
+      break;
     }
-    
-    FreeQueue(top);
-    return (DM_NORMAL);
+
+  FreeQueue(top);
+  return DM_NORMAL;
 }
 
 /*     Function Name: ShowUserByClass
@@ -698,19 +924,35 @@ char *argv[];
  *     Returns: none.
  */
 
-/* ARGSUSED */
-int
-ShowUserByClass(argc, argv)
-int argc;
-char **argv;
+int ShowUserByClass(int argc, char **argv)
+{
+  struct mqelem *top;
+
+  if (YesNoQuestion("This will take a long time.  Are you sure", 0) == FALSE)
+    return DM_NORMAL;
+  top = GetUserInfo(CLASS, argv[1], NULL);
+  Loop(top, PrintUserName);
+
+  FreeQueue(top);
+  return DM_NORMAL;
+}
+
+
+/*     Function Name: ShowUserById
+ *     Description: Shows user information given an ID number.
+ *     Arguments: argc, argv - ID number in argv[1].
+ *     Returns: DM_NORMAL
+ */
+
+int ShowUserById(int argc, char *argv[])
 {
-    struct qelem *top;
+  struct mqelem *top, *elem;
 
-    top = GetUserInfo(CLASS, argv[1], (char *) NULL);
-    Loop(top, PrintUserName);
+  elem = top = GetUserInfo(ID, argv[1], NULL);
+  Loop(elem, PrintUserInfo);
 
-    FreeQueue(top);
-    return (DM_NORMAL);
+  FreeQueue(top);
+  return DM_NORMAL;
 }
 
 
@@ -721,34 +963,32 @@ char **argv;
  *     Returns: none.
  */
 
-/* ARGSUSED */
-int
-GetKrbmap(argc, argv)
-int argc;
-char **argv;
+int GetKrbmap(int argc, char **argv)
 {
-    int stat;
-    struct qelem *elem = NULL, *top;
-    char buf[BUFSIZ];
-
-    if ((stat = do_mr_query("get_kerberos_user_map", 2, &argv[1],
-                            StoreInfo, (char *)&elem)) != 0) {
-       com_err(program_name, stat, " in GetKrbMap.");
-       return(DM_NORMAL);
+  int stat;
+  struct mqelem *elem = NULL, *top;
+  char buf[BUFSIZ];
+
+  if ((stat = do_mr_query("get_kerberos_user_map", 2, &argv[1],
+                         StoreInfo, &elem)))
+    {
+      com_err(program_name, stat, " in GetKrbMap.");
+      return DM_NORMAL;
     }
 
-    top = elem = QueueTop(elem);
-    Put_message("");
-    while (elem != NULL) {
-       char **info = (char **) elem->q_data;
-       sprintf(buf, "User: %-9s Principal: %s",
-               info[KMAP_USER], info[KMAP_PRINCIPAL]);
-       Put_message(buf);
-       elem = elem->q_forw;
+  top = elem = QueueTop(elem);
+  Put_message("");
+  while (elem)
+    {
+      char **info = elem->q_data;
+      sprintf(buf, "User: %-9s Principal: %s",
+             info[KMAP_USER], info[KMAP_PRINCIPAL]);
+      Put_message(buf);
+      elem = elem->q_forw;
     }
 
-    FreeQueue(QueueTop(top));
-    return(DM_NORMAL);
+  FreeQueue(QueueTop(top));
+  return DM_NORMAL;
 }
 
 
@@ -759,25 +999,23 @@ char **argv;
  *     Returns: none.
  */
 
-/* ARGSUSED */
-int
-AddKrbmap(argc, argv)
-int argc;
-char **argv;
+int AddKrbmap(int argc, char **argv)
 {
-    int stat;
+  int stat;
 
-    if (!index(argv[KMAP_PRINCIPAL + 1], '@')) {
-       Put_message("Please specify a realm for the kerberos principal.");
-       return(DM_NORMAL);
+  if (!strchr(argv[KMAP_PRINCIPAL + 1], '@'))
+    {
+      Put_message("Please specify a realm for the kerberos principal.");
+      return DM_NORMAL;
     }
-    if ((stat = do_mr_query("add_kerberos_user_map", 2, &argv[1],
-                            Scream, NULL)) != 0) {
-       com_err(program_name, stat, " in AddKrbMap.");
-       if (stat == MR_EXISTS)
-         Put_message("No user or principal may have more than one mapping.");
+  if ((stat = do_mr_query("add_kerberos_user_map", 2, &argv[1],
+                         NULL, NULL)))
+    {
+      com_err(program_name, stat, " in AddKrbMap.");
+      if (stat == MR_EXISTS)
+       Put_message("No user or principal may have more than one mapping.");
     }
-    return(DM_NORMAL);
+  return DM_NORMAL;
 }
 
 
@@ -788,17 +1026,210 @@ char **argv;
  *     Returns: none.
  */
 
-/* ARGSUSED */
-int
-DeleteKrbmap(argc, argv)
-int argc;
-char **argv;
+int DeleteKrbmap(int argc, char **argv)
+{
+  int stat;
+
+  if ((stat = do_mr_query("delete_kerberos_user_map", 2, &argv[1],
+                         NULL, NULL)))
+    com_err(program_name, stat, " in DeleteKrbMap.");
+  return DM_NORMAL;
+}
+
+int GetUserReservations(int argc, char **argv)
+{
+  int stat;
+  struct mqelem *elem = NULL, *top;
+  char buf[BUFSIZ];
+
+  if ((stat = do_mr_query("get_user_reservations", 1, &argv[1],
+                         StoreInfo, &elem)))
+    {
+      com_err(program_name, stat, " in GetUserReservations.");
+      return DM_NORMAL;
+    }
+
+  top = elem = QueueTop(elem);
+  Put_message("");
+  if (!elem)
+    Put_message("No reservations for that user.");
+  while (elem)
+    {
+      char **info = elem->q_data;
+      sprintf(buf, "Reservation: %s", info[0]);
+      Put_message(buf);
+      elem = elem->q_forw;
+    }
+
+  FreeQueue(QueueTop(top));
+  return DM_NORMAL;  
+}
+
+int AddUserReservation(int argc, char **argv)
 {
-    int stat;
+  int stat;
+  char buf[BUFSIZ];
+  
+  switch (stat = do_mr_query("add_user_reservation", 2, &argv[1],
+                            NULL, NULL))
+    {
+    case MR_SUCCESS:
+      break;
+    case MR_STRING:
+      sprintf(buf, "The reservation %s is not valid.", argv[2]);
+      Put_message(buf);
+      PrintReservationTypes();
+      break;
+    default:
+      com_err(program_name, stat, " in AddUserReservation.");
+      break;
+    }
+  
+  return DM_NORMAL;
+}
 
-    if ((stat = do_mr_query("delete_kerberos_user_map", 2, &argv[1],
-                            Scream, NULL)) != 0) {
-       com_err(program_name, stat, " in DeleteKrbMap.");
+int DelUserReservation(int argc, char **argv)
+{
+  int stat;
+  char buf[BUFSIZ];
+
+  switch (stat = do_mr_query("delete_user_reservation", 2, &argv[1],
+                    NULL, NULL))
+    {
+    case MR_SUCCESS:
+      break;
+    case MR_STRING:
+      sprintf(buf, "The reservation %s is not valid.", argv[2]);
+      Put_message(buf);
+      PrintReservationTypes();
+      break;
+    default:
+      com_err(program_name, stat, " in DelUserReservation.");
+      break;
+    }
+  
+  return DM_NORMAL;
+}
+
+int GetUserByReservation(int argc, char **argv)
+{
+  int stat;
+  struct mqelem *elem = NULL, *top;
+  char buf[BUFSIZ];
+
+  switch (stat = do_mr_query("get_user_by_reservation", 1, &argv[1],
+                    StoreInfo, &elem))
+    {
+    case MR_SUCCESS:
+      break;
+    case MR_STRING:
+      sprintf(buf, "The reservation %s is not valid.", argv[1]);
+      Put_message(buf);
+      PrintReservationTypes();
+      return DM_NORMAL;
+    default:
+      com_err(program_name, stat, " in GetUserByReservation.");
+      return DM_NORMAL;
+    }
+  
+  top = elem = QueueTop(elem);
+  Put_message("");
+  while (elem)
+    {
+      char **info = elem->q_data;
+      sprintf(buf, "User: %s", info[0]);
+      Put_message(buf);
+      elem = elem->q_forw;
+    }
+
+  FreeQueue(QueueTop(top));
+  return DM_NORMAL;  
+}
+
+void PrintReservationTypes(void)
+{
+  int stat;
+  struct mqelem *elem = NULL, *top;
+  char buf[BUFSIZ];
+  char *qargs[2];
+
+  Put_message("Valid types of reservations are: ");
+  Put_message("");
+  qargs[0] = "*";
+  qargs[1] = "RESERVE";
+  qargs[2] = "*";
+  if ((stat = do_mr_query("get_alias", 3, &qargs[0],
+                         StoreInfo, &elem)))
+    {
+      com_err(program_name, stat, "in PrintReservationTypes.");
+    }
+  top = elem = QueueTop(elem);
+  while (elem)
+    {
+      char **info = elem->q_data;
+      sprintf(buf, "%s", info[2]);
+      Put_message(buf);
+      elem = elem->q_forw;
+    }
+
+  FreeQueue(QueueTop(top));  
+}
+
+int UserBySponsor(int argc, char **argv)
+{
+  char buf[BUFSIZ], temp_buf[BUFSIZ], *type, *name;
+  struct mqelem *top;
+
+  type = strdup("USER");
+  if (GetTypeFromUser("Type of sponsor", "search_ace_type", &type) == SUB_ERROR)
+    return DM_NORMAL;
+
+  sprintf(buf, "Name of %s", type);
+  name = strdup(user);
+  if (GetValueFromUser(buf, &name) == SUB_ERROR)
+    return DM_NORMAL;
+
+  switch (YesNoQuestion("Do you want a recursive search (y/n)", FALSE))
+    {
+    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;
+    }
+
+  top = GetUserBySponsor(type, name);
+  Loop(top, PrintLogin);
+
+  FreeQueue(top);
+  return DM_NORMAL;
+}
+
+static void PrintLogin(char **info)
+{
+     char buf[BUFSIZ];
+
+     sprintf(buf, "Login: %s", info[U_NAME]);
+     Put_message(buf);
+}
+
+struct mqelem *GetUserBySponsor(char *type, char *name)
+{
+  char *args[2];
+  struct mqelem *elem = NULL;
+  int status;
+
+  args[0] = type;
+  args[1] = name;
+  if ((status = do_mr_query("get_user_account_by_sponsor", 2, args, StoreInfo,
+                           &elem)))
+    {
+      com_err(program_name, status, " in get_user_account_by_sponsor");
+      return NULL;
     }
-    return(DM_NORMAL);
+  return QueueTop(elem);
 }
This page took 0.097599 seconds and 4 git commands to generate.