]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
locale: split out checking existence of keymap
authorYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 1 Feb 2023 16:50:37 +0000 (01:50 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Sat, 25 Mar 2023 06:24:08 +0000 (15:24 +0900)
No functional change, preparation for later commits.

src/locale/localed-util.c
src/locale/localed-util.h
src/locale/localed.c

index f78704bb4b7375f021927f97eaaad1375d4f2c8a..f955a74a8a931e6020bbcb1f1eda2a28894414a5 100644 (file)
@@ -224,6 +224,46 @@ int vc_context_copy(VCContext *dest, const VCContext *src) {
         return modified;
 }
 
+static int verify_keymap(const char *keymap, int log_level, sd_bus_error *error) {
+        int r;
+
+        assert(keymap);
+
+        r = keymap_exists(keymap); /* This also verifies that the keymap name is kosher. */
+        if (r < 0) {
+                if (error)
+                        sd_bus_error_set_errnof(error, r, "Failed to check keymap %s: %m", keymap);
+                return log_full_errno(log_level, r, "Failed to check keymap %s: %m", keymap);
+        }
+        if (r == 0) {
+                if (error)
+                        sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Keymap %s is not installed.", keymap);
+                return log_full_errno(log_level, SYNTHETIC_ERRNO(ENOENT), "Keymap %s is not installed.", keymap);
+        }
+
+        return 0;
+}
+
+int vc_context_verify_and_warn(const VCContext *vc, int log_level, sd_bus_error *error) {
+        int r;
+
+        assert(vc);
+
+        if (vc->keymap) {
+                r = verify_keymap(vc->keymap, log_level, error);
+                if (r < 0)
+                        return r;
+        }
+
+        if (vc->toggle) {
+                r = verify_keymap(vc->toggle, log_level, error);
+                if (r < 0)
+                        return r;
+        }
+
+        return 0;
+}
+
 void context_clear(Context *c) {
         assert(c);
 
index 83d253c18d9e55ee46cf46800fa64a94bbf094c1..4ddc5609918d8086b7e8346e46ce16db883ddf23 100644 (file)
@@ -52,6 +52,10 @@ bool vc_context_isempty(const VCContext *vc);
 void vc_context_empty_to_null(VCContext *vc);
 bool vc_context_equal(const VCContext *a, const VCContext *b);
 int vc_context_copy(VCContext *dest, const VCContext *src);
+int vc_context_verify_and_warn(const VCContext *vc, int log_level, sd_bus_error *error);
+static inline int vc_context_verify(const VCContext *vc) {
+        return vc_context_verify_and_warn(vc, LOG_DEBUG, NULL);
+}
 
 int find_converted_keymap(const X11Context *xc, char **ret);
 int find_legacy_keymap(const X11Context *xc, char **ret);
index ec5b78a19060df2b3e9b9554383744b59b709458..e6e239d9bd3ea2f24f13a51ae68caab7c33436c6 100644 (file)
@@ -378,15 +378,9 @@ static int method_set_vc_keyboard(sd_bus_message *m, void *userdata, sd_bus_erro
 
         vc_context_empty_to_null(&in);
 
-        FOREACH_STRING(name, in.keymap ?: in.toggle, in.keymap ? in.toggle : NULL) {
-                r = keymap_exists(name); /* This also verifies that the keymap name is kosher. */
-                if (r < 0) {
-                        log_error_errno(r, "Failed to check keymap %s: %m", name);
-                        return sd_bus_error_set_errnof(error, r, "Failed to check keymap %s: %m", name);
-                }
-                if (r == 0)
-                        return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Keymap %s is not installed.", name);
-        }
+        r = vc_context_verify_and_warn(&in, LOG_ERR, error);
+        if (r < 0)
+                return r;
 
         r = vconsole_read_data(c, m);
         if (r < 0) {