Add functions to load data from the kernel
authorAlexey Gladkov <gladkov.alexey@gmail.com>
Thu, 3 Jan 2013 00:33:00 +0000 (04:33 +0400)
committerAlexey Gladkov <gladkov.alexey@gmail.com>
Thu, 3 Jan 2013 00:33:00 +0000 (04:33 +0400)
Signed-off-by: Alexey Gladkov <gladkov.alexey@gmail.com>
src/libkeymap/findfile.h
src/libkeymap/keymap.h
src/libkeymap/keymapP.h
src/libkeymap/load.c [new file with mode: 0644]
src/libkeymap/parse.y

index f1663eb..dbfa903 100644 (file)
@@ -1,6 +1,7 @@
 #ifndef _FINDFILE_H
 #define _FINDFILE_H
 
+#include <stdio.h>
 #include <sys/param.h>
 
 typedef struct lkfile {
index 7e79ebe..d4f0f43 100644 (file)
@@ -94,6 +94,9 @@ int keymap_init(struct keymap *km);
 void keymap_free(struct keymap *kmap);
 int parse_keymap(struct keymap *kmap, lkfile_t *f);
 
+int get_keys(struct keymap *kmap, int console);
+int get_funcs(struct keymap *kmap, int console);
+
 int loadkeys(struct keymap *kmap, int fd, int kbd_mode);
 int dump_bkeymap(struct keymap *kmap);
 int dump_ctable(struct keymap *kmap, FILE *fd);
index 9e88343..539c4b2 100644 (file)
@@ -12,4 +12,7 @@ char *mk_mapname(char modifier);
 void outchar(FILE *fd, unsigned char c, int comma);
 void dumpchar(FILE *fd, unsigned char c, int comma);
 
+int addkey(struct keymap *kmap, int k_index, int k_table, int keycode);
+int addfunc(struct keymap *kmap, struct kbsentry kbs);
+
 #endif /* LK_KEYMAP_PRIVATE_H */
diff --git a/src/libkeymap/load.c b/src/libkeymap/load.c
new file mode 100644 (file)
index 0000000..5533ffe
--- /dev/null
@@ -0,0 +1,70 @@
+/* load.c
+ *
+ * This file is part of kbd project.
+ * Copyright (C) 2012  Alexey Gladkov <gladkov.alexey@gmail.com>
+ *
+ * This file is covered by the GNU General Public License,
+ * which should be included with kbd as the file COPYING.
+ */
+#include <string.h>
+#include <errno.h>
+
+#include <sys/ioctl.h>
+
+#include "../nls.h"
+#include "keymap.h"
+#include "keymapP.h"
+
+int
+get_keys(struct keymap *kmap, int fd)
+{
+       int i, t;
+       struct kbentry ke;
+
+       for (t = 0; t < MAX_NR_KEYMAPS; t++) {
+               for (i = 0; i < NR_KEYS; i++) {
+                       ke.kb_table = t;
+                       ke.kb_index = i;
+                       ke.kb_value = 0;
+
+                       if (ioctl(fd, KDGKBENT, (unsigned long) &ke)) {
+                               log_error(kmap, _("KDGKBENT: %s: error at index %d in table %d"),
+                                       strerror(errno), i, t);
+                               return -1;
+                       }
+
+                       if (addkey(kmap, i, t, ke.kb_value) < 0)
+                               return -1;
+               }
+       }
+
+       if (do_constant(kmap) < 0)
+               return -1;
+
+       return 0;
+}
+
+int
+get_funcs(struct keymap *kmap, int fd)
+{
+       int i;
+       struct kbsentry kbs;
+
+       for (i = 0; i < MAX_NR_FUNC; i++) {
+               kbs.kb_func = i;
+
+               if (ioctl(fd, KDGKBSENT, (unsigned long) &kbs)) {
+                       log_error(kmap, _("KDGKBSENT: %s: Unable to get function key string"),
+                               strerror(errno));
+                       return -1;
+               }
+
+               if (!strlen(kbs.kb_string))
+                       continue;
+
+               if (addfunc(kmap, kbs) < 0)
+                       return -1;
+       }
+
+       return 0;
+}
index ca3fe19..bad2e1b 100644 (file)
@@ -165,7 +165,7 @@ killkey(struct keymap *kmap, int k_index, int k_table)
        return 0;
 }
 
-static int
+int
 addkey(struct keymap *kmap, int k_index, int k_table, int keycode)
 {
        int i;
@@ -239,7 +239,7 @@ addkey(struct keymap *kmap, int k_index, int k_table, int keycode)
        return 0;
 }
 
-static int
+int
 addfunc(struct keymap *kmap, struct kbsentry kbs)
 {
        int x;