chiark / gitweb /
keymap: Tolerate invalid entries in keymaps
[elogind.git] / src / udev / keymap / keymap.c
index 051aa42552f2e8428349ff12aab27c7219d14c7d..0db56d26ad99a7dec01587dc1b8436f399d3f7be 100644 (file)
@@ -40,6 +40,7 @@ const struct key* lookup_key (const char *str, unsigned int len);
 
 #include "keys-from-name.h"
 #include "keys-to-name.h"
+#include "macro.h"
 #include "util.h"
 
 #define MAX_SCANCODES 1024
@@ -61,28 +62,28 @@ static int evdev_open(const char *dev)
         return fd;
 }
 
-static int evdev_get_keycode(int fd, int scancode, int e)
+static int evdev_get_keycode(int fd, unsigned scancode, int e)
 {
-        int codes[2];
+        unsigned codes[2];
 
         codes[0] = scancode;
         if (ioctl(fd, EVIOCGKEYCODE, codes) < 0) {
                 if (e && errno == EINVAL) {
                         return -2;
                 } else {
-                        fprintf(stderr, "EVIOCGKEYCODE: %m\n");
+                        fprintf(stderr, "EVIOCGKEYCODE for scan code 0x%x: %m\n", scancode);
                         return -1;
                 }
         }
         return codes[1];
 }
 
-static int evdev_set_keycode(int fd, int scancode, int keycode)
+static int evdev_set_keycode(int fd, unsigned scancode, int keycode)
 {
-        int codes[2];
+        unsigned codes[2];
 
         codes[0] = scancode;
-        codes[1] = keycode;
+        codes[1] = (unsigned) keycode;
 
         if (ioctl(fd, EVIOCSKEYCODE, codes) < 0) {
                 fprintf(stderr, "EVIOCSKEYCODE: %m\n");
@@ -127,7 +128,8 @@ static const char* format_keyname(const char* key) {
 
 static int dump_table(int fd) {
         char version[256], name[256];
-        int scancode, r = -1;
+        unsigned scancode;
+        int r = -1;
 
         if (evdev_driver_version(fd, version, sizeof(version)) < 0)
                 goto fail;
@@ -191,7 +193,8 @@ static int merge_table(int fd, FILE *f) {
 
         while (!feof(f)) {
                 char s[256], *p;
-                int scancode, new_keycode, old_keycode;
+                unsigned scancode;
+                int new_keycode, old_keycode;
 
                 if (!fgets(s, sizeof(s), f))
                         break;
@@ -223,19 +226,19 @@ static int merge_table(int fd, FILE *f) {
 
                 if ((old_keycode = evdev_get_keycode(fd, scancode, 0)) < 0) {
                         r = -1;
-                        goto fail;
+                        continue;
                 }
 
                 if (evdev_set_keycode(fd, scancode, new_keycode) < 0) {
                         r = -1;
-                        goto fail;
+                        continue;
                 }
 
                 if (new_keycode != old_keycode)
                         fprintf(stderr, "Remapped scancode 0x%02x to 0x%02x (prior: 0x%02x)\n",
                                 scancode, new_keycode, old_keycode);
         }
-fail:
+
         fclose(f);
         return r;
 }
@@ -259,7 +262,7 @@ static int read_event(int fd, struct input_event* ev)
         return 1;
 }
 
-static void print_key(uint32_t scancode, uint16_t keycode, int has_scan, int has_key)
+static void print_key(unsigned scancode, uint16_t keycode, int has_scan, int has_key)
 {
         const char *keyname;
 
@@ -288,7 +291,7 @@ static void print_key(uint32_t scancode, uint16_t keycode, int has_scan, int has
 static void interactive(int fd)
 {
         struct input_event ev;
-        uint32_t last_scan = 0;
+        unsigned last_scan = 0;
         uint16_t last_key = 0;
         int has_scan; /* boolean */
         int has_key; /* 0: none, 1: release, 2: press */
@@ -346,7 +349,7 @@ static void interactive(int fd)
         ioctl(fd, EVIOCGRAB, 0);
 }
 
-static void help(int error)
+_noreturn_ static void help(int error)
 {
         const char* h = "Usage: keymap <event device> [<map file>]\n"
                         "       keymap <event device> scancode keyname [...]\n"