Re: [PATCH] USB: option: Add USB ID for Novatel Ovation MC551

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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);
 }

[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux