diff options
author | Thomas Hellstrom <thellstrom@vmware.com> | 2014-10-01 21:04:30 +0200 |
---|---|---|
committer | Thomas Hellstrom <thellstrom@vmware.com> | 2014-10-08 12:08:58 +0200 |
commit | 576e8123d9f9f01ef6041cdfb96ca811197d05d2 (patch) | |
tree | b45b0ea1b63beea3d11eb2d5e55bd3c3c1bf356b /tools | |
parent | de58228aaf226baac21f4bb31712f7257b221370 (diff) |
Back off if we detect a vmmouse kernel driver v3
If a vmmouse kernel driver is active, vmmouse input is handled by the Xorg
evdev driver and not by the vmmouse driver, so make sure the vmmouse_detect
utility doesn't detect a vmmouse if a kernel driver is active.
v2: Change the vmmouse kernel device name, fix comment.
v3: Fix up libudev error handling.
Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com>
Reviewed-by: Sinclair Yeh <syeh@vmware.com>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/Makefile.am | 7 | ||||
-rw-r--r-- | tools/vmmouse_detect.c | 5 | ||||
-rw-r--r-- | tools/vmmouse_udev.c | 104 |
3 files changed, 114 insertions, 2 deletions
diff --git a/tools/Makefile.am b/tools/Makefile.am index 8ae5516..a1396ba 100644 --- a/tools/Makefile.am +++ b/tools/Makefile.am @@ -22,8 +22,11 @@ bin_PROGRAMS = @DRIVER_NAME@_detect AM_CPPFLAGS = -I$(top_srcdir)/shared $(XORG_CFLAGS) -@DRIVER_NAME@_detect_SOURCES = vmmouse_detect.c -@DRIVER_NAME@_detect_LDADD = $(top_builddir)/shared/lib@DRIVER_NAME@.la +@DRIVER_NAME@_detect_SOURCES = vmmouse_detect.c vmmouse_udev.c +@DRIVER_NAME@_detect_LDADD = $(top_builddir)/shared/lib@DRIVER_NAME@.la \ + @LIBUDEV_LIBS@ +@DRIVER_NAME@_detect_CFLAGS = @LIBUDEV_CFLAGS@ + calloutsdir=$(HAL_CALLOUTS_DIR) callouts_SCRIPTS = hal-probe-vmmouse diff --git a/tools/vmmouse_detect.c b/tools/vmmouse_detect.c index 7939ff8..b743b2d 100644 --- a/tools/vmmouse_detect.c +++ b/tools/vmmouse_detect.c @@ -34,6 +34,8 @@ #include <signal.h> #include "vmmouse_client.h" +extern int vmmouse_uses_kernel_driver(void); + void segvCB(int sig) { @@ -46,6 +48,9 @@ segvCB(int sig) int main(void) { + if (vmmouse_uses_kernel_driver()) + return 1; + /* * If the vmmouse test is not run in a VMware virtual machine, it * will segfault instead of successfully accessing the port. diff --git a/tools/vmmouse_udev.c b/tools/vmmouse_udev.c new file mode 100644 index 0000000..dc100ae --- /dev/null +++ b/tools/vmmouse_udev.c @@ -0,0 +1,104 @@ +/* + * Copyright 2014 by VMware, Inc. + * + * 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 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + * + * Except as contained in this notice, the name of the copyright holder(s) + * and author(s) shall not be used in advertising or otherwise to promote + * the sale, use or other dealings in this Software without prior written + * authorization from the copyright holder(s) and author(s). + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef HAVE_LIBUDEV +#include <libudev.h> +#include <stdlib.h> +#include <string.h> + +#define KERNEL_DEVNAME "VirtualPS/2 VMware VMMouse" + +/** + * vmmouse_uses_kernel_driver - Check whether there's an active + * vmmouse driver in the kernel. + * + * Returns 0 if there was no kernel driver found. + * Returns non-zero on error or if there was an active driver found. + * + * Scans the input subsystem for devices matching KERNEL_DEVNAME. These + * devices are assumed to be active vmmouse drivers. + */ +int vmmouse_uses_kernel_driver(void) +{ + struct udev *udev; + struct udev_enumerate *enumerate; + struct udev_list_entry *devices, *dev_list_entry; + struct udev_device *dev; + + udev = udev_new(); + if (!udev) + return 1; + + /* + * Udev error return codes that are not caught immediately are + * typically caught in the input argument check in the udev + * function calls following the failing call! + */ + enumerate = udev_enumerate_new(udev); + if (udev_enumerate_add_match_subsystem(enumerate, "input")) + goto out_err; + if (udev_enumerate_scan_devices(enumerate)) + goto out_err; + + devices = udev_enumerate_get_list_entry(enumerate); + udev_list_entry_foreach(dev_list_entry, devices) { + const char *path, *name; + + path = udev_list_entry_get_name(dev_list_entry); + dev = udev_device_new_from_syspath(udev, path); + if (!dev) + goto out_err; + name = udev_device_get_sysattr_value(dev, "name"); + if (name && !strcasecmp(name, KERNEL_DEVNAME)) + goto out_found; + + udev_device_unref(dev); + } + + udev_enumerate_unref(enumerate); + udev_unref(udev); + + return 0; + + out_found: + udev_device_unref(dev); + out_err: + udev_enumerate_unref(enumerate); + udev_unref(udev); + + return 1; +} +#else +int vmmouse_uses_kernel_driver(void) +{ + return 0; +} +#endif |