debugged, the rest is still to be done.
#define GROUP 2
#define ALIAS 3
+#define DEFAULT_TYPE ("NFS")
+#define DEFAULT_MACHINE DEFAULT_NONE
+#define DEFAULT_PACK DEFAULT_NONE
+#define DEFAULT_M_POINT DEFAULT_NONE
+#define DEFAULT_ACCESS ("r")
+#define DEFAULT_COMMENTS DEFAULT_COMMENT
+#define DEFAULT_OWNER (user)
+#define DEFAULT_OWNERS (user)
+#define DEFAULT_CREATE DEFAULT_YES
+#define DEFAULT_L_TYPE ("HOMEDIR")
+
+/* Function Name: SetDefaults
+ * Description: sets the default values for filesystem additions.
+ * Arguments: info - an array of char pointers to recieve defaults.
+ * Returns: char ** (this array, now filled).
+ */
+
+static char **
+SetDefaults(info, name)
+char ** info;
+char * name;
+{
+ info[FS_NAME] = Strsave(name);
+ info[FS_TYPE] = Strsave(DEFAULT_TYPE);
+ info[FS_MACHINE] = Strsave(DEFAULT_MACHINE);
+ info[FS_PACK] = Strsave(DEFAULT_PACK);
+ info[FS_M_POINT] = Strsave(DEFAULT_M_POINT);
+ info[FS_ACCESS] = Strsave(DEFAULT_ACCESS);
+ info[FS_COMMENTS] = Strsave(DEFAULT_COMMENTS);
+ info[FS_OWNER] = Strsave(DEFAULT_OWNER);
+ info[FS_OWNERS] = Strsave(DEFAULT_OWNERS);
+ info[FS_CREATE] = Strsave(DEFAULT_CREATE);
+ info[FS_L_TYPE] = Strsave(DEFAULT_L_TYPE);
+ info[FS_MODTIME] = info[FS_MODBY] = info[FS_MODWITH] = info[FS_END] = NULL;
+ return(info);
+}
+
/* Function Name: GetFSInfo
* Description: Stores the info in a queue.
* Arguments: type - type of information to get.
{
int stat;
struct qelem * elem = NULL;
- char * args[2];
+ char * args[5];
switch (type) {
case LABEL:
}
break;
case ALIAS:
- args[0] = name;
- args[1] = FS_ALIAS_TYPE;
- if ( (stat = sms_query("get_alias", 2, args, StoreInfo, &elem)) != 0) {
+ args[ALIAS_NAME] = name;
+ args[ALIAS_TYPE] = FS_ALIAS_TYPE;
+ args[ALIAS_TRANS] = "*";
+ if ( (stat = sms_query("get_alias", 3, args, StoreInfo, &elem)) != 0) {
com_err(program_name, stat, " in get_alias.");
return(NULL);
}
return(QueueTop(elem));
}
+/* Function Name: PrintFSAlias
+ * Description: Prints a filesystem alias
+ * Arguments: info - an array contains the strings of info.
+ * Returns: none.
+ */
+
+static void
+PrintFSAlias(info)
+char ** info;
+{
+ char buf[BUFSIZ];
+
+ sprintf(buf,"Alias: %-25s Filesystem: %s",info[ALIAS_NAME],
+ info[ALIAS_TRANS]);
+ Put_message(buf);
+}
+
/* Function Name: PrintFSInfo
* Description: Prints the filesystem information.
* Arguments: info - a pointer to the filesystem information.
char ** info;
{
char print_buf[BUFSIZ];
- sprintf(print_buf,"Information about filesystem: %s", info[FS_NAME]);
+ FORMFEED;
+ sprintf(print_buf,"%20s Filesystem: %s",
+ " ",info[FS_NAME]);
Put_message(print_buf);
- sprintf(print_buf,"Type: %s\t\tMachine: %s\t\tPackname: %s",info[FS_TYPE],
- info[FS_MACHINE], info[FS_PACK]);
+ sprintf(print_buf,"Type: %-40s Machine: %-15s",
+ info[FS_TYPE], info[FS_MACHINE]);
Put_message(print_buf);
- sprintf(print_buf,"Mountpoint %s\t\t Default Access: %s",info[FS_M_POINT],
- info[FS_ACCESS]);
+ sprintf(print_buf,"Default Access: %-2s Packname: %-17s Mountpoint %s ",
+ info[FS_ACCESS], info[FS_PACK], info[FS_M_POINT]);
Put_message(print_buf);
sprintf(print_buf,"Comments; %s",info[FS_COMMENTS]);
Put_message(print_buf);
- sprintf(print_buf, "User Ownership: %s,\t\tGroup Ownership:\t\t%s",
+ sprintf(print_buf, "User Ownership: %-30s Group Ownership: %s",
info[FS_OWNER], info[FS_OWNERS]);
Put_message(print_buf);
- sprintf(print_buf, "Auto Create %s\t\tLocker Type: %s",info[FS_CREATE],
+ sprintf(print_buf, "Auto Create %-34s Locker Type: %s",info[FS_CREATE],
info[FS_L_TYPE]);
Put_message(print_buf);
- sprintf(print_buf, "Last Modified at %s, by %s with %s",info[FS_MODTIME],
- info[FS_MODBY], info[FS_MODWITH]);
+ sprintf(print_buf, "Last Modified at %s, by %s with %s",
+ info[FS_MODTIME], info[FS_MODBY], info[FS_MODWITH]);
Put_message(print_buf);
}
-/* Function Name: PrintAllFSInfo
- * Description: Prints all infomation about a filesystem, stored in
- * a queue.
- * Arguments: elem - a pointer to the first elem in the queue.
- * Returns: none.
- */
-
-void
-PrintAllFSInfo(elem)
-struct qelem * elem;
-{
-/*
- * Not nescessary, but makes it clear that we are not changing this value.
- */
- struct qelem * local = elem;
-
- while(local != NULL) {
- char ** info = (char **) local->q_data;
- PrintFSInfo(info);
- local = local->q_forw;
- }
-}
-
/* Function Name: AskFSInfo.
* Description: This function askes the user for information about a
* machine and saves it into a structure.
{
char temp_buf[BUFSIZ], *newname;
- sprintf(temp_buf, "\nChanging Attributes of user %s.\n", info[FS_NAME]);
+ sprintf(temp_buf, "\nChanging Attributes of filesystem: %s.\n",
+ info[FS_NAME]);
Put_message(temp_buf);
if (name) {
newname = Strsave(info[FS_NAME]);
- GetValueFromUser("The new login name for this filesystem.",
+ GetValueFromUser("The new name for this filesystem.",
&newname);
}
GetValueFromUser("Filesystem's Type:", &info[FS_TYPE]);
GetValueFromUser("Filesystem's Machine:", &info[FS_MACHINE]);
+ strcpy(temp_buf, CanonicalizeHostname(info[FS_MACHINE]));
+ free(info[FS_MACHINE]);
+ info[FS_MACHINE] = Strsave(temp_buf);
GetValueFromUser("Filesystem's Pack Name:", &info[FS_PACK]);
GetValueFromUser("Filesystem's Mount Point:", &info[FS_M_POINT]);
GetValueFromUser("Filesystem's Default Access:", &info[FS_ACCESS]);
- GetValueFromUser("Commants about this Filesystem:", &info[FS_COMMENTS]);
+ GetValueFromUser("Comments about this Filesystem:", &info[FS_COMMENTS]);
GetValueFromUser("Filesystem's owner (user):", &info[FS_OWNER]);
GetValueFromUser("Filesystem's owners (group):", &info[FS_OWNERS]);
GetValueFromUser("Automatically create this filsystem (0/1):",
- &info[FS_COMMENTS]);
+ &info[FS_CREATE]);
GetValueFromUser("Filesystem's lockertype:", &info[FS_L_TYPE]);
FreeAndClear(&info[FS_MODTIME], TRUE);
int argc;
char **argv;
{
- struct qelem *elem;
+ struct qelem *top, *elem;
- elem = GetFSInfo(LABEL, argv[1]); /* get info. */
- PrintAllFSInfo(elem); /* print it all. */
- FreeQueue(elem); /* clean the queue. */
+ top = elem = GetFSInfo(LABEL, argv[1]); /* get info. */
+ while(elem != NULL) {
+ char ** info = (char **) elem->q_data;
+ PrintFSInfo(info);
+ elem = elem->q_forw;
+ }
+ FreeQueue(top); /* clean the queue. */
return (DM_NORMAL);
}
while (temp_elem != NULL) {
char **info = (char **) temp_elem->q_data;
- if (one_filsys) {
+ if (!one_filsys) {
PrintFSInfo(info);
- answer = YesNoQuitQuestion("\nDelete this filesys?", FALSE);
+ answer = YesNoQuitQuestion("\nDelete this filesystem?", FALSE);
switch(answer) {
case TRUE:
delete = TRUE;
one_filsys = (QueueCount(elem) == 1);
while (temp_elem != NULL) {
char ** info = (char **) temp_elem->q_data;
- if (one_filsys) {
- sprintf(buf, "%s %s %s (y/n/q)? ", "Would you like to change the",
- "information about the filesystem:",
- info[FS_NAME]);
+ if (!one_filsys) {
+ sprintf(buf, "Update filesystem %s (y/n/q)? ", info[FS_NAME]);
info = (char **) temp_elem->q_data;
answer = YesNoQuitQuestion(buf, FALSE);
switch(answer) {
char ** args = AskFSInfo(info, TRUE);
if ( (stat = sms_query("update_filesys", CountArgs(args),
args, NullFunc, NULL)) != 0)
- com_err(program_name, stat, " in filesystem not updated");
+ com_err(program_name, stat, ", filesystem not updated");
else
Put_message("filesystem sucessfully updated.");
}
int argc;
{
char *info[MAX_ARGS_SIZE], **args;
- int stat, count;
+ int stat;
if ( !ValidName(argv[1]) )
return(DM_NORMAL);
return(DM_NORMAL);
}
- for (count = 0; count < 100; count++)
- info[count] = NULL;
- args = AskFSInfo(info, FALSE );
+ args = AskFSInfo(SetDefaults(info, argv[1]), FALSE );
- if (stat = sms_query("add_filesys", CountArgs(args), args,
- NullFunc, NULL) != 0)
+ if ( (stat = sms_query("add_filesys", CountArgs(args), args,
+ NullFunc, NULL)) != 0)
com_err(program_name, stat, " in AddFS");
FreeInfo(info);
int argc;
char **argv;
{
- char **info, buf[BUFSIZ];
struct qelem *top, *elem;
top = elem = GetFSInfo(ALIAS, argv[1]);
+ Put_message(" "); /* blank line. */
while (elem != NULL) {
- info = (char **) elem->q_data;
- sprintf(buf,"Alias: %s\tFilesystem: %s",info[ALIAS_NAME],
- info[ALIAS_TRANS]);
- Put_message(buf);
+ char **info = (char **) elem->q_data;
+ PrintFSAlias(info);
elem = elem->q_forw;
}
args[ALIAS_NAME] = Strsave(argv[1]);
args[ALIAS_TYPE] = Strsave(FS_ALIAS_TYPE);
+ args[ALIAS_TRANS] = Strsave("*");
/*
* Check to see if this alias already exists in the database, if so then
* print out values, free memory used and then exit.
*/
- if ( (stat = sms_query("get_alias", 2, args, StoreInfo, &elem)) == 0) {
- top = elem;
+ if ( (stat = sms_query("get_alias", 3, args, StoreInfo, &elem)) == 0) {
+ top = elem = QueueTop(elem);
while (elem != NULL) {
info = (char **) elem->q_data;
- sprintf(buf,"The alias: %s\tcurrently describes the filesystem %s",
+ sprintf(buf,"The alias: %s currently describes the filesystem %s",
info[ALIAS_NAME], info[ALIAS_TRANS]);
Put_message(buf);
elem = elem->q_forw;
char **argv;
{
register int stat;
- char buf[BUFSIZ];
+ char *ptr;
struct qelem *elem, *top;
Bool one_alias, delete;
while (elem != NULL) {
char **info = (char **) elem->q_data;
- if (one_alias) {
+ Put_message(" "); /* blank line. */
+ PrintFSAlias(info);
+ if (!one_alias) {
int answer;
-
- sprintf(buf, "%s %s for the filesystem %s? (y/n)",
- "Confirm that you want to delete\n the alias",
- info[ALIAS_NAME], info[ALIAS_TRANS]);
- Put_message(buf);
- answer = YesNoQuitQuestion(buf, FALSE);
+ ptr = "Do you want to delete this alias (y/n/q)? ",
+ answer = YesNoQuitQuestion(ptr, FALSE);
switch(answer) {
case TRUE:
delete = TRUE;
}
}
else {
- sprintf(buf, "Are you sure that you want to delete %s",
- "this filesystem alias?");
- delete = Confirm(buf);
+ ptr = "Are you sure that you want to delete this alias?";
+ delete = Confirm(ptr);
}
/*
* Deletetions are performed if the user hits 'y' on a list of multiple
* filesystem aliases, or if the user confirms on a unique alias.
*/
if (delete) {
- if ( (stat = sms_query("delete_filesys", 1,
- &info[ALIAS_NAME], Scream, NULL)) != 0)
+ if ( (stat = sms_query("delete_alias", CountArgs(info),
+ info, Scream, NULL)) != 0)
com_err(program_name, stat, " filesystem alias not deleted.");
else
Put_message("Filesystem alias deleted.");
AttachHelp()
{
static char *message[] = {
- "These are the options:\n",
- "get - get information about a filesystem.",
- "add - add a new filesystem to the data base.",
- "update - update the information in the database on a filesystem.",
- "delete - delete a filesystem from the database.\n",
- "check - check information about association of a name and a filesys.",
- "alias - associate a name with a filsystem.",
- "unalias - disassociate a name with a filesystem.",
- "\twhere a name is: user, group, or project\n",
- "verbose - toggle the request for delete confirmation\n",
+ "These are the options:\n\n",
+ "get - get information about a filesystem.\n",
+ "add - add a new filesystem to the data base.\n",
+ "update - update the information in the database on a filesystem.\n",
+ "delete - delete a filesystem from the database.\n",
+ "check - check information about association of a name and a filesys.\n",
+ "alias - associate a name with a filsystem.\n",
+ "unalias - disassociate a name with a filesystem.\n",
+ "verbose - toggle the request for delete confirmation.\n",
NULL,
};
#define DATA 2
#define MAP 3
+#define M_DEFAULT_TYPE DEFAULT_NONE
+
+#define C_DEFAULT_DESCRIPT DEFAULT_NONE
+#define C_DEFAULT_LOCATION DEFAULT_NONE
+
+#define CD_DEFAULT_LABEL DEFAULT_NONE
+#define CD_DEFAULT_DATA DEFAULT_NONE
+
+/* -------------------- Set Defaults -------------------- */
+
+/* Function Name: SetMachineDefaults
+ * Description: sets machine defaults.
+ * Arguments: info - an array to put the defaults into.
+ * name - Canonacalized name of the machine.
+ * Returns: info - the array.
+ */
+
+char **
+SetMachineDefaults(info, name)
+char ** info, *name;
+{
+ info[M_NAME] = Strsave(name);
+ info[M_TYPE] = Strsave(M_DEFAULT_TYPE);
+ info[M_MODBY] = info[M_MODTIME] = info[M_MODWITH] = info[M_END] = NULL;
+ return(info);
+}
+
+/* Function Name: SetClusterDefaults
+ * Description: sets Cluster defaults.
+ * Arguments: info - an array to put the defaults into.
+ * name - name of the Cluster.
+ * Returns: info - the array.
+ */
+
+char **
+SetClusterDefaults(info, name)
+char ** info, *name;
+{
+ info[C_NAME] = Strsave(name);
+ info[C_DESCRIPT] = Strsave(C_DEFAULT_DESCRIPT);
+ info[C_LOCATION] = Strsave(C_DEFAULT_LOCATION);
+ info[C_MODBY] = info[C_MODTIME] = info[C_MODWITH] = info[C_END] = NULL;
+ return(info);
+}
+
+/* Function Name: SetClusterDataDefaults
+ * Description: Sets cluster data defaults.
+ * Arguments: info - an array to put the defaults into.
+ * name - name of the Cluster.
+ * Returns: info - the array.
+ */
+
+char **
+SetClusterDataDefaults(info, name)
+char ** info, *name;
+{
+ info[CD_NAME] = Strsave(name);
+ info[CD_LABEL] = Strsave(CD_DEFAULT_LABEL);
+ info[CD_DATA] = Strsave(CD_DEFAULT_DATA);
+/*info[CD_MODBY] = info[CD_MODTIME] = info[CD_MODWITH] = info[CD_END] = NULL;*/
+ info[CD_END] = NULL;
+ return(info);
+}
+
+/* -------------------- General Functions -------------------- */
+
/* Function Name: PrintMachInfo
* Description: This function Prints out the Machine info in
* a coherent form.
{
char buf[BUFSIZ];
- sprintf(buf, "Machine: %s\tType: %s", info[M_NAME], info[M_TYPE]);
+ Put_message("");
+ sprintf(buf, "Machine: %-30s Type: %s", info[M_NAME], info[M_TYPE]);
Put_message(buf);
sprintf(buf, "Last Modified at %s, by %s with %s",info[M_MODTIME],
info[M_MODBY], info[M_MODWITH]);
{
char buf[BUFSIZ];
- sprintf(buf, "Cluster: %s", info[C_NAME]);
+ Put_message("");
+ sprintf(buf, "Cluster: %s", info[C_NAME]);
+ Put_message(buf);
+ sprintf(buf, "Description: %s", info[C_DESCRIPT]);
Put_message(buf);
- sprintf(buf,"Description: %-20s, Location: %-20s", info[C_DESCRIPT],
- info[C_LOCATION]);
+ sprintf(buf, "Location: %s", info[C_LOCATION]);
Put_message(buf);
sprintf(buf, "Last Modified at %s, by %s with %s",info[C_MODTIME],
info[C_MODBY], info[C_MODWITH]);
char ** info;
{
char buf[BUFSIZ];
- sprintf(buf, "Cluster: %-30s Label: %-20s Data: %-20s",
+
+ Put_message("");
+ sprintf(buf, "Cluster: %-20s Label: %-15s Data: %s",
info[CD_NAME], info[CD_LABEL], info[CD_DATA]);
Put_message(buf);
}
switch (type) {
case MACHINE:
- sprintf(temp_buf, "Changing the information for the Machine %s.",
- name);
+ sprintf(temp_buf, "Setting the information for the Machine %s.",
+ info[M_NAME]);
break;
case CLUSTER:
- sprintf(temp_buf, "Changing the information for the Cluster %s.",
- name);
+ sprintf(temp_buf, "Setting the information for the Cluster %s.",
+ info[C_NAME]);
break;
case DATA:
- sprintf(temp_buf, "Changing the Data for the Cluster %s.",
- name);
+ sprintf(temp_buf, "Setting the Data for the Cluster %s.",
+ info[CD_NAME]);
break;
}
Put_message(temp_buf);
switch (type) {
case MACHINE:
newname = Strsave(info[M_NAME]);
- GetValueFromUser("The new name for this machine? ",
- &newname);
+ GetValueFromUser("The new name for this machine? ", &newname);
+ strcpy(temp_buf, CanonicalizeHostname(newname));
+ free(newname);
+ newname = Strsave(temp_buf);
break;
case CLUSTER:
newname = Strsave(info[C_NAME]);
int argc;
char **argv;
{
- char **info;
struct qelem *elem, *top;
top = elem = GetMCInfo(MACHINE, CanonicalizeHostname(argv[1]),
(char *) NULL);
while (elem != NULL) {
- info = (char **) elem->q_data;
+ char **info = (char **) elem->q_data;
PrintMachInfo(info);
elem = elem->q_forw;
}
return(DM_NORMAL);
}
- info[0] = name;
- args = AskMCDInfo(info, MACHINE, FALSE);
+ args = AskMCDInfo(SetMachineDefaults(info, name), MACHINE, FALSE);
/*
* Actually create the new Machine.
{
struct qelem *elem, *top;
int stat;
+ char **args, **info, temp_buf[BUFSIZ];
+ Bool one_machine, update_it;
elem = top = GetMCInfo( MACHINE, CanonicalizeHostname(argv[1]),
(char *) NULL);
+ one_machine = (QueueCount(top) == 1);
while (elem != NULL) {
- char ** args;
- char ** info = (char **) elem->q_data;
- args = AskMCDInfo(info, MACHINE, TRUE);
- if ( (stat = sms_query("update_machine", CountArgs(args),
- args, Scream, NULL)) != 0)
- com_err(program_name, stat, " in UpdateMachine.");
+ info = (char **) elem->q_data;
+ if (one_machine)
+ update_it = TRUE;
+ else {
+ sprintf(temp_buf, "Update %s (y/n/q) ? ", info[M_NAME]);
+ switch(YesNoQuitQuestion(temp_buf, FALSE)) {
+ case TRUE:
+ update_it = TRUE;
+ break;
+ case FALSE:
+ update_it = FALSE;
+ break;
+ default:
+ Put_message("Aborting...");
+ FreeQueue(top);
+ return(DM_NORMAL);
+ }
+ }
+ if (update_it) {
+ args = AskMCDInfo(info, MACHINE, TRUE);
+ if ( (stat = sms_query("update_machine", CountArgs(args),
+ args, Scream, NULL)) != 0)
+ com_err(program_name, stat, " in UpdateMachine.");
+ }
elem = elem->q_forw;
}
-
FreeQueue(top);
return(DM_NORMAL);
}
+/* Function Name: CheckAndRemoveFromCluster
+ * Description: This func tests to see if a machine is in a cluster.
+ * and if so then removes it
+ * Arguments: name - name of the machine (already Canonocalized).
+ * ask_user- query the user before removing if from clusters?
+ * Returns: SMS_ERROR if machine left in a cluster, or sms_error.
+ */
+
+int
+CheckAndRemoveFromCluster(name, ask_user)
+char * name;
+Bool ask_user;
+{
+ register int stat, ret_value;
+ Bool delete_it;
+ char *args[10], temp_buf[BUFSIZ], *ptr;
+ struct qelem *top, *elem = NULL;
+
+ ret_value = SUB_NORMAL;
+ args[0] = name;
+ args[1] = "*";
+ stat = sms_query("get_machine_to_cluster_map", 2, args,
+ StoreInfo, &elem);
+ if (stat && stat != SMS_NO_MATCH) {
+ com_err(program_name, stat, " in get_machine_to_cluster_map.");
+ return(DM_NORMAL);
+ }
+ if (stat == 0) {
+ elem = top = QueueTop(elem);
+ if (ask_user) {
+ sprintf(temp_buf, "%s is assigned to the following clusters.",
+ name);
+ Put_message(temp_buf);
+ while (elem != NULL) {
+ char **info = (char **) elem->q_data;
+ Print(1, &info[MAP_CLUSTER], (char *) NULL);
+ elem = elem->q_forw;
+ }
+ ptr = "Remove this machine from ** ALL ** these clusters?";
+
+ if (YesNoQuestion(ptr, FALSE) == TRUE) /* may return -1. */
+ delete_it = TRUE;
+ else {
+ Put_message("Aborting...");
+ FreeQueue(top);
+ return(SUB_ERROR);
+ }
+ }
+ else
+ delete_it = TRUE;
+
+ if (delete_it) {
+ elem = top;
+ while (elem != 0) {
+ char **info = (char **) elem->q_data;
+ if ( (stat = sms_query( "delete_machine_from_cluster",
+ 2, info, Scream, NULL)) != 0) {
+ ret_value = SUB_ERROR;
+ com_err(program_name, stat,
+ " in delete_machine_from_cluster.");
+ sprintf(temp_buf,
+ "Machine %s ** NOT ** removed from cluster %s.",
+ info[MAP_MACHINE], info[MAP_CLUSTER]);
+ Put_message(temp_buf);
+ }
+ elem = elem->q_forw;
+ }
+ }
+ }
+ return(ret_value);
+}
+
/* Function Name: DeleteMachine
* Description: This function removes a machine from the data base.
* Arguments: argc, argv - the machines name int argv[1].
* Returns: DM_NORMAL.
*/
+/* Perhaps we should remove the cluster if it has no machine now. */
+
/* ARGSUSED */
int
DeleteMachine(argc, argv)
char **argv;
{
int stat;
- char * args[2], *name, temp_buf[BUFSIZ];
+ Bool one_machine, delete_it = FALSE;
+ char *name, temp_buf[BUFSIZ];
struct qelem *top, *elem = NULL;
name = CanonicalizeHostname(argv[1]);
+ top = elem = GetMCInfo(MACHINE, name, (char *) NULL);
-/* Should probabally check for wildcards, none allowed. */
-/* Perhaps we should remove the cluster if it has no machine now. */
-
- args[0] = name;
- args[1] = "*";
- stat = sms_query("get_machine_to_cluster_map", 2, args, StoreInfo, &elem);
- if (stat && stat != SMS_NO_MATCH) {
- com_err(program_name, stat, " in DeleteMachine.");
- return(DM_NORMAL);
- }
- if (stat == 0) {
- top = elem;
- while (elem != NULL) {
- sprintf(temp_buf, "%s is assigned to cluster %s.",
- args[0], args[1]);
- Put_message(temp_buf);
- if ( YesNoQuestion(
- "Would you like to remove it from this cluster?", FALSE)) {
- if ( (stat = sms_query( "delete_machine_from_cluster",
- 1, args, Scream, NULL)) != 0)
- com_err(program_name, stat,
- " in delete_machine_from_cluster.");
+ one_machine = (QueueCount(top) == 1);
+ while (elem != NULL) {
+ char **info = (char **) elem->q_data;
+ if (one_machine) {
+ if(Confirm("Are you sure that you want to delete this machine?"))
+ delete_it = TRUE;
+ }
+ else {
+ sprintf(temp_buf, "Delete the machine %s (y/n/q)? ", info[M_NAME]);
+ switch (YesNoQuitQuestion(temp_buf, FALSE)) {
+ case TRUE:
+ delete_it = TRUE;
+ break;
+ case FALSE:
+ delete_it = FALSE;
+ sprintf(temp_buf, "%s not Deleted.", info[M_NAME]);
+ Put_message(temp_buf);
+ break;
+ default: /* quit. */
+ Put_message("Aborting...");
+ FreeQueue(top);
+ return(DM_NORMAL);
+ }
+ }
+ if (delete_it) {
+ if (CheckAndRemoveFromCluster(info[M_NAME], TRUE) != SUB_ERROR) {
+ if ( (stat = sms_query("delete_machine", 1,
+ &info[M_NAME], Scream, NULL)) != 0) {
+ com_err(program_name, stat, " in DeleteMachine.");
+ sprintf(temp_buf, "%s ** NOT ** deleted.",
+ info[M_NAME]);
+ Put_message(temp_buf);
+ }
else {
- Put_message("Aborting...");
- FreeQueue(top);
- return(DM_NORMAL);
+ sprintf(temp_buf, "%s sucesfully Deleted.", info[M_NAME]);
+ Put_message(temp_buf);
}
}
- elem = elem->q_forw;
}
+ elem = elem->q_forw;
}
- if(Confirm("Are you sure that you want to delete this machine?")) {
- if ( (stat = sms_query("delete_machine", 1, &name, Scream, NULL)) != 0)
- com_err(program_name, stat, " in DeleteMachine.");
- }
- else
- Put_message("Operation aborted.");
-
+ FreeQueue(top);
return(DM_NORMAL);
}
char ** argv;
{
int stat;
-
- if ( (stat = sms_query("add_machine_to_cluster", 2, argv + 1,
- Scream, NULL) != 0))
- com_err(program_name, stat, " in AddMachineToCluster.");
-
+ char *machine, *cluster, temp_buf[BUFSIZ], *args[10];
+ Bool add_it, one_machine, one_cluster;
+ struct qelem * melem, *mtop, *celem, *ctop;
+
+ machine = CanonicalizeHostname(argv[1]);
+ cluster = argv[2];
+
+ celem = ctop = GetMCInfo(CLUSTER, cluster, (char *) NULL);
+ melem = mtop = GetMCInfo(MACHINE, machine, (char *) NULL);
+
+ one_machine = (QueueCount(mtop) == 1);
+ one_cluster = (QueueCount(ctop) == 1);
+
+ while (melem != NULL) {
+ char ** minfo = (char **) melem->q_data;
+ while (celem != NULL) {
+ char ** cinfo = (char **) celem->q_data;
+ if (one_machine && one_cluster)
+ add_it = TRUE;
+ else {
+ sprintf(temp_buf,"Add machine %s to cluster %s (y/n/q) ?",
+ minfo[M_NAME], cinfo[C_NAME]);
+ switch (YesNoQuitQuestion(temp_buf, FALSE)) {
+ case TRUE:
+ add_it = TRUE;
+ break;
+ case FALSE:
+ add_it = FALSE;
+ break;
+ default:
+ Put_message("Aborting...");
+ FreeQueue(ctop);
+ FreeQueue(mtop);
+ return(DM_NORMAL);
+ }
+ }
+ if (add_it) {
+ args[0] = minfo[M_NAME];
+ args[1] = cinfo[C_NAME];
+ stat = sms_query("add_machine_to_cluster", 2, args,
+ Scream, NULL);
+ switch (stat) {
+ case SMS_SUCCESS:
+ break;
+ case SMS_EXISTS:
+ sprintf(temp_buf, "%s is already in cluster %s",
+ minfo[M_NAME], cinfo[C_NAME]);
+ Put_message(temp_buf);
+ break;
+ default:
+ com_err(program_name, stat, " in AddMachineToCluster.");
+ break;
+ }
+ }
+ celem = celem->q_forw;
+ }
+ celem = ctop; /* reset cluster element. */
+ melem = melem->q_forw;
+ }
+ FreeQueue(ctop);
+ FreeQueue(mtop);
return(DM_NORMAL);
}
/* Function Name: RemoveMachineFromCluster
* Description: Removes this machine form a specific cluster.
* Arguments: argc, argv - Name of machine in argv[1].
+ * Name of cluster in argv[2].
* Returns: none.
*/
int argc;
char ** argv;
{
- int stat, ans;
- struct qelem *elem, *top;
- char ** info, buf[BUFSIZ];
-
- elem = top = GetMCInfo(CLUSTER, CanonicalizeHostname(argv[1]), "*");
-
- Put_message("This machine is the following clusters:");
- while (elem != NULL) {
- info = (char **) elem->q_data;
- Put_message(info[MAP_CLUSTER]);
- elem = elem->q_forw;
- }
- elem = top;
-
- if ( Confirm("Remove this machine from ** ALL ** these clusters?") ) {
- while (elem != NULL) { /* delete all */
- info = (char **) elem->q_data;
- if ( (stat =sms_query("delete_machine_from_cluster", 2,
- info, Scream, NULL)) != 0 )
- com_err(program_name, stat, " in delete_machine_from_cluster");
- elem = elem->q_forw;
- }
+ int stat;
+ Bool remove_machine, one_item;
+ struct qelem *top, *elem = NULL;
+ char buf[BUFSIZ], * args[10];
+
+ args[MAP_MACHINE] = CanonicalizeHostname(argv[1]);
+ args[MAP_CLUSTER] = argv[2];
+ args[MAP_END] = NULL;
+
+ stat = sms_query("get_machine_to_cluster_map", CountArgs(args), args,
+ StoreInfo, &elem);
+ if (stat == SMS_NO_MATCH) {
+ sprintf(buf, "The machine %s is not is the cluster %s.",
+ args[MAP_MACHINE], args[MAP_CLUSTER]);
+ Put_message(buf);
+ return(DM_NORMAL);
}
- else
- while (elem != NULL) { /* query delete. */
- info = (char **) elem->q_data;
- sprintf(buf, "Remove %13s from the cluster %30s? (y/n/q)",
+ if (stat)
+ com_err(program_name, stat, " in delete_machine_from_cluster");
+
+ top = elem = QueueTop(elem);
+ one_item = (QueueCount(top) == 1);
+ while (elem != NULL) {
+ char **info = (char **) elem->q_data;
+ if (one_item)
+ remove_machine = TRUE;
+ else {
+ sprintf(buf, "Remove %s from the cluster %s? (y/n/q)",
info[MAP_MACHINE], info[MAP_CLUSTER]);
- ans = YesNoQuitQuestion(buf, FALSE);
- if (ans == TRUE)
- if ( (stat =sms_query("delete_machine_from_cluster", 2,
- info, Scream, NULL)) != 0 )
- com_err(program_name, stat, " in delete_machine_from_cluster");
- else if (ans != FALSE) /* quit. or ^C */
+ switch (YesNoQuitQuestion(buf, FALSE)) {
+ case TRUE:
+ remove_machine = TRUE;
+ break;
+ case FALSE:
+ remove_machine = FALSE;
break;
- elem = elem->q_forw;
+ default:
+ Put_message("Aborting");
+ FreeQueue(top);
+ return(DM_NORMAL);
+ }
}
-
+ if (remove_machine)
+ if ( (stat = sms_query("delete_machine_from_cluster", 2,
+ info, Scream, NULL)) != 0 )
+ com_err(program_name, stat,
+ " in delete_machine_from_cluster");
+ else {
+ sprintf(buf, "%s has been removed from the cluster %s.",
+ info[MAP_MACHINE], info[MAP_CLUSTER]);
+ Put_message(buf);
+ }
+ elem = elem->q_forw;
+ }
FreeQueue(top);
return(DM_NORMAL);
}
char **info;
struct qelem *elem, *top;
- top = elem = GetMCInfo( MACHINE, CanonicalizeHostname(argv[1]),
+ top = elem = GetMCInfo( CLUSTER, CanonicalizeHostname(argv[1]),
(char *) NULL);
while (elem != NULL) {
info = (char **) elem->q_data;
return(DM_NORMAL);
}
- info[0] = name;
- args = AskMCDInfo(info, CLUSTER, FALSE);
+ args = AskMCDInfo(SetClusterDefaults(info, name), CLUSTER, FALSE);
/*
* Actually create the new Cluster.
char ** argv;
{
struct qelem *elem, *top;
- char **args, **info;
+ char **args, **info, temp_buf[BUFSIZ];
int stat;
+ Bool one_cluster, update_it;
elem = top = GetMCInfo( CLUSTER, argv[1], (char *) NULL );
+ one_cluster = (QueueCount(top) == 1);
while (elem != NULL) {
info = (char **) elem->q_data;
- args = AskMCDInfo(info, CLUSTER, TRUE);
- if ( (stat = sms_query("update_cluter", CountArgs(args),
- args, Scream, NULL)) != 0)
- com_err(program_name, stat, " in UpdateCluster.");
+ if (one_cluster)
+ update_it = TRUE;
+ else {
+ sprintf(temp_buf, "Update Cluster %s (y/n/q) ? ", info[C_NAME]);
+ switch(YesNoQuitQuestion(temp_buf, FALSE)) {
+ case TRUE:
+ update_it = TRUE;
+ break;
+ case FALSE:
+ update_it = FALSE;
+ break;
+ default:
+ Put_message("Aborting...");
+ FreeQueue(top);
+ return(DM_NORMAL);
+ }
+ }
+ if (update_it) {
+ args = AskMCDInfo(info, CLUSTER, TRUE);
+ if ( (stat = sms_query("update_cluster", CountArgs(args),
+ args, Scream, NULL)) != 0)
+ com_err(program_name, stat, " in UpdateCluster.");
+ }
elem = elem->q_forw;
}
-
FreeQueue(top);
return(DM_NORMAL);
}
+/* Function Name: CheckAndRemoveMachine
+ * Description: This function checks and removes all machines from a
+ * cluster.
+ * Arguments: name - name of the cluster.
+ * ask_first - if TRUE, then we will query the user, before
+ * deletion.
+ * Returns: SUB_ERROR if all machines not removed.
+ */
+
+int
+CheckAndRemoveMachines(name, ask_first)
+char * name;
+Bool ask_first;
+{
+ register int stat, ret_value;
+ Bool delete_it;
+ char *args[10], temp_buf[BUFSIZ], *ptr;
+ struct qelem *top, *elem = NULL;
+
+ ret_value = SUB_NORMAL;
+ args[MAP_MACHINE] = "*";
+ args[MAP_CLUSTER] = name;
+ stat = sms_query("get_machine_to_cluster_map", 2, args,
+ StoreInfo, &elem);
+ if (stat && stat != SMS_NO_MATCH) {
+ com_err(program_name, stat, " in get_machine_to_cluster_map.");
+ return(DM_NORMAL);
+ }
+ if (stat == 0) {
+ elem = top = QueueTop(elem);
+ if (ask_first) {
+ sprintf(temp_buf,
+ "The cluster %s has the following machines in it:",
+ name);
+ Put_message(temp_buf);
+ while (elem != NULL) {
+ char **info = (char **) elem->q_data;
+ Print(1, &info[MAP_MACHINE], (char *) NULL);
+ elem = elem->q_forw;
+ }
+ ptr = "Remove ** ALL ** these machines from this cluster?";
+
+ if (YesNoQuestion(ptr, FALSE) == TRUE) /* may return -1. */
+ delete_it = TRUE;
+ else {
+ Put_message("Aborting...");
+ FreeQueue(top);
+ return(SUB_ERROR);
+ }
+ }
+ else
+ delete_it = TRUE;
+
+ if (delete_it) {
+ elem = top;
+ while (elem != 0) {
+ char **info = (char **) elem->q_data;
+ if ( (stat = sms_query( "delete_machine_from_cluster",
+ 2, info, Scream, NULL)) != 0) {
+ ret_value = SUB_ERROR;
+ com_err(program_name, stat,
+ " in delete_machine_from_cluster.");
+ sprintf(temp_buf,
+ "Machine %s ** NOT ** removed from cluster %s.",
+ info[MAP_MACHINE], info[MAP_CLUSTER]);
+ Put_message(temp_buf);
+ }
+ elem = elem->q_forw;
+ }
+ }
+ }
+ return(ret_value);
+}
+
+
/* Function Name: DeleteCluster
* Description: This function removes a cluster from the database.
* Arguments: argc, argv - the name of the cluster is stored in argv[1].
int argc;
char ** argv;
{
- char * args[3], temp_buf[BUFSIZ];
+ char temp_buf[BUFSIZ];
int stat;
+ Bool one_cluster, delete_it = FALSE;
+ struct qelem *elem, *top;
-/* Should probabally check for wildcards, none allowed. */
-
- args[MAP_MACHINE] = "*";
- args[MAP_CLUSTER] = argv[1];
+ top = elem = GetMCInfo( CLUSTER, argv[1], (char *) NULL );
- stat = sms_query("get_machine_to_cluster_map", 2, args,
- NullFunc, (char *) NULL);
- if (stat & stat != SMS_NO_MATCH) {
- com_err(program_name, stat, " in DeleteCluster.");
- return(DM_NORMAL);
- }
- if (stat != SMS_NO_MATCH) {
- sprintf(temp_buf, "Cluster %s still has machines in it.",argv[1]);
- Put_message(temp_buf);
- if ( YesNoQuestion("Would you like a list? (y/n)", TRUE) == TRUE ) {
- args[0] = "foo"; /* not used. */
- args[1] = "*";
- args[2] = argv[1];
- MachineToClusterMap(3, args);
+ one_cluster = (QueueCount(top) == 1);
+ while (elem != NULL) {
+ char **info = (char **) elem->q_data;
+ if (one_cluster) {
+ if(Confirm("Are you sure that you want to delete this cluster?"))
+ delete_it = TRUE;
}
- return(DM_NORMAL);
- }
- if(Confirm("Are you sure that you want to delete this cluster? ")) {
- if ( (stat = sms_query("delete_cluster",
- 1, &args[MAP_CLUSTER], Scream, NULL)) != 0)
- com_err(program_name, stat, " in DeleteCluster.");
+ else {
+ PrintClusterInfo(info);
+ sprintf(temp_buf, "Delete the cluster %s (y/n/q)? ", info[C_NAME]);
+ switch (YesNoQuitQuestion(temp_buf, FALSE)) {
+ case TRUE:
+ delete_it = TRUE;
+ break;
+ case FALSE:
+ delete_it = FALSE;
+ sprintf(temp_buf, "%s not Deleted.", info[C_NAME]);
+ Put_message(temp_buf);
+ break;
+ default: /* quit. */
+ Put_message("Aborting...");
+ FreeQueue(top);
+ return(DM_NORMAL);
+ }
+ }
+ if (delete_it) {
+ if (CheckAndRemoveMachines(info[C_NAME], TRUE) != SUB_ERROR) {
+ if ( (stat = sms_query("delete_cluster", 1,
+ &info[C_NAME], Scream, NULL)) != 0) {
+ com_err(program_name, stat, " in DeleteCluster.");
+ sprintf(temp_buf, "Cluster %s ** NOT ** deleted.",
+ info[C_NAME]);
+ Put_message(temp_buf);
+ }
+ else {
+ sprintf(temp_buf, "cluster %s sucesfully Deleted.",
+ info[C_NAME]);
+ Put_message(temp_buf);
+ }
+ }
+ }
+ elem = elem->q_forw;
}
- else
- Put_message("Operation aborted.");
-
+ FreeQueue(top);
return(DM_NORMAL);
}
-
+
/* ----------- Cluster Data Menu -------------- */
/* Function Name: ShowClusterData
* Returns: DM_NORMAL.
*/
+/* ARGSUSED */
int
ShowClusterData(argc, argv)
int argc;
int argc;
char ** argv;
{
+ Bool one_piece_of_data, remove_it;
int stat;
+ struct qelem *elem, *top;
- if(Confirm("Do you really want to delete this data?")) {
- if( (stat = sms_query("delete_cluster_data", 3, argv + 1,
- Scream, (char *) NULL)) != 0)
- com_err(program_name, stat, " in DeleteClusterData.");
- } else
- Put_message("Operation aborted.\n");
+ top = elem = GetMCInfo(DATA, argv[1], argv[2]);
+ one_piece_of_data = (QueueCount(elem) == 1);
+ while (elem != NULL) {
+ char **info = (char **) elem->q_data;
+ if (one_piece_of_data) {
+ if(Confirm("Do you really want to remove this data?"))
+ remove_it = TRUE;
+ else
+ Put_message("Operation aborted.\n");
+ }
+ else {
+ PrintClusterData(info);
+ switch (YesNoQuitQuestion
+ ("Remove this piece of cluster data (y/n/q) ? ", FALSE)) {
+ case TRUE:
+ remove_it = TRUE;
+ break;
+ case FALSE:
+ remove_it = FALSE;
+ break;
+ default:
+ Put_message("Aborting");
+ FreeQueue(top);
+ return(DM_NORMAL);
+ }
+ }
+ if (remove_it) {
+ if( (stat = sms_query("delete_cluster_data", 3, info,
+ Scream, (char *) NULL)) != 0) {
+ com_err(program_name, stat, " in DeleteClusterData.");
+ Put_message("Data not removed.");
+ }
+ else
+ Put_message("Removal sucessful.");
+ }
+ elem = elem->q_forw;
+ }
+ FreeQueue(top);
return(DM_NORMAL);
}
top = elem = GetMCInfo(MAP, CanonicalizeHostname(argv[1]), argv[2]);
+ Put_message(""); /* blank line on screen */
while (elem != NULL) {
char ** info = (char **) elem->q_data;
PrintMCMap(info);
/* ARGSUSED */
int
-MachinesInCluster(argv,argc)
+MachinesInCluster(argc, argv)
int argc;
char **argv;
{
#include "globals.h"
#include "infodefs.h"
-static int RealDeleteList(), RealDeleteUser();
+static int RealDeleteUser();
/* Function Name: CheckListForDeletion
* Description: Check one of the lists in which we just removed a member.
com_err(program_name, status, " in CheckIfAcl (get_acl_use).");
return(SUB_ERROR);
}
+ local = elem = QueueTop(elem);
if (verbose) {
sprintf(buf, "%s %s %s %s", type, name,
"is the Access Control List (ACL) for the following data",
"objects:\n");
Put_message(buf);
- local = elem;
while (local != NULL) {
char ** info = (char **) local->q_data;
- Print( QueueCount(elem), info, NULL);
+ Print( CountArgs(info), info, NULL);
local = local->q_forw;
}
Put_message("The ACL for each of these items must be changed before");
int verbose;
{
struct qelem *local;
- char *args[2], temp_buf[BUFSIZ];
+ char *args[10], temp_buf[BUFSIZ];
int status, ans;
args[0] = type;
* Get all list of which this list is a member, and store them in a queue.
*/
- status = sms_query("get_list_of_member", 2, args, StoreInfo,
+ status = sms_query("get_lists_of_member", 2, args, StoreInfo,
(char *) elem);
if (status == SMS_NO_MATCH)
/*
* If verbose mode, then ask the user if we should delete.
*/
-
+ local = elem = QueueTop(elem);
if (verbose) {
sprintf(buf, "List %s has %d member(s):", name, QueueCount(elem) );
Put_message(buf);
- local = elem;
while (local != NULL) {
char ** info = (char **) local->q_data;
Print( CountArgs(info), info, NULL);
com_err(program_name, status, " in delete_filesystem.");
return(SUB_ERROR);
}
+ local = elem = QueueTop(elem);
if (verbose) {
sprintf(buf, "User %s has quotas on the following filsystems:");
Put_message(buf);
- local = elem;
while (local != NULL) {
char ** info = (char **) local->q_data;
sprintf(buf, "Filesystem:\t%s\t\tQuota(in Kb):\t%s",
return(SUB_NORMAL);
}
-/* Function Name: DeleteList
- * Description: deletes a list
- * Arguments: argc, argv - standard SMS argc and argv.
- * Returns: DM Status Code.
+/* Function Name: RealDeleteList
+ * Description: Just Deletes the list.
+ * Arguments: name - name of list to delete
+ * Returns: SUB_ERROR if the deletion failed.
*/
-int
-DeleteList(argc, argv)
-int argc;
-char *argv[];
+static int
+RealDeleteList(name)
+char * name;
{
- char *list, **info;
- struct qelem *local, *member_of, *list_info;
+ char buf[BUFSIZ];
int status;
- member_of = list_info = NULL;
-
- list = argv[1];
- if (!Confirm("Are you sure that you want to delete this list?"))
- return(DM_NORMAL);
-/*
- * Get Information about a list.
- */
- if ( (status = sms_query("get_list_info", 1, &list, StoreInfo,
- (char *) &list_info)) != 0) {
- com_err(program_name, status, " in DeleteList (delete_list).");
- return(DM_NORMAL);
+ if ( (status = sms_query("delete_list", 1, &name, Scream,
+ (char *) NULL)) != SMS_SUCCESS) {
+ com_err(program_name, status, ": list not deleted");
+ return(SUB_ERROR);
}
+ (void) sprintf(buf, "List %s deleted./n", name);
+ Put_message(buf);
+ return(SUB_NORMAL);
+}
-/*
- * Attempt delete. - will only work if:
- * 1) This list has no members.
- * 2) This list in a member of no other lists.
- * 3) This list is not an acl of another object.
+/* Function Name: AttemptToDeleteList
+ * Description: Atempts to delete list, in the following manner:
+ * 1) try to delet it, if this fails in a known error then
+ * a) try to clean up each of those known methods, or
+ * at least explain why we failed.
+ * Arguments: list - name of list.
+ * ask_first - (T/F) query user before preparing for deletion,
+ * and cleaning up?
+ * Returns: none - all is taken care of and error messages printed
+ * one way or the other.
*/
- status = sms_query("delete_list", 1, &list, Scream, (char *) NULL);
- if (status != SMS_IN_USE && status != 0) {
- com_err(program_name, status, " in DeleteList (delete_list).");
- return(DM_NORMAL);
- }
- if (status == 0) {
+void
+AttemptToDeleteList(name, ask_first)
+char * name;
+Bool ask_first;
+{
+ int status;
+ struct qelem *local, *member_of, *list_info;
+ char ** info;
+ member_of = list_info = NULL;
+
+ /*
+ * Attempt delete. - will only work if:
+ * 1) This list has no members.
+ * 2) This list in a member of no other lists.
+ * 3) This list is not an acl of another object.
+ */
+
+ switch (status = sms_query("delete_list", 1, &name,
+ Scream, (char *) NULL)) {
+ case SMS_SUCCESS:
Put_message("List Sucessfully Deleted.");
- }
- else { /* status = SMS_IN_USE. */
-
-/*
- * This list is in use. Try to find out why, and for the cases where we
- * have a good idea of what to do we will query and then do it.
- */
-
- if ( (CheckIfAcl(list, "list", TRUE) == SUB_ERROR) ||
- (RemoveItemFromLists(list, "list",
- &member_of, TRUE) == SUB_ERROR) ||
- (RemoveMembersOfList(list, TRUE) == SUB_ERROR) ||
- (RealDeleteList(list) == SUB_ERROR) ) {
+ break;
+ case SMS_IN_USE:
+ /*
+ * This list is in use. Try to find out why,
+ * and for the cases where we have a good idea of
+ * what to do we will query and then do it.
+ */
+
+ if ( (CheckIfAcl(name, "list", ask_first) == SUB_NORMAL) &&
+ (RemoveItemFromLists(name, "list",
+ &member_of, ask_first) == SUB_NORMAL) &&
+ (RemoveMembersOfList(name, ask_first) == SUB_NORMAL) &&
+ (RealDeleteList(name) == SUB_NORMAL) )
+ { /* if... */
+ info = (char **) list_info->q_data;
+ CheckAcl(info[L_ACL_TYPE], info[L_ACL_NAME], ask_first);
- FreeQueue(list_info);
- FreeQueue(member_of);
- return(DM_NORMAL);
+ local = member_of;
+ while (local != NULL) {
+ info = (char **) local->q_data;
+ CheckListForDeletion(info[LM_LIST], ask_first);
+ local = local->q_forw;
+ }
}
+ FreeQueue(list_info);
+ FreeQueue(member_of); /* bug here somwhere... */
+ break;
+ default:
+ com_err(program_name, status, " in DeleteList (delete_list).");
+ break;
}
-
- info = (char **) list_info->q_data;
- CheckAcl(info[L_ACL_TYPE], info[L_ACL_NAME], TRUE);
-
- local = member_of;
- while (local != NULL) {
- info = (char **) local->q_data;
- CheckListForDeletion(info[LM_LIST], TRUE);
- local = local->q_forw;
- }
-
- FreeQueue(list_info);
- FreeQueue(member_of);
- return(DM_NORMAL);
}
-/* Function Name: RealDeleteList
- * Description: Just Deletes the list.
- * Arguments: name - name of list to delete
- * Returns: SUB_ERROR if the deletion failed.
+/* Function Name: DeleteList
+ * Description: deletes a list
+ * Arguments: argc, argv - standard SMS argc and argv.
+ * Returns: DM Status Code.
*/
-static int
-RealDeleteList(name)
-char * name;
+/* ARGSUSED */
+int
+DeleteList(argc, argv)
+int argc;
+char *argv[];
{
char buf[BUFSIZ];
- int status;
+ struct qelem *top, *list;
+ register int status;
+ Bool one_list;
- if ( (status = sms_query("delete_list", 1, &name, Scream,
- (char *) NULL)) == NULL) {
- com_err(program_name, status, ": list not deleted");
- return(SUB_ERROR);
+ list = NULL;
+
+ switch(status = sms_query("get_list_info", 1, argv + 1, StoreInfo, &list)){
+ case SMS_SUCCESS:
+ break;
+/* case SMS_NO_WILDCARD:
+ Put_message("Wildcards are not accepted here.");
+ return(DM_NORMAL);
+*/ case SMS_NO_MATCH:
+ case SMS_LIST:
+ Put_message("There is not list that matches that name.");
+ return(DM_NORMAL);
+ default:
+ com_err(program_name, status, " in DeleteList (get_list_info).");
+ return(DM_NORMAL);
}
- (void) sprintf(buf, "List %s deleted./n", name);
- Put_message(buf);
- return(SUB_NORMAL);
+
+ top = list = QueueTop(list);
+ one_list = (QueueCount(list) == 1);
+ while (list != NULL) {
+ char ** info = (char**) list->q_data;
+ if (one_list) {
+ if (Confirm("Are you sure that you want to delete this list?"))
+ AttemptToDeleteList(info[L_NAME], TRUE);
+ }
+ else {
+ sprintf(buf, "Delete the list %s", info[L_NAME]);
+ switch( YesNoQuestion( buf, FALSE ) ) {
+ case TRUE:
+ AttemptToDeleteList(info[L_NAME], TRUE);
+ break;
+ case FALSE:
+ break;
+ default:
+ Put_message ("Aborting...");
+ FreeQueue(top);
+ return(DM_NORMAL);
+ }
+ }
+ list = list->q_forw;
+ }
+ FreeQueue(top);
+ return(DM_NORMAL);
}
/* Function Name: DeleteUser
* Returns: DM_NORMAL.
*/
+/* ARGSUSED */
int
DeleteUser(argc, argv)
int argc;
char ** argv;
{
+
+/* Make this handle wildcards. */
+
int status;
char buf[BUFSIZ];
char * name = argv[1]; /* name of the user we are deleting. */
#define GLOM 2
#define ACL_USE 3
+#define YES ("1")
+#define NO ("0")
+
+#define DEFAULT_ACTIVE DEFAULT_YES
+#define DEFAULT_PUBLIC DEFAULT_YES
+#define DEFAULT_HIDDEN DEFAULT_NO
+#define DEFAULT_MAILLIST DEFAULT_YES
+#define DEFAULT_GROUP DEFAULT_NO
+#define DEFAULT_GID UNIQUE_GID
+#define DEFAULT_ACL_TYPE "user"
+#define DEFAULT_ACL_NAME (user)
+#define DEFAULT_DESCRIPTION DEFAULT_COMMENT
+
/* globals only for this file. */
-static char * current_list;
+static char current_list[BUFSIZ];
/* Function Name: PrintListInfo
* Description: This function Prints out the List info in a coherent form.
{
char buf[BUFSIZ];
- (void) sprintf(buf, "List: %s",info[L_NAME]);
+ (void) sprintf(buf, "\n%20sList: %s", "", info[L_NAME]);
(void) Put_message(buf);
- (void) sprintf(buf, "\nDescription: %s", info[L_DESC]);
+ (void) sprintf(buf, "Description: %s", info[L_DESC]);
(void) Put_message(buf);
if ( atoi(info[L_MAILLIST]))
Put_message("This list is a mailing list.");
}
(void) sprintf(buf, "This list is: %s, %s, and %s",
- info[L_ACTIVE] ? "active" : "inactive",
- info[L_PUBLIC] ? "public" : "private",
- info[L_HIDDEN] ? "hidden" : "visible");
+ atoi(info[L_ACTIVE]) ? "active" : "inactive",
+ atoi(info[L_PUBLIC]) ? "public" : "private",
+ atoi(info[L_HIDDEN]) ? "hidden" : "visible");
(void) Put_message(buf);
(void) sprintf(buf, "Last modification at %s, by %s using the program %s",
info[L_MODTIME], info[L_MODBY], info[L_MODWITH]);
args[0] = name1;
if ( (status = sms_query("get_list_info", 1, args,
StoreInfo, (char *) &elem)) != 0) {
- com_err(program_name, status, " in get_nfs_quotas_by_user");
+ com_err(program_name, status, " in get_list_info");
return (NULL);
}
break;
args[0] = name1;
if ( (status = sms_query("get_members_of_list", 1, args,
StoreInfo, (char *) &elem)) != 0) {
- com_err(program_name, status, " in get_nfs_quotas_by_user");
+ com_err(program_name, status, " in get_members_of_list");
return (NULL);
}
break;
args[1] = name2;
if ( (status = sms_query("get_list_of_member", 2, args,
StoreInfo, (char *) &elem)) != 0) {
- com_err(program_name, status, " in get_nfs_quotas_by_user");
+ com_err(program_name, status, " in get_list_of_members");
return (NULL);
}
break;
args[1] = name2;
if ( (status = sms_query("get_acl_use", 2, args,
StoreInfo, (char *) &elem)) != 0) {
- com_err(program_name, status, " in get_nfs_quotas_by_user");
+ com_err(program_name, status, " in get_acl_use");
return (NULL);
}
break;
{
char temp_buf[BUFSIZ], *newname;
- sprintf(temp_buf,"\nChanging Attributes of list %s.\n",info[L_NAME]);
+ sprintf(temp_buf,"\nSetting information of list %s.\n",info[L_NAME]);
Put_message(temp_buf);
if (name) {
GetValueFromUser("Is this list hidden (1/0): ", &info[L_HIDDEN]);
GetValueFromUser("Is this a maillist (1/0): ", &info[L_MAILLIST]);
GetValueFromUser("is this a group (1/0): ", &info[L_GROUP]);
- if (atoi(info[L_GROUP])) {
- sprintf(temp_buf, "What is the Gid for this group, %s",
- "'#' gets unique gid:");
- GetValueFromUser(temp_buf, &info[L_GID]);
- }
+ if (atoi(info[L_GROUP]))
+ GetValueFromUser("What is the GID for this group.", &info[L_GID]);
+
GetValueFromUser("What Type of Administrator (none, user, list): ",
&info[L_ACL_TYPE]);
if ( (strcmp(info[L_ACL_TYPE], "USER") == 0) ||
* Returns: DM status code.
*/
+/* ARGSUSED */
int
ShowListInfo(argc, argv)
int argc;
}
/* Function Name: UpdateList
- * Description:
+ * Description: updates the information on a list.
* Arguments: argc, argv - name of list in argv[1].
* Returns: DM Status code.
*/
+/* ARGSUSED */
int
UpdateList(argc, argv)
int argc;
char **argv;
{
- char **info, **up_args;
+ char buf[BUFSIZ];
struct qelem *top, *list;
int status;
+ Bool one_list, update_it;
list = top = GetListInfo(LIST, argv[1], (char *) NULL);
+ one_list = (QueueCount(top) == 1);
while (list != NULL) {
- info = (char **) list->q_data;
- up_args = AskListInfo(info, TRUE);
- if ( (status = sms_query("update_list", CountArgs(up_args), up_args,
- Scream, (char *) NULL)) != 0) {
- com_err(program_name, status, " in UpdateList.");
- Put_message("List Not Updated.");
- list = list->q_forw;
+ char **up_args, **info = (char **) list->q_data;
+ if (one_list)
+ update_it = TRUE;
+ else {
+ sprintf(buf, "Update the list %s (y/n/q) ? ",info[L_NAME]);
+ switch (YesNoQuitQuestion(buf, FALSE)) {
+ case TRUE:
+ update_it = TRUE;
+ break;
+ case FALSE:
+ update_it = FALSE;
+ break;
+ default:
+ Put_message("Aborting...");
+ FreeQueue(top);
+ return(DM_NORMAL);
+ }
+ }
+ if (update_it) {
+ up_args = AskListInfo(info, TRUE);
+ if ( (status = sms_query("update_list", CountArgs(up_args),
+ up_args, Scream, (char *) NULL)) != 0) {
+ com_err(program_name, status, " in UpdateList.");
+ Put_message("List Not Updated.");
+ }
}
+ list = list->q_forw;
}
-
FreeQueue(top);
return(DM_NORMAL);
}
+/* Function Name: SetDefaults
+ * Description: sets defaults for AddList function
+ * Arguments: info - the array to add them to.
+ * name - name of the program to add.
+ * Returns: defaults - the default information.
+ */
+
+static char **
+SetDefaults(info, name)
+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_ACL_TYPE] = Strsave(DEFAULT_ACL_TYPE);
+ info[L_ACL_NAME] = Strsave(DEFAULT_ACL_NAME);
+ info[L_DESC] = Strsave(DEFAULT_DESCRIPTION);
+ info[L_MODTIME] = info[L_MODBY] = info[L_MODWITH] = info[L_END] = NULL;
+ return(info);
+}
+
/* Function Name: AddList
* Description:
* Arguments: argc, argv - name of list in argv[1].
* Returns: DM Status code.
*/
+/* ARGSUSED */
int
AddList(argc, argv)
int argc;
return(DM_QUIT);
}
- add_args = AskListInfo(info, FALSE);
+ add_args = AskListInfo(SetDefaults(info,argv[1]), FALSE);
if ( (status = sms_query("add_list", CountArgs(add_args), add_args,
Scream, (char *) NULL)) != 0) {
register int status;
found_some = FALSE;
- if ( (status = sms_query("get_members_of_list", 1, ¤t_list,
- PrintByType, type)) != 0)
+ if ( (status = sms_query("get_members_of_list", 1, current_list,
+ PrintByType, type)) != 0)
com_err(program_name, status, " in ListMembersByType\n");
if (!found_some) {
if (type == NULL)
ret_argv[LM_LIST] = Strsave(current_list);
ret_argv[LM_MEMBER] = "nobody";
+ ret_argv[LM_TYPE]= "user";
- PromptWithDefault("Type of member (USER, LIST, or STRING)",
- ret_buf, BUFSIZ, "USER");
- ret_argv[LM_TYPE]= Strsave(ret_buf);
-
- status = sms_access("add_member_to_list", 3, ret_argv);
- if (status == SMS_TYPE) {
- Put_message("\"type\" must be one of 'STRING', 'LIST', or 'USER'.");
+ switch (status = sms_access("add_member_to_list", 3, ret_argv)) {
+ case SMS_SUCCESS:
+ break;
+ case SMS_PERM:
+ Put_message("You are not allowed to add members to this list.");
return(SUB_ERROR);
- } else if (status) {
+ default:
com_err(program_name, status, NULL);
+ return(SUB_ERROR);
}
+ PromptWithDefault("Type of member (USER, LIST, or STRING)",
+ ret_buf, BUFSIZ, "USER");
+ ret_argv[LM_TYPE]= Strsave(ret_buf);
sprintf(temp_buf,"Name of member to %s", action);
PromptWithDefault(temp_buf, ret_buf, BUFSIZ, user);
#include "allmaint_funcs.h"
#include "globals.h"
-extern Menu allmaint_top_menu;
+char * whoami; /* used by menu.c ugh!!! */
+
+extern Menu sms_top_menu;
+
static void ErrorExit(), Usage(), SignalHandler();
char *getlogin();
uid_t getuid();
Usage();
break;
}
-
+
+ program_name = Strsave(program_name);
+ whoami = Strsave(program_name); /* used by menu.c, ugh !!! */
+
if ( status = sms_connect() )
ErrorExit("\nConnection to SMS server failed", status);
* These signals should not be set until just before we fire up the menu
* system.
*/
+
+#ifndef DEBUG
(void) signal(SIGHUP, SignalHandler);
- (void) signal(SIGINT, SignalHandler);
+ (void) signal(SIGINT, SignalHandler);
(void) signal(SIGQUIT, SignalHandler);
+#endif DEBUG
if (use_menu) { /* Start menus that execute program */
Start_paging();
- Start_menu(&allmaint_top_menu);
+ Start_menu(&sms_top_menu);
Stop_paging();
}
else /* Start program without menus. */
- Start_no_menu(&allmaint_top_menu);
+ Start_no_menu(&sms_top_menu);
sms_disconnect();
exit(0);
* Returns: doesn't
*/
-void
+static void
SignalHandler()
{
Put_message("Signal caught - exiting");
NULLFUNC,
NULLFUNC,
"Attach/Filesystem Maintenance",
- 7,
+ 6,
{
SUBMENU("filesystem", "Filesystem Work", &attachmaint_filemenu),
{ GetFSAlias, NULLMENU, 2, {
- {"check", "Check An Association."},
- {"name", "name (user/group/course): "}
+ {"check", "Check An Association"},
+ {"name", "alias name : "}
} },
{ CreateFSAlias, NULLMENU, 2, {
- {"alais", "Associate with a Filesystem."},
- {"name", "name (user/course/project): "},
+ {"alias", "Associate with a Filesystem"},
+ {"name", "alias name : "},
} },
{ DeleteFSAlias, NULLMENU, 2, {
- {"unalias", "Disassociate from a Filesystem."},
- {"name", "name (user/course/project): "},
+ {"unalias", "Disassociate from a Filesystem"},
+ {"name", "alias name : "},
} },
- SIMPLEFUNC("verbose", "Toggle Verbosity of Delete.", ToggleVerboseMode),
- SIMPLEFUNC("help", "Help ...", AttachHelp)
+ SIMPLEFUNC("verbose", "Toggle Verbosity of Delete", ToggleVerboseMode),
+ SIMPLEFUNC("help", "Help ..", AttachHelp)
}
};
NULLFUNC,
NULLFUNC,
"Machine Maintenence",
- 6,
+ 7,
{
{ ShowMachineInfo, NULLMENU, 2, {
- {"Show","Get machine information."},
+ {"show","Get machine information"},
{"name","Machine's Name: "}
} },
{ AddMachine, NULLMENU, 2, {
- {"Add","Add a new machine."},
+ {"add","Add a new machine"},
{"name","Machine's Name: "},
} },
{ UpdateMachine, NULLMENU, 2, {
- {"Update","Update machine information."},
+ {"update","Update machine information"},
{"name","Machine's Name: "},
} },
{ DeleteMachine, NULLMENU, 2, {
- {"Delete","Delete this machine."},
+ {"delete","Delete this machine"},
{"name","Machine's Name: "}
} },
{ MachineToClusterMap, NULLMENU, 3, {
- {"Map", "Show Machine to cluster mapping."},
- {"name", "Machine's Name:"},
- {"cluster", "Cluster's Name:"},
+ {"map", "Show Machine to cluster mapping"},
+ {"name", "Machine's Name: "},
+ {"cluster", "Cluster's Name: "},
} },
{ AddMachineToCluster, NULLMENU, 3, {
- {"AddCluster","Add this machine to a cluster."},
+ {"addcluster","Add machines to a clusters"},
{"name","Machine's Name: "},
- {"cluster", "Cluster's Name:"},
+ {"cluster", "Cluster's Name: "},
} },
- { RemoveMachineFromCluster, NULLMENU, 2, {
- {"RemoveCluster", "Remove this machine from a cluster."},
+ { RemoveMachineFromCluster, NULLMENU, 3, {
+ {"remcluster", "Remove machines from clusters"},
{"name","Machine's Name: "},
+ {"cluster", "Cluster's Name: "},
} },
}
};
NULLFUNC,
NULLFUNC,
"Cluster Information",
- 5,
+ 7,
{
{ ShowClusterInfo, NULLMENU, 2, {
- {"Show", "Get cluster information."},
+ {"show", "Get cluster information"},
{"name", "Cluster's Name: "}
} },
{ MachinesInCluster, NULLMENU, 2, {
- {"Machines", "List all machines in a cluster."},
+ {"machines", "List all machines in a cluster"},
{"clus", "Cluster's Name: "}
} },
{ AddCluster, NULLMENU, 2, {
- {"add", "Add a new cluster."},
+ {"add", "Add a new cluster"},
{"name","Cluster's Name: "},
} },
{ UpdateCluster, NULLMENU, 2, {
- {"update", "Update cluster information."},
+ {"update", "Update cluster information"},
{"name","Cluster's Name: "},
} },
{ DeleteCluster, NULLMENU, 2, {
- {"delete", "Delete this cluster."},
+ {"delete", "Delete this cluster"},
{"name", "Cluster's Name: "}
} },
+ { AddMachineToCluster, NULLMENU, 3, {
+ {"addcluster","Add machines to a clusters"},
+ {"name","Machine's Name: "},
+ {"cluster", "Cluster's Name: "},
+ } },
+ { RemoveMachineFromCluster, NULLMENU, 3, {
+ {"remcluster", "Remove machines from clusters"},
+ {"name","Machine's Name: "},
+ {"cluster", "Cluster's Name: "},
+ } },
}
};
-Menu clustermaint_data_menu= {
+Menu clustermaint_data_menu = {
NULLFUNC,
NULLFUNC,
"Cluster Data Maintenence",
3,
{
{ ShowClusterData, NULLMENU, 3, {
- {"show_one", "Show Data on a given Cluster"},
+ {"show", "Show Data on a given Cluster"},
{"clus", "Cluster's Name: "},
- {"label", "Label Identifing the data"},
+ {"label", "Label Identifing the data: "},
} },
{ AddClusterData, NULLMENU, 4, {
{"add", "Add Data to a given Cluster"},
{"clus", "Cluster Name: "},
- {"label", "Label Identifing the data"},
- {"data", "The data to be added"},
+ {"label", "Label Identifing the data: "},
+ {"data", "The data to be added: "},
} },
{ RemoveClusterData, NULLMENU, 4, {
{"delete", "Remove Data to a given Cluster"},
{"clus", "Cluster's Name: "},
- {"label", "Label Identifing the data"},
- {"data", "The data to be removed"},
+ {"label", "Label Identifing the data: "},
+ {"data", "The data to be removed: "},
} }
}
};
{
SUBMENU("machine", "Work on Machines", &clustermaint_machine_menu),
SUBMENU("cluster", "Work on Clusters", &clustermaint_cluster_menu),
- SUBMENU("service", "Service Clusters", &clustermaint_data_menu),
+ SUBMENU("data", "Work with cluster data", &clustermaint_data_menu),
{MachineToClusterMap, NULLMENU, 3, {
{"map", "Machine to Cluster Mapping"},
{"machine", "Machine Name: "},
"List Maintenance Menu",
8,
{
- { NULLFUNC, &listmaint_member_menu, 2, {
- {"add", "Create new List"},
- {"list name", "Name of list: "}
- } },
- { DeleteList, NULLMENU, 2, {
- {"delete", "Delete a List"},
- {"list name", "Name of list: "}
- } },
{ ShowListInfo, NULLMENU, 2, {
{"show", "Display information about a list"},
{"list name", "Name of list: "}
} },
+ { NULLFUNC, &listmaint_member_menu, 2, {
+ {"add", "Create new List"},
+ {"list name", "Name of list (do not use wildcards): "}
+ } },
{ UpdateList, NULLMENU, 2, {
{"update", "Update characteristics of a list"},
{"list name", "Name of list: "}
} },
+ { DeleteList, NULLMENU, 2, {
+ {"delete", "Delete a List"},
+ {"list name", "Name of list: "}
+ } },
{ NULLFUNC, &listmaint_member_menu, 2, {
{"members", "Change/Display the membership of a list"},
- {"list name", "Name of list: "}
+ {"list name", "Name of list (do not use wildcards): "}
} },
SIMPLEFUNC("query_remove",
"Interactively remove an item from all lists",
InterRemoveItemFromLists),
SUBMENU("list_lists", "Display inventory of lists",
&listmaint_list_menu),
+ SIMPLEFUNC("verbose", "Toggle Verbosity of Delete",
+ ToggleVerboseMode),
SIMPLEFUNC("help", "How to use this program", ListHelp)
}
};
5,
{
{ ShowNFSService, NULLMENU, 3, {
- { "show", "Show an NFS server " },
+ { "show", "Show an NFS server" },
{ "machine", "Machine Name: "},
{ "device", "Directory: "}
} },
{"login name", "Desired login name: "}
} },
{ShowUserByName, NULLMENU, 3, {
- {"full", "Show user information by name."},
+ {"full", "Show user information by name"},
{"first", "First name: "},
{"last", "Last name: "}
} },
{ShowUserByClass, NULLMENU, 2, {
- {"login", "Show names of users in a given class."},
+ {"login", "Show names of users in a given class"},
{"login name", "Desired class: "}
} },
{ModifyUser, NULLMENU, 2, {
};
/*
- * Allmaint top menu
+ * Sms top menu
*/
-Menu allmaint_top_menu = {
+Menu sms_top_menu = {
NULLFUNC,
NULLFUNC,
- "All Maint Top Level Menu",
+ "Sms Database Manipulation",
5,
{
SUBMENU("attachmaint","open the attachmaint menu",&attachmaint_top_menu),
* Returns: DM_NORMAL.
*/
+/* ARGSUSED */
int
ShowNFSService(argc, argv)
int argc;
* Returns: DM_NORMAL.
*/
+/* ARGSUSED */
int
AddNFSService(argc, argv)
char **argv;
return (DM_NORMAL);
}
- top = elem;
+ top = elem = QueueTop(elem);
one_service = ( QueueCount(top) == 1 );
while (elem != NULL) {
info = (char **) elem->q_data;
com_err(program_name, stat, " while checking usage of partition");
length = strlen( dir );
- top = elem;
+ top = elem = QueueTop(elem);
while (elem != NULL) {
char buf[BUFSIZ];
char ** info = (char ** ) elem->q_data;
args[0] = name1;
if ( (status = sms_query("get_user_by_login", 1, args,
StoreInfo, (char *) &elem)) != 0) {
- com_err(program_name, status, " when attempting to get_use_by_login.");
+ com_err(program_name, status,
+ " when attempting to get_use_by_login.");
return (NULL);
}
break;
return( (char *) NULL);
}
- top = elem;
+ top = elem = QueueTop(elem);
while (elem != NULL) {
char ** info = (char **) elem->q_data;
if (strcmp (info[1], machine) == 0) {
};
sprintf(buf,"%s%s",
- "Are you sure that you want to change the default quota\n"
+ "Are you sure that you want to change the default quota\n",
"for all new users? (y/n) ");
if(!Confirm(buf)) {
newval[2] = argv[1];
* Returns: none.
*/
+/* ARGSUSED */
int
ShowUserByClass(argc, argv)
int argc;
*/
/* ARGSUSED */
-int
+static int
PrintPOBoxes(argc, argv, junk)
int argc;
char **argv;
* Returns: none
*/
-void
+static void
PrintUserInfo(info, name_only)
char ** info;
Bool name_only;
FreeInfo(info)
char ** info;
{
- char *pointer = *info;
- while (pointer != NULL)
- free(pointer++);
+ while (*info != NULL)
+ FreeAndClear(info++, TRUE);
}
/* Function Name: FreeAndClear - I couldn't resist the name.
FreeInfo( info ); /* free info fields */
free(elem->q_data); /* free info array itself. */
}
- remque(elem); /* remove this element from the queue */
+ RemoveQueue(elem); /* remove this element from the queue */
free(elem); /* free its space. */
}
}
}
+/* Function Name: AddQueue
+ * Description: Adds an element to a queue
+ * Arguments: elem, pred - element and its predecessor.
+ * Returns: none.
+ */
+
+AddQueue(elem, pred)
+struct qelem * elem, *pred;
+{
+ if (pred == NULL) {
+ elem->q_forw = NULL;
+ elem->q_back = NULL;
+ return;
+ }
+ elem->q_back = pred;
+ elem->q_forw = pred->q_forw;
+ pred->q_forw = elem;
+}
+
+/* Function Name: RemoveQueue
+ * Description: removes an element from a queue.
+ * Arguments: elem.
+ * Returns: none.
+ */
+
+RemoveQueue(elem)
+struct qelem *elem;
+{
+ if (elem->q_forw != NULL)
+ (elem->q_forw)->q_back = elem->q_back;
+ if (elem->q_back != NULL)
+ (elem->q_back)->q_forw = elem->q_forw;
+}
+
/* Function Name: QueueCount
* Description: Counts the number of elements in a queue
* Arguments: elem - any element in the queue.
return(count);
}
-/* ARGSUSED */
int
StoreInfo(argc, argv, data)
int argc;
info[count] = Strsave(argv[count]);
info[count] = NULL; /* NULL terminate this sucker. */
- if (*old_elem == (struct qelem *) NULL) { /* first elem. */
- new_elem->q_data = (char *) info;
- new_elem->q_forw = new_elem->q_back = (struct qelem *) NULL;
- }
- else { /* all other elements. */
- new_elem->q_data = (char *) info;
- insque(new_elem, *old_elem);
- }
+ new_elem->q_data = (char *) info;
+ AddQueue(new_elem, *old_elem);
*old_elem = new_elem;
return(SMS_CONT);
Confirm(prompt)
char * prompt;
{
- return( ~verbose || YesNoQuestion(prompt,FALSE) );
+ return( !verbose || YesNoQuestion(prompt,FALSE) );
}
/* Function Name: ValidName
ToggleVerboseMode()
{
- verbose = ~verbose;
+ verbose = !verbose;
if (verbose)
Put_message("Delete functions will first confirm\n");
* Arguments: info - list that needs this name slipped into it.
* name - the name to slip into the list.
* Returns: a pointer to the new list.
- * NOTE: This screws up the numbers if the elements of the array in a
+ * NOTE: This screws up the numbers of the elements of the array in a
* big way.
*/
/* This also pushes the NULL down. */
for (i = CountArgs(info); i > 1; i--) {
- info[i+i] = info[i];
+ info[i] = info[i-1];
}
- info[1] = Strsave(name); /* now slip in the name. */
+ info[1] = name; /* now slip in the name. */
}
/* Function Name: GetValueFromUser
char buf[BUFSIZ];
PromptWithDefault(prompt, buf, BUFSIZ, *pointer);
- if ( pointer != NULL)
+ if (*pointer != NULL)
free(*pointer);
*pointer = Strsave(buf);
}
struct hostent *hostinfo;
hostinfo = gethostbyname(machine);
+/* If this fails then we just return what we were passed. */
if (hostinfo != (struct hostent *) NULL)
machine = hostinfo->h_name;
- else
-/*
- * gethostbyname failed. This should be very rare, since we're
- * dealing with local hosts, so no fancy error recovery.
- */
- machine = (char *) NULL;
return (machine);
}