summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2016-05-22 22:43:12 -0400
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2016-06-06 09:22:33 -0400
commit5ad327dda2b863697cf5cdc0b1724aed96c5397a (patch)
tree6c8f3ff0ad0010877bf726786fc68b1f0a8c4e29
parent6f3287b346fdcef4e1b5dd4aaeae1ee47e49e94d (diff)
localed: also report when we couldn't convert X11→console
Rework the code a bit where find_converted_keymap cannot (and should not) be called with a null layout, so streq can be used instead of streq_ptr, etc. Note that the behaviour of vconsole_convert_to_x11 and x11_convert_to_vconsole is not symmetrical. When the latter cannot find a match, it simply makes the vconsole mapping empty. But vconsole_convert_to_x11 leaves the x11 layout unchanged. I don't know what the proper solution is here, so I'm just adding more verbose logging without changing the logic.
-rw-r--r--src/locale/keymap-util.c19
-rw-r--r--src/locale/test-keymap-util.c4
2 files changed, 16 insertions, 7 deletions
diff --git a/src/locale/keymap-util.c b/src/locale/keymap-util.c
index b6cbf12c7e..fe29594ccc 100644
--- a/src/locale/keymap-util.c
+++ b/src/locale/keymap-util.c
@@ -35,9 +35,11 @@
#include "strv.h"
static bool startswith_comma(const char *s, const char *prefix) {
- const char *t;
+ s = startswith(s, prefix);
+ if (!s)
+ return false;
- return s && (t = startswith(s, prefix)) && (*t == ',');
+ return *s == ',';
}
static const char* strnulldash(const char *s) {
@@ -529,6 +531,8 @@ int find_legacy_keymap(Context *c, char **new_keymap) {
unsigned best_matching = 0;
int r;
+ assert(!isempty(c->x11_layout));
+
f = fopen(SYSTEMD_KBD_MODEL_MAP, "re");
if (!f)
return -errno;
@@ -544,7 +548,7 @@ int find_legacy_keymap(Context *c, char **new_keymap) {
break;
/* Determine how well matching this entry is */
- if (streq_ptr(c->x11_layout, a[1]))
+ if (streq(c->x11_layout, a[1]))
/* If we got an exact match, this is best */
matching = 10;
else {
@@ -611,7 +615,7 @@ int find_legacy_keymap(Context *c, char **new_keymap) {
}
}
- return 0;
+ return (bool) *new_keymap;
}
int find_language_fallback(const char *lang, char **language) {
@@ -648,7 +652,6 @@ int x11_convert_to_vconsole(Context *c) {
bool modified = false;
if (isempty(c->x11_layout)) {
-
modified =
!isempty(c->vc_keymap) ||
!isempty(c->vc_keymap_toggle);
@@ -666,6 +669,12 @@ int x11_convert_to_vconsole(Context *c) {
if (r < 0)
return r;
}
+ if (r == 0)
+ /* We search for layout-variant match first, but then we also look
+ * for anything which matches just the layout. So it's accurate to say
+ * that we couldn't find anything which matches the layout. */
+ log_notice("No conversion to virtual console map found for \"%s\".",
+ c->x11_layout);
if (!streq_ptr(c->vc_keymap, new_keymap)) {
free(c->vc_keymap);
diff --git a/src/locale/test-keymap-util.c b/src/locale/test-keymap-util.c
index 680aae6228..8dde764a50 100644
--- a/src/locale/test-keymap-util.c
+++ b/src/locale/test-keymap-util.c
@@ -84,11 +84,11 @@ static void test_find_legacy_keymap(void) {
assert_se(ans == NULL);
c.x11_layout = (char*) "pl";
- assert_se(find_legacy_keymap(&c, &ans) == 0); /* should this be 1? */
+ assert_se(find_legacy_keymap(&c, &ans) == 1);
assert_se(streq(ans, "pl2"));
c.x11_layout = (char*) "pl,ru";
- assert_se(find_legacy_keymap(&c, &ans2) == 0); /* should this be 1? */
+ assert_se(find_legacy_keymap(&c, &ans2) == 1);
assert_se(streq(ans, "pl2"));
}