summaryrefslogtreecommitdiff
path: root/src/systemctl/systemctl-set-environment.c
diff options
context:
space:
mode:
authorJoris Hartog <jorishartog@hotmail.com>2021-12-01 15:06:29 +0100
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2021-12-06 11:40:52 +0100
commit5ef599b324efbcb7af317c102b59c662df068500 (patch)
treea36a278f17a7dde77f542fbeb7e2178aaa509786 /src/systemctl/systemctl-set-environment.c
parentdfaf3ec1bf4288b2d0109be990bc61a7ec56bd89 (diff)
downloadsystemd-5ef599b324efbcb7af317c102b59c662df068500.tar.gz
systemctl: support JSON output for "show-environment"
This commit adds a function which converts a bus message containing the environment variables to a JSON object and uses this function to support JSON formatted output for the "systemctl show-environment" command. Fixes #21348
Diffstat (limited to 'src/systemctl/systemctl-set-environment.c')
-rw-r--r--src/systemctl/systemctl-set-environment.c53
1 files changed, 49 insertions, 4 deletions
diff --git a/src/systemctl/systemctl-set-environment.c b/src/systemctl/systemctl-set-environment.c
index 4c8d1acba1..aab0fe5fd0 100644
--- a/src/systemctl/systemctl-set-environment.c
+++ b/src/systemctl/systemctl-set-environment.c
@@ -8,6 +8,40 @@
#include "systemctl-util.h"
#include "systemctl.h"
+static int json_transform_message(sd_bus_message *m, JsonVariant **ret) {
+ _cleanup_(json_variant_unrefp) JsonVariant *v = NULL;
+ char *text;
+ int r;
+
+ assert(m);
+ assert(ret);
+
+ while ((r = sd_bus_message_read_basic(m, SD_BUS_TYPE_STRING, &text)) > 0) {
+ _cleanup_(json_variant_unrefp) JsonVariant *w = NULL;
+
+ char *sep = strchr(text, '=');
+ if (!sep)
+ return log_error_errno(SYNTHETIC_ERRNO(EUCLEAN),
+ "Invalid environment block");
+
+ *sep++ = '\0';
+
+ r = json_build(&w, JSON_BUILD_OBJECT(JSON_BUILD_PAIR(text, JSON_BUILD_STRING(sep))));
+ if (r < 0)
+ return r;
+
+ r = json_variant_merge(&v, w);
+ if (r < 0)
+ return r;
+ }
+ if (r < 0)
+ return bus_log_parse_error(r);
+
+ *ret = TAKE_PTR(v);
+
+ return r;
+}
+
static int print_variable(const char *s) {
const char *sep;
_cleanup_free_ char *esc = NULL;
@@ -46,13 +80,24 @@ int show_environment(int argc, char *argv[], void *userdata) {
if (r < 0)
return bus_log_parse_error(r);
- while ((r = sd_bus_message_read_basic(reply, SD_BUS_TYPE_STRING, &text)) > 0) {
- r = print_variable(text);
+ if (OUTPUT_MODE_IS_JSON(arg_output)) {
+ _cleanup_(json_variant_unrefp) JsonVariant *v = NULL;
+ JsonFormatFlags flags = output_mode_to_json_format_flags(arg_output);
+
+ r = json_transform_message(reply, &v);
if (r < 0)
return r;
+
+ json_variant_dump(v, flags, stdout, NULL);
+ } else {
+ while ((r = sd_bus_message_read_basic(reply, SD_BUS_TYPE_STRING, &text)) > 0) {
+ r = print_variable(text);
+ if (r < 0)
+ return r;
+ }
+ if (r < 0)
+ return bus_log_parse_error(r);
}
- if (r < 0)
- return bus_log_parse_error(r);
r = sd_bus_message_exit_container(reply);
if (r < 0)