diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/evdev_brain.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/src/evdev_brain.c b/src/evdev_brain.c index c4b6fd1..7c854d8 100644 --- a/src/evdev_brain.c +++ b/src/evdev_brain.c @@ -39,6 +39,7 @@ #include <xf86.h> #include <fnmatch.h> +#include <sys/poll.h> #include "inotify.h" #include "inotify-syscalls.h" @@ -347,7 +348,7 @@ static int evdevControl(DeviceIntPtr pPointer, int what) { InputInfoPtr pInfo; - int i; + int i, flags; pInfo = pPointer->public.devicePrivate; @@ -376,6 +377,19 @@ evdevControl(DeviceIntPtr pPointer, int what) SYSCALL (close (pInfo->fd)); pInfo->fd = -1; } + if ((flags = fcntl(pInfo->fd, F_GETFL)) < 0) { + xf86Msg(X_ERROR, "%s: Unable to NONBLOCK inotify, using fallback. " + "(errno: %d)\n", pInfo->name, errno); + evdev_inotify = 0; + SYSCALL (close (pInfo->fd)); + pInfo->fd = -1; + } else if (fcntl(pInfo->fd, F_SETFL, flags | O_NONBLOCK) < 0) { + xf86Msg(X_ERROR, "%s: Unable to NONBLOCK inotify, using fallback. " + "(errno: %d)\n", pInfo->name, errno); + evdev_inotify = 0; + SYSCALL (close (pInfo->fd)); + pInfo->fd = -1; + } if (!evdev_inotify) { SYSCALL (pInfo->fd = open ("/proc/bus/usb/devices", O_RDONLY)); |