From: Jeff Mahoney <je...@suse.com>

This patch adds support for JSON and JSON-compat output.  The latter is
intended to be compatible with Javascript's integers being represented
as 64-bit floats, with only 53 bits usable for the integer component.
Compat mode output will post 64-bit integers as an array of two 32-bit
integers in [high, low] format.

This patch also adds support for reporting which output formats a
command supports as well as detection of the json-c library.

Signed-off-by: Jeff Mahoney <je...@suse.com>
---
 Makefile.inc.in |  4 ++--
 commands.h      | 13 +++++++++++++
 configure.ac    |  6 ++++++
 help.c          | 25 ++++++++++++++-----------
 4 files changed, 35 insertions(+), 13 deletions(-)

diff --git a/Makefile.inc.in b/Makefile.inc.in
index 56271903..68bddbed 100644
--- a/Makefile.inc.in
+++ b/Makefile.inc.in
@@ -18,9 +18,9 @@ BTRFSRESTORE_ZSTD = @BTRFSRESTORE_ZSTD@
 SUBST_CFLAGS = @CFLAGS@
 SUBST_LDFLAGS = @LDFLAGS@
 
-LIBS_BASE = @UUID_LIBS@ @BLKID_LIBS@ -L. -pthread
+LIBS_BASE = @UUID_LIBS@ @BLKID_LIBS@ @JSON_LIBS@ -L. -pthread
 LIBS_COMP = @ZLIB_LIBS@ @LZO2_LIBS@ @ZSTD_LIBS@
-STATIC_LIBS_BASE = @UUID_LIBS_STATIC@ @BLKID_LIBS_STATIC@ -L. -pthread
+STATIC_LIBS_BASE = @UUID_LIBS_STATIC@ @BLKID_LIBS_STATIC@ @JSON_LIBS_STATIC@ 
-L. -pthread
 STATIC_LIBS_COMP = @ZLIB_LIBS_STATIC@ @LZO2_LIBS_STATIC@ @ZSTD_LIBS_STATIC@
 
 prefix ?= @prefix@
diff --git a/commands.h b/commands.h
index 83316c6d..bf74eaf8 100644
--- a/commands.h
+++ b/commands.h
@@ -19,9 +19,22 @@
 
 enum cmd_output {
        CMD_OUTPUT_TEXT = 0,
+#ifdef HAVE_JSON
+       CMD_OUTPUT_JSON,
+       CMD_OUTPUT_JSON_COMPAT,
+#endif
        CMD_OUTPUT_MAX,
 };
 
+/*
+ * If we don't have the JSON library, map the flags to text to avoid
+ * more ifdefs elsewhere.
+ */
+#ifndef HAVE_JSON
+#define CMD_OUTPUT_JSON                CMD_OUTPUT_TEXT
+#define CMD_OUTPUT_JSON_COMPAT CMD_OUTPUT_TEXT
+#endif
+
 #define CMD_OUTPUT_FLAG(x)     (1 << (CMD_OUTPUT_##x))
 
 struct cmd_context {
diff --git a/configure.ac b/configure.ac
index 56d17c3a..6aec672a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -197,6 +197,12 @@ PKG_STATIC(UUID_LIBS_STATIC, [uuid])
 PKG_CHECK_MODULES(ZLIB, [zlib])
 PKG_STATIC(ZLIB_LIBS_STATIC, [zlib])
 
+PKG_CHECK_MODULES(JSON, [json-c], [
+       AC_DEFINE(HAVE_JSON, [1], [Have JSON]),
+       PKG_STATIC(JSON_LIBS_STATIC, [json-c], [
+               AC_DEFINE(HAVE_JSON_STATIC, [1], [Have JSON static])], [true])
+       ], [true])
+
 AC_ARG_ENABLE([zstd],
        AS_HELP_STRING([--disable-zstd], [build without zstd support]),
        [], [enable_zstd=yes]
diff --git a/help.c b/help.c
index 063e9740..f1710621 100644
--- a/help.c
+++ b/help.c
@@ -32,6 +32,10 @@
 
 const char *cmd_outputs[CMD_OUTPUT_MAX] = {
        "text",
+#ifdef HAVE_JSON
+       [CMD_OUTPUT_JSON] = "json",
+       [CMD_OUTPUT_JSON_COMPAT] = "json:compat",
+#endif
 };
 
 static char argv0_buf[ARGV0_BUF_SIZE] = "btrfs";
@@ -186,18 +190,17 @@ static int do_usage_one_command(const char * const 
*usagestr,
                fprintf(outf, "%*s%s\n", pad, "", *usagestr++);
 
        /* options (optional) */
-       if (!*usagestr || ((flags & USAGE_OPTIONS) == 0))
-               return 0;
-
-       /*
-        * options (if present) should always (even if there is no long
-        * description) be prepended with an empty line, skip it
-        */
-       usagestr++;
+       if (*usagestr && (flags & USAGE_OPTIONS)) {
+               /*
+                * options (if present) should always (even if there is no long
+                * description) be prepended with an empty line, skip it
+                */
+               usagestr++;
 
-       fputc('\n', outf);
-       while (*usagestr)
-               fprintf(outf, "%*s%s\n", pad, "", *usagestr++);
+               fputc('\n', outf);
+               while (*usagestr)
+                       fprintf(outf, "%*s%s\n", pad, "", *usagestr++);
+       }
 
        if (flags & USAGE_FORMAT) {
                /* We always support text */
-- 
2.12.3

--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to