diff options
-rw-r--r-- | tools/Makefile.am | 3 | ||||
-rw-r--r-- | tools/evemu-device.c | 133 | ||||
-rw-r--r-- | tools/evemu-play.c | 100 |
3 files changed, 102 insertions, 134 deletions
diff --git a/tools/Makefile.am b/tools/Makefile.am index 9195595..c4e9902 100644 --- a/tools/Makefile.am +++ b/tools/Makefile.am @@ -15,6 +15,9 @@ AM_LDFLAGS = $(top_builddir)/src/libevemu.la evemu_describe_SOURCES = evemu-record.c find_event_devices.c find_event_devices.h evemu_record_SOURCES = $(evemu_describe_SOURCES) +evemu_play_SOURCES = evemu-play.c +evemu_device_SOURCES = $(evemu_play_SOURCES) + evemu_event_CFLAGS = $(LIBEVDEV_CFLAGS) evemu_event_LDADD = $(LIBEVDEV_LIBS) diff --git a/tools/evemu-device.c b/tools/evemu-device.c deleted file mode 100644 index 9b73e98..0000000 --- a/tools/evemu-device.c +++ /dev/null @@ -1,133 +0,0 @@ -/***************************************************************************** - * - * evemu - Kernel device emulation - * - * Copyright (C) 2010-2012 Canonical Ltd. - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 3 as published - * by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - * - * Copyright (C) 2010 Henrik Rydberg <rydberg@euromail.se> - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - ****************************************************************************/ - -#include "evemu.h" -#include <dirent.h> -#include <errno.h> -#include <fcntl.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <sys/stat.h> -#include <sys/types.h> -#include <unistd.h> - -/* - * Finds the newly created device node and holds it open. - */ -static void hold_device(struct evemu_device *dev) -{ - char data[256]; - int ret; - int fd; - const char *device_node = evemu_get_devnode(dev); - - if (!device_node) { - fprintf(stderr, "can not determine device node\n"); - return; - } - - fd = open(device_node, O_RDONLY); - if (fd < 0) { - fprintf(stderr, "error %d opening %s: %s\n", - errno, device_node, strerror(errno)); - return; - } - fprintf(stdout, "%s: %s\n", evemu_get_name(dev), device_node); - fflush(stdout); - - while ((ret = read(fd, data, sizeof(data))) > 0) - ; - - close(fd); -} - -static int evemu_device(FILE *fp) -{ - struct evemu_device *dev; - int ret = -ENOMEM; - - dev = evemu_new(NULL); - if (!dev) - goto out; - ret = evemu_read(dev, fp); - if (ret <= 0) - goto out; - - if (strlen(evemu_get_name(dev)) == 0) { - char name[64]; - sprintf(name, "evemu-%d", getpid()); - evemu_set_name(dev, name); - } - - ret = evemu_create_managed(dev); - if (ret < 0) - goto out; - hold_device(dev); - evemu_destroy(dev); - -out: - evemu_delete(dev); - - return ret; -} - -int main(int argc, char *argv[]) -{ - FILE *fp; - int ret; - if (argc < 2) { - fprintf(stderr, "Usage: %s <dev.prop>\n", argv[0]); - return -1; - } - fp = fopen(argv[1], "r"); - if (!fp) { - fprintf(stderr, "error: could not open file (%m)\n"); - return -1; - } - ret = evemu_device(fp); - if (ret <= 0) { - fprintf(stderr, "error: could not create device: %d\n", ret); - return -1; - } - fclose(fp); - return 0; -} diff --git a/tools/evemu-play.c b/tools/evemu-play.c index 84aa668..fe43f4d 100644 --- a/tools/evemu-play.c +++ b/tools/evemu-play.c @@ -39,15 +39,100 @@ * ****************************************************************************/ +#define _GNU_SOURCE #include "evemu.h" +#include <errno.h> #include <stdio.h> #include <fcntl.h> #include <string.h> #include <unistd.h> -int main(int argc, char *argv[]) +/* + * Finds the newly created device node and holds it open. + */ +static void hold_device(struct evemu_device *dev) +{ + char data[256]; + int ret; + int fd; + const char *device_node = evemu_get_devnode(dev); + + if (!device_node) { + fprintf(stderr, "can not determine device node\n"); + return; + } + + fd = open(device_node, O_RDONLY); + if (fd < 0) { + fprintf(stderr, "error %d opening %s: %s\n", + errno, device_node, strerror(errno)); + return; + } + fprintf(stdout, "%s: %s\n", evemu_get_name(dev), device_node); + fflush(stdout); + + while ((ret = read(fd, data, sizeof(data))) > 0) + ; + + close(fd); +} + +static int evemu_device(FILE *fp) +{ + struct evemu_device *dev; + int ret = -ENOMEM; + + dev = evemu_new(NULL); + if (!dev) + goto out; + ret = evemu_read(dev, fp); + if (ret <= 0) + goto out; + + if (strlen(evemu_get_name(dev)) == 0) { + char name[64]; + sprintf(name, "evemu-%d", getpid()); + evemu_set_name(dev, name); + } + + ret = evemu_create_managed(dev); + if (ret < 0) + goto out; + hold_device(dev); + evemu_destroy(dev); + +out: + evemu_delete(dev); + + return ret; +} + +static int device(int argc, char *argv[]) +{ + FILE *fp; + int ret; + if (argc < 2) { + fprintf(stderr, "Usage: %s <dev.prop>\n", argv[0]); + return -1; + } + fp = fopen(argv[1], "r"); + if (!fp) { + fprintf(stderr, "error: could not open file (%m)\n"); + return -1; + } + ret = evemu_device(fp); + if (ret <= 0) { + fprintf(stderr, "error: could not create device: %d\n", ret); + return -1; + } + fclose(fp); + return 0; +} + +static int play(int argc, char *argv[]) { int fd; + if (argc != 2) { fprintf(stderr, "Usage: %s <device>\n", argv[0]); fprintf(stderr, "\n"); @@ -65,3 +150,16 @@ int main(int argc, char *argv[]) close(fd); return 0; } + +int main(int argc, char *argv[]) +{ + const char *prgm_name = program_invocation_short_name; + + if (prgm_name && + (strcmp(prgm_name, "evemu-device") == 0 || + /* when run directly from the sources (not installed) */ + strcmp(prgm_name, "lt-evemu-device") == 0)) + return device(argc, argv); + else + return play(argc, argv); +} |