[pve-devel] [RFC PATCH mini-journalreader 2/2] include error in json output
Dominik Csapak
d.csapak at proxmox.com
Mon Jun 2 16:24:19 CEST 2025
by using json-c and printing the string into a variable via `vasprintf`.
we use a json library to correctly escape and format the error string we
get, since we cannot be sure about the content.
Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
---
not sure if it's worth to include json-c here just for the error message...
debian/control | 2 +-
src/Makefile | 2 +-
src/mini-journalreader.c | 33 +++++++++++++++++++++++++++------
3 files changed, 29 insertions(+), 8 deletions(-)
diff --git a/debian/control b/debian/control
index 8280f6d..d03772e 100644
--- a/debian/control
+++ b/debian/control
@@ -2,7 +2,7 @@ Source: proxmox-mini-journalreader
Section: admin
Priority: optional
Maintainer: Proxmox Support Team <support at proxmox.com>
-Build-Depends: debhelper-compat (= 13), libsystemd-dev, pkg-config, scdoc,
+Build-Depends: debhelper-compat (= 13), libsystemd-dev, pkg-config, scdoc, libjson-c-dev
Standards-Version: 4.6.2
Package: proxmox-mini-journalreader
diff --git a/src/Makefile b/src/Makefile
index 449004f..adb2782 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -4,7 +4,7 @@ SOURCES=mini-journalreader.c
BIN_DIR ?= $(DESTDIR)/usr/bin
MAN1_DIR ?= $(DESTDIR)/usr/share/man/man1
-LIBS := libsystemd
+LIBS := libsystemd json-c
CFLAGS += -Werror -Wall -Wextra -Wl,-z,relro -g -O2 --std=gnu11
CFLAGS += -fstack-protector-strong -D_FORTIFY_SOURCE=2
CFLAGS += $(shell pkg-config --cflags $(LIBS))
diff --git a/src/mini-journalreader.c b/src/mini-journalreader.c
index d934d43..62d8850 100644
--- a/src/mini-journalreader.c
+++ b/src/mini-journalreader.c
@@ -15,6 +15,10 @@
* If not, see <https://www.gnu.org/licenses/>.
*/
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+
#include <errno.h>
#include <stdbool.h>
#include <stdio.h>
@@ -23,6 +27,7 @@
#include <systemd/sd-journal.h>
#include <time.h>
#include <unistd.h>
+#include <json.h>
#define BUFSIZE 4096
@@ -33,15 +38,31 @@ bool first_line = true;
// helper to print errors on stderr
// if we're in json mode, print closing json body if possible
static void print_error_and_exit(const char *fmt, ...) {
+ fflush_unlocked(stdout);
+
va_list args;
- fprintf(stderr, fmt, args);
- if (json) {
- size_t r = fwrite_unlocked("],\"success\":0}", 1, 14, stdout);
- if (r < 14) {
- fprintf(stderr, "Failed to write closing json\n");
+ char *message;
+ va_start(args, fmt);
+ int r = vasprintf(&message, fmt, args);
+ if (r < 0) {
+ // could not allocate the string, so write it directly and don't
+ // include the error in the json output
+ fprintf(stderr, fmt, args);
+ if (json) {
+ fprintf(stdout, "],\"success\":0}");
}
- fflush_unlocked(stdout);
+ exit(1);
+ }
+ fprintf(stderr, "%s", message);
+ va_end(args);
+
+ if (json) {
+ struct json_object *obj = json_object_new_string(message);
+ const char *json_message = json_object_to_json_string(obj);
+ fprintf(stdout, "], \"error\":%s,\"success\":0}", json_message);
+ json_object_put(obj);
}
+ free(message);
exit(1);
}
--
2.39.5
More information about the pve-devel
mailing list