From: Jeff Mahoney <jeffm@xxxxxxxx>
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 <jeffm@xxxxxxxx>
---
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 majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html