El 12/04/13 13:53, Stanislav Brabec escribió:
Add support for setting of initial state of NumLock. Supported values
are "yes", "no" and "bios" (on x86 platforms).

It sets NumLock in virtual consoles. If NumLock should be turned on, it
also creates empty /run/numlock-on, which can be used e. g. for setting
of X session default.

This ports a feature that exists for a long time in SUSE to systemd.



Please apply the attached patch on top of this one.



>From ae8b7d5c34c8301e60fc4b8617de4acac038c914 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Cristian=20Rodr=C3=ADguez?= <[email protected]>
Date: Fri, 12 Apr 2013 19:32:47 -0300
Subject: [PATCH] Add error reporting and cleanup to kdb numlock patch.

- Ensure we catch errors reading /dev/mem
- declaration of fd "shadows" previous fd.
- free vc_kbd_numlock too.
---
 src/vconsole/vconsole-setup.c | 33 +++++++++++++++++++++++++--------
 1 file changed, 25 insertions(+), 8 deletions(-)

diff --git a/src/vconsole/vconsole-setup.c b/src/vconsole/vconsole-setup.c
index 1115985..8e2c378 100644
--- a/src/vconsole/vconsole-setup.c
+++ b/src/vconsole/vconsole-setup.c
@@ -285,19 +285,35 @@ int main(int argc, char **argv) {
         }
 
 #if defined(__i386__) || defined(__x86_64__)
-        if (vc_kbd_numlock && strcasecmp(vc_kbd_numlock, "bios") == 0) {
-                 int fd;
+        if (vc_kbd_numlock && strcaseeq(vc_kbd_numlock, "bios")) {
+                 int _cleanup_close_ fdmem;
                  char c;
 
-                 fd = open ("/dev/mem", O_RDONLY);
-                 lseek (fd, BIOS_DATA_AREA + BDA_KEYBOARD_STATUS_FLAGS_4, SEEK_SET);
-                 read (fd, &c, sizeof(char));
+                 fdmem = open ("/dev/mem", O_RDONLY);
+
+                 if(fdmem < 0) {
+                     r = EXIT_FAILURE;
+                     log_error("Failed to open /dev/mem: %m");
+                     goto finish;
+                 }
+
+                 if(lseek(fdmem, BIOS_DATA_AREA + BDA_KEYBOARD_STATUS_FLAGS_4, SEEK_SET) == (off_t) -1) {
+                    r = EXIT_FAILURE;
+                    log_error("Failed to seek /dev/mem: %m");
+                    goto finish;
+                 }
+
+                 if(read (fdmem, &c, sizeof(char)) == -1) {
+                    r = EXIT_FAILURE;
+                    log_error("Failed to read /dev/mem: %m");
+                    goto finish;
+                 }
+
                  if (c & BDA_KSF4_NUMLOCK_MASK)
                          numlock = true;
-                 close(fd);
         } else
 #endif
-                 numlock = vc_kbd_numlock && strcasecmp(vc_kbd_numlock, "yes") == 0;
+                 numlock = vc_kbd_numlock && strcaseeq(vc_kbd_numlock, "yes");
         if (utf8)
                 enable_utf8(fd);
         else
@@ -312,7 +328,7 @@ finish:
         if (keymap_pid > 0)
                 wait_for_terminate_and_warn(KBD_LOADKEYS, keymap_pid);
         if (numlock)
-                close(open("/run/numlock-on", O_WRONLY|O_CREAT, 0644));
+                touch("/run/numlock-on");
         else
                 unlink("/run/numlock-on");
 
@@ -326,6 +342,7 @@ finish:
         free(vc_font);
         free(vc_font_map);
         free(vc_font_unimap);
+        free(vc_kbd_numlock);
 
         if (fd >= 0)
                 close_nointr_nofail(fd);
-- 
1.8.1.4

_______________________________________________
systemd-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/systemd-devel

Reply via email to