d5e699
From 23557c82fd09b4ab7b106c13287a3ec8291f42dc Mon Sep 17 00:00:00 2001
d5e699
From: Pino Toscano <toscano.pino@tiscali.it>
d5e699
Date: Fri, 27 Dec 2019 18:41:28 +0100
d5e699
Subject: [PATCH 06/10] Add Null POSIX backend
d5e699
d5e699
Add a simple null backend for POSIX platforms that reports no available
d5e699
devices, and provides no capabilities. Make use of this new backend on
d5e699
all the OSes without an existing backend, so libusb can be built even on
d5e699
OSes without USB support.
d5e699
d5e699
(cherry picked from commit 53572d7e5eee79266139399924c7491174be1670)
d5e699
---
d5e699
 configure.ac          |  13 +++-
d5e699
 libusb/Makefile.am    |   7 +-
d5e699
 libusb/libusbi.h      |   2 +-
d5e699
 libusb/os/null_usb.c  | 176 ++++++++++++++++++++++++++++++++++++++++++
d5e699
 libusb/version_nano.h |   2 +-
d5e699
 5 files changed, 196 insertions(+), 4 deletions(-)
d5e699
 create mode 100644 libusb/os/null_usb.c
d5e699
d5e699
diff --git a/configure.ac b/configure.ac
d5e699
index da8a158..ddde325 100644
d5e699
--- a/configure.ac
d5e699
+++ b/configure.ac
d5e699
@@ -100,7 +100,9 @@ case $host in
d5e699
 	threads=posix
d5e699
 	;;
d5e699
 *)
d5e699
-	AC_MSG_ERROR([unsupported operating system $host])
d5e699
+	AC_MSG_RESULT([Null])
d5e699
+	backend="null"
d5e699
+	threads="posix"
d5e699
 esac
d5e699
 
d5e699
 case $backend in
d5e699
@@ -186,6 +188,14 @@ haiku)
d5e699
 	AC_CHECK_HEADERS([poll.h])
d5e699
 	AC_DEFINE([POLL_NFDS_TYPE],[nfds_t],[type of second poll() argument])
d5e699
 	;;
d5e699
+null)
d5e699
+	AC_DEFINE(OS_NULL, 1, [Null backend])
d5e699
+	AC_SUBST(OS_NULL)
d5e699
+	THREAD_CFLAGS="-pthread"
d5e699
+	LIBS="-pthread"
d5e699
+	AC_CHECK_HEADERS([poll.h])
d5e699
+	AC_DEFINE([POLL_NFDS_TYPE],[nfds_t],[type of second poll() argument])
d5e699
+	;;
d5e699
 esac
d5e699
 
d5e699
 AC_SUBST(LIBS)
d5e699
@@ -197,6 +207,7 @@ AM_CONDITIONAL(OS_SUNOS, test "x$backend" = xsunos)
d5e699
 AM_CONDITIONAL(OS_NETBSD, test "x$backend" = xnetbsd)
d5e699
 AM_CONDITIONAL(OS_WINDOWS, test "x$backend" = xwindows)
d5e699
 AM_CONDITIONAL(OS_HAIKU, test "x$backend" = xhaiku)
d5e699
+AM_CONDITIONAL(OS_NULL, test "x$backend" = xnull)
d5e699
 AM_CONDITIONAL(THREADS_POSIX, test "x$threads" = xposix)
d5e699
 AM_CONDITIONAL(CREATE_IMPORT_LIB, test "x$create_import_lib" = xyes)
d5e699
 AM_CONDITIONAL(USE_UDEV, test "x$enable_udev" = xyes)
d5e699
diff --git a/libusb/Makefile.am b/libusb/Makefile.am
d5e699
index e4da62e..466b633 100644
d5e699
--- a/libusb/Makefile.am
d5e699
+++ b/libusb/Makefile.am
d5e699
@@ -22,13 +22,14 @@ WINDOWS_USB_SRC = libusb-1.0.def libusb-1.0.rc \
d5e699
 WINCE_USB_SRC = os/wince_usb.h os/wince_usb.c
d5e699
 HAIKU_USB_SRC = os/haiku_usb.h os/haiku_usb_backend.cpp \
d5e699
 		os/haiku_usb_raw.h os/haiku_usb_raw.cpp os/haiku_pollfs.cpp
d5e699
+NULL_USB_SRC = os/null_usb.c
d5e699
 
d5e699
 EXTRA_DIST = $(POSIX_POLL_SRC) $(POSIX_THREADS_SRC) \
d5e699
 	$(WINDOWS_POLL_SRC) $(WINDOWS_THREADS_SRC) \
d5e699
 	$(LINUX_USBFS_SRC) $(DARWIN_USB_SRC) \
d5e699
 	$(OPENBSD_USB_SRC) $(NETBSD_USB_SRC) \
d5e699
 	$(WINDOWS_USB_SRC) $(WINCE_USB_SRC) \
d5e699
-	$(HAIKU_USB_SRC) \
d5e699
+	$(HAIKU_USB_SRC) $(NULL_USB_SRC) \
d5e699
 	os/linux_udev.c os/linux_netlink.c
