aboutsummaryrefslogtreecommitdiff
path: root/src/utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/utils.c')
-rw-r--r--src/utils.c58
1 files changed, 58 insertions, 0 deletions
diff --git a/src/utils.c b/src/utils.c
index 62bf58a..047a266 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -532,4 +532,62 @@ int path_store(char **destptr, size_t maxlen, const char *base, const char *path
l_path_setup_error:
guard_free(path_tmp);
return -1;
+}
+
+int xml_pretty_print_in_place(const char *filename, const char *pretty_print_prog, const char *pretty_print_args) {
+ int status = 0;
+ char *tempfile = NULL;
+ char *result = NULL;
+ FILE *fp = NULL;
+ FILE *tmpfp = NULL;
+ char cmd[PATH_MAX];
+ if (!find_program(pretty_print_prog)) {
+ // Pretty printing is optional. 99% chance the XML data will
+ // be passed to a report generator; not inspected by a human.
+ return 0;
+ }
+ memset(cmd, 0, sizeof(cmd));
+ snprintf(cmd, sizeof(cmd) - 1, "%s %s %s", pretty_print_prog, pretty_print_args, filename);
+ result = shell_output(cmd, &status);
+ if (status || !result) {
+ goto pretty_print_failed;
+ }
+
+ tempfile = xmkstemp(&tmpfp, "w+");
+ if (!tmpfp || !tempfile) {
+ goto pretty_print_failed;
+ }
+
+ fprintf(tmpfp, "%s", result);
+ fflush(tmpfp);
+ fclose(tmpfp);
+
+ fp = fopen(filename, "w+");
+ if (!fp) {
+ goto pretty_print_failed;
+ }
+
+ if (copy2(tempfile, filename, CT_PERM)) {
+ goto pretty_print_failed;
+ }
+
+ if (remove(tempfile)) {
+ goto pretty_print_failed;
+ }
+
+ guard_free(tempfile);
+ guard_free(result);
+ return 0;
+
+ pretty_print_failed:
+ fprintf(SYSERROR);
+ if (fp) {
+ fclose(fp);
+ }
+ if (tmpfp) {
+ fclose(tmpfp);
+ }
+ guard_free(tempfile);
+ guard_free(result);
+ return -1;
} \ No newline at end of file