chiark / gitweb /
Modernization
[elogind.git] / src / locale / localed.c
index bb2a3a2e5422cea56ac865052f836c80b1de11c4..3cac634a4c6f83dd21dffed9741afeae44e08b48 100644 (file)
 #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                                                       \
         " <interface name=\"org.freedesktop.locale1\">\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")) {