source: abuse/tags/pd/macabuse/src/keydrv.c @ 49

Last change on this file since 49 was 49, checked in by Sam Hocevar, 11 years ago
  • Imported original public domain release, for future reference.
  • Property svn:keywords set to Id
File size: 4.0 KB
Line 
1/*      Key driver, by Jonathan Clark
2          (portions from showkey.c)
3*/
4
5#include <stdio.h>
6#include <unistd.h>
7#include <getopt.h>
8#include <signal.h>
9#include <fcntl.h>
10#include <termios.h>
11#include <linux/kd.h>
12#include <linux/vt.h>
13#include <fcntl.h>
14#include <sys/stat.h>
15
16
17
18unsigned char keyboard_buf[16];
19
20#include <linux/keyboard.h>
21#include <sys/ioctl.h>
22#include <stdlib.h>
23#include <string.h>
24
25int fd,my_console=-1;
26struct termios old_term;
27
28void clean_up(int close_fd) {
29        ioctl(fd, KDSKBMODE, K_XLATE);
30
31        tcsetattr(fd, TCSAFLUSH, &old_term);
32        if (close_fd)
33          close(fd);
34        if (close_fd)
35          exit(0);
36}
37
38void go_raw(int open_fd)
39{
40        struct termios new_term;
41        struct vt_stat v;
42        if (open_fd)
43        {
44                if ((fd = open("/dev/console", O_RDONLY)) < 0) {
45                        perror("/dev/console");
46                        exit(1);
47                }
48        }
49        if (my_console==-1)
50        {
51          ioctl(fd,VT_GETSTATE,&v);  /* see which console we are using */
52          my_console=v.v_active;
53        }
54        ioctl(fd,VT_WAITACTIVE,my_console);  /* wait for our console to come back */
55
56        tcgetattr(fd, &new_term);
57        tcgetattr(fd, &old_term);
58
59        new_term.c_lflag = new_term.c_lflag & ~ (ICANON | ECHO | ISIG );
60        new_term.c_cc[VMIN] = 1; //sizeof(keyboard_buf);
61        new_term.c_cc[VTIME] = 0;       /* 0.1 sec intercharacter timeout */
62
63        tcsetattr(fd, TCSAFLUSH, &new_term);
64        if (ioctl(fd, KDSKBMODE,
65                K_RAW)) {
66                perror("KDSKBMODE");
67                exit(1);
68        }
69        system("stty raw </dev/console >/dev/console");
70
71}
72
73void die(int x) {
74        fprintf(stderr,"die %d\n",x);
75   
76        clean_up(1);
77        exit(1);
78}
79
80int key_watch(int write_fd)
81{
82        unsigned char map[128];
83
84        int i, n,lalt,ralt,switch_to,lctrl,rctrl,up,quit;
85
86
87        /*
88                if we receive a signal, we want to exit nicely, in
89                order not to leave the keyboard in an unusable mode
90        */
91        signal(SIGHUP, die);
92        signal(SIGINT, die);
93        signal(SIGQUIT, die);
94        signal(SIGILL, die);
95        signal(SIGTRAP, die);
96        signal(SIGABRT, die);
97        signal(SIGIOT, die);
98        signal(SIGFPE, die);
99        signal(SIGKILL, die);
100        signal(SIGUSR1, die);
101        signal(SIGSEGV, die);
102        signal(SIGUSR2, die);
103        signal(SIGPIPE, die);
104        signal(SIGTERM, die);
105        signal(SIGSTKFLT, die);
106        signal(SIGCHLD, die);
107        signal(SIGCONT, die);
108        signal(SIGSTOP, die);
109        signal(SIGTSTP, die);
110        signal(SIGTTIN, die);
111        signal(SIGTTOU, die);
112
113        go_raw(1);
114        quit=lalt=ralt=lctrl=rctrl=0;
115        memset(map,0,128);
116        while (!quit) {
117                n = read(fd, keyboard_buf, sizeof(keyboard_buf));
118                for (i = 0; i < n; i++)
119                { up=!(keyboard_buf[i]&0x80);
120                  if ((keyboard_buf[i]&0x7f)==56) lalt=up;
121                  if ((keyboard_buf[i]&0x7f)==96) ralt=up;
122                  if ((keyboard_buf[i]&0x7f)==29) lctrl=up;
123                  if (up || up!=map[(keyboard_buf[i]&0x7f)])
124                  {
125                    map[(keyboard_buf[i]&0x7f)]=up;
126                    if (!write(write_fd,&keyboard_buf[i],1))
127                    {
128                      fprintf(stderr,"keydrv : unable to write to parent (cleaning up)\n");
129                      clean_up(1);
130                      exit(0);
131                    }
132                  }
133                }
134                for (i = 0; i < n; i++)
135                {
136                  if ((lalt || ralt) && (keyboard_buf[i]&0x7f)>=59 &&
137                      (keyboard_buf[i]&0x7f)<=68)
138                  {
139
140                    switch_to=(keyboard_buf[i]&0x7f)-58;
141                    clean_up(0);
142                   
143                    ioctl(fd,VT_ACTIVATE,switch_to);
144                    go_raw(0);
145                  }
146                  if ((lctrl || rctrl) && (keyboard_buf[i]&0x7f)==46)
147                  {
148                    fprintf(stderr,"^C\n"); fflush(stderr);
149                    quit=1;
150                  }
151                }
152
153        }
154        clean_up(1);
155        exit(0);
156}
157
158
159main()
160{
161  int f,chd;
162  unlink("/tmp/jckey-driver");
163  if (mkfifo("/tmp/jckey-driver",S_IRWXU))
164  { perror("Key driver : unable to make fifo /tmp/jckey-driver");
165    exit(1);
166  }
167  chd=fork();
168  if (chd)
169  { printf("%d\n",chd);
170    return 0;
171  }
172  f=open("/tmp/jckey-driver",O_WRONLY);
173  if (f<0)
174  { perror("/tmp/jckey-driver");
175    exit(1);
176  }
177  key_watch(f);
178  close(f);
179  unlink("/tmp/jckey-driver");
180}
181
182
Note: See TracBrowser for help on using the repository browser.