Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff -ruN evemu-2.2.0/src/evemu.c evemu-2.2.0-switchpatch/src/evemu.c
- --- evemu-2.2.0/src/evemu.c 2015-08-30 17:37:39.155134817 +0100
- +++ evemu-2.2.0-switchpatch/src/evemu.c 2015-08-30 17:37:39.152134816 +0100
- @@ -133,6 +133,31 @@
- return dev;
- }
- +struct evemu_device *evswitch_enumerate(FILE *fp) {
- + int ret = -ENOMEM;
- + struct evemu_device *dev = calloc(1, sizeof(struct evemu_device));
- + 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;
- + return dev;
- +out:
- + evemu_delete(dev);
- +
- + return ret;
- +}
- void evemu_delete(struct evemu_device *dev)
- {
- if (dev->uidev)
- @@ -777,6 +802,78 @@
- }
- }
- + return 0;
- +}
- +
- +int evemu_forward(int fdc, int fdo, int fdo2, int fdo3, int fd, int ms)
- +{
- + struct pollfd fds[2] ;
- + fds[0].fd = fd;
- + fds[0].events = POLLIN;
- + fds[0].revents = 0;
- + fds[1].fd = fdc;
- + fds[1].events = POLLIN;
- + fds[1].revents = 0;
- + struct input_event ev;
- + char buft[10];
- + char cokb = '1';
- + char xokb = '2';
- + char wikb = '3';
- + int i;
- + char o;
- + o = '1';
- + int ret;
- + int reto;
- + long offset = 0;
- + while (poll(fds, 2, ms) > 0) {
- + if(fds[1].revents & POLLIN) {
- + error(WARNING, "control failure\n");
- + while ( i = read( fdc, buft, 1 ) > 0 ) {
- + char buf = buft[0] ;
- + error(WARNING, "operator cant controlling\n");
- + if (fdo3==NULL) {
- + if ( buf==cokb || buf==xokb) {
- + o = buf;
- + error(WARNING, "operator appears to be controlling\n");
- + } else {
- + error(WARNING, "operator appears to be trolling\n");
- + }
- + } else {
- + if ( buf==cokb || buf==xokb || buf==wikb) {
- + o = buf;
- + error(WARNING, "operator appears to be controlling\n");
- + } else {
- + error(WARNING, "operator appears to be trolling\n");
- + }
- + }
- + }
- + }
- + if(fds[0].revents & POLLIN) {
- + SYSCALL(ret = read(fd, &ev, sizeof(ev)));
- + if (ret < 0)
- + return ret;
- + if (ret == sizeof(ev)) {
- +
- + switch(o) {
- + case '1':
- + SYSCALL(reto = write(fdo, &ev, sizeof(ev)));
- + break;
- + case '2':
- + SYSCALL(reto = write(fdo2, &ev, sizeof(ev)));
- + break;
- + case '3':
- + SYSCALL(reto = write(fdo3, &ev, sizeof(ev)));
- + break;
- + default:
- + /* If operator is other than +, -, * or /, error message is shown */
- + error(WARNING, "operator appears to be an empty file\n");
- + break;
- + }
- +
- + }
- + }
- + }
- +
- return 0;
- }
- diff -ruN evemu-2.2.0/src/evemu.h evemu-2.2.0-switchpatch/src/evemu.h
- --- evemu-2.2.0/src/evemu.h 2015-08-30 17:37:39.155134817 +0100
- +++ evemu-2.2.0-switchpatch/src/evemu.h 2015-08-30 17:37:39.152134816 +0100
- @@ -64,6 +64,20 @@
- */
- struct evemu_device *evemu_new(const char *name);
- +
- +
- +/**
- + * evswitch_enumerate() - allocate a new evemu device
- + * @fp: input device desctiptor
- + * <always-NULL> wanted input device name (or NULL to leave empty)
- + *
- + * This function allocates a new evemu device structure and
- + * initializes all fields to zero. If name is non-null and the length
- + * is sane, it is copied to the device name.
- + * Then initializes dthe devise from the supplied file.
- + * Returns NULL in case of memory failure.
- + */
- +struct evemu_device *evswitch_enumerate(FILE *fp);
- /**
- * evemu_delete() - free and allocated evemu device
- * @dev: the device to free
- @@ -388,6 +402,19 @@
- */
- int evemu_record(FILE *fp, int fd, int ms);
- +/**
- + * evswitch_forward() - read events directly from a kernel device
- + * @fdo: file descriptor of kernel device to output from
- + * @fd: file descriptor of kernel device to read from
- + * @ms: maximum time to wait for an event to appear before reading (ms)
- + *
- + * Continuously reads events from one kernel device and writes out
- + * reiugn the other. The function terminates after ms milliseconds of
- + * inactivity.
- + *
- + * Returns zero if successful, negative error otherwise.
- + */
- +int evemu_forward(int fdc, int fdo, int fdo2, int dfo3, int fd, int ms);
- /**
- * evemu_play_one() - play one event to kernel device
- diff -ruN evemu-2.2.0/src/libevemu.ver evemu-2.2.0-switchpatch/src/libevemu.ver
- --- evemu-2.2.0/src/libevemu.ver 2015-08-30 17:37:39.155134817 +0100
- +++ evemu-2.2.0-switchpatch/src/libevemu.ver 2015-08-30 17:37:39.152134816 +0100
- @@ -29,6 +29,7 @@
- evemu_read_event;
- evemu_read_event_realtime;
- evemu_record;
- + evemu_forward;
- evemu_set_abs_flat;
- evemu_set_abs_fuzz;
- evemu_set_abs_maximum;
- @@ -41,6 +42,7 @@
- evemu_set_name;
- evemu_write;
- evemu_write_event;
- + evswitch_enumerate;
- local:
- *;
- diff -ruN evemu-2.2.0/tools/Makefile.am evemu-2.2.0-switchpatch/tools/Makefile.am
- --- evemu-2.2.0/tools/Makefile.am 2015-08-30 17:37:39.155134817 +0100
- +++ evemu-2.2.0-switchpatch/tools/Makefile.am 2015-08-30 17:41:22.261141511 +0100
- @@ -6,7 +6,8 @@
- evemu-device \
- evemu-record \
- evemu-play \
- - evemu-event
- + evemu-event \
- + evemu-switch
- AM_CPPFLAGS =-I$(top_srcdir)/src/
- diff -ruN evemu-2.2.0/tools/evemu-switch.c evemu-2.2.0-switchpatch/tools/evemu-switch.c
- --- evemu-2.2.0/tools/evemu-switch.c 1970-01-01 01:00:00.000000000 +0100
- +++ evemu-2.2.0-switchpatch/tools/evemu-switch.c 2015-08-30 17:37:39.152134816 +0100
- @@ -0,0 +1,394 @@
- +/*****************************************************************************
- + *
- + * 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.
- + *
- + ****************************************************************************/
- +
- +#define _GNU_SOURCE
- +#include "evemu.h"
- +#include <stdio.h>
- +#include <stdlib.h>
- +#include <fcntl.h>
- +#include <string.h>
- +#include <unistd.h>
- +#include <signal.h>
- +#include <time.h>
- +#include <sys/stat.h>
- +#include "find_event_devices.h"
- +
- +#define INFINITE -1
- +
- + int fd;
- + int fdo;
- + int fdo2;
- + int fdo3 = NULL;
- + int fdc;
- + FILE *fp;
- + FILE *fp2;
- + FILE *fp3;
- + int devout;
- + struct evemu_device *dev;
- + struct evemu_device *dev1;
- + struct evemu_device *dev2;
- + struct evemu_device *dev3;
- + char *myfifo;
- +
- +/*
- +static int describe_device(int fd)
- +{
- + struct evemu_device *dev;
- + int ret = -ENOMEM;
- +
- + dev = evemu_new(NULL);
- + if (!dev)
- + goto out;
- + ret = evemu_extract(dev, fd);
- + if (ret)
- + goto out;
- +
- + evemu_write(dev, stdout);
- +out:
- + evemu_delete(dev);
- + return ret;
- +}
- +*/
- +
- +static void handler (int sig __attribute__((unused)))
- +{
- + ioctl(fd, EVIOCGRAB, (void*)0);
- + close(fdo);
- + close(fdo2);
- + close(fdo3);
- + close(fd);
- + close(fdc);
- + unlink(myfifo);
- + evemu_destroy(dev1);
- + evemu_delete(dev1);
- + evemu_destroy(dev2);
- + evemu_delete(dev2);
- + evemu_destroy(dev3);
- + evemu_delete(dev3);
- +}
- +
- +enum mode {
- + EVEMU_RECORD,
- + EVEMU_DESCRIBE
- +};
- +
- +int main(int argc, char *argv[])
- +{
- + enum mode mode = EVEMU_RECORD;
- +
- + struct sigaction act;
- + char *prgm_name = program_invocation_short_name;
- + int nrouts = 0;
- + char *fifc = "_control";
- + int ret = 1;
- +
- +
- + if (prgm_name && (strcmp(prgm_name, "evemu-describe") == 0 ||
- + /* when run directly from the sources (not installed) */
- + strcmp(prgm_name, "lt-evemu-describe") == 0))
- + mode = EVEMU_DESCRIBE;
- +/*
- + device = (argc < 2) ? find_event_devices() : strdup(argv[1]);
- +
- + if (device == NULL) {
- + fprintf(stderr, "Usage: %s <device> [output file]\n", argv[0]);
- + return -1;
- + }
- +*/
- + if (argc < 4) {
- + fprintf(stderr, "Usage: %s <input-device> <output-descriptor1> <output-descriptor2> [output-descriptor3]\n", argv[0]);
- + return -1;
- + }
- + switch(argc) {
- + case 4:
- + nrouts = 2;
- + break;
- + case 5:
- + nrouts = 3;
- + break;
- + default:
- + nrouts = 3;
- + /* If operator is other than +, -, * or /, error message is shown */
- + fprintf(stderr, "operator appears to be overly optimistic\n");
- + fprintf(stderr, "args %d \n",argc);
- + fprintf(stderr, "%s %s %s %s %s",argv[0], argv[1], argv[2] ,argv[3],argv[4]);
- + /*return -1;*/
- + break;
- + }
- +
- +/*
- + if (argc != 5) {
- + fprintf(stderr, "Usage: %s <input-device> <output-device1> <output-device2> <output-device3>\n", argv[0]);
- + fprintf(stderr, "\n");
- + fprintf(stderr, "Event data is read from standard input.\n");
- + return -1;
- + }
- +*/
- +
- + fp = fopen(argv[2], "r");
- + if (!fp) {
- + fprintf(stderr, "error: could not open file %s\n",argv[2]);
- + return -1;
- + }
- + fp2 = fopen(argv[3], "r");
- + if (!fp2) {
- + fprintf(stderr, "error: could not open file %s\n",argv[3]);
- + goto error1;
- + }
- + if (nrouts == 3) {
- + fp3 = fopen(argv[4], "r");
- + if (!fp3) {
- + fprintf(stderr, "error: could not open file %s\n",argv[4]);
- + goto error2;
- + }
- + }
- +
- + dev1 = evswitch_enumerate(fp);
- + if (dev1 <= 0) {
- + fprintf(stderr, "can not enumerate device1\n");
- + goto error3;
- + }
- + const char *device_node1 = evemu_get_devnode(dev1);
- + if (!device_node1)
- + {
- + fprintf(stderr, "can not determine device node1\n");
- + goto error3;
- + }
- +
- + dev2 = evswitch_enumerate(fp2);
- + if (dev2 <= 0) {
- + fprintf(stderr, "can not enumerate device2\n");
- + goto error4;
- + }
- + const char *device_node2 = evemu_get_devnode(dev2);
- + if (!device_node2)
- + {
- + fprintf(stderr, "can not determine device node2\n");
- + goto error5;
- + }
- + close(*fp);
- + close(*fp2);
- +
- + if (nrouts == 3) {
- + dev3 = evswitch_enumerate(fp3);
- + if (dev3 <= 0) {
- + fprintf(stderr, "can not enumerate device3\n");
- + goto error5;
- + }
- + const char *device_node3 = evemu_get_devnode(dev3);
- + if (!device_node3)
- + {
- + fprintf(stderr, "can not determine device node3\n");
- + goto error5;
- + }
- + fdo3 = open(device_node3, O_WRONLY);
- + if (fd < 0) {
- + fprintf(stderr, "error: could not open output device %s\n",device_node3);
- + goto error6;
- + }
- + close(*fp3);
- + }
- +
- +
- +
- + fdo = open(device_node1, O_WRONLY);
- + if (fdo < 0) {
- + fprintf(stderr, "error: could not open output device %s\n",device_node1);
- + goto error11;
- + }
- +
- +
- + fdo2 = open(device_node2, O_WRONLY);
- + if (fd < 0) {
- + fprintf(stderr, "error: could not open output device %s\n",device_node2);
- + goto error12;
- + }
- +
- +
- +
- +
- +
- + fd = open(argv[1], O_RDONLY | O_NONBLOCK);
- + if (fd < 0) {
- + fprintf(stderr, "error: could not open input device\n");
- + goto error13;
- + }
- +
- +
- +/* ret = evemu_device(fp);*/
- + /*if (nrouts == 3) {
- + dev3 = evswitch_enumerate(fp3);
- +
- + const char *device_node3 = evemu_get_devnode(dev3);
- + if (!fdo3)
- + {
- + fprintf(stderr, "can not determine device node\n");
- + return -1;
- + }
- + }*/
- + if (ret <= 0) {
- + fprintf(stderr, "error: could not create device: %d\n", ret);
- + fclose(fp);
- + return -1;
- + }
- +
- +
- +
- +
- + if (nrouts == 3) {
- +
- + }
- +
- +
- + /* create the FIFO (named pipe) */
- + myfifo = strcat(strdup(argv[1]),fifc);
- + mkfifo(myfifo, 0666);
- + ret = chmod(myfifo,S_IRWXU|S_IRGRP|S_IWGRP|S_IROTH);
- + ret = chown(myfifo,0,10);
- + fdc = open(myfifo, O_RDWR | O_NONBLOCK);
- + if (fdc < 0) {
- + fprintf(stderr, "error: could not open control device\n");
- + fprintf(stderr, "%s \n", myfifo);
- + goto error14;
- + }
- +
- +
- + memset (&act, '\0', sizeof(act));
- + act.sa_handler = &handler;
- +
- + if (sigaction(SIGTERM, &act, NULL) < 0) {
- + fprintf (stderr, "Could not attach TERM signal handler.\n");
- + return 1;
- + }
- + if (sigaction(SIGINT, &act, NULL) < 0) {
- + fprintf (stderr, "Could not attach INT signal handler.\n");
- + return 1;
- + }
- +
- +/*
- + if (argc < 3)
- + output = stdout;
- + else {
- + output = fopen(argv[2], "w");
- + if (!output) {
- + fprintf(stderr, "error: could not open output file");
- + }
- + }
- +*/
- +/*
- + if (describe_device(fd)) {
- + fprintf(stderr, "error: could not describe device\n");
- + goto out;
- + }
- +*/
- + if (mode == EVEMU_RECORD) {
- +#ifdef EVIOCSCLOCKID
- + int clockid = CLOCK_MONOTONIC;
- + ioctl(fd, EVIOCSCLOCKID, &clockid);
- +#endif
- + if (ioctl(fd, EVIOCGRAB, (void*)1) < 0) {
- + fprintf(stderr, "error: this device is grabbed and I cannot record events\n");
- + fprintf(stderr, "see the evemu-record man page for more information\n");
- + goto error15;
- + } /*else
- + ioctl(fd, EVIOCGRAB, (void*)0);*/
- +
- + fprintf(stderr, "################################\n");
- + fprintf(stderr, "# Waiting for events #\n");
- + fprintf(stderr, "################################\n");
- + if (evemu_forward(fdc, fdo, fdo2, fdo3, fd, INFINITE))
- + fprintf(stderr, "error: could not describe device\n");
- + goto error16;
- + }
- +
- +
- + ioctl(fd, EVIOCGRAB, (void*)0);
- + close(*fdo);
- + close(*fdo2);
- + close(*fdo3);
- + close(*fd);
- + close(*fdc);
- + unlink(myfifo);
- + evemu_destroy(dev1);
- + evemu_delete(dev1);
- + evemu_destroy(dev2);
- + evemu_delete(dev2);
- + evemu_destroy(dev3);
- + evemu_delete(dev3);
- + return 0;
- +
- +error16:
- + ioctl(fd, EVIOCGRAB, (void*)0);
- +error15:
- + close(*fdc);
- + unlink(myfifo);
- +error14:
- + close(*fd);
- +error13:
- + close(*fdo2);
- +error12:
- + close(*fdo);
- +error11:
- + close(fdo3);
- + evemu_destroy(dev3);
- + evemu_delete(dev3);
- + evemu_destroy(dev2);
- + evemu_delete(dev2);
- + evemu_destroy(dev1);
- + evemu_delete(dev1);
- + return -1;
- +error6:
- + evemu_destroy(dev3);
- + evemu_delete(dev3);
- +error5:
- + evemu_destroy(dev2);
- + evemu_delete(dev2);
- +error4:
- + evemu_destroy(dev1);
- + evemu_delete(dev1);
- +error3:
- + close(*fp3);
- +error2:
- + close(*fp2);
- +error1:
- + close(*fp);
- + return -1;
- +}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement