X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flocale%2Flocaled.c;h=3cac634a4c6f83dd21dffed9741afeae44e08b48;hb=b47d419c25ecc735615a1088060c1ec8bef1e41f;hp=bb2a3a2e5422cea56ac865052f836c80b1de11c4;hpb=9a9bb3ca1eddc8caa2d7aa3e6e27d270e296923f;p=elogind.git diff --git a/src/locale/localed.c b/src/locale/localed.c index bb2a3a2e5..3cac634a4 100644 --- a/src/locale/localed.c +++ b/src/locale/localed.c @@ -31,6 +31,10 @@ #include "dbus-common.h" #include "polkit.h" #include "def.h" +#include "env-util.h" +#include "fileio.h" +#include "fileio-label.h" +#include "label.h" #define INTERFACE \ " \n" \ @@ -114,21 +118,7 @@ static const char * const names[_PROP_MAX] = { [PROP_LC_IDENTIFICATION] = "LC_IDENTIFICATION" }; -static char *data[_PROP_MAX] = { - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL -}; +static char *data[_PROP_MAX] = {}; typedef struct State { char *x11_layout, *x11_model, *x11_variant, *x11_options; @@ -351,7 +341,7 @@ static int write_data_locale(void) { int r, p; char **l = NULL; - r = load_env_file("/etc/locale.conf", &l); + r = load_env_file("/etc/locale.conf", NULL, &l); if (r < 0 && r != -ENOENT) return r; @@ -389,7 +379,7 @@ static int write_data_locale(void) { return 0; } - r = write_env_file("/etc/locale.conf", l); + r = write_env_file_label("/etc/locale.conf", l); strv_free(l); return r; @@ -490,7 +480,7 @@ static int write_data_vconsole(void) { int r; char **l = NULL; - r = load_env_file("/etc/vconsole.conf", &l); + r = load_env_file("/etc/vconsole.conf", NULL, &l); if (r < 0 && r != -ENOENT) return r; @@ -545,7 +535,7 @@ static int write_data_vconsole(void) { return 0; } - r = write_env_file("/etc/vconsole.conf", l); + r = write_env_file_label("/etc/vconsole.conf", l); strv_free(l); return r; @@ -815,7 +805,7 @@ static int convert_x11_to_vconsole(DBusConnection *connection) { free_data_x11(); } else { - FILE *f; + _cleanup_fclose_ FILE *f; unsigned n = 0; unsigned best_matching = 0; char *new_keymap = NULL; @@ -825,16 +815,13 @@ static int convert_x11_to_vconsole(DBusConnection *connection) { return -errno; for (;;) { - char **a; + _cleanup_strv_free_ char **a = NULL; unsigned matching = 0; int r; r = read_next_mapping(f, &n, &a); - if (r < 0) { - fclose(f); + if (r < 0) return r; - } - if (r == 0) break; @@ -853,7 +840,7 @@ static int convert_x11_to_vconsole(DBusConnection *connection) { * layout stripped off. */ if (x > 0 && strlen(a[1]) == x && - strncmp(state.x11_layout, a[1], x) == 0) + strneq(state.x11_layout, a[1], x)) matching = 5; else { size_t w; @@ -889,19 +876,11 @@ static int convert_x11_to_vconsole(DBusConnection *connection) { free(new_keymap); new_keymap = strdup(a[0]); - - if (!new_keymap) { - strv_free(a); - fclose(f); + if (!new_keymap) return -ENOMEM; - } } - - strv_free(a); } - fclose(f); - if (!streq_ptr(state.vc_keymap, new_keymap)) { free(state.vc_keymap); state.vc_keymap = new_keymap; @@ -916,7 +895,8 @@ static int convert_x11_to_vconsole(DBusConnection *connection) { if (modified) { dbus_bool_t b; - DBusMessage *changed; + + _cleanup_dbus_message_unref_ DBusMessage *changed = NULL; int r; r = write_data_vconsole(); @@ -928,13 +908,10 @@ static int convert_x11_to_vconsole(DBusConnection *connection) { "org.freedesktop.locale1", "VConsoleKeymap\0" "VConsoleKeymapToggle\0"); - if (!changed) return -ENOMEM; b = dbus_connection_send(connection, changed, NULL); - dbus_message_unref(changed); - if (!b) return -ENOMEM; @@ -945,31 +922,26 @@ static int convert_x11_to_vconsole(DBusConnection *connection) { } static int append_locale(DBusMessageIter *i, const char *property, void *userdata) { - int r, c = 0, p; - char **l; + int c, p; + _cleanup_strv_free_ char **l = NULL; l = new0(char*, _PROP_MAX+1); if (!l) return -ENOMEM; - for (p = 0; p < _PROP_MAX; p++) { + for (p = 0, c = 0; p < _PROP_MAX; p++) { char *t; if (isempty(data[p])) continue; - if (asprintf(&t, "%s=%s", names[p], data[p]) < 0) { - strv_free(l); + if (asprintf(&t, "%s=%s", names[p], data[p]) < 0) return -ENOMEM; - } l[c++] = t; } - r = bus_property_append_strv(i, property, (void*) l); - strv_free(l); - - return r; + return bus_property_append_strv(i, property, (void*) l); } static const BusProperty bus_locale_properties[] = { @@ -1007,7 +979,7 @@ static DBusHandlerResult locale_message_handler( dbus_bool_t interactive; DBusMessageIter iter; bool modified = false; - bool passed[_PROP_MAX]; + bool passed[_PROP_MAX] = {}; int p; if (!dbus_message_iter_init(message, &iter)) @@ -1029,8 +1001,6 @@ static DBusHandlerResult locale_message_handler( dbus_message_iter_get_basic(&iter, &interactive); - zero(passed); - /* Check whether a variable changed and if so valid */ STRV_FOREACH(i, l) { bool valid = false; @@ -1273,7 +1243,7 @@ static DBusHandlerResult locale_message_handler( if (!(reply = dbus_message_new_method_return(message))) goto oom; - if (!dbus_connection_send(connection, reply, NULL)) + if (!bus_maybe_send_reply(connection, message, reply)) goto oom; dbus_message_unref(reply); @@ -1363,7 +1333,7 @@ int main(int argc, char *argv[]) { log_set_target(LOG_TARGET_AUTO); log_parse_environment(); log_open(); - + label_init("/etc"); umask(0022); if (argc == 2 && streq(argv[1], "--introspect")) {