libubox, jshn: add option to write output to a file

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>
This commit is contained in:
Roman Yeryomin 2019-09-14 01:22:48 +03:00 committed by John Crispin
parent ecf56174da
commit eb30a03048

18
jshn.c
View file

@ -275,7 +275,7 @@ out:
return obj; 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; json_object *obj;
const char *output; const char *output;
@ -297,7 +297,7 @@ static int jshn_format(bool no_newline, bool indent)
goto out; goto out;
output = blobmsg_output; output = blobmsg_output;
} }
fprintf(stdout, "%s%s", output, no_newline ? "" : "\n"); fprintf(stream, "%s%s", output, no_newline ? "" : "\n");
free(blobmsg_output); free(blobmsg_output);
ret = 0; ret = 0;
@ -342,6 +342,7 @@ int main(int argc, char **argv)
int i; int i;
int ch; int ch;
int fd; int fd;
FILE *fp = NULL;
struct stat sb; struct stat sb;
char *fbuf; char *fbuf;
int ret; int ret;
@ -366,7 +367,7 @@ int main(int argc, char **argv)
avl_insert(&env_vars, &vars[i].avl); 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) { switch(ch) {
case 'p': case 'p':
var_prefix = optarg; var_prefix = optarg;
@ -400,7 +401,16 @@ int main(int argc, char **argv)
close(fd); close(fd);
return ret; return ret;
case 'w': 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': case 'n':
no_newline = true; no_newline = true;
break; break;