[pve-devel] [RFC PATCH mini-journalreader v2 2/2] include error in json output
Dominik Csapak
d.csapak at proxmox.com
Mon Jun 2 16:30:50 CEST 2025
by using json-c and printing the string into a variable via `vasprintf`.
Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
---
changes from RFC v1:
* rebase on last patch and also use vfprintf in fallback case
debian/control | 2 +-
src/Makefile | 2 +-
src/mini-journalreader.c | 31 +++++++++++++++++++++++++------
3 files changed, 27 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 562b390..e3982ab 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,17 +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;
+ char *message;
va_start(args, fmt);
- vfprintf(stderr, fmt, args);
+ 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
+ vfprintf(stderr, fmt, args);
+ if (json) {
+ fprintf(stdout, "],\"success\":0}");
+ }
+ exit(1);
+ }
+ fprintf(stderr, "%s", message);
va_end(args);
+
if (json) {
- size_t r = fwrite_unlocked("],\"success\":0}", 1, 14, stdout);
- if (r < 14) {
- fprintf(stderr, "Failed to write closing json\n");
- }
- fflush_unlocked(stdout);
+ 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