X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Flocale%2Flocalectl.c;h=2632305dcc24c4e797cc781778940067222dada3;hp=fb21bfd7f76726c07728ae1742de605d792f9dde;hb=bce415edcae8e7af8327de8265d621f95fa5426f;hpb=ffc06c3513d9a0693c7f810d03b20705127ba55a diff --git a/src/locale/localectl.c b/src/locale/localectl.c index fb21bfd7f..2632305dc 100644 --- a/src/locale/localectl.c +++ b/src/locale/localectl.c @@ -42,6 +42,7 @@ #include "set.h" #include "path-util.h" #include "utf8.h" +#include "def.h" static bool arg_no_pager = false; static bool arg_ask_password = true; @@ -63,6 +64,9 @@ static void polkit_agent_open_if_enabled(void) { if (!arg_ask_password) return; + if (arg_transport != BUS_TRANSPORT_LOCAL) + return; + polkit_agent_open(); } @@ -104,15 +108,15 @@ static void print_status_info(StatusInfo *i) { static int show_status(sd_bus *bus, char **args, unsigned n) { StatusInfo info = {}; - const struct bus_properties_map map[] = { - { "s", "VConsoleKeymap", &info.vconsole_keymap }, - { "s", "VConsoleKeymap", &info.vconsole_keymap }, - { "s", "VConsoleKeymapToggle", &info.vconsole_keymap_toggle}, - { "s", "X11Layout", &info.x11_layout }, - { "s", "X11Model", &info.x11_model }, - { "s", "X11Variant", &info.x11_variant }, - { "s", "X11Options", &info.x11_options }, - { "as", "Locale", &info.locale }, + 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; @@ -122,9 +126,12 @@ static int show_status(sd_bus *bus, char **args, unsigned n) { r = bus_map_all_properties(bus, "org.freedesktop.locale1", "/org/freedesktop/locale1", - map); - if (r < 0) + map, + &info); + if (r < 0) { + log_error("Could not get properties: %s", strerror(-r)); goto fail; + } print_status_info(&info); @@ -135,7 +142,6 @@ fail: static int set_locale(sd_bus *bus, char **args, unsigned n) { _cleanup_bus_message_unref_ sd_bus_message *m = NULL; - _cleanup_bus_message_unref_ sd_bus_message *reply = NULL; _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL; int r; @@ -144,23 +150,25 @@ static int set_locale(sd_bus *bus, char **args, unsigned n) { polkit_agent_open_if_enabled(); - r = sd_bus_message_new_method_call(bus, + r = sd_bus_message_new_method_call( + bus, + &m, "org.freedesktop.locale1", "/org/freedesktop/locale1", "org.freedesktop.locale1", - "SetLocale", &m); + "SetLocale"); if (r < 0) - return r; + return bus_log_create_error(r); r = sd_bus_message_append_strv(m, args + 1); if (r < 0) - return r; + return bus_log_create_error(r); r = sd_bus_message_append(m, "b", arg_ask_password); if (r < 0) - return r; + return bus_log_create_error(r); - r = sd_bus_send_with_reply_and_block(bus, m, 0, &error, NULL); + r = sd_bus_call(bus, m, 0, &error, NULL); if (r < 0) { log_error("Failed to issue method call: %s", bus_error_message(&error, -r)); return r; @@ -361,7 +369,6 @@ static int list_locales(sd_bus *bus, char **args, unsigned n) { } 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; @@ -412,7 +419,7 @@ static int nftw_cb( !endswith(fpath, ".map.gz")) return 0; - p = strdup(path_get_file_name(fpath)); + p = strdup(basename(fpath)); if (!p) return log_oom(); @@ -435,15 +442,14 @@ static int nftw_cb( static int list_vconsole_keymaps(sd_bus *bus, char **args, unsigned n) { _cleanup_strv_free_ char **l = NULL; + const char *dir; keymaps = set_new(string_hash_func, string_compare_func); if (!keymaps) return log_oom(); - nftw("/usr/share/keymaps/", nftw_cb, 20, FTW_MOUNT|FTW_PHYS); - nftw("/usr/share/kbd/keymaps/", nftw_cb, 20, FTW_MOUNT|FTW_PHYS); - nftw("/usr/lib/kbd/keymaps/", nftw_cb, 20, FTW_MOUNT|FTW_PHYS); - nftw("/lib/kbd/keymaps/", nftw_cb, 20, FTW_MOUNT|FTW_PHYS); + NULSTR_FOREACH(dir, KBD_KEYMAP_DIRS) + nftw(dir, nftw_cb, 20, FTW_MOUNT|FTW_PHYS); l = set_get_strv(keymaps); if (!l) { @@ -468,7 +474,6 @@ static int list_vconsole_keymaps(sd_bus *bus, char **args, unsigned n) { } 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; @@ -613,11 +618,11 @@ static int help(void) { "Query or change system locale and keyboard settings.\n\n" " -h --help Show this help\n" " --version Show package version\n" - " --no-convert Don't convert keyboard mappings\n" " --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" + " --no-convert Don't convert keyboard mappings\n\n" "Commands:\n" " status Show current locale settings\n" " set-locale LOCALE... Set system locale\n" @@ -653,7 +658,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; @@ -666,8 +671,7 @@ static int parse_argv(int argc, char *argv[]) { switch (c) { case 'h': - help(); - return 0; + return help(); case ARG_VERSION: puts(PACKAGE_STRING); @@ -700,8 +704,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"); } } @@ -793,33 +796,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; }