X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Flocale%2Flocalectl.c;h=748a14841d1449b08d00a99aa08525a24623799f;hp=402b058e404fd569517b7df458de0dbc32a2d9c3;hb=46e65dcc3a522b5e992e165b5e61d14254026859;hpb=4b4bec19582c3ad2b7d25116f3c22c783274fead diff --git a/src/locale/localectl.c b/src/locale/localectl.c index 402b058e4..748a14841 100644 --- a/src/locale/localectl.c +++ b/src/locale/localectl.c @@ -63,6 +63,9 @@ static void polkit_agent_open_if_enabled(void) { if (!arg_ask_password) return; + if (arg_transport != BUS_TRANSPORT_LOCAL) + return; + polkit_agent_open(); } @@ -102,125 +105,31 @@ static void print_status_info(StatusInfo *i) { printf(" X11 Options: %s\n", i->x11_options); } -static int status_read_property(const char *name, sd_bus_message *property, StatusInfo *i) { - char type; - const char *contents; - int r; - - assert(name); - assert(property); - - r = sd_bus_message_peek_type(property, &type, &contents); - if (r < 0) { - log_error("Could not determine type of message: %s", strerror(-r)); - return r; - } - - switch (type) { - - case SD_BUS_TYPE_STRING: { - const char *s; - - sd_bus_message_read_basic(property, type, &s); - if (isempty(s)) - break; - - if (streq(name, "VConsoleKeymap")) - i->vconsole_keymap = s; - else if (streq(name, "VConsoleKeymapToggle")) - i->vconsole_keymap_toggle = s; - else if (streq(name, "X11Layout")) - i->x11_layout = s; - else if (streq(name, "X11Model")) - i->x11_model = s; - else if (streq(name, "X11Variant")) - i->x11_variant = s; - else if (streq(name, "X11Options")) - i->x11_options = s; - - break; - } - - case SD_BUS_TYPE_ARRAY: { - _cleanup_strv_free_ char **l = NULL; - - if (!streq(contents, "s")) - break; - - if (!streq(name, "Locale")) - break; - - r = bus_message_read_strv_extend(property, &l); - if (r < 0) - break; - - strv_free(i->locale); - i->locale = l; - l = NULL; - - break; - } - } - - return r; -} - static int show_status(sd_bus *bus, char **args, unsigned n) { - _cleanup_bus_message_unref_ sd_bus_message *reply = NULL; - _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL; - int r; StatusInfo info = {}; + static const struct bus_properties_map map[] = { + { "VConsoleKeymap", "s", NULL, offsetof(StatusInfo, vconsole_keymap) }, + { "VConsoleKeymap", "s", NULL, offsetof(StatusInfo, vconsole_keymap) }, + { "VConsoleKeymapToggle", "s", NULL, offsetof(StatusInfo, vconsole_keymap_toggle) }, + { "X11Layout", "s", NULL, offsetof(StatusInfo, x11_layout) }, + { "X11Model", "s", NULL, offsetof(StatusInfo, x11_model) }, + { "X11Variant", "s", NULL, offsetof(StatusInfo, x11_variant) }, + { "X11Options", "s", NULL, offsetof(StatusInfo, x11_options) }, + { "Locale", "as", NULL, offsetof(StatusInfo, locale) }, + {} + }; + int r; - assert(args); - - r = sd_bus_call_method( bus, - "org.freedesktop.locale1", - "/org/freedesktop/locale1", - "org.freedesktop.DBus.Properties", - "GetAll", - &error, - &reply, - "s", ""); - if (r < 0) { - log_error("Could not get properties: %s", bus_error_message(&error, -r)); - return r; - } + assert(bus); - r = sd_bus_message_enter_container(reply, SD_BUS_TYPE_ARRAY, "{sv}"); + r = bus_map_all_properties(bus, + "org.freedesktop.locale1", + "/org/freedesktop/locale1", + map, + &info); if (r < 0) goto fail; - while ((r = sd_bus_message_enter_container(reply, SD_BUS_TYPE_DICT_ENTRY, "sv")) > 0) { - const char *name; - const char *contents; - - r = sd_bus_message_read_basic(reply, SD_BUS_TYPE_STRING, &name); - if (r < 0) - goto fail; - - r = sd_bus_message_peek_type(reply, NULL, &contents); - if (r < 0) - goto fail; - - r = sd_bus_message_enter_container(reply, SD_BUS_TYPE_VARIANT, contents); - if (r < 0) - goto fail; - - r = status_read_property(name, reply, &info); - if (r < 0) { - log_error("Failed to parse reply."); - return r; - } - - r = sd_bus_message_exit_container(reply); - if (r < 0) - goto fail; - - r = sd_bus_message_exit_container(reply); - if (r < 0) - goto fail; - } - print_status_info(&info); fail: @@ -256,9 +165,8 @@ static int set_locale(sd_bus *bus, char **args, unsigned n) { return r; r = sd_bus_send_with_reply_and_block(bus, m, 0, &error, NULL); - if (r < 0) { - log_error("Failed to issue method call: %s", strerror(-r)); + log_error("Failed to issue method call: %s", bus_error_message(&error, -r)); return r; } @@ -460,6 +368,7 @@ static int set_vconsole_keymap(sd_bus *bus, char **args, unsigned n) { _cleanup_bus_message_unref_ sd_bus_message *reply = NULL; _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL; const char *map, *toggle_map; + int r; assert(bus); assert(args); @@ -474,7 +383,8 @@ static int set_vconsole_keymap(sd_bus *bus, char **args, unsigned n) { map = args[1]; toggle_map = n > 2 ? args[2] : ""; - return sd_bus_call_method(bus, + r = sd_bus_call_method( + bus, "org.freedesktop.locale1", "/org/freedesktop/locale1", "org.freedesktop.locale1", @@ -482,6 +392,10 @@ static int set_vconsole_keymap(sd_bus *bus, char **args, unsigned n) { &error, NULL, "ssbb", map, toggle_map, arg_convert, arg_ask_password); + if (r < 0) + log_error("Failed to set keymap: %s", bus_error_message(&error, -r)); + + return r; } static Set *keymaps = NULL; @@ -561,6 +475,7 @@ static int set_x11_keymap(sd_bus *bus, char **args, unsigned n) { _cleanup_bus_message_unref_ sd_bus_message *reply = NULL; _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL; const char *layout, *model, *variant, *options; + int r; assert(bus); assert(args); @@ -577,7 +492,8 @@ static int set_x11_keymap(sd_bus *bus, char **args, unsigned n) { variant = n > 3 ? args[3] : ""; options = n > 4 ? args[4] : ""; - return sd_bus_call_method(bus, + r = sd_bus_call_method( + bus, "org.freedesktop.locale1", "/org/freedesktop/locale1", "org.freedesktop.locale1", @@ -586,6 +502,10 @@ static int set_x11_keymap(sd_bus *bus, char **args, unsigned n) { NULL, "ssssbb", layout, model, variant, options, arg_convert, arg_ask_password); + if (r < 0) + log_error("Failed to set keymap: %s", bus_error_message(&error, -r)); + + return r; } static int list_x11_keymaps(sd_bus *bus, char **args, unsigned n) { @@ -701,7 +621,7 @@ static int help(void) { " --no-pager Do not pipe output into a pager\n" " --no-ask-password Do not prompt for password\n" " -H --host=[USER@]HOST Operate on remote host\n" - " -M --machine=CONTAINER Operate on local container\n\n" + " -M --machine=CONTAINER Operate on local container\n\n" "Commands:\n" " status Show current locale settings\n" " set-locale LOCALE... Set system locale\n" @@ -737,7 +657,7 @@ static int parse_argv(int argc, char *argv[]) { { "machine", required_argument, NULL, 'M' }, { "no-ask-password", no_argument, NULL, ARG_NO_ASK_PASSWORD }, { "no-convert", no_argument, NULL, ARG_NO_CONVERT }, - { NULL, 0, NULL, 0 } + {} }; int c; @@ -750,8 +670,7 @@ static int parse_argv(int argc, char *argv[]) { switch (c) { case 'h': - help(); - return 0; + return help(); case ARG_VERSION: puts(PACKAGE_STRING); @@ -784,8 +703,7 @@ static int parse_argv(int argc, char *argv[]) { return -EINVAL; default: - log_error("Unknown option code %c", c); - return -EINVAL; + assert_not_reached("Unhandled option"); } } @@ -877,33 +795,27 @@ static int localectl_main(sd_bus *bus, int argc, char *argv[]) { } int main(int argc, char*argv[]) { - int r, ret = EXIT_FAILURE; _cleanup_bus_unref_ sd_bus *bus = NULL; + int r; setlocale(LC_ALL, ""); log_parse_environment(); log_open(); r = parse_argv(argc, argv); - if (r < 0) + if (r <= 0) goto finish; - else if (r == 0) { - ret = EXIT_SUCCESS; - goto finish; - } r = bus_open_transport(arg_transport, arg_host, false, &bus); if (r < 0) { log_error("Failed to create bus connection: %s", strerror(-r)); - ret = EXIT_FAILURE; goto finish; } r = localectl_main(bus, argc, argv); - ret = r < 0 ? EXIT_FAILURE : r; finish: pager_close(); - return ret; + return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; }