We cannot assume terminal is in UTF-8 (actually, unless
setup by initrd it likely is not). Properly set requested
mode. This avoids errors similar to

sh-4.1# /lib/systemd/systemd-vconsole-setup
Failed to open syslog for logging: No such file or directory
loadkeys: warning: loading Unicode keymap on non-Unicode console
    (perhaps you want to do `kbd_mode -u'?)

and broken fonts.

Signed-off-by: Andrey Borzenkov <[email protected]>

---
 src/vconsole-setup.c |   25 ++++++++++++++++---------
 1 files changed, 16 insertions(+), 9 deletions(-)

diff --git a/src/vconsole-setup.c b/src/vconsole-setup.c
index 7703361..af7f37d 100644
--- a/src/vconsole-setup.c
+++ b/src/vconsole-setup.c
@@ -60,20 +60,28 @@ static bool is_locale_utf8(void) {
         return streq(set, "UTF-8");
 }
 
-static int disable_utf8(int fd) {
+static int set_utf8(int fd, bool utf8) {
         int r = 0, k;
 
-        if (ioctl(fd, KDSKBMODE, K_XLATE) < 0)
-                r = -errno;
+       if (utf8) {
+               if (ioctl(fd, KDSKBMODE, K_UNICODE) < 0)
+                       r = -errno;
 
-        if (loop_write(fd, "\033%@", 3, false) < 0)
-                r = -errno;
+               if (loop_write(fd, "\033%G", 3, false) < 0)
+                       r = -errno;
+       } else {
+               if (ioctl(fd, KDSKBMODE, K_XLATE) < 0)
+                       r = -errno;
 
-        if ((k = write_one_line_file("/sys/module/vt/parameters/default_utf8", 
"0")) < 0)
+               if (loop_write(fd, "\033%@", 3, false) < 0)
+                       r = -errno;
+       }
+
+        if ((k = write_one_line_file("/sys/module/vt/parameters/default_utf8", 
utf8 ? "1" : "0")) < 0)
                 r = k;
 
         if (r < 0)
-                log_warning("Failed to disable UTF-8: %s", strerror(errno));
+                log_warning("Failed to %s UTF-8: %s", utf8 ? "enable" : 
"disable", strerror(errno));
 
         return r;
 }
@@ -322,8 +330,7 @@ int main(int argc, char **argv) {
                 goto finish;
         }
 
-        if (!utf8)
-                disable_utf8(fd);
+       set_utf8(fd, utf8);
 
         if (load_keymap(vc, vc_keymap, utf8, &keymap_pid) >= 0 &&
             load_font(vc, vc_font, vc_font_map, vc_font_unimap, &font_pid) >= 
0)
-- 
tg: (4149f86..) upstream/kbd-utf8 (depends on: master)
_______________________________________________
systemd-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/systemd-devel

Reply via email to