summaryrefslogtreecommitdiff
path: root/src/locale/localed.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/locale/localed.c')
-rw-r--r--src/locale/localed.c97
1 files changed, 47 insertions, 50 deletions
diff --git a/src/locale/localed.c b/src/locale/localed.c
index b8f95b69a6..f851d35a08 100644
--- a/src/locale/localed.c
+++ b/src/locale/localed.c
@@ -19,31 +19,33 @@
#include "keymap-util.h"
#include "locale-util.h"
#include "macro.h"
+#include "main-func.h"
+#include "missing_capability.h"
#include "path-util.h"
#include "selinux-util.h"
+#include "signal-util.h"
#include "string-util.h"
#include "strv.h"
#include "user-util.h"
-static Hashmap *polkit_registry = NULL;
-
static int locale_update_system_manager(Context *c, sd_bus *bus) {
_cleanup_free_ char **l_unset = NULL;
_cleanup_strv_free_ char **l_set = NULL;
_cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
sd_bus_error error = SD_BUS_ERROR_NULL;
- unsigned c_set, c_unset, p;
+ size_t c_set, c_unset;
+ LocaleVariable p;
int r;
assert(bus);
l_unset = new0(char*, _VARIABLE_LC_MAX);
if (!l_unset)
- return -ENOMEM;
+ return log_oom();
l_set = new0(char*, _VARIABLE_LC_MAX);
if (!l_set)
- return -ENOMEM;
+ return log_oom();
for (p = 0, c_set = 0, c_unset = 0; p < _VARIABLE_LC_MAX; p++) {
const char *name;
@@ -56,8 +58,9 @@ static int locale_update_system_manager(Context *c, sd_bus *bus) {
else {
char *s;
- if (asprintf(&s, "%s=%s", name, c->locale[p]) < 0)
- return -ENOMEM;
+ s = strjoin(name, "=", c->locale[p]);
+ if (!s)
+ return log_oom();
l_set[c_unset++] = s;
}
@@ -70,19 +73,19 @@ static int locale_update_system_manager(Context *c, sd_bus *bus) {
"org.freedesktop.systemd1.Manager",
"UnsetAndSetEnvironment");
if (r < 0)
- return r;
+ return bus_log_create_error(r);
r = sd_bus_message_append_strv(m, l_unset);
if (r < 0)
- return r;
+ return bus_log_create_error(r);
r = sd_bus_message_append_strv(m, l_set);
if (r < 0)
- return r;
+ return bus_log_create_error(r);
r = sd_bus_call(bus, m, 0, &error, NULL);
if (r < 0)
- log_error_errno(r, "Failed to update the manager environment, ignoring: %m");
+ return log_error_errno(r, "Failed to update the manager environment: %s", bus_error_message(&error, r));
return 0;
}
@@ -103,8 +106,9 @@ static int vconsole_reload(sd_bus *bus) {
"ss", "systemd-vconsole-setup.service", "replace");
if (r < 0)
- log_error("Failed to issue method call: %s", bus_error_message(&error, -r));
- return r;
+ return log_error_errno(r, "Failed to issue method call: %s", bus_error_message(&error, r));
+
+ return 0;
}
static int vconsole_convert_to_x11_and_emit(Context *c, sd_bus_message *m) {
@@ -251,20 +255,13 @@ static int property_get_xkb(
return -EINVAL;
}
-static void locale_free(char ***l) {
- int p;
-
- for (p = 0; p < _VARIABLE_LC_MAX; p++)
- (*l)[p] = mfree((*l)[p]);
-}
-
static int method_set_locale(sd_bus_message *m, void *userdata, sd_bus_error *error) {
- Context *c = userdata;
+ _cleanup_(locale_variables_freep) char *new_locale[_VARIABLE_LC_MAX] = {};
_cleanup_strv_free_ char **settings = NULL, **l = NULL;
- char *new_locale[_VARIABLE_LC_MAX] = {}, **i;
- _cleanup_(locale_free) _unused_ char **dummy = new_locale;
+ Context *c = userdata;
bool modified = false;
int interactive, p, r;
+ char **i;
assert(m);
assert(c);
@@ -365,7 +362,7 @@ static int method_set_locale(sd_bus_message *m, void *userdata, sd_bus_error *er
NULL,
interactive,
UID_INVALID,
- &polkit_registry,
+ &c->polkit_registry,
error);
if (r < 0)
return r;
@@ -436,7 +433,7 @@ static int method_set_vc_keyboard(sd_bus_message *m, void *userdata, sd_bus_erro
NULL,
interactive,
UID_INVALID,
- &polkit_registry,
+ &c->polkit_registry,
error);
if (r < 0)
return r;
@@ -456,9 +453,7 @@ static int method_set_vc_keyboard(sd_bus_message *m, void *userdata, sd_bus_erro
log_info("Changed virtual console keymap to '%s' toggle '%s'",
strempty(c->vc_keymap), strempty(c->vc_keymap_toggle));
- r = vconsole_reload(sd_bus_message_get_bus(m));
- if (r < 0)
- log_error_errno(r, "Failed to request keymap reload: %m");
+ (void) vconsole_reload(sd_bus_message_get_bus(m));
(void) sd_bus_emit_properties_changed(
sd_bus_message_get_bus(m),
@@ -631,7 +626,7 @@ static int method_set_x11_keyboard(sd_bus_message *m, void *userdata, sd_bus_err
NULL,
interactive,
UID_INVALID,
- &polkit_registry,
+ &c->polkit_registry,
error);
if (r < 0)
return r;
@@ -715,8 +710,8 @@ static int connect_bus(Context *c, sd_event *event, sd_bus **_bus) {
return 0;
}
-int main(int argc, char *argv[]) {
- _cleanup_(context_free) Context context = {
+static int run(int argc, char *argv[]) {
+ _cleanup_(context_clear) Context context = {
.locale_mtime = USEC_INFINITY,
.vc_mtime = USEC_INFINITY,
.x11_mtime = USEC_INFINITY,
@@ -725,37 +720,39 @@ int main(int argc, char *argv[]) {
_cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
int r;
- log_set_target(LOG_TARGET_AUTO);
- log_parse_environment();
- log_open();
+ log_setup_service();
umask(0022);
mac_selinux_init();
- if (argc != 1) {
- log_error("This program takes no arguments.");
- r = -EINVAL;
- goto finish;
- }
+ if (argc != 1)
+ return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "This program takes no arguments.");
+
+ assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGTERM, SIGINT, -1) >= 0);
r = sd_event_default(&event);
- if (r < 0) {
- log_error_errno(r, "Failed to allocate event loop: %m");
- goto finish;
- }
+ if (r < 0)
+ return log_error_errno(r, "Failed to allocate event loop: %m");
- sd_event_set_watchdog(event, true);
+ (void) sd_event_set_watchdog(event, true);
+
+ r = sd_event_add_signal(event, NULL, SIGINT, NULL, NULL);
+ if (r < 0)
+ return log_error_errno(r, "Failed to install SIGINT handler: %m");
+
+ r = sd_event_add_signal(event, NULL, SIGTERM, NULL, NULL);
+ if (r < 0)
+ return log_error_errno(r, "Failed to install SIGTERM handler: %m");
r = connect_bus(&context, event, &bus);
if (r < 0)
- goto finish;
+ return r;
r = bus_event_loop_with_idle(event, bus, "org.freedesktop.locale1", DEFAULT_EXIT_USEC, NULL, NULL);
if (r < 0)
- log_error_errno(r, "Failed to run event loop: %m");
+ return log_error_errno(r, "Failed to run event loop: %m");
-finish:
- bus_verify_polkit_async_registry_free(polkit_registry);
-
- return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
+ return 0;
}
+
+DEFINE_MAIN_FUNCTION(run);