On Mon, 2012-06-25 at 10:24 -0500, Dan Williams wrote: > On Sat, 2012-06-23 at 21:46 -0400, Alan Stern wrote: > > On Sat, 23 Jun 2012, Bjørn Mork wrote: > > > > > > Maybe you're not aware that libusb-1.0 has a compatibility layer that > > > > provides the old libusb-0.1 bindings. > > > > > > That's correct. I was not aware of this. Thanks. Learning something > > > every day makes me feel younger. This mailing list is something of a > > > Fountain of Youth :-) > > > > > > > It's probably in a package called libusb-compat or something similar. > > > > > > Cannot find any such package in Debian. "apt-cache search libusb compat" > > > returns nothing. > > > > I don't know what it's called, and Debian might not even have packaged > > it. (It doesn't seem to be present in Fedora 16, for that matter.) > > But even if they didn't, it can always be built from the source. > > So the compat package doesn't actually work either. That's what Fedora > is using for the older libusb. And here's why... new libusb has a > symbol libusb_init() that replaces usb_init(). The compat library does > this: > > API_EXPORTED void usb_init(void) > { > int r; > usbi_dbg(""); > > if (!ctx) { > r = libusb_init(&ctx); > if (r < 0) { > > But guess what USB.pm does? > > # > # Internal-only, one-time init function. > my $init_ref; > $init_ref = sub > { > libusb_init(); > $init_ref = sub {}; > }; > > <snip> > > void libusb_init() > { > usb_init(); > } > > Guess which libusb_init() actually gets called? So when loading > Device::USB on a system with the compat library, we loop for infinity > calling usb_init() -> libusb_init() -> usb_init() -> (etc). Yay. I'll > fix this up locally for me at least. But beware :) If anyone cares, here's the patch to Device::USB that makes things happier with libusb-1.0. There's other conflicts than just libusb_init(), so I did the sledgehammer approach. Dan
diff -up Device-USB-0.35/lib/Device/USB/Bus.pm.foo Device-USB-0.35/lib/Device/USB/Bus.pm diff -up Device-USB-0.35/lib/Device/USB/Device.pm.foo Device-USB-0.35/lib/Device/USB/Device.pm --- Device-USB-0.35/lib/Device/USB/Device.pm.foo 2012-06-25 10:33:33.091995923 -0500 +++ Device-USB-0.35/lib/Device/USB/Device.pm 2012-06-25 10:34:37.504190659 -0500 @@ -69,7 +69,7 @@ Close the device connected to the object sub DESTROY { my $self = shift; - Device::USB::libusb_close( $self->{handle} ) if $self->{handle}; + Device::USB::_libusb_close( $self->{handle} ) if $self->{handle}; return; } @@ -269,9 +269,9 @@ If the device fails to open, the reason sub open ## no critic (ProhibitBuiltinHomonyms) { my $self = shift; - Device::USB::libusb_close( $self->{handle} ) if $self->{handle}; + Device::USB::_libusb_close( $self->{handle} ) if $self->{handle}; local $! = 0; - $self->{handle} = Device::USB::libusb_open( $self->{device} ); + $self->{handle} = Device::USB::_libusb_open( $self->{device} ); return 0 == $!; } @@ -303,7 +303,7 @@ sub set_configuration my $configuration = shift; $self->_assert_open(); - return Device::USB::libusb_set_configuration( $self->{handle}, $configuration ); + return Device::USB::_libusb_set_configuration( $self->{handle}, $configuration ); } =item set_altinterface @@ -328,7 +328,7 @@ sub set_altinterface my $alternate = shift; $self->_assert_open(); - return Device::USB::libusb_set_altinterface( $self->{handle}, $alternate ); + return Device::USB::_libusb_set_altinterface( $self->{handle}, $alternate ); } =item clear_halt @@ -353,7 +353,7 @@ sub clear_halt my $ep = shift; $self->_assert_open(); - return Device::USB::libusb_clear_halt( $self->{handle}, $ep ); + return Device::USB::_libusb_clear_halt( $self->{handle}, $ep ); } =item reset @@ -369,7 +369,7 @@ sub reset ## no critic (ProhibitBuiltin return 0 unless defined $self->{handle}; - my $ret = Device::USB::libusb_reset( $self->{handle} ); + my $ret = Device::USB::_libusb_reset( $self->{handle} ); delete $self->{handle} unless $ret; return $ret; @@ -397,7 +397,7 @@ sub claim_interface my $interface = shift; $self->_assert_open(); - return Device::USB::libusb_claim_interface( $self->{handle}, $interface ); + return Device::USB::_libusb_claim_interface( $self->{handle}, $interface ); } =item release_interface @@ -422,7 +422,7 @@ sub release_interface my $interface = shift; $self->_assert_open(); - return Device::USB::libusb_release_interface( $self->{handle}, $interface ); + return Device::USB::_libusb_release_interface( $self->{handle}, $interface ); } =item control_msg @@ -466,7 +466,7 @@ sub control_msg $bytes = q{} unless defined $bytes; $self->_assert_open(); - my ($retval, $out) = Device::USB::libusb_control_msg( + my ($retval, $out) = Device::USB::_libusb_control_msg( $self->{handle}, $requesttype, $request, $value, $index, $bytes, $size, $timeout ); @@ -506,7 +506,7 @@ sub get_string my $buf = "\0" x MAX_BUFFER_SIZE; - my $retlen = Device::USB::libusb_get_string( + my $retlen = Device::USB::_libusb_get_string( $self->{handle}, $index, $langid, $buf, MAX_BUFFER_SIZE ); @@ -539,7 +539,7 @@ sub get_string_simple my $buf = "\0" x MAX_BUFFER_SIZE; - my $retlen = Device::USB::libusb_get_string_simple( + my $retlen = Device::USB::_libusb_get_string_simple( $self->{handle}, $index, $buf, MAX_BUFFER_SIZE ); @@ -580,7 +580,7 @@ sub get_descriptor my $buf = "\0" x MAX_BUFFER_SIZE; - my $retlen = Device::USB::libusb_get_descriptor( + my $retlen = Device::USB::_libusb_get_descriptor( $self->{handle}, $type, $index, $buf, MAX_BUFFER_SIZE ); @@ -635,7 +635,7 @@ sub get_descriptor_by_endpoint my $buf = "\0" x MAX_BUFFER_SIZE; - my $retlen = Device::USB::libusb_get_descriptor_by_endpoint( + my $retlen = Device::USB::_libusb_get_descriptor_by_endpoint( $self->{handle}, $ep, $type, $index, $buf, MAX_BUFFER_SIZE ); @@ -693,7 +693,7 @@ sub bulk_read $bytes .= "\0" x ($size - length $bytes); } - my $retlen = Device::USB::libusb_bulk_read( + my $retlen = Device::USB::_libusb_bulk_read( $self->{handle}, $ep, $bytes, $size, $timeout ); @@ -745,7 +745,7 @@ sub interrupt_read $bytes .= "\0" x ($size - length $bytes); } - my $retlen = Device::USB::libusb_interrupt_read( + my $retlen = Device::USB::_libusb_interrupt_read( $self->{handle}, $ep, $bytes, $size, $timeout ); @@ -788,7 +788,7 @@ sub bulk_write $self->_assert_open(); - return Device::USB::libusb_bulk_write( + return Device::USB::_libusb_bulk_write( $self->{handle}, $ep, $bytes, length $bytes, $timeout ); } @@ -826,7 +826,7 @@ sub interrupt_write $self->_assert_open(); - return Device::USB::libusb_interrupt_write( + return Device::USB::_libusb_interrupt_write( $self->{handle}, $ep, $bytes, length $bytes, $timeout ); } @@ -858,7 +858,7 @@ sub get_driver_np my $buf = "\0" x MAX_BUFFER_SIZE; - my $retlen = Device::USB::libusb_get_driver_np( + my $retlen = Device::USB::_libusb_get_driver_np( $self->{handle}, $interface, $buf, MAX_BUFFER_SIZE ); @@ -882,7 +882,7 @@ sub detach_kernel_driver_np my $interface = shift; $self->_assert_open(); - return Device::USB::libusb_detach_kernel_driver_np( + return Device::USB::_libusb_detach_kernel_driver_np( $self->{handle}, $interface ); } diff -up Device-USB-0.35/lib/Device/USB.pm.foo Device-USB-0.35/lib/Device/USB.pm --- Device-USB-0.35/lib/Device/USB.pm.foo 2012-06-25 10:26:47.280069269 -0500 +++ Device-USB-0.35/lib/Device/USB.pm 2012-06-25 10:35:45.841336325 -0500 @@ -172,7 +172,7 @@ CLASS_VENDOR_SPEC my $init_ref; $init_ref = sub { - libusb_init(); + _libusb_init(); $init_ref = sub {}; }; @@ -228,7 +228,7 @@ number of busses added or removed. sub find_busses { my $self = shift; - return libusb_find_busses(); + return _libusb_find_busses(); } =item find_devices @@ -241,7 +241,7 @@ number of devices added or removed. Shou sub find_devices { my $self = shift; - return libusb_find_devices(); + return _libusb_find_devices(); } =item find_device @@ -538,37 +538,37 @@ unsigned DeviceUSBDebugLevel() return debugLevel; } -void libusb_init() +void _libusb_init() { usb_init(); } -int libusb_find_busses() +int _libusb_find_busses() { return usb_find_busses(); } -int libusb_find_devices() +int _libusb_find_devices() { return usb_find_devices(); } -void *libusb_get_busses() +void *_libusb_get_busses() { return usb_get_busses(); } -void *libusb_open(void *dev) +void *_libusb_open(void *dev) { return usb_open( (struct usb_device*)dev ); } -int libusb_close(void *dev) +int _libusb_close(void *dev) { return usb_close((usb_dev_handle *)dev); } -int libusb_set_configuration(void *dev, int configuration) +int _libusb_set_configuration(void *dev, int configuration) { if(DeviceUSBDebugLevel()) { @@ -577,7 +577,7 @@ int libusb_set_configuration(void *dev, return usb_set_configuration((usb_dev_handle *)dev, configuration); } -int libusb_set_altinterface(void *dev, int alternate) +int _libusb_set_altinterface(void *dev, int alternate) { if(DeviceUSBDebugLevel()) { @@ -586,7 +586,7 @@ int libusb_set_altinterface(void *dev, i return usb_set_altinterface((usb_dev_handle *)dev, alternate); } -int libusb_clear_halt(void *dev, unsigned int ep) +int _libusb_clear_halt(void *dev, unsigned int ep) { if(DeviceUSBDebugLevel()) { @@ -595,12 +595,12 @@ int libusb_clear_halt(void *dev, unsigne return usb_clear_halt((usb_dev_handle *)dev, ep); } -int libusb_reset(void *dev) +int _libusb_reset(void *dev) { return usb_reset((usb_dev_handle *)dev); } -int libusb_get_driver_np(void *dev, int interface, char *name, unsigned int namelen) +int _libusb_get_driver_np(void *dev, int interface, char *name, unsigned int namelen) { int ret = 0; if(DeviceUSBDebugLevel()) @@ -616,7 +616,7 @@ int libusb_get_driver_np(void *dev, int #endif } -int libusb_detach_kernel_driver_np(void *dev, int interface) +int _libusb_detach_kernel_driver_np(void *dev, int interface) { if(DeviceUSBDebugLevel()) { @@ -629,7 +629,7 @@ int libusb_detach_kernel_driver_np(void #endif } -int libusb_claim_interface(void *dev, int interface) +int _libusb_claim_interface(void *dev, int interface) { if(DeviceUSBDebugLevel()) { @@ -638,7 +638,7 @@ int libusb_claim_interface(void *dev, in return usb_claim_interface((usb_dev_handle *)dev, interface); } -int libusb_release_interface(void *dev, int interface) +int _libusb_release_interface(void *dev, int interface) { if(DeviceUSBDebugLevel()) { @@ -647,7 +647,7 @@ int libusb_release_interface(void *dev, return usb_release_interface((usb_dev_handle *)dev, interface); } -void libusb_control_msg(void *dev, int requesttype, int request, int value, int index, char *bytes, int size, int timeout) +void _libusb_control_msg(void *dev, int requesttype, int request, int value, int index, char *bytes, int size, int timeout) { int i = 0; int retval = 0; @@ -689,7 +689,7 @@ void libusb_control_msg(void *dev, int r Inline_Stack_Done; } -int libusb_get_string(void *dev, int index, int langid, char *buf, size_t buflen) +int _libusb_get_string(void *dev, int index, int langid, char *buf, size_t buflen) { if(DeviceUSBDebugLevel()) { @@ -700,7 +700,7 @@ int libusb_get_string(void *dev, int ind return usb_get_string((usb_dev_handle *)dev, index, langid, buf, buflen); } -int libusb_get_string_simple(void *dev, int index, char *buf, size_t buflen) +int _libusb_get_string_simple(void *dev, int index, char *buf, size_t buflen) { if(DeviceUSBDebugLevel()) { @@ -711,32 +711,32 @@ int libusb_get_string_simple(void *dev, return usb_get_string_simple((usb_dev_handle *)dev, index, buf, buflen); } -int libusb_get_descriptor(void *dev, unsigned char type, unsigned char index, char *buf, int size) +int _libusb_get_descriptor(void *dev, unsigned char type, unsigned char index, char *buf, int size) { return usb_get_descriptor((usb_dev_handle *)dev, type, index, buf, size); } -int libusb_get_descriptor_by_endpoint(void *dev, int ep, unsigned char type, unsigned char index, char *buf, int size) +int _libusb_get_descriptor_by_endpoint(void *dev, int ep, unsigned char type, unsigned char index, char *buf, int size) { return usb_get_descriptor_by_endpoint((usb_dev_handle *)dev, ep, type, index, buf, size); } -int libusb_bulk_write(void *dev, int ep, char *bytes, int size, int timeout) +int _libusb_bulk_write(void *dev, int ep, char *bytes, int size, int timeout) { return usb_bulk_write((usb_dev_handle *)dev, ep, bytes, size, timeout); } -int libusb_bulk_read(void *dev, int ep, char *bytes, int size, int timeout) +int _libusb_bulk_read(void *dev, int ep, char *bytes, int size, int timeout) { return usb_bulk_read((usb_dev_handle *)dev, ep, bytes, size, timeout); } -int libusb_interrupt_write(void *dev, int ep, char *bytes, int size, int timeout) +int _libusb_interrupt_write(void *dev, int ep, char *bytes, int size, int timeout) { return usb_interrupt_write((usb_dev_handle *)dev, ep, bytes, size, timeout); } -int libusb_interrupt_read(void *dev, int ep, char *bytes, int size, int timeout) +int _libusb_interrupt_read(void *dev, int ep, char *bytes, int size, int timeout) { return usb_interrupt_read((usb_dev_handle *)dev, ep, bytes, size, timeout); } diff -up Device-USB-0.35/t/pod-coverage.t.foo Device-USB-0.35/t/pod-coverage.t --- Device-USB-0.35/t/pod-coverage.t.foo 2012-06-25 10:32:17.010947066 -0500 +++ Device-USB-0.35/t/pod-coverage.t 2012-06-25 10:32:26.309830814 -0500 @@ -8,7 +8,7 @@ eval "use Test::Pod::Coverage 1.04"; ## plan skip_all => "Test::Pod::Coverage 1.04 required for testing POD coverage" if $@; all_pod_coverage_ok( { also_private => [ - qr/^libusb_\w+$/, + qr/^_libusb_\w+$/, qr/^dl_load_flags$/, qr/^lib_find_usb_device$/, qr/^lib_get_usb_busses$/, diff -up Device-USB-0.35/USB.pm.foo Device-USB-0.35/USB.pm --- Device-USB-0.35/USB.pm.foo 2012-06-25 10:26:43.371118137 -0500 +++ Device-USB-0.35/USB.pm 2012-06-25 10:30:39.586165044 -0500 @@ -172,7 +172,7 @@ CLASS_VENDOR_SPEC my $init_ref; $init_ref = sub { - libusb_init(); + _libusb_init(); $init_ref = sub {}; }; @@ -228,7 +228,7 @@ number of busses added or removed. sub find_busses { my $self = shift; - return libusb_find_busses(); + return _libusb_find_busses(); } =item find_devices @@ -241,7 +241,7 @@ number of devices added or removed. Shou sub find_devices { my $self = shift; - return libusb_find_devices(); + return _libusb_find_devices(); } =item find_device @@ -538,37 +538,37 @@ unsigned DeviceUSBDebugLevel() return debugLevel; } -void libusb_init() +void _libusb_init() { usb_init(); } -int libusb_find_busses() +int _libusb_find_busses() { return usb_find_busses(); } -int libusb_find_devices() +int _libusb_find_devices() { return usb_find_devices(); } -void *libusb_get_busses() +void *_libusb_get_busses() { return usb_get_busses(); } -void *libusb_open(void *dev) +void *_libusb_open(void *dev) { return usb_open( (struct usb_device*)dev ); } -int libusb_close(void *dev) +int _libusb_close(void *dev) { return usb_close((usb_dev_handle *)dev); } -int libusb_set_configuration(void *dev, int configuration) +int _libusb_set_configuration(void *dev, int configuration) { if(DeviceUSBDebugLevel()) { @@ -577,7 +577,7 @@ int libusb_set_configuration(void *dev, return usb_set_configuration((usb_dev_handle *)dev, configuration); } -int libusb_set_altinterface(void *dev, int alternate) +int _libusb_set_altinterface(void *dev, int alternate) { if(DeviceUSBDebugLevel()) { @@ -586,7 +586,7 @@ int libusb_set_altinterface(void *dev, i return usb_set_altinterface((usb_dev_handle *)dev, alternate); } -int libusb_clear_halt(void *dev, unsigned int ep) +int _libusb_clear_halt(void *dev, unsigned int ep) { if(DeviceUSBDebugLevel()) { @@ -595,12 +595,12 @@ int libusb_clear_halt(void *dev, unsigne return usb_clear_halt((usb_dev_handle *)dev, ep); } -int libusb_reset(void *dev) +int _libusb_reset(void *dev) { return usb_reset((usb_dev_handle *)dev); } -int libusb_get_driver_np(void *dev, int interface, char *name, unsigned int namelen) +int _libusb_get_driver_np(void *dev, int interface, char *name, unsigned int namelen) { int ret = 0; if(DeviceUSBDebugLevel()) @@ -616,7 +616,7 @@ int libusb_get_driver_np(void *dev, int #endif } -int libusb_detach_kernel_driver_np(void *dev, int interface) +int _libusb_detach_kernel_driver_np(void *dev, int interface) { if(DeviceUSBDebugLevel()) { @@ -629,7 +629,7 @@ int libusb_detach_kernel_driver_np(void #endif } -int libusb_claim_interface(void *dev, int interface) +int _libusb_claim_interface(void *dev, int interface) { if(DeviceUSBDebugLevel()) { @@ -638,7 +638,7 @@ int libusb_claim_interface(void *dev, in return usb_claim_interface((usb_dev_handle *)dev, interface); } -int libusb_release_interface(void *dev, int interface) +int _libusb_release_interface(void *dev, int interface) { if(DeviceUSBDebugLevel()) { @@ -647,7 +647,7 @@ int libusb_release_interface(void *dev, return usb_release_interface((usb_dev_handle *)dev, interface); } -void libusb_control_msg(void *dev, int requesttype, int request, int value, int index, char *bytes, int size, int timeout) +void _libusb_control_msg(void *dev, int requesttype, int request, int value, int index, char *bytes, int size, int timeout) { int i = 0; int retval = 0; @@ -689,7 +689,7 @@ void libusb_control_msg(void *dev, int r Inline_Stack_Done; } -int libusb_get_string(void *dev, int index, int langid, char *buf, size_t buflen) +int _libusb_get_string(void *dev, int index, int langid, char *buf, size_t buflen) { if(DeviceUSBDebugLevel()) { @@ -700,7 +700,7 @@ int libusb_get_string(void *dev, int ind return usb_get_string((usb_dev_handle *)dev, index, langid, buf, buflen); } -int libusb_get_string_simple(void *dev, int index, char *buf, size_t buflen) +int _libusb_get_string_simple(void *dev, int index, char *buf, size_t buflen) { if(DeviceUSBDebugLevel()) { @@ -711,32 +711,32 @@ int libusb_get_string_simple(void *dev, return usb_get_string_simple((usb_dev_handle *)dev, index, buf, buflen); } -int libusb_get_descriptor(void *dev, unsigned char type, unsigned char index, char *buf, int size) +int _libusb_get_descriptor(void *dev, unsigned char type, unsigned char index, char *buf, int size) { return usb_get_descriptor((usb_dev_handle *)dev, type, index, buf, size); } -int libusb_get_descriptor_by_endpoint(void *dev, int ep, unsigned char type, unsigned char index, char *buf, int size) +int _libusb_get_descriptor_by_endpoint(void *dev, int ep, unsigned char type, unsigned char index, char *buf, int size) { return usb_get_descriptor_by_endpoint((usb_dev_handle *)dev, ep, type, index, buf, size); } -int libusb_bulk_write(void *dev, int ep, char *bytes, int size, int timeout) +int _libusb_bulk_write(void *dev, int ep, char *bytes, int size, int timeout) { return usb_bulk_write((usb_dev_handle *)dev, ep, bytes, size, timeout); } -int libusb_bulk_read(void *dev, int ep, char *bytes, int size, int timeout) +int _libusb_bulk_read(void *dev, int ep, char *bytes, int size, int timeout) { return usb_bulk_read((usb_dev_handle *)dev, ep, bytes, size, timeout); } -int libusb_interrupt_write(void *dev, int ep, char *bytes, int size, int timeout) +int _libusb_interrupt_write(void *dev, int ep, char *bytes, int size, int timeout) { return usb_interrupt_write((usb_dev_handle *)dev, ep, bytes, size, timeout); } -int libusb_interrupt_read(void *dev, int ep, char *bytes, int size, int timeout) +int _libusb_interrupt_read(void *dev, int ep, char *bytes, int size, int timeout) { return usb_interrupt_read((usb_dev_handle *)dev, ep, bytes, size, timeout); }