diff options
author | Joris Hartog <jorishartog@hotmail.com> | 2021-12-01 15:06:29 +0100 |
---|---|---|
committer | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2021-12-06 11:40:52 +0100 |
commit | 5ef599b324efbcb7af317c102b59c662df068500 (patch) | |
tree | a36a278f17a7dde77f542fbeb7e2178aaa509786 /src/systemctl/systemctl-set-environment.c | |
parent | Merge pull request #21621 from mrc0mmand/lgtm-false-positive (diff) | |
download | systemd-5ef599b324efbcb7af317c102b59c662df068500.tar.xz systemd-5ef599b324efbcb7af317c102b59c662df068500.zip |
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.c | 53 |
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) |