d5e699
 
d5e699
 if OS_LINUX
d5e699
@@ -64,6 +65,10 @@ libusb_haiku_la_SOURCES = $(HAIKU_USB_SRC)
d5e699
 libusb_1_0_la_LIBADD = libusb_haiku.la
d5e699
 endif
d5e699
 
d5e699
+if OS_NULL
d5e699
+OS_SRC = $(NULL_USB_SRC)
d5e699
+endif
d5e699
+
d5e699
 if OS_WINDOWS
d5e699
 OS_SRC = $(WINDOWS_USB_SRC)
d5e699
 
d5e699
diff --git a/libusb/libusbi.h b/libusb/libusbi.h
d5e699
index 0a677bd..4cb6141 100644
d5e699
--- a/libusb/libusbi.h
d5e699
+++ b/libusb/libusbi.h
d5e699
@@ -575,7 +575,7 @@ int usbi_clear_event(struct libusb_context *ctx);
d5e699
 
d5e699
 /* Internal abstraction for poll (needs struct usbi_transfer on Windows) */
d5e699
 #if defined(OS_LINUX) || defined(OS_DARWIN) || defined(OS_OPENBSD) || defined(OS_NETBSD) ||\
d5e699
-	defined(OS_HAIKU) || defined(OS_SUNOS)
d5e699
+	defined(OS_HAIKU) || defined(OS_SUNOS) || defined(OS_NULL)
d5e699
 #include <unistd.h>
d5e699
 #include "os/poll_posix.h"
d5e699
 #elif defined(OS_WINDOWS) || defined(OS_WINCE)
