@@ -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;
@@ -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:
@@ -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;
}
@@ -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;
}
}
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(-)