diff options
-rw-r--r-- | config_msvc.h | 49 | ||||
-rw-r--r-- | examples/lsusb.c | 3 | ||||
-rw-r--r-- | examples/xusb.c | 12 | ||||
-rw-r--r-- | libusb/core.c | 14 | ||||
-rw-r--r-- | libusb/io.c | 28 | ||||
-rw-r--r-- | libusb/libusb.h | 41 | ||||
-rw-r--r-- | libusb/libusbi.h | 40 | ||||
-rw-r--r-- | libusb/os/windows_compat.c | 11 | ||||
-rw-r--r-- | libusb/os/windows_compat.h | 14 | ||||
-rw-r--r-- | libusb/os/windows_usb.c | 40 | ||||
-rw-r--r-- | libusb/os/windows_usb.h | 8 | ||||
-rw-r--r-- | libusb/sync.c | 4 |
12 files changed, 178 insertions, 86 deletions
diff --git a/config_msvc.h b/config_msvc.h new file mode 100644 index 0000000..77fe89b --- /dev/null +++ b/config_msvc.h @@ -0,0 +1,49 @@ +/* config_msvc.h. Manual config.h for MSVC. */ + +/* Default visibility */ +#define API_EXPORTED /**/ + +/* Debug message logging */ +#define ENABLE_DEBUG_LOGGING 1 + +/* Message logging */ +#define ENABLE_LOGGING 1 + +/* Windows backend */ +#define OS_WINDOWS /**/ + +/* Name of package */ +#define PACKAGE "libusb" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "libusb" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "libusb 1.0.5" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "libusb" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "1.0.5" + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Backend handles timeout */ +/* #undef USBI_OS_HANDLES_TIMEOUT */ + +/* timerfd headers available */ +/* #undef USBI_TIMERFD_AVAILABLE */ + +/* Version number of package */ +#define VERSION "1.0.5" + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +/* #undef inline */ +#endif diff --git a/examples/lsusb.c b/examples/lsusb.c index 317adf0..43806de 100644 --- a/examples/lsusb.c +++ b/examples/lsusb.c @@ -44,8 +44,7 @@ static void print_devs(libusb_device **devs) int main(void) { libusb_device **devs; - int r; - ssize_t cnt; + int r, cnt; r = libusb_init(NULL); if (r < 0) diff --git a/examples/xusb.c b/examples/xusb.c index 0157f24..080e468 100644 --- a/examples/xusb.c +++ b/examples/xusb.c @@ -20,11 +20,15 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#ifdef _MSC_VER
+#include <config_msvc.h>
+#else
+#include <config.h> +#endif #include <stdio.h> #include <sys/types.h> #include <inttypes.h> #include <string.h> -#include "../config.h" #include <libusb/libusb.h> @@ -330,7 +334,8 @@ int test_device(uint16_t vid, uint16_t pid) int i, j, k, r; int iface, nb_ifaces; int test_scsi = 0; - + struct libusb_device_descriptor dev_desc; + printf("Opening device...\n"); handle = libusb_open_device_with_vid_pid(NULL, vid, pid); @@ -341,7 +346,6 @@ int test_device(uint16_t vid, uint16_t pid) dev = libusb_get_device(handle); - struct libusb_device_descriptor dev_desc; printf("reading device descriptor...\n"); CALL_CHECK(libusb_get_device_descriptor(dev, &dev_desc)); printf("length = %d\n", dev_desc.bLength); @@ -439,7 +443,7 @@ int main(int argc, char** argv) printf(" -h: display usage\n"); printf(" -j: test OLIMEX ARM-USB-TINY JTAG, 2 channel composite device\n"); printf(" -k: test Generic 2 GB USB Key\n"); - printf(" -x: test Microsoft XBox Controller Type S\n"); + printf(" -x: test Microsoft XBox Controller Type S (default)\n"); return 0; } switch(argv[1][1]) { diff --git a/libusb/core.c b/libusb/core.c index dce42ff..535ecf3 100644 --- a/libusb/core.c +++ b/libusb/core.c @@ -18,19 +18,22 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#ifdef _MSC_VER
+#include <config_msvc.h>
+#else
#include <config.h> - +#endif #include <errno.h> #include <stdarg.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> -#include <unistd.h> #ifdef OS_WINDOWS #include <windows.h> #include "os/windows_compat.h" #else +#include <unistd.h> #include <poll.h> #define write_for_poll write #define read_for_poll read @@ -569,7 +572,7 @@ struct libusb_device *usbi_get_device_by_session_id(struct libusb_context *ctx, struct libusb_device *ret = NULL; pthread_mutex_lock(&ctx->usb_devs_lock); - list_for_each_entry(dev, &ctx->usb_devs, list) + list_for_each_entry(dev, &ctx->usb_devs, list, struct libusb_device) if (dev->session_data == session_id) { ret = dev; break; @@ -599,14 +602,13 @@ struct libusb_device *usbi_get_device_by_session_id(struct libusb_context *ctx, * \returns the number of devices in the outputted list, or LIBUSB_ERROR_NO_MEM * on memory allocation failure. */ -API_EXPORTED ssize_t libusb_get_device_list(libusb_context *ctx, +API_EXPORTED int libusb_get_device_list(libusb_context *ctx, libusb_device ***list) { struct discovered_devs *discdevs = discovered_devs_alloc(); struct libusb_device **ret; int r = 0; - size_t i; - ssize_t len; + int i, len; USBI_GET_CONTEXT(ctx); usbi_dbg(""); diff --git a/libusb/io.c b/libusb/io.c index ffc0015..2e59f72 100644 --- a/libusb/io.c +++ b/libusb/io.c @@ -18,20 +18,28 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#ifdef _MSC_VER
+#include <config_msvc.h>
+#else
#include <config.h> +#endif #include <errno.h> #include <pthread.h> #include <signal.h> #include <stdint.h> #include <stdlib.h> #include <string.h> +#if defined(_MSC_VER) +#include <time.h> +#else #include <sys/time.h> +#endif #include <time.h> -#include <unistd.h> #ifdef OS_WINDOWS #include <windows.h> #include "os/windows_compat.h" #else +#include <unistd.h> #include <poll.h> #define write_for_poll write #define read_for_poll read @@ -1114,7 +1122,7 @@ static int add_to_flying_list(struct usbi_transfer *transfer) } /* otherwise, find appropriate place in list */ - list_for_each_entry(cur, &ctx->flying_transfers, list) { + list_for_each_entry(cur, &ctx->flying_transfers, list, struct usbi_transfer) { /* find first timeout that occurs after the transfer in question */ struct timeval *cur_tv = &cur->timeout; @@ -1714,7 +1722,7 @@ static int handle_timeouts_locked(struct libusb_context *ctx) /* iterate through flying transfers list, finding all transfers that * have expired timeouts */ - list_for_each_entry(transfer, &ctx->flying_transfers, list) { + list_for_each_entry(transfer, &ctx->flying_transfers, list, struct usbi_transfer) { struct timeval *cur_tv = &transfer->timeout; /* if we've reached transfers of infinite timeout, we're all done */ @@ -1785,7 +1793,7 @@ static int handle_events(struct libusb_context *ctx, struct timeval *tv) int timeout_ms; pthread_mutex_lock(&ctx->pollfds_lock); - list_for_each_entry(ipollfd, &ctx->pollfds, list) + list_for_each_entry(ipollfd, &ctx->pollfds, list, struct usbi_pollfd) nfds++; /* TODO: malloc when number of fd's changes, not on every poll */ @@ -1793,7 +1801,7 @@ static int handle_events(struct libusb_context *ctx, struct timeval *tv) if (!fds) return LIBUSB_ERROR_NO_MEM; - list_for_each_entry(ipollfd, &ctx->pollfds, list) { + list_for_each_entry(ipollfd, &ctx->pollfds, list, struct usbi_pollfd) { struct libusb_pollfd *pollfd = &ipollfd->pollfd; int fd = pollfd->fd; i++; @@ -2107,7 +2115,7 @@ API_EXPORTED int libusb_get_next_timeout(libusb_context *ctx, } /* find next transfer which hasn't already been processed as timed out */ - list_for_each_entry(transfer, &ctx->flying_transfers, list) { + list_for_each_entry(transfer, &ctx->flying_transfers, list, struct usbi_transfer) { if (!(transfer->flags & USBI_TRANSFER_TIMED_OUT)) { found = 1; break; @@ -2209,7 +2217,7 @@ void usbi_remove_pollfd(struct libusb_context *ctx, int fd) usbi_dbg("remove fd %d", fd); pthread_mutex_lock(&ctx->pollfds_lock); - list_for_each_entry(ipollfd, &ctx->pollfds, list) + list_for_each_entry(ipollfd, &ctx->pollfds, list, struct usbi_pollfd) if (ipollfd->pollfd.fd == fd) { found = 1; break; @@ -2249,14 +2257,14 @@ API_EXPORTED const struct libusb_pollfd **libusb_get_pollfds( USBI_GET_CONTEXT(ctx); pthread_mutex_lock(&ctx->pollfds_lock); - list_for_each_entry(ipollfd, &ctx->pollfds, list) + list_for_each_entry(ipollfd, &ctx->pollfds, list, struct usbi_pollfd) cnt++; ret = calloc(cnt + 1, sizeof(struct libusb_pollfd *)); if (!ret) goto out; - list_for_each_entry(ipollfd, &ctx->pollfds, list) + list_for_each_entry(ipollfd, &ctx->pollfds, list, struct usbi_pollfd) ret[i++] = (struct libusb_pollfd *) ipollfd; ret[cnt] = NULL; @@ -2292,7 +2300,7 @@ void usbi_handle_disconnect(struct libusb_device_handle *handle) while (1) { pthread_mutex_lock(&HANDLE_CTX(handle)->flying_transfers_lock); to_cancel = NULL; - list_for_each_entry(cur, &HANDLE_CTX(handle)->flying_transfers, list) + list_for_each_entry(cur, &HANDLE_CTX(handle)->flying_transfers, list, struct usbi_transfer) if (__USBI_TRANSFER_TO_LIBUSB_TRANSFER(cur)->dev_handle == handle) { to_cancel = cur; break; diff --git a/libusb/libusb.h b/libusb/libusb.h index 2dbb9a5..7070898 100644 --- a/libusb/libusb.h +++ b/libusb/libusb.h @@ -22,7 +22,12 @@ #define __LIBUSB_H__ #include <stdint.h> +#if defined(_MSC_VER) +#define inline __inline +#include <time.h> +#else #include <sys/time.h> +#endif #include <sys/types.h> #include <time.h> #include <limits.h> @@ -31,24 +36,24 @@ extern "C" { #endif -/** \def libusb_cpu_to_le16 - * \ingroup misc - * Convert a 16-bit value from host-endian to little-endian format. On - * little endian systems, this function does nothing. On big endian systems, - * the bytes are swapped. - * \param x the host-endian value to convert - * \returns the value in little-endian byte order +/** \def libusb_cpu_to_le16
+ * \ingroup misc
+ * Convert a 16-bit value from host-endian to little-endian format. On
+ * little endian systems, this function does nothing. On big endian systems,
+ * the bytes are swapped.
+ * \param x the host-endian value to convert
+ * \returns the value in little-endian byte order
*/ -#define libusb_cpu_to_le16(x) ({ \ - union { \ - uint8_t b8[2]; \ - uint16_t b16; \ - } _tmp; \ - uint16_t _tmp2 = (uint16_t)(x); \ - _tmp.b8[1] = _tmp2 >> 8; \ - _tmp.b8[0] = _tmp2 & 0xff; \ - _tmp.b16; \ -}) +static inline uint16_t libusb_cpu_to_le16(uint16_t x) { + union { + uint8_t b8[2]; + uint16_t b16; + } _tmp; + uint16_t _tmp2 = (uint16_t)(x); + _tmp.b8[1] = _tmp2 >> 8; + _tmp.b8[0] = _tmp2 & 0xff; + return _tmp.b16; +} /** \def libusb_le16_to_cpu * \ingroup misc @@ -769,7 +774,7 @@ int libusb_init(libusb_context **ctx); void libusb_exit(libusb_context *ctx); void libusb_set_debug(libusb_context *ctx, int level); -ssize_t libusb_get_device_list(libusb_context *ctx, +int libusb_get_device_list(libusb_context *ctx, libusb_device ***list); void libusb_free_device_list(libusb_device **list, int unref_devices); libusb_device *libusb_ref_device(libusb_device *dev); diff --git a/libusb/libusbi.h b/libusb/libusbi.h index 7b0d353..6b501ae 100644 --- a/libusb/libusbi.h +++ b/libusb/libusbi.h @@ -21,8 +21,11 @@ #ifndef __LIBUSBI_H__ #define __LIBUSBI_H__ +#ifdef _MSC_VER
+#include <config_msvc.h>
+#else
#include <config.h> - +#endif #include <pthread.h> #include <stddef.h> #include <time.h> @@ -57,17 +60,18 @@ struct list_head { * pos - A structure pointer has a "member" element * head - list head * member - the list_head element in "pos" + * type - the type of the first parameter */ -#define list_for_each_entry(pos, head, member) \ - for (pos = list_entry((head)->next, typeof(*pos), member); \ +#define list_for_each_entry(pos, head, member, type) \ + for (pos = list_entry((head)->next, type, member); \ &pos->member != (head); \ - pos = list_entry(pos->member.next, typeof(*pos), member)) + pos = list_entry(pos->member.next, type, member)) -#define list_for_each_entry_safe(pos, n, head, member) \ - for (pos = list_entry((head)->next, typeof(*pos), member), \ - n = list_entry(pos->member.next, typeof(*pos), member); \ +#define list_for_each_entry_safe(pos, n, head, member, type) \ + for (pos = list_entry((head)->next, type, member), \ + n = list_entry(pos->member.next, type, member); \ &pos->member != (head); \ - pos = n, n = list_entry(n->member.next, typeof(*n), member)) + pos = n, n = list_entry(n->member.next, type, member)) #define list_empty(entry) ((entry)->next == (entry)) @@ -121,20 +125,20 @@ void usbi_log(struct libusb_context *ctx, enum usbi_log_level, const char *function, const char *format, ...); #ifdef ENABLE_LOGGING -#define _usbi_log(ctx, level, fmt...) usbi_log(ctx, level, __FUNCTION__, fmt) +#define _usbi_log(ctx, level, ...) usbi_log(ctx, level, __FUNCTION__, __VA_ARGS__) #else -#define _usbi_log(ctx, level, fmt...) +#define _usbi_log(ctx, level, ...) #endif #ifdef ENABLE_DEBUG_LOGGING -#define usbi_dbg(fmt...) _usbi_log(NULL, LOG_LEVEL_DEBUG, fmt) +#define usbi_dbg(...) _usbi_log(NULL, LOG_LEVEL_DEBUG, __VA_ARGS__) #else -#define usbi_dbg(fmt...) +#define usbi_dbg(...) #endif -#define usbi_info(ctx, fmt...) _usbi_log(ctx, LOG_LEVEL_INFO, fmt) -#define usbi_warn(ctx, fmt...) _usbi_log(ctx, LOG_LEVEL_WARNING, fmt) -#define usbi_err(ctx, fmt...) _usbi_log(ctx, LOG_LEVEL_ERROR, fmt) +#define usbi_info(ctx, ...) _usbi_log(ctx, LOG_LEVEL_INFO, __VA_ARGS__) +#define usbi_warn(ctx, ...) _usbi_log(ctx, LOG_LEVEL_WARNING, __VA_ARGS__) +#define usbi_err(ctx, ...) _usbi_log(ctx, LOG_LEVEL_ERROR, __VA_ARGS__) #define USBI_GET_CONTEXT(ctx) if (!(ctx)) (ctx) = usbi_default_context #define DEVICE_CTX(dev) ((dev)->ctx) @@ -271,15 +275,15 @@ struct usbi_transfer { }; #define __USBI_TRANSFER_TO_LIBUSB_TRANSFER(transfer) \ - ((struct libusb_transfer *)(((void *)(transfer)) \ + ((struct libusb_transfer *)(((char *)(transfer)) \ + sizeof(struct usbi_transfer))) #define __LIBUSB_TRANSFER_TO_USBI_TRANSFER(transfer) \ - ((struct usbi_transfer *)(((void *)(transfer)) \ + ((struct usbi_transfer *)(((char *)(transfer)) \ - sizeof(struct usbi_transfer))) static inline void *usbi_transfer_get_os_priv(struct usbi_transfer *transfer) { - return ((void *)transfer) + sizeof(struct usbi_transfer) + return ((char *)transfer) + sizeof(struct usbi_transfer) + sizeof(struct libusb_transfer) + (transfer->num_iso_packets * sizeof(struct libusb_iso_packet_descriptor)); diff --git a/libusb/os/windows_compat.c b/libusb/os/windows_compat.c index ea2455d..56feb15 100644 --- a/libusb/os/windows_compat.c +++ b/libusb/os/windows_compat.c @@ -70,12 +70,13 @@ #include <stdio.h> #include <windows.h> #include <pthread.h> +#include <io.h> #include "windows_compat.h" // Uncomment to debug the polling layer //#define DEBUG_WINDOWS_COMPAT -#ifdef DEBUG_WINDOWS_COMPAT +#if defined(DEBUG_WINDOWS_COMPAT) #define printb(...) printf(__VA_ARGS__) #else #define printb(...) @@ -205,7 +206,7 @@ void exit_polling(void) * * requires a valid index */ -inline void _init_read_marker(int index) +__inline void _init_read_marker(int index) { // Cancel any read operation in progress CancelIo(poll_fd[index].handle); @@ -241,7 +242,7 @@ int pipe_for_poll(int filedes[2]) return -1; } - sprintf(pipe_name, "\\\\.\\pipe\\libusb%08x%04x", (unsigned)GetCurrentProcessId(), pipe_number++);
+ _snprintf(pipe_name, sizeof(pipe_name), "\\\\.\\pipe\\libusb%08x%04x", (unsigned)GetCurrentProcessId(), pipe_number++);
// Read end of the pipe handle[0] = CreateNamedPipeA(pipe_name, PIPE_ACCESS_INBOUND|FILE_FLAG_OVERLAPPED,
@@ -476,7 +477,7 @@ struct winfd overlapped_to_winfd(OVERLAPPED* overlapped) */ int poll(struct pollfd *fds, unsigned int nfds, int timeout) { - int i, index, triggered = 0; + unsigned int i, index, triggered = 0; HANDLE *handles_to_wait_on = malloc(nfds*sizeof(HANDLE)); int *handle_to_index = malloc(nfds*sizeof(int)); DWORD nb_handles_to_wait_on = 0; @@ -747,7 +748,7 @@ ssize_t read_for_poll(int fd, void *buf, size_t count) // Read supplementary bytes if needed (blocking) if (count > 1) { reset_overlapped(poll_fd[index].overlapped); - if (!ReadFile(poll_fd[index].handle, buf+1, (DWORD)(count-1), &rd_count, poll_fd[index].overlapped)) {
+ if (!ReadFile(poll_fd[index].handle, (char*)buf+1, (DWORD)(count-1), &rd_count, poll_fd[index].overlapped)) {
if(GetLastError() == ERROR_IO_PENDING) { if (!GetOverlappedResult(poll_fd[index].handle, poll_fd[index].overlapped, &rd_count, TRUE)) { // TODO: handle more data! diff --git a/libusb/os/windows_compat.h b/libusb/os/windows_compat.h index ad55299..95f8d75 100644 --- a/libusb/os/windows_compat.h +++ b/libusb/os/windows_compat.h @@ -26,10 +26,18 @@ * * This is placed in the .h to limit changes required to the core files */ -#ifdef interface
+#if defined(interface)
#undef interface
#endif +#if !defined(ssize_t) +#if defined (_WIN64)
+#define ssize_t __int64
+#else
+#define ssize_t long
+#endif +#endif + #define MAX_FDS 256 #define POLLIN 0x0001 /* There is data to read */ @@ -77,13 +85,13 @@ struct winfd fd_to_winfd(int fd); struct winfd handle_to_winfd(HANDLE handle); struct winfd overlapped_to_winfd(OVERLAPPED* overlapped); -#ifndef TIMESPEC_TO_TIMEVAL +#if !defined(TIMESPEC_TO_TIMEVAL) #define TIMESPEC_TO_TIMEVAL(tv, ts) { \ (tv)->tv_sec = (ts)->tv_sec; \ (tv)->tv_usec = (ts)->tv_nsec / 1000; \ } #endif -#ifndef timersub +#if !defined(timersub) #define timersub(a, b, result) \
do { \
(result)->tv_sec = (a)->tv_sec - (b)->tv_sec; \
diff --git a/libusb/os/windows_usb.c b/libusb/os/windows_usb.c index 34570ab..7e01447 100644 --- a/libusb/os/windows_usb.c +++ b/libusb/os/windows_usb.c @@ -17,9 +17,12 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#if defined(_MSC_VER)
+#include <config_msvc.h>
+#else
#include <config.h> +#endif #include <ctype.h> -#include <dirent.h> #include <errno.h> #include <fcntl.h> #include <sched.h> @@ -28,15 +31,23 @@ #include <windows.h> #include <tchar.h> #include <setupapi.h> +#if defined(_MSC_VER) +#include <api/usbiodef.h> +#include <api/usbioctl.h> +#if !defined __drv_preferredFunction +#define __drv_preferredFunction(func,why) +#endif +#include <api/cfgmgr32.h> +#else #include <ddk/usbiodef.h> #include <ddk/usbioctl.h> #include <ddk/cfgmgr32.h> -#include <largeint.h> +#endif #include <inttypes.h> #include <objbase.h> // for string to GUID conv. requires libole32.a /* Prevent compilation problems on Windows platforms */ -#ifdef interface +#if defined(interface) #undef interface #endif @@ -45,12 +56,12 @@ #include "windows_usb.h" // These GUIDs appear undefined on MinGW32 -#ifndef GUID_DEVINTERFACE_USB_HOST_CONTROLLER +#if !defined(GUID_DEVINTERFACE_USB_HOST_CONTROLLER) // http://msdn.microsoft.com/en-us/library/bb663109.aspx const GUID GUID_DEVINTERFACE_USB_HOST_CONTROLLER = { 0x3ABF6F2D, 0x71C4, 0x462A, {0x8A, 0x92, 0x1E, 0x68, 0x61, 0xE6, 0xAF, 0x27} }; #endif -#ifndef GUID_DEVINTERFACE_USB_DEVICE +#if !defined(GUID_DEVINTERFACE_USB_DEVICE) // http://msdn.microsoft.com/en-us/library/bb663093.aspx const GUID GUID_DEVINTERFACE_USB_DEVICE = { 0xA5DCBF10, 0x6530, 0x11D2, {0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED} }; #endif @@ -151,8 +162,7 @@ static char err_string[ERR_BUFFER_SIZE]; static char* sanitize_path(const char* path) { const char root_prefix[] = "\\\\.\\"; - int j; - size_t size, root_size; + size_t j, size, root_size; char* ret_path = NULL; int add_root = 0; @@ -702,7 +712,7 @@ static int usb_enumerate_hub(struct libusb_context *ctx, struct discovered_devs if (conn_info.DeviceAddress > LIBUSB_DEVADDR_MAX) { LOOP_CONTINUE("program assertion failed - device address is greater than 255, ignoring device"); } else { - devaddr = conn_info.DeviceAddress; + devaddr = (uint8_t)conn_info.DeviceAddress; } // Same trick as linux for session_id, with same caveat session_id = busnum << (sizeof(libusb_devaddr_t)*8) | devaddr; @@ -1483,7 +1493,7 @@ static void windows_handle_callback (struct usbi_transfer *itransfer, uint32_t i static int windows_handle_events(struct libusb_context *ctx, struct pollfd *fds, nfds_t nfds, int num_ready) { struct windows_transfer_priv* transfer_priv = NULL; - int i = 0; + nfds_t i = 0; bool found = false; struct usbi_transfer *transfer; DWORD io_size, io_result; @@ -1501,7 +1511,7 @@ static int windows_handle_events(struct libusb_context *ctx, struct pollfd *fds, // Because a Windows OVERLAPPED is used for poll emulation, // a pollable fd is created and stored with each transfer - list_for_each_entry(transfer, &ctx->flying_transfers, list) { + list_for_each_entry(transfer, &ctx->flying_transfers, list, struct usbi_transfer) { transfer_priv = usbi_transfer_get_os_priv(transfer); if (transfer_priv->pollable_fd.fd == fds[i].fd) { found = true; @@ -1543,8 +1553,8 @@ static int windows_clock_gettime(int clk_id, struct timespec *tp) // If hires_frequency is set, we have an hires monotonic timer available if ((hires_frequency != 0) && (QueryPerformanceCounter(&hires_counter) != 0)) { - tp->tv_sec = hires_counter.QuadPart / hires_frequency; - tp->tv_nsec = ((hires_counter.QuadPart % hires_frequency)/1000) * hires_ticks_to_ps; + tp->tv_sec = (long)(hires_counter.QuadPart / hires_frequency); + tp->tv_nsec = (long)(((hires_counter.QuadPart % hires_frequency)/1000) * hires_ticks_to_ps); return LIBUSB_SUCCESS; } // make sure we fall through to real-time if we can't get hires timer @@ -1557,8 +1567,8 @@ static int windows_clock_gettime(int clk_id, struct timespec *tp) rtime.LowPart = ftime.dwLowDateTime; rtime.HighPart = ftime.dwHighDateTime; rtime.QuadPart -= epoch_time; - tp->tv_sec = rtime.QuadPart / 10000000; - tp->tv_nsec = (rtime.QuadPart % 10000000)*100; + tp->tv_sec = (long)(rtime.QuadPart / 10000000); + tp->tv_nsec = (long)((rtime.QuadPart % 10000000)*100); return LIBUSB_SUCCESS; default: return LIBUSB_ERROR_INVALID_PARAM; @@ -1603,7 +1613,7 @@ const struct usbi_os_backend windows_backend = { windows_handle_events, windows_clock_gettime, -#ifdef USBI_TIMERFD_AVAILABLE +#if defined(USBI_TIMERFD_AVAILABLE) NULL, #endif sizeof(struct windows_device_priv), diff --git a/libusb/os/windows_usb.h b/libusb/os/windows_usb.h index 55c8bdc..1452224 100644 --- a/libusb/os/windows_usb.h +++ b/libusb/os/windows_usb.h @@ -236,7 +236,7 @@ typedef struct _USB_CONFIGURATION_DESCRIPTOR_SHORT { } USB_CONFIGURATION_DESCRIPTOR_SHORT; #pragma pack(pop) -#ifndef USB_HUB_CAP_FLAGS +#if !defined(_MSC_VER) typedef union _USB_HUB_CAP_FLAGS { ULONG ul; struct { @@ -249,19 +249,17 @@ typedef union _USB_HUB_CAP_FLAGS { ULONG ReservedMBZ:26; }; } USB_HUB_CAP_FLAGS, *PUSB_HUB_CAP_FLAGS; -#endif -#ifndef USB_HUB_CAPABILITIES_EX typedef struct _USB_HUB_CAPABILITIES_EX { USB_HUB_CAP_FLAGS CapabilityFlags; } USB_HUB_CAPABILITIES_EX, *PUSB_HUB_CAPABILITIES_EX; #endif -#ifndef USB_GET_HUB_CAPABILITIES_EX +#if !defined(USB_GET_HUB_CAPABILITIES_EX) #define USB_GET_HUB_CAPABILITIES_EX 276 #endif -#ifndef IOCTL_USB_GET_HUB_CAPABILITIES_EX +#if !defined(IOCTL_USB_GET_HUB_CAPABILITIES_EX) #define IOCTL_USB_GET_HUB_CAPABILITIES_EX \ CTL_CODE( FILE_DEVICE_USB, USB_GET_HUB_CAPABILITIES_EX, \ METHOD_BUFFERED, FILE_ANY_ACCESS ) diff --git a/libusb/sync.c b/libusb/sync.c index bd4d970..75b7af7 100644 --- a/libusb/sync.c +++ b/libusb/sync.c @@ -17,7 +17,11 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#ifdef _MSC_VER
+#include <config_msvc.h>
+#else
#include <config.h> +#endif #include <errno.h> #include <stdint.h> #include <stdlib.h> |