[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

xserver-xorg-input-joystick: Changes to 'upstream-unstable'



 configure.ac           |    2 +-
 src/backend_bsd.c      |   33 ++++++++++++++-------------------
 src/backend_evdev.c    |   40 +++++++++++++++++-----------------------
 src/backend_joystick.c |   44 +++++++++++---------------------------------
 src/jstk.c             |   47 ++++++++++++++++++++++++++++++++++++++++-------
 src/jstk.h             |    6 ++++++
 src/jstk_key.c         |    3 ++-
 7 files changed, 91 insertions(+), 84 deletions(-)

New commits:
commit de424865ece983d8da62b7f7e3d013eabac0b8b5
Author: Peter Hutterer <peter.hutterer@who-t.net>
Date:   Fri Nov 18 08:58:35 2016 +1000

    joystick 1.6.3
    
    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>

diff --git a/configure.ac b/configure.ac
index b5834a5..5c930ad 100644
--- a/configure.ac
+++ b/configure.ac
@@ -23,7 +23,7 @@
 # Initialize Autoconf
 AC_PREREQ([2.60])
 AC_INIT([xf86-input-joystick],
-        [1.6.2],
+        [1.6.3],
         [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg],
         [xf86-input-joystick])
 AC_CONFIG_SRCDIR([Makefile.am])

commit 60d0e9c451b3f259d524b0ddcc5c1f21a4f82293
Author: Matthieu Herrb <matthieu@herrb.eu>
Date:   Sun Jul 31 12:54:14 2016 +0200

    use xf86{Add,Remove}EnabledDevice()
    
    Signed-off-by: Matthieu Herrb <matthieu@herrb.eu>
    Reviewed-by: Adam Jackson <ajax@redhat.com>
    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>

diff --git a/src/jstk.c b/src/jstk.c
index 6cf0ef9..158d77a 100644
--- a/src/jstk.c
+++ b/src/jstk.c
@@ -147,7 +147,7 @@ jstkReadProc(InputInfoPtr pInfo)
             xf86Msg(X_WARNING, "JOYSTICK: Read failed. Deactivating device.\n");
 
             if (pInfo->fd >= 0)
-                RemoveEnabledDevice(pInfo->fd);
+                xf86RemoveEnabledDevice(pInfo);
             return;
         }
 
