From 2b0bc4d824d03d6ac6e1eeaecc432c2958bd0e22 Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Sat, 15 Apr 2023 01:50:07 +0900 Subject: [PATCH] nvme-printf: Add show error function for nvme list command json output Signed-off-by: Tokunori Ikegami --- nvme-print-json.c | 26 ++++++++++++++++++++++++++ nvme-print-json.h | 2 ++ nvme-print.c | 15 +++++++++++++++ nvme-print.h | 1 + nvme.c | 8 +++----- 5 files changed, 47 insertions(+), 5 deletions(-) diff --git a/nvme-print-json.c b/nvme-print-json.c index eb7e484f..1df36a5d 100644 --- a/nvme-print-json.c +++ b/nvme-print-json.c @@ -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); +} diff --git a/nvme-print-json.h b/nvme-print-json.h index 3641c80b..bcb6d1ee 100644 --- a/nvme-print-json.h +++ b/nvme-print-json.h @@ -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) diff --git a/nvme-print.c b/nvme-print.c index d265e873..8bd2174f 100644 --- a/nvme-print.c +++ b/nvme-print.c @@ -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); +} diff --git a/nvme-print.h b/nvme-print.h index 91106e2b..a3fc450d 100644 --- a/nvme-print.h +++ b/nvme-print.h @@ -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 928cfce9..dd6130c2 100644 --- 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; } -- 2.49.0