chiark / gitweb /
use libexecdir, bindir, sbindir, switch to /usr/lib/udev in documentation
[elogind.git] / extras / keymap / keymap.c
index eabd1e44d823f768703cc74de0bb2a363b3c3280..fadd7a31d270043f3b793faf68afb80a05f1a961 100644 (file)
@@ -184,17 +184,9 @@ static void set_key(int fd, const char* scancode_str, const char* keyname)
                        scancode, k->id);
 }
 
-static int merge_table(int fd, const char *filename) {
+static int merge_table(int fd, FILE *f) {
        int r = 0;
        int line = 0;
-       FILE* f;
-
-       f = fopen(filename, "r");
-       if (!f) {
-               perror(filename);
-               r = -1;
-               goto fail;
-       }
 
        while (!feof(f)) {
                char s[256], *p;
@@ -243,20 +235,10 @@ static int merge_table(int fd, const char *filename) {
                                scancode, new_keycode, old_keycode);
        }
 fail:
+       fclose(f);
        return r;
 }
 
-static const char* default_keymap_path(const char* path)
-{
-       static char result[PATH_MAX];
-
-       /* If keymap file is given without a path, assume udev directory; must end with '/' * */
-       if (!strchr(path, '/')) {
-               snprintf(result, sizeof(result), "%s%s", LIBEXECDIR "/keymaps/", path);
-               return result;
-       }
-       return path;
-}
 
 /* read one event; return 1 if valid */
 static int read_event(int fd, struct input_event* ev)
@@ -424,7 +406,31 @@ int main(int argc, char **argv)
 
        /* two arguments (device, mapfile): set map file */
        if (argc == optind+2) {
-               merge_table(fd, default_keymap_path(argv[optind+1]));
+               const char *filearg = argv[optind+1];
+               if (strchr(filearg, '/')) {
+                       /* Keymap file argument is a path */
+                       FILE *f = fopen(filearg, "r");
+                       if (f)
+                               merge_table(fd, f);
+                       else
+                               perror(filearg);
+               } else {
+                       /* Keymap file argument is a filename */
+                       /* Open override file if present, otherwise default file */
+                       char keymap_path[PATH_MAX];
+                       snprintf(keymap_path, sizeof(keymap_path), "%s%s", SYSCONFDIR "/udev/keymaps/", filearg);
+                       FILE *f = fopen(keymap_path, "r");
+                       if (f) {
+                               merge_table(fd, f);
+                       } else {
+                               snprintf(keymap_path, sizeof(keymap_path), "%s%s", LIBEXECDIR "/keymaps/", filearg);
+                               f = fopen(keymap_path, "r");
+                               if (f)
+                                       merge_table(fd, f);
+                               else
+                                       perror(keymap_path);
+                       }
+               }
                return 0;
        }