From 6efd6d130e84af490c8d3c306f031edb672b977f Mon Sep 17 00:00:00 2001 From: Martin Mares Date: Sat, 31 Oct 2009 22:34:49 +0100 Subject: [PATCH] Spionovatko --- spy/Makefile | 10 ++ spy/keyspy.c | 106 ++++++++++++++ spy/keytab.h | 362 ++++++++++++++++++++++++++++++++++++++++++++++++ spy/mkkeytab.sh | 11 ++ 4 files changed, 489 insertions(+) create mode 100644 spy/Makefile create mode 100644 spy/keyspy.c create mode 100644 spy/keytab.h create mode 100755 spy/mkkeytab.sh diff --git a/spy/Makefile b/spy/Makefile new file mode 100644 index 0000000..e03c74a --- /dev/null +++ b/spy/Makefile @@ -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 index 0000000..6ae4d8d --- /dev/null +++ b/spy/keyspy.c @@ -0,0 +1,106 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +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 \n\ + or: keyspy show \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 index 0000000..7f0ddd4 --- /dev/null +++ b/spy/keytab.h @@ -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 index 0000000..60689d0 --- /dev/null +++ b/spy/mkkeytab.sh @@ -0,0 +1,11 @@ +#!/bin/sh +sed keytab.h -- 2.39.2