Global Namespace
// typedefs typedef struct libusb_context libusb_context; typedef struct libusb_device libusb_device; typedef struct libusb_device_handle libusb_device_handle; typedef void (*libusb_transfer_cb_fn)(struct libusb_transfer *transfer); typedef void (*libusb_pollfd_added_cb)( int fd, short events, void *user_data ); typedef void (*libusb_pollfd_removed_cb)( int fd, void *user_data ); typedef int libusb_hotplug_callback_handle; typedef int (*libusb_hotplug_callback_fn)( libusb_context *ctx, libusb_device *device, libusb_hotplug_event event, void *user_data ); // enums enum libusb_bos_type; enum libusb_capability; enum libusb_class_code; enum libusb_descriptor_type; enum libusb_endpoint_direction; enum libusb_error; enum libusb_hotplug_event; enum libusb_hotplug_flag; enum libusb_iso_sync_type; enum libusb_iso_usage_type; enum libusb_log_level; enum libusb_request_recipient; enum libusb_request_type; enum libusb_speed; enum libusb_ss_usb_device_capability_attributes; enum libusb_standard_request; enum libusb_supported_speed; enum libusb_transfer_flags; enum libusb_transfer_status; enum libusb_transfer_type; enum libusb_usb_2_0_extension_attributes; // structs struct libusb_bos_descriptor; struct libusb_bos_dev_capability_descriptor; struct libusb_config_descriptor; struct libusb_container_id_descriptor; struct libusb_control_setup; struct libusb_device_descriptor; struct libusb_endpoint_descriptor; struct libusb_interface; struct libusb_interface_descriptor; struct libusb_iso_packet_descriptor; struct libusb_pollfd; struct libusb_ss_endpoint_companion_descriptor; struct libusb_ss_usb_device_capability_descriptor; struct libusb_transfer; struct libusb_usb_2_0_extension_descriptor; struct libusb_version; // global variables struct libusb_context* usbi_default_context = NULL; static const struct libusb_version libusb_version_internal = { LIBUSB_MAJOR, LIBUSB_MINOR, LIBUSB_MICRO, LIBUSB_NANO, LIBUSB_RC, "http://libusb.info" }; static int default_context_refcnt = 0; static usbi_mutex_static_t default_context_lock = USBI_MUTEX_INITIALIZER; static struct timeval timestamp_origin = { 0, 0 }; usbi_mutex_static_t active_contexts_lock = USBI_MUTEX_INITIALIZER; struct list_head active_contexts_list; static size_t usbi_locale = 0; static const char* usbi_locale_supported[] = { "en", "nl", "fr", "ru" }; static const char* usbi_localized_errors[ARRAYSIZE(usbi_locale_supported)][LIBUSB_ERROR_COUNT]; // global functions static struct discovered_devs* discovered_devs_alloc(void); static void discovered_devs_free(struct discovered_devs* discdevs); struct discovered_devs* discovered_devs_append( struct discovered_devs* discdevs, struct libusb_device* dev ); struct libusb_device* usbi_alloc_device( struct libusb_context* ctx, unsigned long session_id ); void usbi_connect_device(struct libusb_device* dev); void usbi_disconnect_device(struct libusb_device* dev); int usbi_sanitize_device(struct libusb_device* dev); struct libusb_device* usbi_get_device_by_session_id( struct libusb_context* ctx, unsigned long session_id ); ssize_t libusb_get_device_list( libusb_context* ctx, libusb_device*** list ); void libusb_free_device_list( libusb_device** list, int unref_devices ); uint8_t libusb_get_bus_number(libusb_device* dev); uint8_t libusb_get_port_number(libusb_device* dev); int libusb_get_port_numbers( libusb_device* dev, uint8_t* port_numbers, int port_numbers_len ); int libusb_get_port_path( libusb_context* ctx, libusb_device* dev, uint8_t* port_numbers, uint8_t port_numbers_len ); libusb_device* libusb_get_parent(libusb_device* dev); uint8_t libusb_get_device_address(libusb_device* dev); int libusb_get_device_speed(libusb_device* dev); static const struct libusb_endpoint_descriptor* find_endpoint( struct libusb_config_descriptor* config, unsigned char endpoint ); int libusb_get_max_packet_size( libusb_device* dev, unsigned char endpoint ); int libusb_get_max_iso_packet_size( libusb_device* dev, unsigned char endpoint ); libusb_device* libusb_ref_device(libusb_device* dev); void libusb_unref_device(libusb_device* dev); int usbi_signal_event(struct libusb_context* ctx); int usbi_clear_event(struct libusb_context* ctx); int libusb_open( libusb_device* dev, libusb_device_handle** dev_handle ); libusb_device_handle* libusb_open_device_with_vid_pid( libusb_context* ctx, uint16_t vendor_id, uint16_t product_id ); static void do_close( struct libusb_context* ctx, struct libusb_device_handle* dev_handle ); void libusb_close(libusb_device_handle* dev_handle); libusb_device* libusb_get_device(libusb_device_handle* dev_handle); int libusb_get_configuration( libusb_device_handle* dev_handle, int* config ); int libusb_set_configuration( libusb_device_handle* dev_handle, int configuration ); int libusb_claim_interface( libusb_device_handle* dev_handle, int interface_number ); int libusb_release_interface( libusb_device_handle* dev_handle, int interface_number ); int libusb_set_interface_alt_setting( libusb_device_handle* dev_handle, int interface_number, int alternate_setting ); int libusb_clear_halt( libusb_device_handle* dev_handle, unsigned char endpoint ); int libusb_reset_device(libusb_device_handle* dev_handle); int libusb_alloc_streams( libusb_device_handle* dev_handle, uint32_t num_streams, unsigned char* endpoints, int num_endpoints ); int libusb_free_streams( libusb_device_handle* dev_handle, unsigned char* endpoints, int num_endpoints ); unsigned char* libusb_dev_mem_alloc( libusb_device_handle* dev_handle, size_t length ); int libusb_dev_mem_free( libusb_device_handle* dev_handle, unsigned char* buffer, size_t length ); int libusb_kernel_driver_active( libusb_device_handle* dev_handle, int interface_number ); int libusb_detach_kernel_driver( libusb_device_handle* dev_handle, int interface_number ); int libusb_attach_kernel_driver( libusb_device_handle* dev_handle, int interface_number ); int libusb_set_auto_detach_kernel_driver( libusb_device_handle* dev_handle, int enable ); void libusb_set_debug( libusb_context* ctx, int level ); int libusb_init(libusb_context** context); void libusb_exit(struct libusb_context* ctx); int libusb_has_capability(uint32_t capability); static void usbi_log_str( struct libusb_context* ctx, enum libusb_log_level level, const char* str ); void usbi_log_v( struct libusb_context* ctx, enum libusb_log_level level, const char* function, const char* format, va_list args ); void usbi_log( struct libusb_context* ctx, enum libusb_log_level level, const char* function, const char* format, ... ); const char* libusb_error_name(int error_code); const struct libusb_version* libusb_get_version(void); int usbi_parse_descriptor( const unsigned char* source, const char* descriptor, void* dest, int host_endian ); static void clear_endpoint(struct libusb_endpoint_descriptor* endpoint); static int parse_endpoint( struct libusb_context* ctx, struct libusb_endpoint_descriptor* endpoint, unsigned char* buffer, int size, int host_endian ); static void clear_interface(struct libusb_interface* usb_interface); static int parse_interface( libusb_context* ctx, struct libusb_interface* usb_interface, unsigned char* buffer, int size, int host_endian ); static void clear_configuration(struct libusb_config_descriptor* config); static int parse_configuration( struct libusb_context* ctx, struct libusb_config_descriptor* config, unsigned char* buffer, int size, int host_endian ); static int raw_desc_to_config( struct libusb_context* ctx, unsigned char* buf, int size, int host_endian, struct libusb_config_descriptor** config ); int usbi_device_cache_descriptor(libusb_device* dev); int libusb_get_device_descriptor( libusb_device* dev, struct libusb_device_descriptor* desc ); int libusb_get_active_config_descriptor( libusb_device* dev, struct libusb_config_descriptor** config ); int libusb_get_config_descriptor( libusb_device* dev, uint8_t config_index, struct libusb_config_descriptor** config ); int usbi_get_config_index_by_value( struct libusb_device* dev, uint8_t bConfigurationValue, int* idx ); int libusb_get_config_descriptor_by_value( libusb_device* dev, uint8_t bConfigurationValue, struct libusb_config_descriptor** config ); void libusb_free_config_descriptor(struct libusb_config_descriptor* config); int libusb_get_ss_endpoint_companion_descriptor( struct libusb_context* ctx, const struct libusb_endpoint_descriptor* endpoint, struct libusb_ss_endpoint_companion_descriptor** ep_comp ); void libusb_free_ss_endpoint_companion_descriptor(struct libusb_ss_endpoint_companion_descriptor* ep_comp); static int parse_bos( struct libusb_context* ctx, struct libusb_bos_descriptor** bos, unsigned char* buffer, int size, int host_endian ); int libusb_get_bos_descriptor( libusb_device_handle* dev_handle, struct libusb_bos_descriptor** bos ); void libusb_free_bos_descriptor(struct libusb_bos_descriptor* bos); int libusb_get_usb_2_0_extension_descriptor( struct libusb_context* ctx, struct libusb_bos_dev_capability_descriptor* dev_cap, struct libusb_usb_2_0_extension_descriptor** usb_2_0_extension ); void libusb_free_usb_2_0_extension_descriptor(struct libusb_usb_2_0_extension_descriptor* usb_2_0_extension); int libusb_get_ss_usb_device_capability_descriptor( struct libusb_context* ctx, struct libusb_bos_dev_capability_descriptor* dev_cap, struct libusb_ss_usb_device_capability_descriptor** ss_usb_device_cap ); void libusb_free_ss_usb_device_capability_descriptor(struct libusb_ss_usb_device_capability_descriptor* ss_usb_device_cap); int libusb_get_container_id_descriptor( struct libusb_context* ctx, struct libusb_bos_dev_capability_descriptor* dev_cap, struct libusb_container_id_descriptor** container_id ); void libusb_free_container_id_descriptor(struct libusb_container_id_descriptor* container_id); int libusb_get_string_descriptor_ascii( libusb_device_handle* dev_handle, uint8_t desc_index, unsigned char* data, int length ); static int usbi_hotplug_match_cb( struct libusb_context* ctx, struct libusb_device* dev, libusb_hotplug_event event, struct libusb_hotplug_callback* hotplug_cb ); void usbi_hotplug_match( struct libusb_context* ctx, struct libusb_device* dev, libusb_hotplug_event event ); void usbi_hotplug_notification( struct libusb_context* ctx, struct libusb_device* dev, libusb_hotplug_event event ); int libusb_hotplug_register_callback( libusb_context* ctx, libusb_hotplug_event events, libusb_hotplug_flag flags, int vendor_id, int product_id, int dev_class, libusb_hotplug_callback_fn cb_fn, void* user_data, libusb_hotplug_callback_handle* callback_handle ); void libusb_hotplug_deregister_callback( libusb_context* ctx, libusb_hotplug_callback_handle callback_handle ); void usbi_hotplug_deregister_all(struct libusb_context* ctx); int usbi_io_init(struct libusb_context* ctx); void usbi_io_exit(struct libusb_context* ctx); static int calculate_timeout(struct usbi_transfer* transfer); struct libusb_transfer* libusb_alloc_transfer(int iso_packets); void libusb_free_transfer(struct libusb_transfer* transfer); static int arm_timerfd_for_next_timeout(struct libusb_context* ctx); static int add_to_flying_list(struct usbi_transfer* transfer); static int remove_from_flying_list(struct usbi_transfer* transfer); int libusb_submit_transfer(struct libusb_transfer* transfer); int libusb_cancel_transfer(struct libusb_transfer* transfer); void libusb_transfer_set_stream_id( struct libusb_transfer* transfer, uint32_t stream_id ); uint32_t libusb_transfer_get_stream_id(struct libusb_transfer* transfer); int usbi_handle_transfer_completion( struct usbi_transfer* itransfer, enum libusb_transfer_status status ); int usbi_handle_transfer_cancellation(struct usbi_transfer* transfer); void usbi_signal_transfer_completion(struct usbi_transfer* transfer); int libusb_try_lock_events(libusb_context* ctx); void libusb_lock_events(libusb_context* ctx); void libusb_unlock_events(libusb_context* ctx); int libusb_event_handling_ok(libusb_context* ctx); int libusb_event_handler_active(libusb_context* ctx); void libusb_interrupt_event_handler(libusb_context* ctx); void libusb_lock_event_waiters(libusb_context* ctx); void libusb_unlock_event_waiters(libusb_context* ctx); int libusb_wait_for_event( libusb_context* ctx, struct timeval* tv ); static void handle_timeout(struct usbi_transfer* itransfer); static int handle_timeouts_locked(struct libusb_context* ctx); static int handle_timeouts(struct libusb_context* ctx); static int handle_events( struct libusb_context* ctx, struct timeval* tv ); static int get_next_timeout( libusb_context* ctx, struct timeval* tv, struct timeval* out ); int libusb_handle_events_timeout_completed( libusb_context* ctx, struct timeval* tv, int* completed ); int libusb_handle_events_timeout( libusb_context* ctx, struct timeval* tv ); int libusb_handle_events(libusb_context* ctx); int libusb_handle_events_completed( libusb_context* ctx, int* completed ); int libusb_handle_events_locked( libusb_context* ctx, struct timeval* tv ); int libusb_pollfds_handle_timeouts(libusb_context* ctx); int libusb_get_next_timeout( libusb_context* ctx, struct timeval* tv ); void libusb_set_pollfd_notifiers( libusb_context* ctx, libusb_pollfd_added_cb added_cb, libusb_pollfd_removed_cb removed_cb, void* user_data ); static void usbi_fd_notification(struct libusb_context* ctx); int usbi_add_pollfd( struct libusb_context* ctx, int fd, short events ); void usbi_remove_pollfd( struct libusb_context* ctx, int fd ); const struct libusb_pollfd** libusb_get_pollfds(libusb_context* ctx); void libusb_free_pollfds(const struct libusb_pollfd** pollfds); void usbi_handle_disconnect(struct libusb_device_handle* dev_handle); static uint16_t libusb_cpu_to_le16(const uint16_t x); int libusb_setlocale(const char* locale); const char* libusb_strerror(enum libusb_error errcode); static unsigned char* libusb_control_transfer_get_data(struct libusb_transfer* transfer); static struct libusb_control_setup* libusb_control_transfer_get_setup(struct libusb_transfer* transfer); static void libusb_fill_control_setup( unsigned char* buffer, uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, uint16_t wLength ); static void libusb_fill_control_transfer( struct libusb_transfer* transfer, libusb_device_handle* dev_handle, unsigned char* buffer, libusb_transfer_cb_fn callback, void* user_data, unsigned int timeout ); static void libusb_fill_bulk_transfer( struct libusb_transfer* transfer, libusb_device_handle* dev_handle, unsigned char endpoint, unsigned char* buffer, int length, libusb_transfer_cb_fn callback, void* user_data, unsigned int timeout ); static void libusb_fill_bulk_stream_transfer( struct libusb_transfer* transfer, libusb_device_handle* dev_handle, unsigned char endpoint, uint32_t stream_id, unsigned char* buffer, int length, libusb_transfer_cb_fn callback, void* user_data, unsigned int timeout ); static void libusb_fill_interrupt_transfer( struct libusb_transfer* transfer, libusb_device_handle* dev_handle, unsigned char endpoint, unsigned char* buffer, int length, libusb_transfer_cb_fn callback, void* user_data, unsigned int timeout ); static void libusb_fill_iso_transfer( struct libusb_transfer* transfer, libusb_device_handle* dev_handle, unsigned char endpoint, unsigned char* buffer, int length, int num_iso_packets, libusb_transfer_cb_fn callback, void* user_data, unsigned int timeout ); static void libusb_set_iso_packet_lengths( struct libusb_transfer* transfer, unsigned int length ); static unsigned char* libusb_get_iso_packet_buffer( struct libusb_transfer* transfer, unsigned int packet ); static unsigned char* libusb_get_iso_packet_buffer_simple( struct libusb_transfer* transfer, unsigned int packet ); int libusb_control_transfer( libusb_device_handle* dev_handle, uint8_t request_type, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, unsigned char* data, uint16_t wLength, unsigned int timeout ); int libusb_bulk_transfer( libusb_device_handle* dev_handle, unsigned char endpoint, unsigned char* data, int length, int* actual_length, unsigned int timeout ); int libusb_interrupt_transfer( libusb_device_handle* dev_handle, unsigned char endpoint, unsigned char* data, int length, int* actual_length, unsigned int timeout ); static int libusb_get_descriptor( libusb_device_handle* dev_handle, uint8_t desc_type, uint8_t desc_index, unsigned char* data, int length ); static int libusb_get_string_descriptor( libusb_device_handle* dev_handle, uint8_t desc_index, uint16_t langid, unsigned char* data, int length ); static void sync_transfer_cb(struct libusb_transfer* transfer); static void sync_transfer_wait_for_completion(struct libusb_transfer* transfer); static int do_sync_bulk_transfer( struct libusb_device_handle* dev_handle, unsigned char endpoint, unsigned char* buffer, int length, int* transferred, unsigned int timeout, unsigned char type ); // macros #define CONFIG_DESC_LENGTH #define DESC_HEADER_LENGTH #define DEVICE_DESC_LENGTH #define DISCOVERED_DEVICES_SIZE_STEP #define ENDPOINT_AUDIO_DESC_LENGTH #define ENDPOINT_DESC_LENGTH #define INTERFACE_DESC_LENGTH #define LIBUSBX_API_VERSION #define LIBUSB_API_VERSION #define LIBUSB_BT_CONTAINER_ID_SIZE #define LIBUSB_BT_SS_USB_DEVICE_CAPABILITY_SIZE #define LIBUSB_BT_USB_2_0_EXTENSION_SIZE #define LIBUSB_CALL #define LIBUSB_CONTROL_SETUP_SIZE #define LIBUSB_DEPRECATED_FOR(f) #define LIBUSB_DT_BOS_MAX_SIZE #define LIBUSB_DT_BOS_SIZE #define LIBUSB_DT_CONFIG_SIZE #define LIBUSB_DT_DEVICE_CAPABILITY_SIZE #define LIBUSB_DT_DEVICE_SIZE #define LIBUSB_DT_ENDPOINT_AUDIO_SIZE #define LIBUSB_DT_ENDPOINT_SIZE #define LIBUSB_DT_HUB_NONVAR_SIZE #define LIBUSB_DT_INTERFACE_SIZE #define LIBUSB_DT_SS_ENDPOINT_COMPANION_SIZE #define LIBUSB_ENDPOINT_ADDRESS_MASK #define LIBUSB_ENDPOINT_DIR_MASK #define LIBUSB_ERROR_COUNT #define LIBUSB_HOTPLUG_MATCH_ANY #define LIBUSB_ISO_SYNC_TYPE_MASK #define LIBUSB_ISO_USAGE_TYPE_MASK #define LIBUSB_MICRO #define LIBUSB_MINOR #define LIBUSB_NANO #define LIBUSB_RC #define LIBUSB_TRANSFER_TYPE_MASK #define libusb_le16_to_cpu