diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile | 3 | ||||
-rw-r--r-- | src/getkey.c | 47 |
2 files changed, 49 insertions, 1 deletions
diff --git a/src/Makefile b/src/Makefile index 389c8b1c..8b9616ad 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1,6 +1,6 @@ CFLAGS+=-Wall -D_GNU_SOURCE -g -PROGS=usernetctl doexec netreport testd usleep ipcalc initlog minilogd loglevel +PROGS=usernetctl doexec netreport testd usleep ipcalc initlog minilogd loglevel getkey INITLOG_OBJS=initlog.o process.o USLEEP_OBJS=usleep.o @@ -19,6 +19,7 @@ install: install -s -m 755 initlog $(ROOT)/sbin/initlog install -s -m 755 minilogd $(ROOT)/sbin/minilogd install -s -m 755 loglevel $(ROOT)/sbin/loglevel + install -s -m 755 getkey $(ROOT)/sbin/getkey install -m 644 initlog.1 $(ROOT)/usr/man/man1 install -m 644 doexec.1 $(ROOT)/usr/man/man1 install -m 644 netreport.1 $(ROOT)/usr/man/man1 diff --git a/src/getkey.c b/src/getkey.c new file mode 100644 index 00000000..b17558a3 --- /dev/null +++ b/src/getkey.c @@ -0,0 +1,47 @@ + +#include <ctype.h> +#include <signal.h> +#include <string.h> +#include <termios.h> +#include <unistd.h> + +/* A very simple keygrabber. */ + +struct termios tp; + +void reset_term(int x) { + tcsetattr(0,TCSANOW,&tp); + exit(x); +} + +int main(int argc, char **argv) { + char foo[2]; + int tp_if,tp_of,tp_lf; + int x; + + if (argc>1) { + for (x=0;argv[1][x];x++) argv[1][x]=toupper(argv[1][x]); + } + foo[0]=foo[1]='\0'; + signal(SIGTERM,reset_term); + tcgetattr(0,&tp); + tp_if=tp.c_iflag; + tp_of=tp.c_oflag; + tp_lf=tp.c_lflag; + tp.c_iflag=0; + tp.c_oflag &= ~OPOST; + tp.c_lflag &= ~(ISIG | ICANON); + tcsetattr(0,TCSANOW,&tp); + tp.c_iflag=tp_if; + tp.c_oflag=tp_of; + tp.c_lflag=tp_lf; + while (1) { + read(0,foo,1); + foo[0]=toupper(foo[0]); + /* Die if we get a control-c or control-d */ + if (foo[0]==3 || foo[0]==4) reset_term(1); + if ((!argv[1]) || strstr(argv[1],foo)) { + reset_term(0); + } + } +} |