@@ -414,7 +414,7 @@ jstkDeviceControlProc(DeviceIntPtr       pJstk,
         if (jstkOpenDevice(priv, FALSE) != -1) {
             pJstk->public.on = TRUE;
             pInfo->fd = priv->fd;
-            AddEnabledDevice(pInfo->fd);
+            xf86AddEnabledDevice(pInfo);
         } else return !Success;
         break;
 
@@ -437,7 +437,7 @@ jstkDeviceControlProc(DeviceIntPtr       pJstk,
         }
 
         if (pInfo->fd >= 0)
-            RemoveEnabledDevice(pInfo->fd);
+            xf86RemoveEnabledDevice(pInfo);
         if (!(pInfo->flags & XI86_SERVER_FD))
             pInfo->fd = -1;
         if (priv->close_proc)
@@ -772,4 +772,3 @@ _X_EXPORT XF86ModuleData joystickModuleData = {
 };
 
 /* vim: set filetype=c.doxygen ts=4 et: */
-

commit baf8bd4441d5dc6cdd687e066bf13cc1c3df1a41
Author: Hans de Goede <hdegoede@redhat.com>
Date:   Thu Mar 13 14:49:53 2014 +0100

    Add support for server managed fds
    
    Keep things simple by handling server managed fds in the common parts
    of the open and close paths.
    
    Signed-off-by: Hans de Goede <hdegoede@redhat.com>
    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>

diff --git a/src/backend_bsd.c b/src/backend_bsd.c
index f3f501e..d8c6bac 100644
--- a/src/backend_bsd.c
+++ b/src/backend_bsd.c
@@ -91,10 +91,12 @@ jstkOpenDevice_bsd(JoystickDevPtr joystick, Bool probe)
     report_desc_t rd;
     struct jstk_bsd_hid_data *bsddata;
 
-    if ((joystick->fd = open(joystick->device, O_RDWR | O_NDELAY, 0)) < 0) {
-        xf86Msg(X_ERROR, "Cannot open joystick '%s' (%s)\n", joystick->device,
-                strerror(errno));
-        return -1;
+    if (joystick->fd == -1) {
+        if ((joystick->fd = open(joystick->device, O_RDWR | O_NDELAY, 0)) < 0) {
+            xf86Msg(X_ERROR, "Cannot open joystick '%s' (%s)\n",
+                    joystick->device, strerror(errno));
+            return -1;
+        }
     }
 
     if ((rd = hid_get_report_desc(joystick->fd)) == 0) {
diff --git a/src/backend_evdev.c b/src/backend_evdev.c
index 2a7b0e2..cae4b28 100644
--- a/src/backend_evdev.c
+++ b/src/backend_evdev.c
@@ -90,10 +90,12 @@ jstkOpenDevice_evdev(JoystickDevPtr joystick, Bool probe)
     unsigned long key_bits[NBITS(KEY_MAX)];
     int axes, buttons, j;
 
-    if ((joystick->fd = open(joystick->device, O_RDONLY | O_NDELAY, 0)) < 0) {
-        xf86Msg(X_ERROR, "Cannot open joystick '%s' (%s)\n", 
-                joystick->device, strerror(errno));
-        return -1;
+    if (joystick->fd == -1) {
+        if ((joystick->fd = open(joystick->device, O_RDONLY | O_NDELAY, 0)) < 0) {
+            xf86Msg(X_ERROR, "Cannot open joystick '%s' (%s)\n",
+                    joystick->device, strerror(errno));
+            return -1;
+        }
     }
 
     if (ioctl(joystick->fd, EVIOCGVERSION, &driver_version) == -1) {
diff --git a/src/backend_joystick.c b/src/backend_joystick.c
index d335bc2..172ce50 100644
--- a/src/backend_joystick.c
+++ b/src/backend_joystick.c
@@ -72,10 +72,12 @@ jstkOpenDevice_joystick(JoystickDevPtr joystick, Bool probe)
     unsigned char axes, buttons;
     int driver_version;
 
-    if ((joystick->fd = open(joystick->device, O_RDONLY | O_NDELAY, 0)) < 0) {
-        xf86Msg(X_ERROR, "Cannot open joystick '%s' (%s)\n", 
-                joystick->device, strerror(errno));
-        return -1;
+    if (joystick->fd == -1) {
+        if ((joystick->fd = open(joystick->device, O_RDONLY | O_NDELAY, 0)) < 0) {
+            xf86Msg(X_ERROR, "Cannot open joystick '%s' (%s)\n",
+                    joystick->device, strerror(errno));
+            return -1;
+        }
     }
 
     if (ioctl(joystick->fd, JSIOCGVERSION, &driver_version) == -1) {
diff --git a/src/jstk.c b/src/jstk.c
index 211fe32..6cf0ef9 100644
--- a/src/jstk.c
+++ b/src/jstk.c
@@ -80,6 +80,9 @@ jstkOpenDevice(JoystickDevPtr priv, BOOL probe)
     int fd;
     fd = -1;
 
+    if (priv->joystick_device->flags & XI86_SERVER_FD)
+        priv->fd = priv->joystick_device->fd;
+
     if (probe == FALSE && priv->open_proc)
         return priv->open_proc(priv, probe);
 
@@ -112,7 +115,8 @@ jstkOpenDevice(JoystickDevPtr priv, BOOL probe)
 void jstkCloseDevice(JoystickDevPtr priv)
 {
     if ((priv->fd >= 0)) {
-      xf86CloseSerial(priv->fd);
+      if (!(priv->joystick_device->flags & XI86_SERVER_FD))
+          xf86CloseSerial(priv->fd);
       priv->fd = -1;
     }
 }
@@ -434,7 +438,8 @@ jstkDeviceControlProc(DeviceIntPtr       pJstk,
 
         if (pInfo->fd >= 0)
             RemoveEnabledDevice(pInfo->fd);
-        pInfo->fd = -1;
+        if (!(pInfo->flags & XI86_SERVER_FD))
+            pInfo->fd = -1;
         if (priv->close_proc)
             priv->close_proc(priv);
         pJstk->public.on = FALSE;
@@ -485,7 +490,8 @@ jstkCorePreInit(InputDriverPtr drv, InputInfoPtr pInfo, int flags)
     pInfo->read_input = jstkReadProc;
     pInfo->control_proc = NULL;
     pInfo->switch_mode = NULL;
-    pInfo->fd = -1;
+    if (!(pInfo->flags & XI86_SERVER_FD))
+        pInfo->fd = -1;
     pInfo->dev = NULL;
     pInfo->type_name = XI_JOYSTICK;
 
@@ -506,6 +512,7 @@ jstkCorePreInit(InputDriverPtr drv, InputInfoPtr pInfo, int flags)
     priv->mouse_enabled = TRUE;
     priv->keys_enabled = TRUE;
     priv->amplify = 1.0f;
+    priv->joystick_device = pInfo;
     priv->keyboard_device = keyboard_device;
     priv->num_axes    = MAXAXES;
     priv->num_buttons = MAXBUTTONS;
@@ -682,7 +689,11 @@ _X_EXPORT InputDriverRec JOYSTICK = {
     NULL,
     jstkCorePreInit,
     jstkCoreUnInit,
-    NULL
+    NULL,
+    NULL,
+#ifdef XI86_DRV_CAP_SERVER_FD
+    XI86_DRV_CAP_SERVER_FD
+#endif
 };
 
 /*
diff --git a/src/jstk.h b/src/jstk.h
index 4955435..6421e7f 100644
--- a/src/jstk.h
+++ b/src/jstk.h
@@ -55,6 +55,9 @@
 #define XI_JOYSTICK "JOYSTICK"
 #endif
 
+#ifndef XI86_SERVER_FD
+#define XI86_SERVER_FD 0x20
+#endif
 
 typedef enum _JOYSTICKEVENT {
     EVENT_NONE=0,
@@ -106,6 +109,7 @@ typedef struct _JoystickDevRec {
     jstkReadDataProc read_proc; /* Callback for reading data from the backend */
     void         *devicedata; /* Extra platform device dependend data */
     char         *device;     /* Name of the device */
+    InputInfoPtr joystick_device; /* Back pointer to the joystick device */
     InputInfoPtr keyboard_device; /* Slave device for keyboard events */
 
     OsTimerPtr   timer;       /* Timer for axis movement */
diff --git a/src/jstk_key.c b/src/jstk_key.c
index 241b15d..5a4ed8e 100644
--- a/src/jstk_key.c
+++ b/src/jstk_key.c
@@ -200,7 +200,8 @@ int jstkKeyboardPreInit(InputDriverPtr drv, InputInfoPtr pInfo, int flags)
     pInfo->read_input = NULL;
     pInfo->control_proc = NULL;
     pInfo->switch_mode = NULL;
-    pInfo->fd = -1;
+    if (!(pInfo->flags & XI86_SERVER_FD))
+        pInfo->fd = -1;
     pInfo->type_name = XI_JOYSTICK;
 
     /* parse keyboard-related options */

commit 341d23ceaa9d5483b5318425e7308e09f8941957
Author: Hans de Goede <hdegoede@redhat.com>
Date:   Thu Mar 13 14:49:52 2014 +0100

    Add a generic jstkCloseDevice helper function
    
    This is a preparation patch for adding support for server managed fds.
    
    Signed-off-by: Hans de Goede <hdegoede@redhat.com>
    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>

diff --git a/src/backend_bsd.c b/src/backend_bsd.c
index 9fa3035..f3f501e 100644
--- a/src/backend_bsd.c
+++ b/src/backend_bsd.c
@@ -209,10 +209,7 @@ jstkOpenDevice_bsd(JoystickDevPtr joystick, Bool probe)
 static void
 jstkCloseDevice_bsd(JoystickDevPtr joystick)
 {
-    if ((joystick->fd >= 0)) {
-      xf86CloseSerial(joystick->fd);
-      joystick->fd = -1;
-    }
+    jstkCloseDevice(joystick);
     if (joystick->devicedata != NULL) {
         if (((struct jstk_bsd_hid_data*)joystick->devicedata)->data_buf)
             free(((struct jstk_bsd_hid_data*)joystick->devicedata)->data_buf);
diff --git a/src/backend_evdev.c b/src/backend_evdev.c
index 6d6f644..2a7b0e2 100644
--- a/src/backend_evdev.c
+++ b/src/backend_evdev.c
@@ -210,10 +210,7 @@ jstkOpenDevice_evdev(JoystickDevPtr joystick, Bool probe)
 static void
 jstkCloseDevice_evdev(JoystickDevPtr joystick)
 {
-    if ((joystick->fd >= 0)) {
-        xf86CloseSerial(joystick->fd);
-        joystick->fd = -1;
-    }
+    jstkCloseDevice(joystick);
     if (joystick->devicedata) {
         free(joystick->devicedata);
         joystick->devicedata = NULL;
diff --git a/src/backend_joystick.c b/src/backend_joystick.c
index c84654e..d335bc2 100644
--- a/src/backend_joystick.c
+++ b/src/backend_joystick.c
@@ -49,7 +49,6 @@
 #include "backend_joystick.h"
 
 
-static void jstkCloseDevice_joystick(JoystickDevPtr joystick);
 static int jstkReadData_joystick(JoystickDevPtr joystick,
                                  JOYSTICKEVENT *event,
                                  int *number);
@@ -82,7 +81,7 @@ jstkOpenDevice_joystick(JoystickDevPtr joystick, Bool probe)
     if (ioctl(joystick->fd, JSIOCGVERSION, &driver_version) == -1) {
         xf86Msg(X_ERROR, "Joystick: ioctl JSIOCGVERSION on '%s' failed: %s\n", 
                 joystick->device, strerror(errno));
-        jstkCloseDevice_joystick(joystick);
+        jstkCloseDevice(joystick);
         return -1;
     }
     if ((driver_version >> 16) < 1) {
@@ -95,21 +94,21 @@ jstkOpenDevice_joystick(JoystickDevPtr joystick, Bool probe)
     if (ioctl(joystick->fd, JSIOCGAXES, &axes) == -1) {
         xf86Msg(X_ERROR, "Joystick: ioctl JSIOCGAXES on '%s' failed: %s\n", 
                 joystick->device, strerror(errno));
-        jstkCloseDevice_joystick(joystick);
+        jstkCloseDevice(joystick);
         return -1;
     }
 
     if (ioctl(joystick->fd, JSIOCGBUTTONS, &buttons) == -1) {
         xf86Msg(X_ERROR, "Joystick: ioctl JSIOCGBUTTONS on '%s' failed: %s\n", 
                 joystick->device, strerror(errno));
-        jstkCloseDevice_joystick(joystick);
+        jstkCloseDevice(joystick);
         return -1;
     }
 
     if (ioctl(joystick->fd, JSIOCGNAME(128), joy_name) == -1) {
         xf86Msg(X_ERROR, "Joystick: ioctl JSIOCGNAME on '%s' failed: %s\n", 
                   joystick->device, strerror(errno));
-        jstkCloseDevice_joystick(joystick);
+        jstkCloseDevice(joystick);
         return -1;
     }
 
@@ -127,32 +126,13 @@ jstkOpenDevice_joystick(JoystickDevPtr joystick, Bool probe)
 
     joystick->open_proc = jstkOpenDevice_joystick;
     joystick->read_proc = jstkReadData_joystick;
-    joystick->close_proc = jstkCloseDevice_joystick;
+    joystick->close_proc = jstkCloseDevice;
     return joystick->fd;
 }
 
 
 /***********************************************************************
  *
- * jstkCloseDevice --
- *
- * close the handle.
- *
- ***********************************************************************
- */
-
-static void
-jstkCloseDevice_joystick(JoystickDevPtr joystick)
-{
-    if ((joystick->fd >= 0)) {
-        xf86CloseSerial(joystick->fd);
-        joystick->fd = -1;
-    }
-}
-
-
-/***********************************************************************
- *
  * jstkReadData --
  *
  * Reads data from fd and stores it in the JoystickDevRec struct
diff --git a/src/jstk.c b/src/jstk.c
index bee34fc..211fe32 100644
--- a/src/jstk.c
+++ b/src/jstk.c
@@ -34,6 +34,7 @@
 #include <xf86Xinput.h>
 #include <exevents.h>		/* Needed for InitValuator/Proximity stuff */
 #include <xf86Opt.h>
+#include <xf86_OSproc.h>
 
 #include <math.h>
 #include <xf86Module.h>
@@ -98,6 +99,23 @@ jstkOpenDevice(JoystickDevPtr priv, BOOL probe)
     return fd;
 }
 
+/*
+ ***************************************************************************
+ *
+ * jstkCloseDevice --
+ *
+ * Called to close the device specified in priv, this is a helper for
+ * backend proc_close functions
+ *
+ ***************************************************************************
+ */
+void jstkCloseDevice(JoystickDevPtr priv)
+{
+    if ((priv->fd >= 0)) {
+      xf86CloseSerial(priv->fd);
+      priv->fd = -1;
+    }
+}
 
 /*
  ***************************************************************************
diff --git a/src/jstk.h b/src/jstk.h
index ed5e4a7..4955435 100644
--- a/src/jstk.h
+++ b/src/jstk.h
@@ -123,4 +123,6 @@ typedef struct _JoystickDevRec {
     BUTTON button[MAXBUTTONS];    /* Configuration per button */
 } JoystickDevRec;
 
+void jstkCloseDevice(JoystickDevPtr priv);
+
 #endif

commit 6de3b75c453e4687b21f6d6acfcf87e7041c4fc5
Author: Hans de Goede <hdegoede@redhat.com>
Date:   Thu Mar 13 14:49:51 2014 +0100

    Use jstkCloseDevice_* on error in jstkOpenDevice_* backend functions
    
    This is a preparation patch for adding support for server managed fds, this
    also fixes a missing free() in an error handling path in the evdev back-end.
    
    Signed-off-by: Hans de Goede <hdegoede@redhat.com>
    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>

diff --git a/src/backend_bsd.c b/src/backend_bsd.c
index c6ce7b4..9fa3035 100644
--- a/src/backend_bsd.c
+++ b/src/backend_bsd.c
@@ -100,29 +100,27 @@ jstkOpenDevice_bsd(JoystickDevPtr joystick, Bool probe)
     if ((rd = hid_get_report_desc(joystick->fd)) == 0) {
         xf86Msg(X_ERROR, "Joystick: hid_get_report_desc failed: %s\n",
                 strerror(errno));
-        close(joystick->fd);
-        joystick->fd = -1;
+        jstkCloseDevice_bsd(joystick);
         return -1;
     }
 
     if (ioctl(joystick->fd, USB_GET_REPORT_ID, &report_id) < 0) {
         xf86Msg(X_ERROR, "Joystick: ioctl USB_GET_REPORT_ID failed: %s\n",
                 strerror(errno));
-        close(joystick->fd);
-        joystick->fd = -1;
+        jstkCloseDevice_bsd(joystick);
         return -1;
     }
 
     bsddata = (struct jstk_bsd_hid_data*)
               malloc(sizeof(struct jstk_bsd_hid_data));
+    joystick->devicedata = (void*) bsddata;
+
     bsddata->dlen = hid_report_size(rd, hid_input, report_id);
 
     if ((bsddata->data_buf = malloc(bsddata->dlen)) == NULL) {
         fprintf(stderr, "error: couldn't malloc %d bytes\n", bsddata->dlen);
         hid_dispose_report_desc(rd);
-        free(bsddata);
-        close(joystick->fd);
-        joystick->fd = -1;
+        jstkCloseDevice_bsd(joystick);
         return -1;
     }
 
@@ -181,14 +179,11 @@ jstkOpenDevice_bsd(JoystickDevPtr joystick, Bool probe)
     if (!got_something) {
         free(bsddata->data_buf);
         xf86Msg(X_ERROR, "Joystick: Didn't find any usable axes.\n");
-        free(bsddata);
-        close(joystick->fd);
-        joystick->fd = -1;
+        jstkCloseDevice_bsd(joystick);
         return -1;
     }
 
     bsddata->hotdata = 0;
-    joystick->devicedata = (void*) bsddata;
     if (probe == TRUE) {
         xf86Msg(X_INFO, "Joystick: %d buttons, %d axes\n", 
                 joystick->num_buttons, joystick->num_axes);
@@ -222,6 +217,7 @@ jstkCloseDevice_bsd(JoystickDevPtr joystick)
         if (((struct jstk_bsd_hid_data*)joystick->devicedata)->data_buf)
             free(((struct jstk_bsd_hid_data*)joystick->devicedata)->data_buf);
         free(joystick->devicedata);
+        joystick->devicedata = NULL;
     }
 }
 
diff --git a/src/backend_evdev.c b/src/backend_evdev.c
index ca0b2e0..6d6f644 100644
--- a/src/backend_evdev.c
+++ b/src/backend_evdev.c
@@ -99,16 +99,14 @@ jstkOpenDevice_evdev(JoystickDevPtr joystick, Bool probe)
     if (ioctl(joystick->fd, EVIOCGVERSION, &driver_version) == -1) {
         xf86Msg(X_ERROR, "Joystick: ioctl EVIOCGVERSION on '%s' failed: %s\n", 
                 joystick->device, strerror(errno));
-        close(joystick->fd);
-        joystick->fd = -1;
+        jstkCloseDevice_evdev(joystick);
         return -1;
     }
 
     if (ioctl(joystick->fd, EVIOCGID, &id) == -1) {
         xf86Msg(X_ERROR, "Joystick: ioctl EVIOCGID on '%s' failed: %s\n",
                 joystick->device, strerror(errno));
-        close(joystick->fd);
-        joystick->fd = -1;
+        jstkCloseDevice_evdev(joystick);
         return -1;
     }
 
@@ -118,13 +116,14 @@ jstkOpenDevice_evdev(JoystickDevPtr joystick, Bool probe)
     {
         xf86Msg(X_ERROR, "Joystick: ioctl EVIOCGBIT on '%s' failed: %s\n",
                 joystick->device, strerror(errno));
-        close(joystick->fd);
-        joystick->fd = -1;
+        jstkCloseDevice_evdev(joystick);
         return -1;
     }
 
     evdevdata = (struct jstk_evdev_data*)
                 malloc(sizeof(struct jstk_evdev_data));
+    joystick->devicedata = (void*) evdevdata;
+
     for (axes=0; axes<ABS_MAX; axes++)
     {
         evdevdata->axis[axes].number = -1;
@@ -144,9 +143,7 @@ jstkOpenDevice_evdev(JoystickDevPtr joystick, Bool probe)
             if (ioctl(joystick->fd, EVIOCGABS(j), &absinfo) == -1) {
                 xf86Msg(X_ERROR, "Joystick: ioctl EVIOCGABS on '%s' failed: %s\n",
                         joystick->device, strerror(errno));
-                close(joystick->fd);
-                joystick->fd = -1;
-                free(evdevdata);
+                jstkCloseDevice_evdev(joystick);
                 return -1;
             }
             evdevdata->axis[j].number = axes; /* physical -> logical mapping */
@@ -163,8 +160,7 @@ jstkOpenDevice_evdev(JoystickDevPtr joystick, Bool probe)
     {
         xf86Msg(X_ERROR, "Joystick: ioctl EVIOCGBIT on '%s' failed: %s\n",
                 joystick->device, strerror(errno));
-        close(joystick->fd);
-        joystick->fd = -1;
+        jstkCloseDevice_evdev(joystick);
         return -1;
     }
     buttons = 0; /* Our logical index */
@@ -191,7 +187,6 @@ jstkOpenDevice_evdev(JoystickDevPtr joystick, Bool probe)
     joystick->open_proc = jstkOpenDevice_evdev;
     joystick->read_proc = jstkReadData_evdev;
     joystick->close_proc = jstkCloseDevice_evdev;
-    joystick->devicedata = (void*) evdevdata;
 
     if (buttons > MAXBUTTONS)
         buttons = MAXBUTTONS;
@@ -217,12 +212,12 @@ jstkCloseDevice_evdev(JoystickDevPtr joystick)
 {
     if ((joystick->fd >= 0)) {
         xf86CloseSerial(joystick->fd);
-        if (joystick->devicedata) {
-            free(joystick->devicedata);
-            joystick->devicedata = NULL;
-        }
         joystick->fd = -1;
     }
+    if (joystick->devicedata) {
+        free(joystick->devicedata);
+        joystick->devicedata = NULL;
+    }
 }
 
 
diff --git a/src/backend_joystick.c b/src/backend_joystick.c
index e61d908..c84654e 100644
--- a/src/backend_joystick.c
+++ b/src/backend_joystick.c
@@ -82,8 +82,7 @@ jstkOpenDevice_joystick(JoystickDevPtr joystick, Bool probe)
     if (ioctl(joystick->fd, JSIOCGVERSION, &driver_version) == -1) {
         xf86Msg(X_ERROR, "Joystick: ioctl JSIOCGVERSION on '%s' failed: %s\n", 
                 joystick->device, strerror(errno));
-        close(joystick->fd);
-        joystick->fd = -1;
+        jstkCloseDevice_joystick(joystick);
         return -1;
     }
     if ((driver_version >> 16) < 1) {
@@ -96,24 +95,21 @@ jstkOpenDevice_joystick(JoystickDevPtr joystick, Bool probe)
     if (ioctl(joystick->fd, JSIOCGAXES, &axes) == -1) {
         xf86Msg(X_ERROR, "Joystick: ioctl JSIOCGAXES on '%s' failed: %s\n", 
                 joystick->device, strerror(errno));
-        close(joystick->fd);
-        joystick->fd = -1;
+        jstkCloseDevice_joystick(joystick);
         return -1;
     }
 
     if (ioctl(joystick->fd, JSIOCGBUTTONS, &buttons) == -1) {
         xf86Msg(X_ERROR, "Joystick: ioctl JSIOCGBUTTONS on '%s' failed: %s\n", 
                 joystick->device, strerror(errno));
-        close(joystick->fd);
-        joystick->fd = -1;
+        jstkCloseDevice_joystick(joystick);
         return -1;
     }
 
     if (ioctl(joystick->fd, JSIOCGNAME(128), joy_name) == -1) {
         xf86Msg(X_ERROR, "Joystick: ioctl JSIOCGNAME on '%s' failed: %s\n", 
                   joystick->device, strerror(errno));
-        close(joystick->fd);
-        joystick->fd = -1;
+        jstkCloseDevice_joystick(joystick);
         return -1;
     }
 

commit a976a85aeff4f2511544c0385533d9387957afae
Author: Peter Hutterer <peter.hutterer@who-t.net>
Date:   Wed Jan 30 12:57:51 2013 +1000

    Handle DEVICE_ABORT for input ABI 19.1
    
    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>

diff --git a/src/jstk.c b/src/jstk.c
index b82481a..bee34fc 100644
--- a/src/jstk.c
+++ b/src/jstk.c
@@ -422,6 +422,11 @@ jstkDeviceControlProc(DeviceIntPtr       pJstk,
         pJstk->public.on = FALSE;
         break;
 
+#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) * 100 + GET_ABI_MINOR(ABI_XINPUT_VERSION) >= 1901
+    case DEVICE_ABORT:
+        break;
+#endif
+
     default:
         ErrorF("unsupported mode=%d\n", what);
         return BadValue;


Reply to: