On 10/02/2014 02:42 PM, Hans de Goede wrote: > Hi, > > On 10/02/2014 02:39 PM, Thomas Hellstrom wrote: >> 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. >> >> Signed-off-by: Thomas Hellstrom <[email protected]> >> Reviewed-by: Brian Paul <[email protected]> > Looks good: > > Reviewed-by: Hans de Goede <[email protected]> > > Regards, > > Hans
Thanks for reviewing. As Brian correctly points out there are some missing libudev error checks that I need to fix. /Thomas > >> --- >> configure.ac | 14 +++++++ >> tools/Makefile.am | 7 +++- >> tools/vmmouse_detect.c | 5 +++ >> tools/vmmouse_udev.c | 100 >> +++++++++++++++++++++++++++++++++++++++++++++++++ >> 4 files changed, 124 insertions(+), 2 deletions(-) >> create mode 100644 tools/vmmouse_udev.c >> >> diff --git a/configure.ac b/configure.ac >> index ad05504..1197555 100644 >> --- a/configure.ac >> +++ b/configure.ac >> @@ -105,6 +105,20 @@ XORG_DRIVER_CHECK_EXT(RANDR, randrproto) >> XORG_DRIVER_CHECK_EXT(XINPUT, inputproto) >> >> # Checks for pkg-config packages >> +libudev_check=yes >> +AC_ARG_WITH([libudev], >> + [AS_HELP_STRING([--without-libudev], >> + [Use to build without libudev on linux])], >> + [if test x$withval = xno; then libudev_check=no; fi] >> + []) >> + >> +if test x`uname` = xLinux -a $libudev_check = yes; then >> + PKG_CHECK_MODULES(LIBUDEV, [libudev], >> + [AC_DEFINE([HAVE_LIBUDEV], 1, >> + [Has libudev installed])], >> + []); >> +fi >> + >> PKG_CHECK_MODULES(XORG, [xorg-server >= 1.0.1] xproto $REQUIRED_MODULES) >> >> PKG_CHECK_EXISTS([xorg-server >= 1.1.0], >> 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@[email protected] >> +@DRIVER_NAME@_detect_SOURCES = vmmouse_detect.c vmmouse_udev.c >> +@DRIVER_NAME@_detect_LDADD = $(top_builddir)/shared/lib@[email protected] \ >> + @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..a79c37a >> --- /dev/null >> +++ b/tools/vmmouse_udev.c >> @@ -0,0 +1,100 @@ >> +/* >> + * 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; >> + >> + enumerate = udev_enumerate_new(udev); >> + if (udev_enumerate_add_match_subsystem(enumerate, "input")) >> + goto out_early_err; >> + if (udev_enumerate_scan_devices(enumerate)) >> + goto out_early_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_late_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: >> + out_late_err: >> + udev_device_unref(dev); >> + out_early_err: >> + udev_enumerate_unref(enumerate); >> + udev_unref(udev); >> + >> + return 1; >> +} >> +#else >> +int vmmouse_uses_kernel_driver(void) >> +{ >> + return 0; >> +} >> +#endif >> > _______________________________________________ > [email protected]: X.Org development > Archives: > https://urldefense.proofpoint.com/v1/url?u=http://lists.x.org/archives/xorg-devel&k=oIvRg1%2BdGAgOoM1BIlLLqw%3D%3D%0A&r=l5Ago9ekmVFZ3c4M6eauqrJWGwjf6fTb%2BP3CxbBFkVM%3D%0A&m=LGREtk6G1AfFuwJ%2F3P0DuNOOrtFH%2BOPVux3RzzVcRgs%3D%0A&s=0a8a07472e2859da37834d584be733b97f8778eafa8c1bbe5cba735f9c80af17 > Info: > https://urldefense.proofpoint.com/v1/url?u=http://lists.x.org/mailman/listinfo/xorg-devel&k=oIvRg1%2BdGAgOoM1BIlLLqw%3D%3D%0A&r=l5Ago9ekmVFZ3c4M6eauqrJWGwjf6fTb%2BP3CxbBFkVM%3D%0A&m=LGREtk6G1AfFuwJ%2F3P0DuNOOrtFH%2BOPVux3RzzVcRgs%3D%0A&s=85ca02eaba04281a0388a5a0b3d88804370f9ed0a03bb4d4ea37cec7c26397a9 _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
