]> mj.ucw.cz Git - misc.git/commitdiff
Spionovatko
authorMartin Mares <mj@ucw.cz>
Sat, 31 Oct 2009 21:34:49 +0000 (22:34 +0100)
committerMartin Mares <mj@ucw.cz>
Sat, 31 Oct 2009 21:34:49 +0000 (22:34 +0100)
spy/Makefile [new file with mode: 0644]
spy/keyspy.c [new file with mode: 0644]
spy/keytab.h [new file with mode: 0644]
spy/mkkeytab.sh [new file with mode: 0755]

diff --git a/spy/Makefile b/spy/Makefile
new file mode 100644 (file)
index 0000000..e03c74a
--- /dev/null
@@ -0,0 +1,10 @@
+CC=gcc
+LD=gcc
+CFLAGS=-O2 -Wall -W -Wno-parentheses -Wstrict-prototypes -Wmissing-prototypes -Wundef -Wredundant-decls -std=gnu99
+
+all: keyspy
+
+keyspy.o: keyspy.c keytab.h
+
+clean:
+       rm -f `find . -name "*~" -or -name "*.[oa]" -or -name "\#*\#" -or -name TAGS -or -name core -or -name .depend -or -name .#*`
diff --git a/spy/keyspy.c b/spy/keyspy.c
new file mode 100644 (file)
index 0000000..6ae4d8d
--- /dev/null
@@ -0,0 +1,106 @@
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <inttypes.h>
+#include <sys/time.h>
+#include <linux/input.h>
+
+struct spy_event {
+  uint16_t delta_ms;
+  uint16_t key;                        // bit 15: 0=press, 1=release
+};
+
+static void __attribute__((noreturn)) __attribute__((format(printf,1,2))) die(char *fmt, ...)
+{
+  va_list args;
+  va_start(args, fmt);
+  fprintf(stderr, "keyspy: ");
+  vfprintf(stderr, fmt, args);
+  exit(1);
+}
+
+static void record(char *logname)
+{
+  int evfd = open("/dev/input/by-path/platform-i8042-serio-0-event-kbd", O_RDONLY);
+  if (evfd < 0)
+    die("Cannot open event device: %m\n");
+
+  int spyfd = open(logname, O_WRONLY | O_CREAT | O_APPEND, 0600);
+  if (spyfd < 0)
+    die("Cannot open spy log %s: %m\n", logname);
+
+  int64_t last_t = 0;
+  for (;;)
+    {
+      struct input_event ev;
+      if (read(evfd, &ev, sizeof(ev)) != sizeof(ev))
+       die("Error reading event device: %m\n");
+      printf("type=%04x code=%04x value=%08x\n", ev.type, ev.code, ev.value);
+      if (ev.type == EV_KEY)
+       {
+         struct spy_event se;
+         int64_t t = (uint64_t) ev.time.tv_sec * 1000 + ev.time.tv_usec / 1000;
+         int64_t dt = t - last_t;
+         if (dt < 0)
+           dt = 0;
+         else if (dt > 0xffff)
+           dt = 0xffff;
+         last_t = t;
+         se.delta_ms = dt;
+         se.key = (ev.code < 0x8000 ? ev.code : 0x7fff);
+         if (!ev.value)
+           se.key |= 0x8000;
+         if (write(spyfd, &se, sizeof(se)) != sizeof(se))
+           die("Error writing spy log: %m\n");
+       }
+    }
+}
+
+const char *key_names[] = {
+#include "keytab.h"
+};
+
+static void show(char *logname)
+{
+  FILE *f = fopen(logname, "r");
+  if (!f)
+    die("Cannot read log: %m\n");
+  struct spy_event se;
+  while (fread(&se, sizeof(se), 1, f))
+    {
+      if (se.delta_ms == 0xffff)
+       printf("----- ");
+      else
+       printf("%5d ", se.delta_ms);
+      printf("%c ", (se.key & 0x8000 ? '-' : '+'));
+      unsigned k = se.key & 0x7fff;
+      if (k < sizeof(key_names) / sizeof(key_names[0]) && key_names[k])
+       printf("%s\n", key_names[k]);
+      else
+       printf("#%04x\n", k);
+    }
+}
+
+static void usage(void)
+{
+  fprintf(stderr, "\
+Usage: keyspy record <logfile>\n\
+   or: keyspy show <logfile>\n\
+");
+  exit(1);
+}
+
+int main(int argc, char **argv)
+{
+  if (argc != 3)
+    usage();
+  if (!strcmp(argv[1], "record"))
+    record(argv[2]);
+  else if (!strcmp(argv[1], "show"))
+    show(argv[2]);
+  else
+    usage();
+}
diff --git a/spy/keytab.h b/spy/keytab.h
new file mode 100644 (file)
index 0000000..7f0ddd4
--- /dev/null
@@ -0,0 +1,362 @@
+[KEY_RESERVED] = "RESERVED",
+[KEY_ESC] = "ESC",
+[KEY_1] = "1",
+[KEY_2] = "2",
+[KEY_3] = "3",
+[KEY_4] = "4",
+[KEY_5] = "5",
+[KEY_6] = "6",
+[KEY_7] = "7",
+[KEY_8] = "8",
+[KEY_9] = "9",
+[KEY_0] = "0",
+[KEY_MINUS] = "MINUS",
+[KEY_EQUAL] = "EQUAL",
+[KEY_BACKSPACE] = "BACKSPACE",
+[KEY_TAB] = "TAB",
+[KEY_Q] = "Q",
+[KEY_W] = "W",
+[KEY_E] = "E",
+[KEY_R] = "R",
+[KEY_T] = "T",
+[KEY_Y] = "Y",
+[KEY_U] = "U",
+[KEY_I] = "I",
+[KEY_O] = "O",
+[KEY_P] = "P",
+[KEY_LEFTBRACE] = "LEFTBRACE",
+[KEY_RIGHTBRACE] = "RIGHTBRACE",
+[KEY_ENTER] = "ENTER",
+[KEY_LEFTCTRL] = "LEFTCTRL",
+[KEY_A] = "A",
+[KEY_S] = "S",
+[KEY_D] = "D",
+[KEY_F] = "F",
+[KEY_G] = "G",
+[KEY_H] = "H",
+[KEY_J] = "J",
+[KEY_K] = "K",
+[KEY_L] = "L",
+[KEY_SEMICOLON] = "SEMICOLON",
+[KEY_APOSTROPHE] = "APOSTROPHE",
+[KEY_GRAVE] = "GRAVE",
+[KEY_LEFTSHIFT] = "LEFTSHIFT",
+[KEY_BACKSLASH] = "BACKSLASH",
+[KEY_Z] = "Z",
+[KEY_X] = "X",
+[KEY_C] = "C",
+[KEY_V] = "V",
+[KEY_B] = "B",
+[KEY_N] = "N",
+[KEY_M] = "M",
+[KEY_COMMA] = "COMMA",
+[KEY_DOT] = "DOT",
+[KEY_SLASH] = "SLASH",
+[KEY_RIGHTSHIFT] = "RIGHTSHIFT",
+[KEY_KPASTERISK] = "KPASTERISK",
+[KEY_LEFTALT] = "LEFTALT",
+[KEY_SPACE] = "SPACE",
+[KEY_CAPSLOCK] = "CAPSLOCK",
+[KEY_F1] = "F1",
+[KEY_F2] = "F2",
+[KEY_F3] = "F3",
+[KEY_F4] = "F4",
+[KEY_F5] = "F5",
+[KEY_F6] = "F6",
+[KEY_F7] = "F7",
+[KEY_F8] = "F8",
+[KEY_F9] = "F9",
+[KEY_F10] = "F10",
+[KEY_NUMLOCK] = "NUMLOCK",
+[KEY_SCROLLLOCK] = "SCROLLLOCK",
+[KEY_KP7] = "KP7",
+[KEY_KP8] = "KP8",
+[KEY_KP9] = "KP9",
+[KEY_KPMINUS] = "KPMINUS",
+[KEY_KP4] = "KP4",
+[KEY_KP5] = "KP5",
+[KEY_KP6] = "KP6",
+[KEY_KPPLUS] = "KPPLUS",
+[KEY_KP1] = "KP1",
+[KEY_KP2] = "KP2",
+[KEY_KP3] = "KP3",
+[KEY_KP0] = "KP0",
+[KEY_KPDOT] = "KPDOT",
+[KEY_ZENKAKUHANKAKU] = "ZENKAKUHANKAKU",
+[KEY_102ND] = "102ND",
+[KEY_F11] = "F11",
+[KEY_F12] = "F12",
+[KEY_RO] = "RO",
+[KEY_KATAKANA] = "KATAKANA",
+[KEY_HIRAGANA] = "HIRAGANA",
+[KEY_HENKAN] = "HENKAN",
+[KEY_KATAKANAHIRAGANA] = "KATAKANAHIRAGANA",
+[KEY_MUHENKAN] = "MUHENKAN",
+[KEY_KPJPCOMMA] = "KPJPCOMMA",
+[KEY_KPENTER] = "KPENTER",
+[KEY_RIGHTCTRL] = "RIGHTCTRL",
+[KEY_KPSLASH] = "KPSLASH",
+[KEY_SYSRQ] = "SYSRQ",
+[KEY_RIGHTALT] = "RIGHTALT",
+[KEY_LINEFEED] = "LINEFEED",
+[KEY_HOME] = "HOME",
+[KEY_UP] = "UP",
+[KEY_PAGEUP] = "PAGEUP",
+[KEY_LEFT] = "LEFT",
+[KEY_RIGHT] = "RIGHT",
+[KEY_END] = "END",
+[KEY_DOWN] = "DOWN",
+[KEY_PAGEDOWN] = "PAGEDOWN",
+[KEY_INSERT] = "INSERT",
+[KEY_DELETE] = "DELETE",
+[KEY_MACRO] = "MACRO",
+[KEY_MUTE] = "MUTE",
+[KEY_VOLUMEDOWN] = "VOLUMEDOWN",
+[KEY_VOLUMEUP] = "VOLUMEUP",
+[KEY_POWER] = "POWER",
+[KEY_KPEQUAL] = "KPEQUAL",
+[KEY_KPPLUSMINUS] = "KPPLUSMINUS",
+[KEY_PAUSE] = "PAUSE",
+[KEY_KPCOMMA] = "KPCOMMA",
+[KEY_HANGEUL] = "HANGEUL",
+[KEY_HANJA] = "HANJA",
+[KEY_YEN] = "YEN",
+[KEY_LEFTMETA] = "LEFTMETA",
+[KEY_RIGHTMETA] = "RIGHTMETA",
+[KEY_COMPOSE] = "COMPOSE",
+[KEY_STOP] = "STOP",
+[KEY_AGAIN] = "AGAIN",
+[KEY_PROPS] = "PROPS",
+[KEY_UNDO] = "UNDO",
+[KEY_FRONT] = "FRONT",
+[KEY_COPY] = "COPY",
+[KEY_OPEN] = "OPEN",
+[KEY_PASTE] = "PASTE",
+[KEY_FIND] = "FIND",
+[KEY_CUT] = "CUT",
+[KEY_HELP] = "HELP",
+[KEY_MENU] = "MENU",
+[KEY_CALC] = "CALC",
+[KEY_SETUP] = "SETUP",
+[KEY_SLEEP] = "SLEEP",
+[KEY_WAKEUP] = "WAKEUP",
+[KEY_FILE] = "FILE",
+[KEY_SENDFILE] = "SENDFILE",
+[KEY_DELETEFILE] = "DELETEFILE",
+[KEY_XFER] = "XFER",
+[KEY_PROG1] = "PROG1",
+[KEY_PROG2] = "PROG2",
+[KEY_WWW] = "WWW",
+[KEY_MSDOS] = "MSDOS",
+[KEY_COFFEE] = "COFFEE",
+[KEY_DIRECTION] = "DIRECTION",
+[KEY_CYCLEWINDOWS] = "CYCLEWINDOWS",
+[KEY_MAIL] = "MAIL",
+[KEY_BOOKMARKS] = "BOOKMARKS",
+[KEY_COMPUTER] = "COMPUTER",
+[KEY_BACK] = "BACK",
+[KEY_FORWARD] = "FORWARD",
+[KEY_CLOSECD] = "CLOSECD",
+[KEY_EJECTCD] = "EJECTCD",
+[KEY_EJECTCLOSECD] = "EJECTCLOSECD",
+[KEY_NEXTSONG] = "NEXTSONG",
+[KEY_PLAYPAUSE] = "PLAYPAUSE",
+[KEY_PREVIOUSSONG] = "PREVIOUSSONG",
+[KEY_STOPCD] = "STOPCD",
+[KEY_RECORD] = "RECORD",
+[KEY_REWIND] = "REWIND",
+[KEY_PHONE] = "PHONE",
+[KEY_ISO] = "ISO",
+[KEY_CONFIG] = "CONFIG",
+[KEY_HOMEPAGE] = "HOMEPAGE",
+[KEY_REFRESH] = "REFRESH",
+[KEY_EXIT] = "EXIT",
+[KEY_MOVE] = "MOVE",
+[KEY_EDIT] = "EDIT",
+[KEY_SCROLLUP] = "SCROLLUP",
+[KEY_SCROLLDOWN] = "SCROLLDOWN",
+[KEY_KPLEFTPAREN] = "KPLEFTPAREN",
+[KEY_KPRIGHTPAREN] = "KPRIGHTPAREN",
+[KEY_NEW] = "NEW",
+[KEY_REDO] = "REDO",
+[KEY_F13] = "F13",
+[KEY_F14] = "F14",
+[KEY_F15] = "F15",
+[KEY_F16] = "F16",
+[KEY_F17] = "F17",
+[KEY_F18] = "F18",
+[KEY_F19] = "F19",
+[KEY_F20] = "F20",
+[KEY_F21] = "F21",
+[KEY_F22] = "F22",
+[KEY_F23] = "F23",
+[KEY_F24] = "F24",
+[KEY_PLAYCD] = "PLAYCD",
+[KEY_PAUSECD] = "PAUSECD",
+[KEY_PROG3] = "PROG3",
+[KEY_PROG4] = "PROG4",
+[KEY_SUSPEND] = "SUSPEND",
+[KEY_CLOSE] = "CLOSE",
+[KEY_PLAY] = "PLAY",
+[KEY_FASTFORWARD] = "FASTFORWARD",
+[KEY_BASSBOOST] = "BASSBOOST",
+[KEY_PRINT] = "PRINT",
+[KEY_HP] = "HP",
+[KEY_CAMERA] = "CAMERA",
+[KEY_SOUND] = "SOUND",
+[KEY_QUESTION] = "QUESTION",
+[KEY_EMAIL] = "EMAIL",
+[KEY_CHAT] = "CHAT",
+[KEY_SEARCH] = "SEARCH",
+[KEY_CONNECT] = "CONNECT",
+[KEY_FINANCE] = "FINANCE",
+[KEY_SPORT] = "SPORT",
+[KEY_SHOP] = "SHOP",
+[KEY_ALTERASE] = "ALTERASE",
+[KEY_CANCEL] = "CANCEL",
+[KEY_BRIGHTNESSDOWN] = "BRIGHTNESSDOWN",
+[KEY_BRIGHTNESSUP] = "BRIGHTNESSUP",
+[KEY_MEDIA] = "MEDIA",
+[KEY_SWITCHVIDEOMODE] = "SWITCHVIDEOMODE",
+[KEY_KBDILLUMTOGGLE] = "KBDILLUMTOGGLE",
+[KEY_KBDILLUMDOWN] = "KBDILLUMDOWN",
+[KEY_KBDILLUMUP] = "KBDILLUMUP",
+[KEY_SEND] = "SEND",
+[KEY_REPLY] = "REPLY",
+[KEY_FORWARDMAIL] = "FORWARDMAIL",
+[KEY_SAVE] = "SAVE",
+[KEY_DOCUMENTS] = "DOCUMENTS",
+[KEY_BATTERY] = "BATTERY",
+[KEY_BLUETOOTH] = "BLUETOOTH",
+[KEY_WLAN] = "WLAN",
+[KEY_UWB] = "UWB",
+[KEY_UNKNOWN] = "UNKNOWN",
+[KEY_VIDEO_NEXT] = "VIDEO_NEXT",
+[KEY_VIDEO_PREV] = "VIDEO_PREV",
+[KEY_BRIGHTNESS_CYCLE] = "BRIGHTNESS_CYCLE",
+[KEY_BRIGHTNESS_ZERO] = "BRIGHTNESS_ZERO",
+[KEY_DISPLAY_OFF] = "DISPLAY_OFF",
+[KEY_WIMAX] = "WIMAX",
+[KEY_OK] = "OK",
+[KEY_SELECT] = "SELECT",
+[KEY_GOTO] = "GOTO",
+[KEY_CLEAR] = "CLEAR",
+[KEY_POWER2] = "POWER2",
+[KEY_OPTION] = "OPTION",
+[KEY_INFO] = "INFO",
+[KEY_TIME] = "TIME",
+[KEY_VENDOR] = "VENDOR",
+[KEY_ARCHIVE] = "ARCHIVE",
+[KEY_PROGRAM] = "PROGRAM",
+[KEY_CHANNEL] = "CHANNEL",
+[KEY_FAVORITES] = "FAVORITES",
+[KEY_EPG] = "EPG",
+[KEY_PVR] = "PVR",
+[KEY_MHP] = "MHP",
+[KEY_LANGUAGE] = "LANGUAGE",
+[KEY_TITLE] = "TITLE",
+[KEY_SUBTITLE] = "SUBTITLE",
+[KEY_ANGLE] = "ANGLE",
+[KEY_ZOOM] = "ZOOM",
+[KEY_MODE] = "MODE",
+[KEY_KEYBOARD] = "KEYBOARD",
+[KEY_SCREEN] = "SCREEN",
+[KEY_PC] = "PC",
+[KEY_TV] = "TV",
+[KEY_TV2] = "TV2",
+[KEY_VCR] = "VCR",
+[KEY_VCR2] = "VCR2",
+[KEY_SAT] = "SAT",
+[KEY_SAT2] = "SAT2",
+[KEY_CD] = "CD",
+[KEY_TAPE] = "TAPE",
+[KEY_RADIO] = "RADIO",
+[KEY_TUNER] = "TUNER",
+[KEY_PLAYER] = "PLAYER",
+[KEY_TEXT] = "TEXT",
+[KEY_DVD] = "DVD",
+[KEY_AUX] = "AUX",
+[KEY_MP3] = "MP3",
+[KEY_AUDIO] = "AUDIO",
+[KEY_VIDEO] = "VIDEO",
+[KEY_DIRECTORY] = "DIRECTORY",
+[KEY_LIST] = "LIST",
+[KEY_MEMO] = "MEMO",
+[KEY_CALENDAR] = "CALENDAR",
+[KEY_RED] = "RED",
+[KEY_GREEN] = "GREEN",
+[KEY_YELLOW] = "YELLOW",
+[KEY_BLUE] = "BLUE",
+[KEY_CHANNELUP] = "CHANNELUP",
+[KEY_CHANNELDOWN] = "CHANNELDOWN",
+[KEY_FIRST] = "FIRST",
+[KEY_LAST] = "LAST",
+[KEY_AB] = "AB",
+[KEY_NEXT] = "NEXT",
+[KEY_RESTART] = "RESTART",
+[KEY_SLOW] = "SLOW",
+[KEY_SHUFFLE] = "SHUFFLE",
+[KEY_BREAK] = "BREAK",
+[KEY_PREVIOUS] = "PREVIOUS",
+[KEY_DIGITS] = "DIGITS",
+[KEY_TEEN] = "TEEN",
+[KEY_TWEN] = "TWEN",
+[KEY_VIDEOPHONE] = "VIDEOPHONE",
+[KEY_GAMES] = "GAMES",
+[KEY_ZOOMIN] = "ZOOMIN",
+[KEY_ZOOMOUT] = "ZOOMOUT",
+[KEY_ZOOMRESET] = "ZOOMRESET",
+[KEY_WORDPROCESSOR] = "WORDPROCESSOR",
+[KEY_EDITOR] = "EDITOR",
+[KEY_SPREADSHEET] = "SPREADSHEET",
+[KEY_GRAPHICSEDITOR] = "GRAPHICSEDITOR",
+[KEY_PRESENTATION] = "PRESENTATION",
+[KEY_DATABASE] = "DATABASE",
+[KEY_NEWS] = "NEWS",
+[KEY_VOICEMAIL] = "VOICEMAIL",
+[KEY_ADDRESSBOOK] = "ADDRESSBOOK",
+[KEY_MESSENGER] = "MESSENGER",
+[KEY_DISPLAYTOGGLE] = "DISPLAYTOGGLE",
+[KEY_SPELLCHECK] = "SPELLCHECK",
+[KEY_LOGOFF] = "LOGOFF",
+[KEY_DOLLAR] = "DOLLAR",
+[KEY_EURO] = "EURO",
+[KEY_FRAMEBACK] = "FRAMEBACK",
+[KEY_FRAMEFORWARD] = "FRAMEFORWARD",
+[KEY_CONTEXT_MENU] = "CONTEXT_MENU",
+[KEY_MEDIA_REPEAT] = "MEDIA_REPEAT",
+[KEY_DEL_EOL] = "DEL_EOL",
+[KEY_DEL_EOS] = "DEL_EOS",
+[KEY_INS_LINE] = "INS_LINE",
+[KEY_DEL_LINE] = "DEL_LINE",
+[KEY_FN] = "FN",
+[KEY_FN_ESC] = "FN_ESC",
+[KEY_FN_F1] = "FN_F1",
+[KEY_FN_F2] = "FN_F2",
+[KEY_FN_F3] = "FN_F3",
+[KEY_FN_F4] = "FN_F4",
+[KEY_FN_F5] = "FN_F5",
+[KEY_FN_F6] = "FN_F6",
+[KEY_FN_F7] = "FN_F7",
+[KEY_FN_F8] = "FN_F8",
+[KEY_FN_F9] = "FN_F9",
+[KEY_FN_F10] = "FN_F10",
+[KEY_FN_F11] = "FN_F11",
+[KEY_FN_F12] = "FN_F12",
+[KEY_FN_1] = "FN_1",
+[KEY_FN_2] = "FN_2",
+[KEY_FN_D] = "FN_D",
+[KEY_FN_E] = "FN_E",
+[KEY_FN_F] = "FN_F",
+[KEY_FN_S] = "FN_S",
+[KEY_FN_B] = "FN_B",
+[KEY_BRL_DOT1] = "BRL_DOT1",
+[KEY_BRL_DOT2] = "BRL_DOT2",
+[KEY_BRL_DOT3] = "BRL_DOT3",
+[KEY_BRL_DOT4] = "BRL_DOT4",
+[KEY_BRL_DOT5] = "BRL_DOT5",
+[KEY_BRL_DOT6] = "BRL_DOT6",
+[KEY_BRL_DOT7] = "BRL_DOT7",
+[KEY_BRL_DOT8] = "BRL_DOT8",
+[KEY_BRL_DOT9] = "BRL_DOT9",
+[KEY_BRL_DOT10] = "BRL_DOT10",
diff --git a/spy/mkkeytab.sh b/spy/mkkeytab.sh
new file mode 100755 (executable)
index 0000000..60689d0
--- /dev/null
@@ -0,0 +1,11 @@
+#!/bin/sh
+sed </usr/include/linux/input.h '
+       s/^#define KEY_\([A-Za-z0-9_]\+\).*/[KEY_\1] = "\1",/
+       /KEY_HANGUEL/d
+       /KEY_MIN_INTERESTING/d
+       /KEY_MAX/d
+       /KEY_CNT/d
+       /KEY_SCREENLOCK/d
+       t
+       d
+' >keytab.h