Currently dlm_controld sets a embedded data int value of dlm_controld
dump functionality failed for e.g. if lockspace cannot be found. The
dlm_tool does not parse this possible error functionality and will exit
successfully. This patch will add dlm_tool fail functionality if
dlm_controld sets an embedded data error value.
---
 dlm_controld/lib.c           | 25 +++++++++-------
 dlm_controld/libdlmcontrol.h | 10 +++----
 dlm_tool/main.c              | 57 +++++++++++++++++++++++++++---------
 3 files changed, 62 insertions(+), 30 deletions(-)

diff --git a/dlm_controld/lib.c b/dlm_controld/lib.c
index 2888ad05..a21150f2 100644
--- a/dlm_controld/lib.c
+++ b/dlm_controld/lib.c
@@ -109,7 +109,7 @@ static void init_header(struct dlmc_header *h, int cmd, 
char *name,
 
 static char copy_buf[DLMC_DUMP_SIZE];
 
-static int do_dump(int cmd, char *name, char *buf)
+static int do_dump(int cmd, char *name, char *buf, int *data)
 {
        struct dlmc_header h;
        int fd, rv, len;
@@ -118,6 +118,8 @@ static int do_dump(int cmd, char *name, char *buf)
 
        init_header(&h, cmd, name, 0);
 
+       *data = 0;
+
        fd = do_connect(DLMC_QUERY_SOCK_PATH);
        if (fd < 0) {
                rv = fd;
@@ -134,6 +136,7 @@ static int do_dump(int cmd, char *name, char *buf)
        if (rv < 0)
                goto out_close;
 
+       *data = h.data;
        len = h.len - sizeof(h);
 
        if (len <= 0 || len > DLMC_DUMP_SIZE)
@@ -150,29 +153,29 @@ static int do_dump(int cmd, char *name, char *buf)
        return rv;
 }
 
-int dlmc_dump_debug(char *buf)
+int dlmc_dump_debug(char *buf, int *data)
 {
-       return do_dump(DLMC_CMD_DUMP_DEBUG, NULL, buf);
+       return do_dump(DLMC_CMD_DUMP_DEBUG, NULL, buf, data);
 }
 
-int dlmc_dump_config(char *buf)
+int dlmc_dump_config(char *buf, int *data)
 {
-       return do_dump(DLMC_CMD_DUMP_CONFIG, NULL, buf);
+       return do_dump(DLMC_CMD_DUMP_CONFIG, NULL, buf, data);
 }
 
-int dlmc_dump_log_plock(char *buf)
+int dlmc_dump_log_plock(char *buf, int *data)
 {
-       return do_dump(DLMC_CMD_DUMP_LOG_PLOCK, NULL, buf);
+       return do_dump(DLMC_CMD_DUMP_LOG_PLOCK, NULL, buf, data);
 }
 
-int dlmc_dump_plocks(char *name, char *buf)
+int dlmc_dump_plocks(char *name, char *buf, int *data)
 {
-       return do_dump(DLMC_CMD_DUMP_PLOCKS, name, buf);
+       return do_dump(DLMC_CMD_DUMP_PLOCKS, name, buf, data);
 }
 
-int dlmc_dump_run(char *buf)
+int dlmc_dump_run(char *buf, int *data)
 {
-       return do_dump(DLMC_CMD_DUMP_RUN, NULL, buf);
+       return do_dump(DLMC_CMD_DUMP_RUN, NULL, buf, data);
 }
 
 int dlmc_reload_config(void)
diff --git a/dlm_controld/libdlmcontrol.h b/dlm_controld/libdlmcontrol.h
index a8654f3e..08f04c39 100644
--- a/dlm_controld/libdlmcontrol.h
+++ b/dlm_controld/libdlmcontrol.h
@@ -80,11 +80,11 @@ struct dlmc_lockspace {
 
 #define DLMC_STATUS_VERBOSE    0x00000001
 
-int dlmc_dump_debug(char *buf);
-int dlmc_dump_config(char *buf);
-int dlmc_dump_run(char *buf);
-int dlmc_dump_log_plock(char *buf);
-int dlmc_dump_plocks(char *name, char *buf);
+int dlmc_dump_debug(char *buf, int *data);
+int dlmc_dump_config(char *buf, int *data);
+int dlmc_dump_run(char *buf, int *data);
+int dlmc_dump_log_plock(char *buf, int *data);
+int dlmc_dump_plocks(char *name, char *buf, int *data);
 int dlmc_lockspace_info(char *lsname, struct dlmc_lockspace *ls);
 int dlmc_node_info(char *lsname, int nodeid, struct dlmc_node *node);
 /* caller need to free *lss */
diff --git a/dlm_tool/main.c b/dlm_tool/main.c
index 50f0cae9..52fd5b89 100644
--- a/dlm_tool/main.c
+++ b/dlm_tool/main.c
@@ -1466,36 +1466,51 @@ static void do_fence_ack(char *name)
        dlmc_fence_ack(name);
 }
 
-static void do_plocks(char *name)
+static int do_plocks(char *name)
 {
        char buf[DLMC_DUMP_SIZE];
+       int rv, data;
 
        memset(buf, 0, sizeof(buf));
 
-       dlmc_dump_plocks(name, buf);
+       rv = dlmc_dump_plocks(name, buf, &data);
+       if (rv)
+               return rv;
+       else if (data)
+               return data;
 
        buf[DLMC_DUMP_SIZE-1] = '\0';
 
        do_write(STDOUT_FILENO, buf, strlen(buf));
+
+       return 0;
 }
 
-static void do_dump(int op)
+static int do_dump(int op)
 {
+       int rv = -EOPNOTSUPP, data;
        char buf[DLMC_DUMP_SIZE];
 
        memset(buf, 0, sizeof(buf));
 
        if (op == OP_DUMP)
-               dlmc_dump_debug(buf);
+               rv = dlmc_dump_debug(buf, &data);
        else if (op == OP_DUMP_CONFIG)
-               dlmc_dump_config(buf);
+               rv = dlmc_dump_config(buf, &data);
        else if (op == OP_DUMP_RUN)
-               dlmc_dump_run(buf);
+               rv = dlmc_dump_run(buf, &data);
+
+       if (rv)
+               return rv;
+       else if (data)
+               return data;
 
        buf[DLMC_DUMP_SIZE-1] = '\0';
 
        do_write(STDOUT_FILENO, buf, strlen(buf));
        printf("\n");
+
+       return 0;
 }
 
 static void do_reload_config(void)
@@ -1514,18 +1529,25 @@ static void do_set_config(void)
                printf("set_config done\n");
 }
 
-static void do_log_plock(void)
+static int do_log_plock(void)
 {
        char buf[DLMC_DUMP_SIZE];
+       int rv, data;
 
        memset(buf, 0, sizeof(buf));
 
-       dlmc_dump_log_plock(buf);
+       rv = dlmc_dump_log_plock(buf, &data);
+       if (rv)
+               return rv;
+       else if (data)
+               return data;
 
        buf[DLMC_DUMP_SIZE-1] = '\0';
 
        do_write(STDOUT_FILENO, buf, strlen(buf));
        printf("\n");
+
+       return 0;
 }
 
 static int do_run(int op)
@@ -1576,6 +1598,7 @@ int main(int argc, char **argv)
 {
        prog_name = argv[0];
        decode_arguments(argc, argv);
+       int rv = 0;
 
        switch (operation) {
 
@@ -1605,11 +1628,11 @@ int main(int argc, char **argv)
                break;
 
        case OP_DUMP:
-               do_dump(operation);
+               rv = do_dump(operation);
                break;
 
        case OP_DUMP_CONFIG:
-               do_dump(operation);
+               rv = do_dump(operation);
                break;
 
        case OP_RELOAD_CONFIG:
@@ -1621,11 +1644,11 @@ int main(int argc, char **argv)
                break;
 
        case OP_LOG_PLOCK:
-               do_log_plock();
+               rv = do_log_plock();
                break;
 
        case OP_PLOCKS:
-               do_plocks(lsname);
+               rv = do_plocks(lsname);
                break;
 
        case OP_DEADLOCK_CHECK:
@@ -1654,9 +1677,15 @@ int main(int argc, char **argv)
                break;
 
        case OP_DUMP_RUN:
-               do_dump(operation);
+               rv = do_dump(operation);
                break;
        }
-       return 0;
+
+       if (rv < 0) {
+               fprintf(stderr, "failed: %s\n", strerror(-rv));
+               return EXIT_FAILURE;
+       }
+
+       return EXIT_SUCCESS;
 }
 
-- 
2.31.1

Reply via email to