diff options
Diffstat (limited to 'src/locale/localed.c')
-rw-r--r-- | src/locale/localed.c | 93 |
1 files changed, 54 insertions, 39 deletions
diff --git a/src/locale/localed.c b/src/locale/localed.c index 88756542fd..e3eef4a610 100644 --- a/src/locale/localed.c +++ b/src/locale/localed.c @@ -99,11 +99,6 @@ static const char* nonempty(const char *s) { return isempty(s) ? NULL : s; } -static void free_and_replace(char **s, char *v) { - free(*s); - *s = v; -} - static bool startswith_comma(const char *s, const char *prefix) { const char *t; @@ -111,22 +106,22 @@ static bool startswith_comma(const char *s, const char *prefix) { } static void context_free_x11(Context *c) { - free_and_replace(&c->x11_layout, NULL); - free_and_replace(&c->x11_model, NULL); - free_and_replace(&c->x11_variant, NULL); - free_and_replace(&c->x11_options, NULL); + c->x11_layout = mfree(c->x11_layout); + c->x11_options = mfree(c->x11_options); + c->x11_model = mfree(c->x11_model); + c->x11_variant = mfree(c->x11_variant); } static void context_free_vconsole(Context *c) { - free_and_replace(&c->vc_keymap, NULL); - free_and_replace(&c->vc_keymap_toggle, NULL); + c->vc_keymap = mfree(c->vc_keymap); + c->vc_keymap_toggle = mfree(c->vc_keymap_toggle); } static void context_free_locale(Context *c) { int p; for (p = 0; p < _LOCALE_MAX; p++) - free_and_replace(&c->locale[p], NULL); + c->locale[p] = mfree(c->locale[p]); } static void context_free(Context *c) { @@ -142,7 +137,7 @@ static void locale_simplify(Context *c) { for (p = LOCALE_LANG+1; p < _LOCALE_MAX; p++) if (isempty(c->locale[p]) || streq_ptr(c->locale[LOCALE_LANG], c->locale[p])) - free_and_replace(&c->locale[p], NULL); + c->locale[p] = mfree(c->locale[p]); } static int locale_read_data(Context *c) { @@ -227,22 +222,25 @@ static int x11_read_data(Context *c) { if (in_section && first_word(l, "Option")) { _cleanup_strv_free_ char **a = NULL; - r = strv_split_quoted(&a, l, 0); + r = strv_split_extract(&a, l, WHITESPACE, EXTRACT_QUOTES); if (r < 0) return r; if (strv_length(a) == 3) { - if (streq(a[1], "XkbLayout")) { - free_and_replace(&c->x11_layout, a[2]); - a[2] = NULL; - } else if (streq(a[1], "XkbModel")) { - free_and_replace(&c->x11_model, a[2]); - a[2] = NULL; - } else if (streq(a[1], "XkbVariant")) { - free_and_replace(&c->x11_variant, a[2]); - a[2] = NULL; - } else if (streq(a[1], "XkbOptions")) { - free_and_replace(&c->x11_options, a[2]); + char **p = NULL; + + if (streq(a[1], "XkbLayout")) + p = &c->x11_layout; + else if (streq(a[1], "XkbModel")) + p = &c->x11_model; + else if (streq(a[1], "XkbVariant")) + p = &c->x11_variant; + else if (streq(a[1], "XkbOptions")) + p = &c->x11_options; + + if (p) { + free(*p); + *p = a[2]; a[2] = NULL; } } @@ -250,7 +248,7 @@ static int x11_read_data(Context *c) { } else if (!in_section && first_word(l, "Section")) { _cleanup_strv_free_ char **a = NULL; - r = strv_split_quoted(&a, l, 0); + r = strv_split_extract(&a, l, WHITESPACE, EXTRACT_QUOTES); if (r < 0) return -ENOMEM; @@ -476,15 +474,25 @@ static int x11_write_data(Context *c) { fprintf(f, " Option \"XkbOptions\" \"%s\"\n", c->x11_options); fputs("EndSection\n", f); - fflush(f); - if (ferror(f) || rename(temp_path, "/etc/X11/xorg.conf.d/00-keyboard.conf") < 0) { + r = fflush_and_check(f); + if (r < 0) + goto fail; + + if (rename(temp_path, "/etc/X11/xorg.conf.d/00-keyboard.conf") < 0) { r = -errno; - unlink("/etc/X11/xorg.conf.d/00-keyboard.conf"); - unlink(temp_path); - return r; - } else - return 0; + goto fail; + } + + return 0; + +fail: + (void) unlink("/etc/X11/xorg.conf.d/00-keyboard.conf"); + + if (temp_path) + (void) unlink(temp_path); + + return r; } static int vconsole_reload(sd_bus *bus) { @@ -539,7 +547,7 @@ static int read_next_mapping(const char* filename, if (l[0] == 0 || l[0] == '#') continue; - r = strv_split_quoted(&b, l, 0); + r = strv_split_extract(&b, l, WHITESPACE, EXTRACT_QUOTES); if (r < 0) return r; @@ -748,8 +756,10 @@ static int find_legacy_keymap(Context *c, char **new_keymap) { r = find_converted_keymap(l, v, &converted); if (r < 0) return r; - if (r > 0) - free_and_replace(new_keymap, converted); + if (r > 0) { + free(*new_keymap); + *new_keymap = converted; + } } return 0; @@ -810,8 +820,9 @@ static int x11_convert_to_vconsole(Context *c, sd_bus *bus) { } if (!streq_ptr(c->vc_keymap, new_keymap)) { - free_and_replace(&c->vc_keymap, new_keymap); - free_and_replace(&c->vc_keymap_toggle, NULL); + free(c->vc_keymap); + c->vc_keymap = new_keymap; + c->vc_keymap_toggle = mfree(c->vc_keymap_toggle); modified = true; } else free(new_keymap); @@ -955,6 +966,7 @@ static int method_set_locale(sd_bus_message *m, void *userdata, sd_bus_error *er m, CAP_SYS_ADMIN, "org.freedesktop.locale1.set-locale", + NULL, interactive, UID_INVALID, &c->polkit_registry, @@ -981,7 +993,7 @@ static int method_set_locale(sd_bus_message *m, void *userdata, sd_bus_error *er if (have[p]) continue; - free_and_replace(&c->locale[p], NULL); + c->locale[p] = mfree(c->locale[p]); } locale_simplify(c); @@ -1044,6 +1056,7 @@ static int method_set_vc_keyboard(sd_bus_message *m, void *userdata, sd_bus_erro m, CAP_SYS_ADMIN, "org.freedesktop.locale1.set-keyboard", + NULL, interactive, UID_INVALID, &c->polkit_registry, @@ -1087,6 +1100,7 @@ static int method_set_vc_keyboard(sd_bus_message *m, void *userdata, sd_bus_erro } #ifdef HAVE_XKBCOMMON +_printf_(3, 0) static void log_xkb(struct xkb_context *ctx, enum xkb_log_level lvl, const char *format, va_list args) { const char *fmt; @@ -1174,6 +1188,7 @@ static int method_set_x11_keyboard(sd_bus_message *m, void *userdata, sd_bus_err m, CAP_SYS_ADMIN, "org.freedesktop.locale1.set-keyboard", + NULL, interactive, UID_INVALID, &c->polkit_registry, |