]> www.infradead.org Git - users/sagi/nvme-cli.git/commitdiff
nvme-printf: Add show error function for nvme list command json output
authorTokunori Ikegami <ikegami.t@gmail.com>
Fri, 14 Apr 2023 16:50:07 +0000 (01:50 +0900)
committerDaniel Wagner <wagi@monom.org>
Mon, 17 Apr 2023 07:54:10 +0000 (09:54 +0200)
Signed-off-by: Tokunori Ikegami <ikegami.t@gmail.com>
nvme-print-json.c
nvme-print-json.h
nvme-print.c
nvme-print.h
nvme.c

index eb7e484f4bb69cf17d1355771ffa6074cf69b7b2..1df36a5d916fada0cdddc5dab2817c4223cd90a7 100644 (file)
@@ -9,6 +9,8 @@
 #include "nvme.h"
 #include "common.h"
 
+#define ERROR_MSG_LEN 100
+
 static const uint8_t zero_uuid[16] = { 0 };
 
 void json_nvme_id_ns(struct nvme_id_ns *ns, bool cap_only)
@@ -2854,3 +2856,27 @@ void json_output_status(int status)
 
        json_output_object(root);
 }
+
+void json_output_error(const char *msg, va_list ap)
+{
+       struct json_object *root = json_create_object();
+       int len = ERROR_MSG_LEN;
+       char *error = (char *)malloc(ERROR_MSG_LEN);
+
+       if (!error)
+               return;
+
+       len = vsnprintf(error, len, msg, ap) + 1;
+       if (len > ERROR_MSG_LEN) {
+               error = (char *)realloc(error, len);
+               if (!error)
+                       return;
+               vsnprintf(error, len, msg, ap);
+       }
+
+       json_object_add_value_string(root, "error", error);
+
+       json_output_object(root);
+
+       free(error);
+}
index 3641c80b1e4f6df393426f178b740658e6543fb8..bcb6d1eed9b63f44a3179c2999f15878b00e94e8 100644 (file)
@@ -79,6 +79,7 @@ void json_predictable_latency_per_nvmset(
        struct nvme_nvmset_predictable_lat_log *plpns_log,
        __u16 nvmset_id);
 void json_output_status(int status);
+void json_output_error(const char *msg, va_list ap);
 
 /* fabrics.c */
 void json_discovery_log(struct nvmf_discovery_log *log, int numrec);
@@ -138,6 +139,7 @@ void json_connect_msg(nvme_ctrl_t c);
 #define json_predictable_latency_event_agg_log(pea_log, log_entries)
 #define json_predictable_latency_per_nvmset(plpns_log, nvmset_id)
 #define json_output_status(status)
+#define json_output_error(const char *msg, va_list ap)
 
 /* fabrics.c */
 #define json_discovery_log(log, numrec)
index d265e873673a122c7f236a257e98e064615435e1..8bd2174fc7494261d3c88aba74b6a5e15dcdbb14 100644 (file)
@@ -5456,3 +5456,18 @@ void nvme_show_topology(nvme_root_t r, enum nvme_print_flags flags,
        else
                nvme_show_simple_topology(r, ranking);
 }
+
+void nvme_show_error(const char *msg, ...)
+{
+       va_list ap;
+       va_start(ap, msg);
+
+       if (argconfig_output_format_json(false))
+               return json_output_error(msg, ap);
+
+       vfprintf(stderr, msg, ap);
+
+       printf("\n");
+
+       va_end(ap);
+}
index 91106e2b7732fbc55c394e3b32d9ca06e7ca4ce3..a3fc450d98feca53d6b64b00c251a5b2479cecef 100644 (file)
@@ -155,5 +155,6 @@ char *zone_state_to_string(__u8 state);
 const char *nvme_pel_event_to_string(int type);
 const char *get_sanitize_log_sstat_status_str(__u16 status);
 const char *nvme_ana_state_to_string(enum nvme_ana_state state);
+void nvme_show_error(const char *msg, ...);
 
 #endif
diff --git a/nvme.c b/nvme.c
index 928cfce9098a2c439eb3606459834d5b4598a7db..dd6130c2df1367feb9fb54a27870b9d8407c8fec 100644 (file)
--- a/nvme.c
+++ b/nvme.c
@@ -3335,7 +3335,7 @@ static int list(int argc, char **argv, struct command *cmd, struct plugin *plugi
        if (flags < 0)
                return err;
        if (flags != JSON && flags != NORMAL) {
-               fprintf(stderr, "Invalid output format\n");
+               nvme_show_error("Invalid output format");
                return -EINVAL;
        }
        if (cfg.verbose)
@@ -3343,14 +3343,12 @@ static int list(int argc, char **argv, struct command *cmd, struct plugin *plugi
 
        r = nvme_create_root(stderr, map_log_level(cfg.verbose, false));
        if (!r) {
-               fprintf(stderr, "Failed to create topology root: %s\n",
-                       nvme_strerror(errno));
+               nvme_show_error("Failed to create topology root: %s", nvme_strerror(errno));
                return -errno;
        }
        err = nvme_scan_topology(r, NULL, NULL);
        if (err < 0) {
-               fprintf(stderr, "Failed to scan topology: %s\n",
-                        nvme_strerror(errno));
+               nvme_show_error("Failed to scan topology: %s", nvme_strerror(errno));
                nvme_free_tree(r);
                return err;
        }