[PATCH evemu 1/2] tools: evemu-device: rely on libevdev to retrieve the device node
Peter Hutterer
peter.hutterer at who-t.net
Thu Jan 9 14:53:45 PST 2014
On Thu, Jan 09, 2014 at 05:15:10PM -0500, Benjamin Tissoires wrote:
> Cleanup a little evemu-device now that we rely on libevdev for the internal
> stuffs.
> Needs to export a new function evemu_get_devnode, but we already have
> broken the ABI.
>
> Signed-off-by: Benjamin Tissoires <benjamin.tissoires at gmail.com>
> ---
>
> Not sure about the ABI breakage (new function) and the soname bump, but still,
> there has been no release since the last bump...
no bump needed then, people building against git versions cannot expect ABI
stability.
Reviewed-by: Peter Hutterer <peter.hutterer at who-t.net>
note that we can pass LIBEVDEV_UINPUT_OPEN_MANAGED as fd, so it's likely we
can drop the rest of this file too.
Cheers,
Peter
> src/evemu.c | 5 +++
> src/evemu.h | 9 ++++
> src/libevemu.ver | 1 +
> tools/evemu-device.c | 121 +--------------------------------------------------
> 4 files changed, 17 insertions(+), 119 deletions(-)
>
> diff --git a/src/evemu.c b/src/evemu.c
> index 888ce3c..21adef1 100644
> --- a/src/evemu.c
> +++ b/src/evemu.c
> @@ -781,6 +781,11 @@ int evemu_create(struct evemu_device *dev, int fd)
> return libevdev_uinput_create_from_device(dev->evdev, fd, &dev->uidev);
> }
>
> +const char *evemu_get_devnode(struct evemu_device *dev)
> +{
> + return libevdev_uinput_get_devnode(dev->uidev);
> +}
> +
> void evemu_destroy(struct evemu_device *dev)
> {
> if (dev->uidev) {
> diff --git a/src/evemu.h b/src/evemu.h
> index 44634e8..d25d707 100644
> --- a/src/evemu.h
> +++ b/src/evemu.h
> @@ -423,6 +423,15 @@ int evemu_play(FILE *fp, int fd);
> int evemu_create(struct evemu_device *dev, int fd);
>
> /**
> + * evemu_get_devnode() - get device node
> + * @dev: the device in use
> + *
> + * Returns the input device node of the virtual device. The pointer is owned by
> + * the evemu instance and has evemu scope.
> + */
> +const char *evemu_get_devnode(struct evemu_device *dev);
> +
> +/**
> * evemu_destroy() - destroy all created kernel devices
> * @dev: the device to destroy
> *
> diff --git a/src/libevemu.ver b/src/libevemu.ver
> index 24ae0ce..8f216fd 100644
> --- a/src/libevemu.ver
> +++ b/src/libevemu.ver
> @@ -11,6 +11,7 @@ EVEMU_2.0 {
> evemu_get_abs_maximum;
> evemu_get_abs_minimum;
> evemu_get_abs_resolution;
> + evemu_get_devnode;
> evemu_get_id_bustype;
> evemu_get_id_product;
> evemu_get_id_vendor;
> diff --git a/tools/evemu-device.c b/tools/evemu-device.c
> index ae82578..064d116 100644
> --- a/tools/evemu-device.c
> +++ b/tools/evemu-device.c
> @@ -51,133 +51,17 @@
> #include <unistd.h>
>
> #define UINPUT_NODE "/dev/uinput"
> -#define MAX_EVENT_NODE 32
> -#define SYS_INPUT_DIR "/sys/class/input"
> -
> -
> -/*
> - * Extracts the device number from the event file name.
> - */
> -static int _device_number_from_event_file_name(const char *event_file_name)
> -{
> - int device_number = -1;
> - sscanf(event_file_name, "event%d", &device_number);
> - return device_number;
> -}
> -
> -
> -/*
> - * A filter that passes only input event file names.
> - */
> -static int _filter_event_files(const struct dirent *d)
> -{
> - return 0 == strncmp("event", d->d_name, sizeof("event")-1);
> -}
> -
> -
> -/*
> - * A strict weak ordering function to compare two event file names.
> - */
> -static int _sort_event_files(const struct dirent **lhs, const struct dirent **rhs)
> -{
> - int d1 = _device_number_from_event_file_name((*lhs)->d_name);
> - int d2 = _device_number_from_event_file_name((*rhs)->d_name);
> - return (d1 > d2) ? -1 : (d1 == d2) ? 0 : 1;
> -}
> -
> -
> -/*
> - * Finds the device node that has a matching device name and the most recent
> - * creation time.
> - */
> -static char * _find_newest_device_node_with_name(const char *device_name)
> -{
> - struct dirent **event_file_list;
> - time_t newest_node_time = 0;
> - char *newest_node_name = NULL;
> - int i;
> -
> - int event_file_count = scandir(SYS_INPUT_DIR,
> - &event_file_list,
> - _filter_event_files,
> - _sort_event_files);
> - if (event_file_count < 0)
> - {
> - fprintf(stderr, "error %d opening %s: %s\n",
> - errno, SYS_INPUT_DIR, strerror(errno));
> - return NULL;
> - }
> -
> - for (i = 0; i < event_file_count; ++i)
> - {
> - int device_number = _device_number_from_event_file_name(event_file_list[i]->d_name);
> -
> - char name_file_name[48];
> - FILE *name_file;
> - char name[128];
> - size_t name_length;
> -
> - /* get the name of the device */
> - sprintf(name_file_name, SYS_INPUT_DIR "/event%d/device/name", device_number);
> - name_file = fopen(name_file_name, "r");
> - if (!name_file)
> - {
> - fprintf(stderr, "error %d opening %s: %s\n",
> - errno, name_file_name, strerror(errno));
> - goto next_file;
> - }
> - name_length = fread(name, sizeof(char), sizeof(name)-1, name_file);
> - fclose(name_file);
> -
> - if (name_length <= 1)
> - goto next_file;
> -
> - /* trim the trailing newline */
> - name[name_length-1] = 0;
> -
> - /* if the device name matches, compare the creation times */
> - if (0 == strcmp(name, device_name))
> - {
> - char input_name[32];
> - struct stat sbuf;
> - int sstat;
> -
> - sprintf(input_name, "/dev/input/event%d", device_number);
> - sstat = stat(input_name, &sbuf);
> - if (sstat < 0)
> - {
> - fprintf(stderr, "error %d stating %s: %s\n",
> - errno, name_file_name, strerror(errno));
> - goto next_file;
> - }
> -
> - if (sbuf.st_ctime > newest_node_time)
> - {
> - newest_node_time = sbuf.st_ctime;
> - free(newest_node_name);
> - newest_node_name = strdup(input_name);
> - }
> - }
> -
> -next_file:
> - free(event_file_list[i]);
> - }
> - free(event_file_list);
> -
> - return newest_node_name;
> -}
> -
>
> /*
> * Finds the newly created device node and holds it open.
> */
> -static void hold_device(const struct evemu_device *dev)
> +static void hold_device(struct evemu_device *dev)
> {
> char data[256];
> int ret;
> int fd;
>
> - char *device_node = _find_newest_device_node_with_name(evemu_get_name(dev));
> + const char *device_node = evemu_get_devnode(dev);
> if (!device_node)
> {
> fprintf(stderr, "can not determine device node\n");
> @@ -195,7 +79,6 @@ static void hold_device(const struct evemu_device *dev)
> fflush(stdout);
> while ((ret = read(fd, data, sizeof(data))) > 0);
> close(fd);
> - free(device_node);
> }
>
> static int evemu_device(FILE *fp)
> --
> 1.8.3.1
>
> _______________________________________________
> Input-tools mailing list
> Input-tools at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/input-tools
More information about the Input-tools
mailing list