summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHenrik Rydberg <rydberg@euromail.se>2010-12-21 17:29:14 +0100
committerHenrik Rydberg <rydberg@euromail.se>2010-12-21 17:29:14 +0100
commit1bc6faa48907919376b14429f3b802d0d16fc00a (patch)
tree73e57b6f956d8f50c456330c878e9b210ad41483
parenta8df0405686350c3145b3e5119d796c6642339fd (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.h28
-rw-r--r--src/evemu-impl.h19
-rw-r--r--src/evemu.c31
-rw-r--r--tools/evemu-describe.c19
-rw-r--r--tools/evemu-device.c40
-rw-r--r--tools/evemu-echo.c18
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)