d5e699
diff --git a/libusb/os/null_usb.c b/libusb/os/null_usb.c
d5e699
new file mode 100644
d5e699
index 0000000..97fa0b8
d5e699
--- /dev/null
d5e699
+++ b/libusb/os/null_usb.c
d5e699
@@ -0,0 +1,176 @@
d5e699
+/*
d5e699
+ * Copyright © 2019 Pino Toscano <toscano.pino@tiscali.it>
d5e699
+ *
d5e699
+ * This library is free software; you can redistribute it and/or
d5e699
+ * modify it under the terms of the GNU Lesser General Public
d5e699
+ * License as published by the Free Software Foundation; either
d5e699
+ * version 2.1 of the License, or (at your option) any later version.
d5e699
+ *
d5e699
+ * This library is distributed in the hope that it will be useful,
d5e699
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
d5e699
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
d5e699
+ * Lesser General Public License for more details.
d5e699
+ *
d5e699
+ * You should have received a copy of the GNU Lesser General Public
d5e699
+ * License along with this library; if not, write to the Free Software
d5e699
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
d5e699
+ */
d5e699
+
d5e699
+#include "libusbi.h"
d5e699
+
d5e699
+static int
d5e699
+null_get_device_list(struct libusb_context * ctx,
d5e699
+	struct discovered_devs **discdevs)
d5e699
+{
d5e699
+	return LIBUSB_SUCCESS;
d5e699
+}
d5e699
+
d5e699
+static int
d5e699
+null_open(struct libusb_device_handle *handle)
d5e699
+{
d5e699
+	return LIBUSB_ERROR_NOT_SUPPORTED;
d5e699
+}
d5e699
+
d5e699
+static void
d5e699
+null_close(struct libusb_device_handle *handle)
d5e699
+{
d5e699
+}
d5e699
+
d5e699
+static int
d5e699
+null_get_device_descriptor(struct libusb_device *dev, unsigned char *buf,
d5e699
+    int *host_endian)
d5e699
+{
d5e699
+	return LIBUSB_ERROR_NOT_SUPPORTED;
d5e699
+}
d5e699
+
d5e699
+static int
d5e699
+null_get_active_config_descriptor(struct libusb_device *dev,
d5e699
+    unsigned char *buf, size_t len, int *host_endian)
d5e699
+{
d5e699
+	return LIBUSB_ERROR_NOT_SUPPORTED;
d5e699
+}
d5e699
+
d5e699
+static int
d5e699
+null_get_config_descriptor(struct libusb_device *dev, uint8_t idx,
d5e699
+    unsigned char *buf, size_t len, int *host_endian)
d5e699
+{
d5e699
+	return LIBUSB_ERROR_NOT_SUPPORTED;
d5e699
+}
d5e699
+
d5e699
+static int
d5e699
+null_set_configuration(struct libusb_device_handle *handle, int config)
d5e699
+{
d5e699
+	return LIBUSB_ERROR_NOT_SUPPORTED;
d5e699
+}
d5e699
+
d5e699
+static int
d5e699
+null_claim_interface(struct libusb_device_handle *handle, int iface)
d5e699
+{
d5e699
+	return LIBUSB_ERROR_NOT_SUPPORTED;
d5e699
+}
d5e699
+
d5e699
+static int
d5e699
+null_release_interface(struct libusb_device_handle *handle, int iface)
d5e699
+{
d5e699
+	return LIBUSB_ERROR_NOT_SUPPORTED;
d5e699
+}
d5e699
+
d5e699
+static int
d5e699
+null_set_interface_altsetting(struct libusb_device_handle *handle, int iface,
d5e699
+    int altsetting)
d5e699
+{
d5e699
+	return LIBUSB_ERROR_NOT_SUPPORTED;
d5e699
+}
d5e699
+
d5e699
+static int
d5e699
+null_clear_halt(struct libusb_device_handle *handle, unsigned char endpoint)
d5e699
+{
d5e699
+	return LIBUSB_ERROR_NOT_SUPPORTED;
d5e699
+}
d5e699
+
d5e699
+static int
d5e699
+null_reset_device(struct libusb_device_handle *handle)
d5e699
+{
d5e699
+	return LIBUSB_ERROR_NOT_SUPPORTED;
d5e699
+}
d5e699
+
d5e699
+static int
d5e699
+null_submit_transfer(struct usbi_transfer *itransfer)
d5e699
+{
d5e699
+	return LIBUSB_ERROR_NOT_SUPPORTED;
d5e699
+}
d5e699
+
d5e699
+static int
d5e699
+null_cancel_transfer(struct usbi_transfer *itransfer)
d5e699
+{
d5e699
+	return LIBUSB_ERROR_NOT_SUPPORTED;
d5e699
+}
d5e699
+
d5e699
+static void
d5e699
+null_clear_transfer_priv(struct usbi_transfer *itransfer)
d5e699
+{
d5e699
+}
d5e699
+
d5e699
+static int
d5e699
+null_handle_transfer_completion(struct usbi_transfer *itransfer)
d5e699
+{
d5e699
+	return LIBUSB_ERROR_NOT_SUPPORTED;
d5e699
+}
d5e699
+
d5e699
+static int
d5e699
+null_clock_gettime(int clkid, struct timespec *tp)
d5e699
+{
d5e699
+	switch (clkid) {
d5e699
+	case USBI_CLOCK_MONOTONIC:
d5e699
+		return clock_gettime(CLOCK_REALTIME, tp);
d5e699
+	case USBI_CLOCK_REALTIME:
d5e699
+		return clock_gettime(CLOCK_REALTIME, tp);
d5e699
+	default:
d5e699
+		return LIBUSB_ERROR_INVALID_PARAM;
d5e699
+	}
d5e699
+}
d5e699
+
d5e699
+const struct usbi_os_backend usbi_backend = {
d5e699
+	.name = "Null backend",
d5e699
+	.caps = 0,
d5e699
+	.init = NULL,
d5e699
+	.exit = NULL,
d5e699
+	.set_option = NULL,
d5e699
+	.get_device_list = null_get_device_list,
d5e699
+	.hotplug_poll = NULL,
d5e699
+	.wrap_sys_device = NULL,
d5e699
+	.open = null_open,
d5e699
+	.close = null_close,
d5e699
+	.get_device_descriptor = null_get_device_descriptor,
d5e699
+	.get_active_config_descriptor = null_get_active_config_descriptor,
d5e699
+	.get_config_descriptor = null_get_config_descriptor,
d5e699
+	.get_config_descriptor_by_value = NULL,
d5e699
+	.get_configuration = NULL,
d5e699
+	.set_configuration = null_set_configuration,
d5e699
+	.claim_interface = null_claim_interface,
d5e699
+	.release_interface = null_release_interface,
d5e699
+	.set_interface_altsetting = null_set_interface_altsetting,
d5e699
+	.clear_halt = null_clear_halt,
d5e699
+	.reset_device = null_reset_device,
d5e699
+	.alloc_streams = NULL,
d5e699
+	.free_streams = NULL,
d5e699
+	.dev_mem_alloc = NULL,
d5e699
+	.dev_mem_free = NULL,
d5e699
+	.kernel_driver_active = NULL,
d5e699
+	.detach_kernel_driver = NULL,
d5e699
+	.attach_kernel_driver = NULL,
d5e699
+	.destroy_device = NULL,
d5e699
+	.submit_transfer = null_submit_transfer,
d5e699
+	.cancel_transfer = null_cancel_transfer,
d5e699
+	.clear_transfer_priv = null_clear_transfer_priv,
d5e699
+	.handle_events = NULL,
d5e699
+	.handle_transfer_completion = null_handle_transfer_completion,
d5e699
+	.clock_gettime = null_clock_gettime,
d5e699
+#ifdef USBI_TIMERFD_AVAILABLE
d5e699
+	.get_timerfd_clockid = NULL,
d5e699
+#endif
d5e699
+	.context_priv_size = 0,
d5e699
+	.device_priv_size = 0,
d5e699
+	.device_handle_priv_size = 0,
d5e699
+	.transfer_priv_size = 0,
d5e699
+};
d5e699
diff --git a/libusb/version_nano.h b/libusb/version_nano.h
d5e699
index 1764dec..4150474 100644
d5e699
--- a/libusb/version_nano.h
d5e699
+++ b/libusb/version_nano.h
d5e699
@@ -1 +1 @@
d5e699
-#define LIBUSB_NANO 11413
d5e699
+#define LIBUSB_NANO 11415
d5e699
-- 
d5e699
2.26.1
d5e699