libubox, jshn: add option to write output to a file
authorRoman Yeryomin <roman@advem.lv>
Fri, 13 Sep 2019 22:22:48 +0000 (01:22 +0300)
committerJohn Crispin <john@phrozen.org>
Mon, 21 Oct 2019 12:21:41 +0000 (14:21 +0200)
This would allow board_config_flush to run one command instead
of two and would be faster and safer than redirecting output
and moving a file between filesystems.

Originally discussed here:
http://lists.openwrt.org/pipermail/openwrt-devel/2017-December/010127.html

Signed-off-by: Roman Yeryomin <roman@advem.lv>
jshn.c

diff --git a/jshn.c b/jshn.c
index 24e3265cefc70d44aca71a265e15ffabd030d9e9..0aa120c925dd673d090a4586812b3d81108ffc6c 100644 (file)
--- a/jshn.c
+++ b/jshn.c
@@ -275,7 +275,7 @@ out:
        return obj;
 }
 
-static int jshn_format(bool no_newline, bool indent)
+static int jshn_format(bool no_newline, bool indent, FILE *stream)
 {
        json_object *obj;
        const char *output;
@@ -297,7 +297,7 @@ static int jshn_format(bool no_newline, bool indent)
                        goto out;
                output = blobmsg_output;
        }
-       fprintf(stdout, "%s%s", output, no_newline ? "" : "\n");
+       fprintf(stream, "%s%s", output, no_newline ? "" : "\n");
        free(blobmsg_output);
        ret = 0;
 
@@ -342,6 +342,7 @@ int main(int argc, char **argv)
        int i;
        int ch;
        int fd;
+       FILE *fp = NULL;
        struct stat sb;
        char *fbuf;
        int ret;
@@ -366,7 +367,7 @@ int main(int argc, char **argv)
                avl_insert(&env_vars, &vars[i].avl);
        }
 
-       while ((ch = getopt(argc, argv, "p:nir:R:w")) != -1) {
+       while ((ch = getopt(argc, argv, "p:nir:R:o:w")) != -1) {
                switch(ch) {
                case 'p':
                        var_prefix = optarg;
@@ -400,7 +401,16 @@ int main(int argc, char **argv)
                        close(fd);
                        return ret;
                case 'w':
-                       return jshn_format(no_newline, indent);
+                       return jshn_format(no_newline, indent, stdout);
+               case 'o':
+                       fp = fopen(optarg, "w");
+                       if (!fp) {
+                               fprintf(stderr, "Error opening %s\n", optarg);
+                               return 3;
+                       }
+                       jshn_format(no_newline, indent, fp);
+                       fclose(fp);
+                       return 0;
                case 'n':
                        no_newline = true;
                        break;