diff options
author | Henrik Rydberg <rydberg@euromail.se> | 2010-12-21 17:29:14 +0100 |
---|---|---|
committer | Henrik Rydberg <rydberg@euromail.se> | 2010-12-21 17:29:14 +0100 |
commit | 1bc6faa48907919376b14429f3b802d0d16fc00a (patch) | |
tree | 73e57b6f956d8f50c456330c878e9b210ad41483 | |
parent | a8df0405686350c3145b3e5119d796c6642339fd (diff) |
Make evemu ABI resilient
Hide the evemu struct, make it versioned, and instead use new/delete
and accessor functions. This should give us enough ABI stability to
run mixed library implementations.
Signed-off-by: Henrik Rydberg <rydberg@euromail.se>
-rw-r--r-- | include/evemu.h | 28 | ||||
-rw-r--r-- | src/evemu-impl.h | 19 | ||||
-rw-r--r-- | src/evemu.c | 31 | ||||
-rw-r--r-- | tools/evemu-describe.c | 19 | ||||
-rw-r--r-- | tools/evemu-device.c | 40 | ||||
-rw-r--r-- | tools/evemu-echo.c | 18 |
6 files changed, 107 insertions, 48 deletions
diff --git a/include/evemu.h b/include/evemu.h index 70a5bd5..698a539 100644 --- a/include/evemu.h +++ b/include/evemu.h @@ -26,28 +26,22 @@ * ****************************************************************************/ -#ifndef _EVPLAY_H -#define _EVPLAY_H +#ifndef _EVEMU_H +#define _EVEMU_H -#include <linux/uinput.h> #include <stdio.h> +#include <errno.h> +#include <linux/input.h> -#define EVPLAY_NBITS KEY_CNT -#define EVPLAY_NBYTES ((EVPLAY_NBITS + 7) / 8) +#define EVEMU_VERSION_MAJOR 1 +#define EVEMU_VERSION_MINOR 1 -struct evemu_device { - char name[UINPUT_MAX_NAME_SIZE]; - struct input_id id; - unsigned char mask[EV_CNT][EVPLAY_NBYTES]; - int bytes[EV_CNT]; - struct input_absinfo abs[ABS_CNT]; -}; +struct evemu_device *evemu_new(const char *name); +void evemu_delete(struct evemu_device *dev); -static inline int evemu_has(const struct evemu_device *dev, - int type, int code) -{ - return (dev->mask[type][code >> 3] >> (code & 7)) & 1; -} +const char *evemu_get_name(const struct evemu_device *dev); + +int evemu_has(const struct evemu_device *dev, int type, int code); int evemu_extract(struct evemu_device *dev, int fd); int evemu_write(const struct evemu_device *dev, FILE *fp); diff --git a/src/evemu-impl.h b/src/evemu-impl.h new file mode 100644 index 0000000..2346590 --- /dev/null +++ b/src/evemu-impl.h @@ -0,0 +1,19 @@ +#ifndef _EVEMU_IMPL_H +#define _EVEMU_IMPL_H + +#include <evemu.h> +#include <linux/uinput.h> + +#define EVPLAY_NBITS KEY_CNT +#define EVPLAY_NBYTES ((EVPLAY_NBITS + 7) / 8) + +struct evemu_device { + int version_major, version_minor; + char name[UINPUT_MAX_NAME_SIZE]; + struct input_id id; + unsigned char mask[EV_CNT][EVPLAY_NBYTES]; + int bytes[EV_CNT]; + struct input_absinfo abs[ABS_CNT]; +}; + +#endif diff --git a/src/evemu.c b/src/evemu.c index 54156aa..53bda86 100644 --- a/src/evemu.c +++ b/src/evemu.c @@ -26,7 +26,8 @@ * ****************************************************************************/ -#include "evemu.h" +#include "evemu-impl.h" +#include <stdlib.h> #include <string.h> #include <stdio.h> #include <fcntl.h> @@ -44,6 +45,34 @@ static void copy_bits(unsigned char *mask, const unsigned long *bits, int bytes) } } +struct evemu_device *evemu_new(const char *name) +{ + struct evemu_device *dev = calloc(1, sizeof(struct evemu_device)); + + dev->version_major = EVEMU_VERSION_MAJOR; + dev->version_minor = EVEMU_VERSION_MINOR; + + if (name && strlen(name) < sizeof(dev->name)) + strcpy(dev->name, name); + + return dev; +} + +void evemu_delete(struct evemu_device *dev) +{ + free(dev); +} + +const char *evemu_get_name(const struct evemu_device *dev) +{ + return dev->name; +} + +int evemu_has(const struct evemu_device *dev, int type, int code) +{ + return (dev->mask[type][code >> 3] >> (code & 7)) & 1; +} + int evemu_extract(struct evemu_device *dev, int fd) { unsigned long bits[64]; diff --git a/tools/evemu-describe.c b/tools/evemu-describe.c index ec6b1ef..6c6cdab 100644 --- a/tools/evemu-describe.c +++ b/tools/evemu-describe.c @@ -26,22 +26,27 @@ * ****************************************************************************/ -#include "evemu.h" +#include <evemu.h> #include <stdio.h> #include <fcntl.h> #include <string.h> static int describe_device(int fd) { - struct evemu_device dev; - int ret; + struct evemu_device *dev; + int ret = -ENOMEM; - ret = evemu_extract(&dev, fd); + dev = evemu_new(0); + if (!dev) + goto out; + ret = evemu_extract(dev, fd); if (ret) - return ret; - evemu_write(&dev, stdout); + goto out; - return 0; + evemu_write(dev, stdout); +out: + evemu_delete(dev); + return ret; } int main(int argc, char *argv[]) diff --git a/tools/evemu-device.c b/tools/evemu-device.c index b318cf6..79193ff 100644 --- a/tools/evemu-device.c +++ b/tools/evemu-device.c @@ -50,7 +50,7 @@ static void hold_device(const struct evemu_device *dev) ret = read(fd, name, sizeof(name)); if (ret > 0) name[ret - 1] = 0; - if (!strcmp(dev->name, name)) + if (!strcmp(evemu_get_name(dev), name)) sprintf(node, "/dev/input/event%d", i + 1); close(fd); } @@ -58,7 +58,7 @@ static void hold_device(const struct evemu_device *dev) fd = open(node, O_RDONLY); if (fd < 0) return; - fprintf(stdout, "%s: %s\n", dev->name, node); + fprintf(stdout, "%s: %s\n", evemu_get_name(dev), node); fflush(stdout); while ((ret = read(fd, data, sizeof(data))) > 0); close(fd); @@ -66,28 +66,36 @@ static void hold_device(const struct evemu_device *dev) static int evemu_device(FILE *fp) { - struct evemu_device dev; - int ret, fd; + struct evemu_device *dev; + char name[64]; + int ret = -ENOMEM; + int fd; - ret = evemu_read(&dev, fp); - if (ret <= 0) - return ret; + sprintf(name, "evemu-%d", getpid()); - sprintf(dev.name, "evemu-%d", getpid()); + dev = evemu_new(name); + if (!dev) + goto out; + ret = evemu_read(dev, fp); + if (ret <= 0) + goto out; - fd = open(UINPUT_NODE, O_WRONLY); - if (fd < 0) - return fd; - ret = evemu_create(&dev, fd); + ret = fd = open(UINPUT_NODE, O_WRONLY); if (ret < 0) - return ret; - - hold_device(&dev); + goto out; + ret = evemu_create(dev, fd); + if (ret < 0) + goto out_close; + hold_device(dev); evemu_destroy(fd); + +out_close: close(fd); +out: + evemu_delete(dev); - return 0; + return ret; } int main(int argc, char *argv[]) diff --git a/tools/evemu-echo.c b/tools/evemu-echo.c index d3501ea..e9c89df 100644 --- a/tools/evemu-echo.c +++ b/tools/evemu-echo.c @@ -33,16 +33,20 @@ static int evemu_echo_describe(FILE *fp) { - struct evemu_device dev; - int ret; + struct evemu_device *dev; + int ret = -ENOMEM; - ret = evemu_read(&dev, fp); + dev = evemu_new(0); + if (!dev) + goto out; + ret = evemu_read(dev, fp); if (ret <= 0) - return ret; - - evemu_write(&dev, stdout); + goto out; - return 0; + evemu_write(dev, stdout); +out: + evemu_delete(dev); + return ret; } static int evemu_echo_event(FILE *fp) |