summaryrefslogtreecommitdiff
path: root/src/locale
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2023-02-02 01:50:37 +0900
committerYu Watanabe <watanabe.yu+github@gmail.com>2023-03-25 15:24:08 +0900
commit384f22e39f563d15e5902ec23a342ef52d044169 (patch)
tree48f9ade80c30e427a9af666366ee7bd076bc45dd /src/locale
parent3017b9b1a6d8b55568cdaf83fafb78065ecd51fc (diff)
downloadsystemd-384f22e39f563d15e5902ec23a342ef52d044169.tar.gz
locale: split out checking existence of keymap
No functional change, preparation for later commits.
Diffstat (limited to 'src/locale')
-rw-r--r--src/locale/localed-util.c40
-rw-r--r--src/locale/localed-util.h4
-rw-r--r--src/locale/localed.c12
3 files changed, 47 insertions, 9 deletions
diff --git a/src/locale/localed-util.c b/src/locale/localed-util.c
index f78704bb4b..f955a74a8a 100644
--- a/src/locale/localed-util.c
+++ b/src/locale/localed-util.c
@@ -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);
diff --git a/src/locale/localed-util.h b/src/locale/localed-util.h
index 83d253c18d..4ddc560991 100644
--- a/src/locale/localed-util.h
+++ b/src/locale/localed-util.h
@@ -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);
diff --git a/src/locale/localed.c b/src/locale/localed.c
index ec5b78a190..e6e239d9bd 100644
--- a/src/locale/localed.c
+++ b/src/locale/localed.c
@@ -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) {