source of highlighter
plain | download
    1 /* keyfaker - Linux keyboard-typer faker
    2    Copyright (C) 2010  Kabel
    3 
    4    This program is free software: you can redistribute it and/or modify
    5    it under the terms of the GNU General Public License as published by
    6    the Free Software Foundation, either version 3 of the License, or
    7    (at your option) any later version.
    8 
    9    This program is distributed in the hope that it will be useful,
   10    but WITHOUT ANY WARRANTY; without even the implied warranty of
   11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   12    GNU General Public License for more details.
   13 
   14    You should have received a copy of the GNU General Public License
   15    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
   16 
   17 #include <errno.h>
   18 #include <signal.h>
   19 #include <stdint.h>
   20 #include <linux/input.h>
   21 #include <linux/uinput.h>
   22 #include <stdio.h>
   23 #include <stdlib.h>
   24 #include <string.h>
   25 #include <sys/types.h>
   26 #include <sys/stat.h>
   27 #include <time.h>
   28 #include <unistd.h>
   29 #include <fcntl.h>
   30 
   31 #define SHIFT 0x00000100
   32 
   33 struct {
   34   int keycode;
   35   char ch;
   36 } keys[] = {
   37   { KEY_0, '0' },
   38   { KEY_1, '1' },
   39   { KEY_2, '2' },
   40   { KEY_3, '3' },
   41   { KEY_4, '4' },
   42   { KEY_5, '5' },
   43   { KEY_6, '6' },
   44   { KEY_7, '7' },
   45   { KEY_8, '8' },
   46   { KEY_9, '9' },
   47   { KEY_MINUS, '-' },
   48   { KEY_EQUAL, '=' },
   49   { KEY_A, 'a' },
   50   { KEY_B, 'b' },
   51   { KEY_C, 'c' },
   52   { KEY_D, 'd' },
   53   { KEY_E, 'e' },
   54   { KEY_F, 'f' },
   55   { KEY_G, 'g' },
   56   { KEY_H, 'h' },
   57   { KEY_I, 'i' },
   58   { KEY_J, 'j' },
   59   { KEY_K, 'k' },
   60   { KEY_L, 'l' },
   61   { KEY_M, 'm' },
   62   { KEY_N, 'n' },
   63   { KEY_O, 'o' },
   64   { KEY_P, 'p' },
   65   { KEY_Q, 'q' },
   66   { KEY_R, 'r' },
   67   { KEY_S, 's' },
   68   { KEY_T, 't' },
   69   { KEY_U, 'u' },
   70   { KEY_V, 'v' },
   71   { KEY_W, 'w' },
   72   { KEY_X, 'x' },
   73   { KEY_Y, 'y' },
   74   { KEY_Z, 'z' },
   75   { KEY_LEFTBRACE, '[' },
   76   { KEY_RIGHTBRACE, ']' },
   77   { KEY_SEMICOLON, ';' },
   78   { KEY_APOSTROPHE, '\'' },
   79   { KEY_BACKSLASH, '\\' },
   80   { KEY_COMMA, ',' },
   81   { KEY_DOT, '.' },
   82   { KEY_SLASH, '/' },
   83   { SHIFT | KEY_0, ')' },
   84   { SHIFT | KEY_1, '!' },
   85   { SHIFT | KEY_2, '@' },
   86   { SHIFT | KEY_3, '#' },
   87   { SHIFT | KEY_4, '$' },
   88   { SHIFT | KEY_5, '%' },
   89   { SHIFT | KEY_6, '^' },
   90   { SHIFT | KEY_7, '&' },
   91   { SHIFT | KEY_8, '*' },
   92   { SHIFT | KEY_9, '(' },
   93   { SHIFT | KEY_MINUS, '_' },
   94   { SHIFT | KEY_EQUAL, '+' },
   95   { SHIFT | KEY_A, 'A' },
   96   { SHIFT | KEY_B, 'B' },
   97   { SHIFT | KEY_C, 'C' },
   98   { SHIFT | KEY_D, 'D' },
   99   { SHIFT | KEY_E, 'E' },
  100   { SHIFT | KEY_F, 'F' },
  101   { SHIFT | KEY_G, 'G' },
  102   { SHIFT | KEY_H, 'H' },
  103   { SHIFT | KEY_I, 'I' },
  104   { SHIFT | KEY_J, 'J' },
  105   { SHIFT | KEY_K, 'K' },
  106   { SHIFT | KEY_L, 'L' },
  107   { SHIFT | KEY_M, 'M' },
  108   { SHIFT | KEY_N, 'N' },
  109   { SHIFT | KEY_O, 'O' },
  110   { SHIFT | KEY_P, 'P' },
  111   { SHIFT | KEY_Q, 'Q' },
  112   { SHIFT | KEY_R, 'R' },
  113   { SHIFT | KEY_S, 'S' },
  114   { SHIFT | KEY_T, 'T' },
  115   { SHIFT | KEY_U, 'U' },
  116   { SHIFT | KEY_V, 'V' },
  117   { SHIFT | KEY_W, 'W' },
  118   { SHIFT | KEY_X, 'X' },
  119   { SHIFT | KEY_Y, 'Y' },
  120   { SHIFT | KEY_Z, 'Z' },
  121   { SHIFT | KEY_LEFTBRACE, '{' },
  122   { SHIFT | KEY_RIGHTBRACE, '}' },
  123   { SHIFT | KEY_SEMICOLON, ':' },
  124   { SHIFT | KEY_APOSTROPHE, '"' },
  125   { SHIFT | KEY_BACKSLASH, '|' },
  126   { SHIFT | KEY_COMMA, '<' },
  127   { SHIFT | KEY_DOT, '>' },
  128   { SHIFT | KEY_SLASH, '?' },
  129   { KEY_SPACE, ' ' },
  130   { KEY_TAB, '\t' },
  131   { KEY_ENTER, '\n' },
  132   { 0, 0 }
  133 };
  134 
  135 int from, to;
  136 
  137 void
  138 sigcatch (int sig)
  139 {
  140   if (sig == SIGINT || sig == SIGTERM)
  141     {
  142       ioctl (from, EVIOCGRAB, NULL);
  143       ioctl (to, UI_DEV_DESTROY);
  144       close (from);
  145       close (to);
  146       exit (EXIT_SUCCESS);
  147     }
  148 }
  149 
  150 int
  151 main (int argc, char ** argv)
  152 {
  153   int i, enabled = 0, shift = 0;
  154   ssize_t rd;
  155   struct input_event ev[64];
  156   char * data = NULL;
  157   off_t datalen = 0;
  158   off_t position = 0;
  159   struct uinput_user_dev ud;
  160   struct timespec now, lastF12, lastF11;
  161   int lF12 = 0, lF11 = 0;
  162 
  163   signal (SIGTERM, sigcatch);
  164   signal (SIGINT, sigcatch);
  165 
  166   if (argc < 3)
  167     {
  168       fprintf (stderr, "usage: %s <device> <fakefile>\n\n", basename (argv[0]));
  169       exit (1);
  170     }
  171 
  172   usleep (100000);
  173 
  174   from = open (argv[1], O_RDONLY);
  175   if (from < 0)
  176     {
  177       fprintf (stderr, "cannot open %s: %s\n", argv[1], strerror (errno));
  178       exit (1);
  179     }
  180 
  181   if (ioctl (from, EVIOCGRAB, (void *) 1) < 0)
  182     {
  183       close (from);
  184       fprintf (stderr, "cannot grab %s: %s\n", argv[1], strerror (errno));
  185       exit (1);
  186     }
  187 
  188   to = open ("/dev/input/uinput", O_WRONLY | O_NONBLOCK);
  189   if (to < 0 && errno == ENOENT)
  190     {
  191       fprintf (stderr, "/dev/input/uinput does not exists, trying modprobe uinput\n", strerror (errno));
  192       system ("modprobe uinput");
  193       sleep (1);
  194       to = open ("/dev/input/uinput", O_WRONLY | O_NONBLOCK);
  195     }
  196   if (to < 0)
  197     {
  198       close (from);
  199       fprintf (stderr, "cannot open /dev/input/uinput: %s\n", strerror (errno));
  200       exit (1);
  201     }
  202 
  203   ioctl (to, UI_SET_EVBIT, EV_SYN);
  204   ioctl (to, UI_SET_EVBIT, EV_KEY);
  205 
  206   for (i = 0; i < KEY_MAX; i++)
  207     ioctl (to, UI_SET_KEYBIT, i);
  208 
  209   memset ((void *) &ud, 0, sizeof (ud));
  210   strcpy (ud.name, "kabel keys");
  211   ud.id.version = 4;
  212   ud.id.bustype = BUS_PCI;
  213   write (to, (char *) &ud, sizeof (ud));
  214 
  215   ioctl (to, UI_DEV_CREATE);
  216 
  217   printf ("started\n");
  218 
  219   while (1)
  220     {
  221       rd = read (from, (char *) ev, sizeof (struct input_event) * 64);
  222       for (i = 0; i < rd / sizeof (struct input_event); i++)
  223         {
  224           if (ev[i].type == EV_KEY)
  225             {
  226               if (ev[i].code == KEY_F11)
  227                 {
  228                   if (ev[i].value == 1)
  229                     {
  230                       clock_gettime (CLOCK_MONOTONIC, &lastF11);
  231                       lF11 = 1;
  232                     }
  233                   else if (lF11)
  234                     {
  235                       struct timespec diff;
  236                       clock_gettime (CLOCK_MONOTONIC, &now);
  237                       diff.tv_sec =  now.tv_sec - lastF11.tv_sec;
  238                       diff.tv_nsec = now.tv_nsec - lastF11.tv_nsec;
  239                       if (diff.tv_nsec < 0)
  240                         {
  241                           diff.tv_sec --;
  242                           diff.tv_nsec += 1000000000;
  243                         }
  244                       if (diff.tv_sec >= 5)
  245                         raise (SIGTERM);
  246                     }
  247                 }
  248               else if (ev[i].code == KEY_F12)
  249                 {
  250                   int changestate = 0;
  251                   if (ev[i].value == 1)
  252                     {
  253                       clock_gettime (CLOCK_MONOTONIC, &lastF12);
  254                       lF12 = 1;
  255                     }
  256                   else if (lF12)
  257                     {
  258                       struct timespec diff;
  259                       clock_gettime (CLOCK_MONOTONIC, &now);
  260                       diff.tv_sec =  now.tv_sec - lastF12.tv_sec;
  261                       diff.tv_nsec = now.tv_nsec - lastF12.tv_nsec;
  262                       if (diff.tv_nsec < 0)
  263                         {
  264                           diff.tv_sec --;
  265                           diff.tv_nsec += 1000000000;
  266                         }
  267                       if (diff.tv_sec >= 3)
  268                         {
  269                           changestate = 1;
  270                           lF12 = 0;
  271                         }
  272                     }
  273                   if (changestate)
  274                     {
  275                       if (!enabled)
  276                         {
  277                           struct stat st;
  278                           int fd;
  279                           fd = open (argv[2], O_RDONLY);
  280                           if (fd < 0)
  281                             {
  282                               fprintf (stderr, "can not open %s for reading\n", argv[2]);
  283                               continue;
  284                             }
  285                           stat (argv[2], &st);
  286                           data = malloc (st.st_size);
  287                           read (fd, data, st.st_size);
  288                           datalen = st.st_size;
  289                           position = 0;
  290                           close (fd);
  291                           printf ("faking enabled with %u bytes of data\n", datalen);
  292                           enabled = 1;
  293                         }
  294                       else
  295                         {
  296                           free (data);
  297                           data = NULL;
  298                           datalen = 0;
  299                           position = 0;
  300                           printf ("faking disabled\n");
  301                           enabled = 0;
  302                         }
  303                     }
  304                   continue;
  305                 }
  306               else if (enabled && position < datalen)
  307                 {
  308                   int j;
  309                   for (j = 0; keys[j].keycode != 0; j++)
  310                     if (ev[i].code == (keys[j].keycode & ~SHIFT))
  311                       break;
  312                   if ((keys[j].keycode & ~SHIFT) != 0)
  313                     {
  314                       int k;
  315                       for (k = 0; keys[k].keycode != 0; k++)
  316                         if (data[position] == keys[k].ch)
  317                           break;
  318                       if (keys[j].ch != 0)
  319                         {
  320                           if (ev[i].value == 1)
  321                             {
  322                               struct input_event tev[4];
  323                               int l, shifted;
  324                               tev[0].time = ev[i].time;
  325                               tev[0].type = EV_KEY;
  326                               tev[0].code = KEY_LEFTSHIFT;
  327                               tev[0].value = 1;
  328                               tev[1].time = ev[i].time;
  329                               tev[1].time.tv_usec += 3000;
  330                               if (tev[1].time.tv_usec > 1000000)
  331                                 {
  332                                   tev[1].time.tv_sec += 1;
  333                                   tev[1].time.tv_usec %= 1000000;
  334                                 }
  335                               tev[1].type = EV_KEY;
  336                               tev[1].code = keys[k].keycode & ~SHIFT;
  337                               tev[1].value = 1;
  338                               tev[2].time = ev[i].time;
  339                               tev[2].time.tv_usec += 6000;
  340                               if (tev[2].time.tv_usec > 1000000)
  341                                 {
  342                                   tev[2].time.tv_sec += 1;
  343                                   tev[2].time.tv_usec %= 1000000;
  344                                 }
  345                               tev[2].type = EV_KEY;
  346                               tev[2].code = keys[k].keycode & ~SHIFT;
  347                               tev[2].value = 0;
  348                               tev[3].time = ev[i].time;
  349                               tev[3].time.tv_usec += 9000;
  350                               if (tev[3].time.tv_usec > 1000000)
  351                                 {
  352                                   tev[3].time.tv_sec += 1;
  353                                   tev[3].time.tv_usec %= 1000000;
  354                                 }
  355                               tev[3].type = EV_KEY;
  356                               tev[3].code = KEY_LEFTSHIFT;
  357                               tev[3].value = 0;
  358                               shifted = keys[k].keycode & SHIFT;
  359                               struct input_event sev;
  360                               sev.type = EV_SYN;
  361                               sev.code = 0;
  362                               sev.value = 0;
  363                               for (l = shifted ? 0 : 1; l < (shifted ? 4 : 3); l++)
  364                                 {
  365                                   write (to, (char *) &tev[l], sizeof (struct input_event));
  366                                   sev.time = tev[l].time;
  367                                   sev.time.tv_usec += 3;
  368                                   if (sev.time.tv_usec >= 1000000)
  369                                     {
  370                                       sev.time.tv_sec += 1;
  371                                       sev.time.tv_usec %= 1000000;
  372                                     }
  373                                   write (to, (char *) &sev, sizeof (struct input_event));
  374                                 }
  375                               position++;
  376                             }
  377                         }
  378                       else
  379                         goto other;
  380                     }
  381                   else
  382                     goto other;
  383                 }
  384               else
  385                 {
  386 other:
  387                   if (!enabled || (enabled && ev[i].code != KEY_LEFTSHIFT &&
  388                                    ev[i].code != KEY_RIGHTSHIFT && ev[i].code != KEY_CAPSLOCK))
  389                     write (to, (char *) &ev[i], sizeof (struct input_event));
  390                   if (enabled && ev[i].code == KEY_BACKSPACE && ev[i].value && position > 0)
  391                     position --;
  392                 }
  393             }
  394           else if (ev[i].type == EV_SYN)
  395             write (to, (char *) &ev[i], sizeof (struct input_event));
  396         }
  397     }
  398 }