+
+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;
+ 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;
+}
+
+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", "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 QueueTop(elem);
+}