diff mbox series

[v2,07/18] multipathd: always start failure replies with "fail\n"

Message ID 20240103175643.18438-8-bmarzins@redhat.com (mailing list archive)
State Not Applicable, archived
Delegated to: christophe varoqui
Headers show
Series change how multipathd deletes maps plus cleanups | expand

Commit Message

Benjamin Marzinski Jan. 3, 2024, 5:56 p.m. UTC
When multipathd interactive commands fail for certain reasons, like
timing out or incorrect permissions, they do not reply with "fail\n".
Currently, multipath and multipathc expect that a reply other than
"fail\n" means success. Instead, prefix all failure replies with
"fail\n", and adapt multipath and multipathc to return failure for any
reply starting with "fail\n".

Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
---
 libdmmp/libdmmp.c   |  6 +++---
 multipath/main.c    | 13 ++++++++++---
 multipathd/uxclnt.c |  9 +++++++--
 multipathd/uxlsnr.c | 12 +++++-------
 4 files changed, 25 insertions(+), 15 deletions(-)
diff mbox series

Patch

diff --git a/libdmmp/libdmmp.c b/libdmmp/libdmmp.c
index 0025e66d..77f8a6a0 100644
--- a/libdmmp/libdmmp.c
+++ b/libdmmp/libdmmp.c
@@ -321,7 +321,7 @@  invoke:
 		}
 	}
 	if ((*output != NULL) &&
-	    (strncmp(*output, "timeout", strlen("timeout")) == 0))
+	    (strncmp(*output, "fail\ntimeout", strlen("fail\ntimeout")) == 0))
 		flag_check_tmo = true;
 
 	if (flag_check_tmo == true) {
@@ -364,8 +364,8 @@  invoke:
 	}
 
 	if ((*output != NULL) &&
-	    strncmp(*output, "permission deny",
-		    strlen("permission deny")) == 0) {
+	    strncmp(*output, "fail\npermission deny",
+		    strlen("fail\npermission deny")) == 0) {
 		_error(ctx, "Permission deny, need to be root");
 		rc = DMMP_ERR_PERMISSION_DENY;
 		goto out;
diff --git a/multipath/main.c b/multipath/main.c
index 00302087..48d684e3 100644
--- a/multipath/main.c
+++ b/multipath/main.c
@@ -804,10 +804,17 @@  int delegate_to_multipathd(enum mpath_cmds cmd,
 	}
 
 	if (reply != NULL && *reply != '\0') {
-		if (strcmp(reply, "fail\n"))
+		if (strncmp(reply, "fail\n", 5))
 			r = DELEGATE_OK;
-		if (r != NOT_DELEGATED && strcmp(reply, "ok\n"))
-			printf("%s", reply);
+		if (r != NOT_DELEGATED && strcmp(reply, "ok\n")) {
+			/* If there is additional failure information, skip the
+			 * initial 'fail' */
+			if (strncmp(reply, "fail\n", 5) == 0 &&
+			    strlen(reply) > 5)
+				printf("%s", reply + 5);
+			else
+				printf("%s", reply);
+		}
 	}
 
 out:
diff --git a/multipathd/uxclnt.c b/multipathd/uxclnt.c
index c3ae5db6..16133a88 100644
--- a/multipathd/uxclnt.c
+++ b/multipathd/uxclnt.c
@@ -30,8 +30,13 @@  static int process_req(int fd, char * inbuf, unsigned int timeout)
 			printf("error %d receiving packet\n", ret);
 		return 1;
 	} else {
-		printf("%s", reply);
-		ret = (strcmp(reply, "fail\n") == 0);
+		ret = (strncmp(reply, "fail\n", 5) == 0);
+		/* If there is additional failure information, skip the
+		 * initial 'fail' */
+		if (ret && strlen(reply) > 5)
+			printf("%s", reply + 5);
+		else
+			printf("%s", reply);
 		free(reply);
 		return ret;
 	}
diff --git a/multipathd/uxlsnr.c b/multipathd/uxlsnr.c
index 4d6f258c..4df01666 100644
--- a/multipathd/uxlsnr.c
+++ b/multipathd/uxlsnr.c
@@ -392,6 +392,11 @@  static void drain_idle_fd(int fd)
 
 void default_reply(struct client *c, int r)
 {
+	if (r == 0) {
+		append_strbuf_str(&c->reply, "ok\n");
+		return;
+	}
+	append_strbuf_str(&c->reply, "fail\n");
 	switch(r) {
 	case -EINVAL:
 	case -ESRCH:
@@ -406,13 +411,6 @@  void default_reply(struct client *c, int r)
 	case -ETIMEDOUT:
 		append_strbuf_str(&c->reply, "timeout\n");
 		break;
-	case 0:
-		append_strbuf_str(&c->reply, "ok\n");
-		break;
-	default:
-		/* cli_handler functions return 1 on unspecified error */
-		append_strbuf_str(&c->reply, "fail\n");
-		break;
 	}
 }