[dm-devel] [PATCH 51/57] multipathd: Provide standard error description on cli failure

Hannes Reinecke hare at suse.de
Wed Apr 27 11:10:52 UTC 2016


When the cli command fails we should be returning the error
in addition to the standard help text.

Signed-off-by: Hannes Reinecke <hare at suse.de>
---
 multipathd/cli.c | 53 +++++++++++++++++++++++++++++++++++++----------------
 1 file changed, 37 insertions(+), 16 deletions(-)

diff --git a/multipathd/cli.c b/multipathd/cli.c
index 6a5c6db..ab1365b 100644
--- a/multipathd/cli.c
+++ b/multipathd/cli.c
@@ -1,6 +1,7 @@
 /*
  * Copyright (c) 2005 Christophe Varoqui
  */
+#include <errno.h>
 #include <memory.h>
 #include <vector.h>
 #include <parser.h>
@@ -224,10 +225,14 @@ find_key (const char * str)
 	return foundkw;
 }
 
-#define E_SYNTAX	1
-#define E_NOPARM	2
-#define E_NOMEM		3
-
+/*
+ * get_cmdvec
+ *
+ * returns:
+ * ENOMEM: not enough memory to allocate command
+ * EAGAIN: command not found
+ * EINVAL: argument missing for command
+ */
 static int
 get_cmdvec (char * cmd, vector *v)
 {
@@ -241,13 +246,13 @@ get_cmdvec (char * cmd, vector *v)
 
 	strvec = alloc_strvec(cmd);
 	if (!strvec)
-		return E_NOMEM;
+		return ENOMEM;
 
 	cmdvec = vector_alloc();
 
 	if (!cmdvec) {
 		free_strvec(strvec);
-		return E_NOMEM;
+		return ENOMEM;
 	}
 
 	vector_foreach_slot(strvec, buff, i) {
@@ -260,17 +265,17 @@ get_cmdvec (char * cmd, vector *v)
 		}
 		kw = find_key(buff);
 		if (!kw) {
-			r = E_SYNTAX;
+			r = EAGAIN;
 			goto out;
 		}
 		cmdkw = alloc_key();
 		if (!cmdkw) {
-			r = E_NOMEM;
+			r = ENOMEM;
 			goto out;
 		}
 		if (!vector_alloc_slot(cmdvec)) {
 			FREE(cmdkw);
-			r = E_NOMEM;
+			r = ENOMEM;
 			goto out;
 		}
 		vector_set_slot(cmdvec, cmdkw);
@@ -280,7 +285,7 @@ get_cmdvec (char * cmd, vector *v)
 			get_param = 1;
 	}
 	if (get_param) {
-		r = E_NOPARM;
+		r = EINVAL;
 		goto out;
 	}
 	*v = cmdvec;
@@ -340,13 +345,29 @@ genhelp_sprint_aliases (char * reply, int maxlen, vector keys,
 }
 
 static int
-do_genhelp(char *reply, int maxlen) {
+do_genhelp(char *reply, int maxlen, const char *cmd, int error) {
 	int len = 0;
 	int i, j;
 	uint64_t fp;
 	struct handler * h;
 	struct key * kw;
 
+	switch(error) {
+	case ENOMEM:
+		len += snprintf(reply + len, maxlen - len,
+				"%s: Not enough memory\n", cmd);
+		break;
+	case EAGAIN:
+		len += snprintf(reply + len, maxlen - len,
+				"%s: not found\n", cmd);
+		break;
+	case EINVAL:
+		len += snprintf(reply + len, maxlen - len,
+				"%s: Missing argument\n", cmd);
+		break;
+	}
+	if (len >= maxlen)
+		goto out;
 	len += snprintf(reply + len, maxlen - len, VERSION_STRING);
 	if (len >= maxlen)
 		goto out;
@@ -388,7 +409,7 @@ out:
 
 
 static char *
-genhelp_handler (void)
+genhelp_handler (const char *cmd, int error)
 {
 	char * reply;
 	char * p = NULL;
@@ -401,7 +422,7 @@ genhelp_handler (void)
 		if (!reply)
 			return NULL;
 		p = reply;
-		p += do_genhelp(reply, maxlen);
+		p += do_genhelp(reply, maxlen, cmd, error);
 		again = ((p - reply) >= maxlen);
 		REALLOC_REPLY(reply, again, maxlen);
 	}
@@ -418,7 +439,7 @@ parse_cmd (char * cmd, char ** reply, int * len, void * data)
 	r = get_cmdvec(cmd, &cmdvec);
 
 	if (r) {
-		*reply = genhelp_handler();
+		*reply = genhelp_handler(cmd, r);
 		*len = strlen(*reply) + 1;
 		return 0;
 	}
@@ -426,7 +447,7 @@ parse_cmd (char * cmd, char ** reply, int * len, void * data)
 	h = find_handler(fingerprint(cmdvec));
 
 	if (!h || !h->fn) {
-		*reply = genhelp_handler();
+		*reply = genhelp_handler(cmd, EINVAL);
 		*len = strlen(*reply) + 1;
 		free_keys(cmdvec);
 		return 0;
@@ -562,7 +583,7 @@ key_generator (const char * str, int state)
 		/*
 		 * If last keyword takes a param, don't even try to guess
 		 */
-		if (r == E_NOPARM) {
+		if (r == EINVAL) {
 			has_param = 1;
 			return (strdup("(value)"));
 		}
-- 
2.6.6




More information about the dm-devel mailing list