[lvm-devel] master - commands: centralize shell vs script vs command decision

David Teigland teigland at sourceware.org
Fri Jul 7 20:37:01 UTC 2017


Gitweb:        https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=85f1814e9dc574c271cfdae91adfe2628ff62fa9
Commit:        85f1814e9dc574c271cfdae91adfe2628ff62fa9
Parent:        c995e40b6333fb83fc1eda7be0cc4ef43f1eb88e
Author:        David Teigland <teigland at redhat.com>
AuthorDate:    Mon May 8 10:31:30 2017 -0500
Committer:     David Teigland <teigland at redhat.com>
CommitterDate: Fri Jul 7 15:33:44 2017 -0500

commands: centralize shell vs script vs command decision

This clarifies the point where lvm decides if it is
running an lvm shell, command or a script.
---
 tools/lvmcmdline.c |   39 ++++++++++++++++++++++++++++++---------
 1 files changed, 30 insertions(+), 9 deletions(-)

diff --git a/tools/lvmcmdline.c b/tools/lvmcmdline.c
index 964e295..2e71abf 100644
--- a/tools/lvmcmdline.c
+++ b/tools/lvmcmdline.c
@@ -3292,7 +3292,6 @@ void lvm_fin(struct cmd_context *cmd)
 static int _run_script(struct cmd_context *cmd, int argc, char **argv)
 {
 	FILE *script;
-
 	char buffer[CMD_LEN];
 	int ret = 0;
 	int magic_number = 0;
@@ -3391,7 +3390,10 @@ int lvm2_main(int argc, char **argv)
 	int ret, alias = 0;
 	struct custom_fds custom_fds;
 	struct cmd_context *cmd;
+	int run_shell = 0;
+	int run_script = 0;
 	const char *run_name;
+	const char *run_command_name = NULL;
 
 	if (!argv)
 		return -1;
@@ -3461,16 +3463,30 @@ int lvm2_main(int argc, char **argv)
 		goto_out;
 	}
 
-	/* Can be the name of a script file. */
-	if (run_name && !find_command_name(run_name))
-		run_name = NULL;
+	/*
+	 * Decide if we are running a shell or a command or a script.  When
+	 * there is no run_name, it's a shell, when run_name is a recognized
+	 * lvm command it's that command, when run_name is not a recognized
+	 * command name, try it as an lvm script.
+	 */
+	if (!run_name)
+		run_shell = 1;
+	else if (!find_command_name(run_name))
+		run_script = 1;
+	else
+		run_command_name = run_name;
 
-	if (!lvm_register_commands(cmd, run_name)) {
+	/*
+	 * NULL run_command_name means register all command defs because
+	 * a script or shell needs to access any command name, while a
+	 * single command needs to access only defs for the named command.
+	 */
+	if (!lvm_register_commands(cmd, run_command_name)) {
 		ret = ECMD_FAILED;
 		goto out;
 	}
 
-	if (!alias && !argc) {
+	if (run_shell) {
 #ifdef READLINE_SUPPORT
 		_nonroot_warning();
 		if (!_prepare_profiles(cmd)) {
@@ -3488,11 +3504,16 @@ int lvm2_main(int argc, char **argv)
 	}
 
 	_nonroot_warning();
-	ret = lvm_run_command(cmd, argc, argv);
-	if ((ret == ENO_SUCH_CMD) && (!alias))
+
+	if (run_script)
 		ret = _run_script(cmd, argc, argv);
-	if (ret == ENO_SUCH_CMD)
+	else
+		ret = lvm_run_command(cmd, argc, argv);
+
+	if (ret == ENO_SUCH_CMD) {
 		log_error("No such command.  Try 'help'.");
+		goto out;
+	}
 
 	if ((ret != ECMD_PROCESSED) && !error_message_produced()) {
 		log_debug(INTERNAL_ERROR "Failed command did not use log_error");




More information about the lvm-devel mailing list