--- freeglut-2.4.0.orig/src/freeglut_joystick.c
+++ freeglut-2.4.0/src/freeglut_joystick.c
@@ -76,11 +76,11 @@
 #        include <fcntl.h>
 #    endif
 #    include <errno.h>
-#    if defined(__FreeBSD__) || defined(__NetBSD__)
+#    if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__)
 /* XXX The below hack is done until freeglut's autoconf is updated. */
 #        define HAVE_USB_JS    1
 
-#        if defined(__FreeBSD__) && __FreeBSD_version >= 500000
+#        if (defined(__FreeBSD__) || defined(__FreeBSD_kernel__)) && (__FreeBSD_version >= 500000 || __FreeBSD_kernel_version >= 500000)
 #            include <sys/joystick.h>
 #        else
 /*
@@ -131,7 +131,7 @@
 
 /* BSD defines from "jsBSD.cxx" around lines 42-270 */
 
-#if defined(__NetBSD__) || defined(__FreeBSD__)
+#if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
 
 #    ifdef HAVE_USB_JS
 #        if defined(__NetBSD__)
@@ -142,13 +142,11 @@
 #            else
 #                include <usb.h>
 #            endif
-#        elif defined(__FreeBSD__)
-#            if __FreeBSD_version < 500000
-#                include <libusbhid.h>
-#            else
-/* XXX The below hack is done until freeglut's autoconf is updated. */
-#                define HAVE_USBHID_H 1
+#        elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
+#            ifdef HAVE_USBHID_H
 #                include <usbhid.h>
+#            else
+#                include <libusbhid.h>
 #            endif
 #        endif
 #        include <dev/usb/usb.h>
@@ -393,7 +391,7 @@
 
 
 #if TARGET_HOST_UNIX_X11
-#   if defined(__FreeBSD__) || defined(__NetBSD__)
+#   if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__)
        struct os_specific_s *os;
 #   endif
 
@@ -461,7 +459,7 @@
     int status;
 #endif
 
-#if defined(__FreeBSD__) || defined(__NetBSD__)
+#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__)
     int len;
 #endif
 
@@ -598,7 +596,7 @@
 #endif
 
 #if TARGET_HOST_UNIX_X11
-#    if defined(__FreeBSD__) || defined(__NetBSD__)
+#    if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__)
     if ( joy->os->is_analog )
     {
         int status = read ( joy->os->fd, &joy->os->ajs, sizeof(joy->os->ajs) );
@@ -656,9 +654,9 @@
                if (usage > 0 && usage < _JS_MAX_BUTTONS + 1)
                {
                    if (d)
-                       joy->os->cache_buttons |= (1 << usage - 1);
+                       joy->os->cache_buttons |= (1 << (usage - 1));
                    else
-                       joy->os->cache_buttons &= ~(1 << usage - 1);
+                       joy->os->cache_buttons &= ~(1 << (usage - 1));
                }
             }
         }
@@ -744,7 +742,7 @@
     }
 
     if ( buttons )
-#        if defined( __FreeBSD__ ) || defined( __NetBSD__ )
+#        if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || defined( __NetBSD__ )
         *buttons = ( joy->js.b1 ? 1 : 0 ) | ( joy->js.b2 ? 2 : 0 );  /* XXX Should not be here -- BSD is handled earlier */
 #        else
         *buttons = joy->js.buttons;
@@ -1054,12 +1052,12 @@
     CFTypeRef topLevelElement;
 #endif
 #if TARGET_HOST_UNIX_X11
-#    if defined( __FreeBSD__ ) || defined( __NetBSD__ )
+#    if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || defined( __NetBSD__ )
        char *cp;
 #    endif
 #    ifdef JS_NEW
        unsigned char u;
-#    else
+#    elif defined(__linux__)
        int counter;
 #    endif
 #endif
@@ -1285,7 +1283,7 @@
 #endif
 
 #if TARGET_HOST_UNIX_X11
-#if defined( __FreeBSD__ ) || defined( __NetBSD__ )
+#if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || defined( __NetBSD__ )
     for( i = 0; i < _JS_MAX_AXES; i++ )
         joy->os->cache_axes[ i ] = 0.0f;
 
@@ -1549,7 +1547,7 @@
 #endif
 
 #if TARGET_HOST_UNIX_X11
-#    if defined( __FreeBSD__ ) || defined( __NetBSD__ )
+#    if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || defined( __NetBSD__ )
     fgJoystick[ ident ]->id = ident;
     fgJoystick[ ident ]->error = GL_FALSE;
 
@@ -1619,7 +1617,7 @@
 #endif
 
 #if TARGET_HOST_UNIX_X11
-#if defined( __FreeBSD__ ) || defined( __NetBSD__ )
+#if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || defined( __NetBSD__ )
             if( fgJoystick[ident]->os )
             {
                 if( ! fgJoystick[ ident ]->error )
@@ -1684,9 +1682,6 @@
 
   fgInitialiseJoysticks ();
 
-  if ( !fgJoystick )
-    return 0;
-
   if ( !fgState.JoysticksInitialised )
     return 0;
 
