From 9752b50e922572e4cd214ac45ed95e4ee410fe24 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Thu, 21 Jul 2011 15:13:40 +1000 Subject: evemu-device: Use signal handler for all termination If evemu-device is backgrounded it can only be killed with SIGTERM. That again doesn't clean up properly. Since we didn't do anything with the read(2) data anyway, replace it with a sleep(3) and set the signal handler to terminate the loop on SIGINT and a few other signals. Signed-off-by: Peter Hutterer Signed-off-by: Henrik Rydberg --- tools/evemu-device.c | 40 ++++++++++++++++++++++++++++++++-------- 1 file changed, 32 insertions(+), 8 deletions(-) (limited to 'tools') diff --git a/tools/evemu-device.c b/tools/evemu-device.c index 26da7d9..eea6b18 100644 --- a/tools/evemu-device.c +++ b/tools/evemu-device.c @@ -43,15 +43,16 @@ #include "evemu.h" #include #include +#include #include #include #define UINPUT_NODE "/dev/uinput" #define MAX_EVENT_NODE 32 -static void hold_device(const struct evemu_device *dev) +static int find_and_report_device(const struct evemu_device *dev) { - char node[256], data[256]; + char node[256]; int fd, ret, i; memset(node, 0, sizeof(node)); @@ -70,13 +71,31 @@ static void hold_device(const struct evemu_device *dev) close(fd); } - fd = open(node, O_RDONLY); - if (fd < 0) - return; + if (!node[0]) { + fprintf(stderr, "%s: input node not found larger than %d?\n", + evemu_get_name(dev), MAX_EVENT_NODE); + return 0; + } + fprintf(stdout, "%s: %s\n", evemu_get_name(dev), node); fflush(stdout); - while ((ret = read(fd, data, sizeof(data))) > 0); - close(fd); + return 1; +} + +static int stop; + +static void signal_handler(int signal) +{ + stop = 1; +} + +static void wait_for_signal(const struct evemu_device *dev) +{ + signal(SIGINT, signal_handler); + signal(SIGTTIN, signal_handler); + signal(SIGTTOU, signal_handler); + + while (!stop && sleep(10000)); } static int evemu_device(FILE *fp) @@ -102,7 +121,12 @@ static int evemu_device(FILE *fp) ret = evemu_create(dev, fd); if (ret < 0) goto out_close; - hold_device(dev); + + ret = find_and_report_device(dev); + if (ret <= 0) + goto out_close; + + wait_for_signal(dev); evemu_destroy(fd); out_close: -- cgit v1.2.3