From cf8ecfb438b2418d664cfd96f32d6c70aa2030ad Mon Sep 17 00:00:00 2001 From: Joachim LF Date: Sat, 2 Jan 2021 09:15:44 +0100 Subject: [PATCH] [pyUSB] Update to V1.1.1 a54ebc7 --- build/device/usb/__init__.py | 52 +++++++++++++----- build/device/usb/_debug.py | 37 +++++++++---- build/device/usb/_interop.py | 39 +++++++++----- build/device/usb/_lookup.py | 37 +++++++++---- build/device/usb/_objfinalizer.py | 37 +++++++++---- build/device/usb/backend/__init__.py | 43 ++++++++++----- build/device/usb/backend/libusb0.py | 80 +++++++++++++++++++++++----- build/device/usb/backend/libusb1.py | 58 +++++++++++++------- build/device/usb/backend/openusb.py | 48 ++++++++++++----- build/device/usb/control.py | 44 ++++++++++----- build/device/usb/core.py | 62 ++++++++++++++++----- build/device/usb/legacy.py | 37 +++++++++---- build/device/usb/libloader.py | 37 +++++++++---- build/device/usb/util.py | 57 ++++++++++++-------- 14 files changed, 480 insertions(+), 188 deletions(-) mode change 100755 => 100644 build/device/usb/__init__.py mode change 100755 => 100644 build/device/usb/_debug.py mode change 100755 => 100644 build/device/usb/_interop.py mode change 100755 => 100644 build/device/usb/_lookup.py mode change 100755 => 100644 build/device/usb/_objfinalizer.py mode change 100755 => 100644 build/device/usb/backend/__init__.py mode change 100755 => 100644 build/device/usb/backend/libusb0.py mode change 100755 => 100644 build/device/usb/backend/libusb1.py mode change 100755 => 100644 build/device/usb/backend/openusb.py mode change 100755 => 100644 build/device/usb/control.py mode change 100755 => 100644 build/device/usb/core.py mode change 100755 => 100644 build/device/usb/legacy.py mode change 100755 => 100644 build/device/usb/libloader.py mode change 100755 => 100644 build/device/usb/util.py diff --git a/build/device/usb/__init__.py b/build/device/usb/__init__.py old mode 100755 new mode 100644 index 6d5104577..13c2fbf32 --- a/build/device/usb/__init__.py +++ b/build/device/usb/__init__.py @@ -1,17 +1,32 @@ -# Copyright (C) 2009-2017 Wander Lairson Costa -# Copyright (C) 2017-2018 Robert Wlodarczyk +# Copyright 2009-2017 Wander Lairson Costa +# Copyright 2009-2021 PyUSB contributors # -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: # -# http://www.apache.org/licenses/LICENSE-2.0 +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. # -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. r"""PyUSB - Easy USB access in Python @@ -33,8 +48,19 @@ import os __author__ = 'Wander Lairson Costa' # Use Semantic Versioning, http://semver.org/ -version_info = (1, 0, 2) -__version__ = '%d.%d.%d' % version_info +try: + from usb._version import version as __version__ +except ImportError: + __version__ = '0.0.0' + +def _get_extended_version_info(version): + import re + m = re.match(r'(\d+)\.(\d+)\.(\d+)[.-]?(.*)', version) + major, minor, patch, suffix = m.groups() + return int(major), int(minor), int(patch), suffix + +extended_version_info = _get_extended_version_info(__version__) +version_info = extended_version_info[:3] __all__ = ['legacy', 'control', 'core', 'backend', 'util', 'libloader'] diff --git a/build/device/usb/_debug.py b/build/device/usb/_debug.py old mode 100755 new mode 100644 index 8c2a2b1aa..a4ca7e82e --- a/build/device/usb/_debug.py +++ b/build/device/usb/_debug.py @@ -1,17 +1,32 @@ -# Copyright (C) 2009-2017 Wander Lairson Costa -# Copyright (C) 2017-2018 Robert Wlodarczyk +# Copyright 2009-2017 Wander Lairson Costa +# Copyright 2009-2021 PyUSB contributors # -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: # -# http://www.apache.org/licenses/LICENSE-2.0 +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. # -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. __author__ = 'Wander Lairson Costa' diff --git a/build/device/usb/_interop.py b/build/device/usb/_interop.py old mode 100755 new mode 100644 index 96b019365..5729f910e --- a/build/device/usb/_interop.py +++ b/build/device/usb/_interop.py @@ -1,17 +1,32 @@ -# Copyright (C) 2009-2017 Wander Lairson Costa -# Copyright (C) 2017-2018 Robert Wlodarczyk +# Copyright 2009-2017 Wander Lairson Costa +# Copyright 2009-2021 PyUSB contributors # -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: # -# http://www.apache.org/licenses/LICENSE-2.0 +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. # -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # All the hacks necessary to assure compatibility across all # supported versions come here. @@ -81,5 +96,5 @@ def as_array(data=None): # When you pass a unicode string or a character sequence, # you get a TypeError if the first parameter does not match a = array.array('B') - a.fromstring(data) # deprecated since 3.2 + a.frombytes(data.encode('utf-8')) return a diff --git a/build/device/usb/_lookup.py b/build/device/usb/_lookup.py old mode 100755 new mode 100644 index 82170b744..68695de0e --- a/build/device/usb/_lookup.py +++ b/build/device/usb/_lookup.py @@ -1,17 +1,32 @@ -# Copyright (C) 2009-2017 Wander Lairson Costa -# Copyright (C) 2017-2018 Robert Wlodarczyk +# Copyright 2009-2017 Wander Lairson Costa +# Copyright 2009-2021 PyUSB contributors # -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: # -# http://www.apache.org/licenses/LICENSE-2.0 +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. # -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. r"""usb._lookups - Lookup tables for USB """ diff --git a/build/device/usb/_objfinalizer.py b/build/device/usb/_objfinalizer.py old mode 100755 new mode 100644 index ad8736074..dededa853 --- a/build/device/usb/_objfinalizer.py +++ b/build/device/usb/_objfinalizer.py @@ -1,19 +1,34 @@ # -*- coding: utf-8 -*- # -# Copyright (C) 2009-2017 Wander Lairson Costa -# Copyright (C) 2017-2018 Robert Wlodarczyk +# Copyright 2009-2017 Wander Lairson Costa +# Copyright 2009-2021 PyUSB contributors # -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: # -# http://www.apache.org/licenses/LICENSE-2.0 +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. # -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import sys diff --git a/build/device/usb/backend/__init__.py b/build/device/usb/backend/__init__.py old mode 100755 new mode 100644 index 2ff118069..f28e4940f --- a/build/device/usb/backend/__init__.py +++ b/build/device/usb/backend/__init__.py @@ -1,17 +1,32 @@ -# Copyright (C) 2009-2017 Wander Lairson Costa -# Copyright (C) 2017-2018 Robert Wlodarczyk +# Copyright 2009-2017 Wander Lairson Costa +# Copyright 2009-2021 PyUSB contributors # -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: # -# http://www.apache.org/licenses/LICENSE-2.0 +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. # -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. r"""usb.backend - Backend interface. @@ -62,7 +77,7 @@ import usb._objfinalizer as _objfinalizer __author__ = 'Wander Lairson Costa' -__all__ = ['IBackend', 'libusb01', 'libusb10', 'openusb'] +__all__ = ['IBackend', 'libusb0', 'libusb1', 'openusb'] def _not_implemented(func): raise NotImplementedError(func.__name__) @@ -196,7 +211,7 @@ class IBackend(_objfinalizer.AutoFinalizedObject): This method should only be called when the interface has more than one alternate setting. The dev_handle is the value returned by the - open_device() method. intf and altsetting are respectivelly the + open_device() method. intf and altsetting are respectively the bInterfaceNumber and bAlternateSetting fields of the related interface. """ _not_implemented(self.set_interface_altsetting) @@ -268,7 +283,7 @@ class IBackend(_objfinalizer.AutoFinalizedObject): _not_implemented(self.intr_write) def intr_read(self, dev_handle, ep, intf, size, timeout): - r"""Perform an interrut read. + r"""Perform an interrupt read. dev_handle is the value returned by the open_device() method. The ep parameter is the bEndpointAddress field whose endpoint diff --git a/build/device/usb/backend/libusb0.py b/build/device/usb/backend/libusb0.py old mode 100755 new mode 100644 index ff04475f5..c2183af8d --- a/build/device/usb/backend/libusb0.py +++ b/build/device/usb/backend/libusb0.py @@ -1,24 +1,40 @@ -# Copyright (C) 2009-2017 Wander Lairson Costa -# Copyright (C) 2017-2018 Robert Wlodarczyk +# Copyright 2009-2017 Wander Lairson Costa +# Copyright 2009-2021 PyUSB contributors # -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: # -# http://www.apache.org/licenses/LICENSE-2.0 +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. # -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. from ctypes import * +import errno import os import usb.backend import usb.util import sys -from usb.core import USBError +from usb.core import USBError, USBTimeoutError from usb._debug import methodtrace import usb._interop as _interop import logging @@ -30,6 +46,8 @@ __all__ = ['get_backend'] _logger = logging.getLogger('usb.backend.libusb0') +_USBFS_MAXDRIVERNAME = 255 + # usb.h if sys.platform.find('bsd') != -1 or sys.platform.find('mac') != -1 or \ @@ -350,6 +368,14 @@ def _setup_prototypes(lib): # linux only + # int usb_get_driver_np(usb_dev_handle *dev, + # int interface, + # char *name, + # unsigned int namelen); + if hasattr(lib, 'usb_get_driver_np'): + lib.usb_get_driver_np.argtypes = \ + [_usb_dev_handle, c_int, c_char_p, c_uint] + # int usb_detach_kernel_driver_np(usb_dev_handle *dev, int interface); if hasattr(lib, 'usb_detach_kernel_driver_np'): lib.usb_detach_kernel_driver_np.argtypes = [_usb_dev_handle, c_int] @@ -415,6 +441,9 @@ def _check(ret): errmsg = os.strerror(-ret) else: return ret + + if ret is not None and -ret == errno.ETIMEDOUT: + raise USBTimeoutError(errmsg, ret, -ret) raise USBError(errmsg, ret) def _has_iso_transfer(): @@ -588,8 +617,35 @@ class _LibUSB(usb.backend.IBackend): def reset_device(self, dev_handle): _check(_lib.usb_reset(dev_handle)) + @methodtrace(_logger) + def is_kernel_driver_active(self, dev_handle, intf): + if not hasattr(_lib, 'usb_get_driver_np'): + raise NotImplementedError(self.is_kernel_driver_active.__name__) + from errno import ENODATA + buf = usb.util.create_buffer(_USBFS_MAXDRIVERNAME + 1) + name, length = buf.buffer_info() + length *= buf.itemsize + # based on the implementation of libusb_kernel_driver_active + # (see libusb/os/linux_usbfs.c @@ op_kernel_driver_active): + # usb_get_driver_np fails with ENODATA when no kernel driver is bound, + # and if 'usbfs' is bound that means that a userspace program is + # controlling the device (e.g. using this very library) + try: + _check(_lib.usb_get_driver_np( + dev_handle, + intf, + cast(name, c_char_p), + length)) + return cast(name, c_char_p).value != b'usbfs' + except USBError as err: + if err.backend_error_code == -ENODATA: + return False + raise err + @methodtrace(_logger) def detach_kernel_driver(self, dev_handle, intf): + if not hasattr(_lib, 'usb_detach_kernel_driver_np'): + raise NotImplementedError(self.detach_kernel_driver.__name__) _check(_lib.usb_detach_kernel_driver_np(dev_handle, intf)) def __write(self, fn, dev_handle, ep, intf, data, timeout): diff --git a/build/device/usb/backend/libusb1.py b/build/device/usb/backend/libusb1.py old mode 100755 new mode 100644 index de30c256a..6615d68b7 --- a/build/device/usb/backend/libusb1.py +++ b/build/device/usb/backend/libusb1.py @@ -1,17 +1,32 @@ -# Copyright (C) 2009-2017 Wander Lairson Costa -# Copyright (C) 2017-2018 Robert Wlodarczyk +# Copyright 2009-2017 Wander Lairson Costa +# Copyright 2009-2021 PyUSB contributors # -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: # -# http://www.apache.org/licenses/LICENSE-2.0 +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. # -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. from ctypes import * import usb.util @@ -22,14 +37,14 @@ import usb._interop as _interop import usb._objfinalizer as _objfinalizer import errno import math -from usb.core import USBError +from usb.core import USBError, USBTimeoutError import usb.libloader __author__ = 'Wander Lairson Costa' __all__ = [ 'get_backend', - 'LIBUSB_SUCESS', + 'LIBUSB_SUCCESS', 'LIBUSB_ERROR_IO', 'LIBUSB_ERROR_INVALID_PARAM', 'LIBUSB_ERROR_ACCESS', @@ -42,14 +57,14 @@ __all__ = [ 'LIBUSB_ERROR_INTERRUPTED', 'LIBUSB_ERROR_NO_MEM', 'LIBUSB_ERROR_NOT_SUPPORTED', - 'LIBUSB_ERROR_OTHER' + 'LIBUSB_ERROR_OTHER', 'LIBUSB_TRANSFER_COMPLETED', 'LIBUSB_TRANSFER_ERROR', 'LIBUSB_TRANSFER_TIMED_OUT', 'LIBUSB_TRANSFER_CANCELLED', 'LIBUSB_TRANSFER_STALL', 'LIBUSB_TRANSFER_NO_DEVICE', - 'LIBUSB_TRANSFER_OVERFLOW' + 'LIBUSB_TRANSFER_OVERFLOW', ] _logger = logging.getLogger('usb.backend.libusb1') @@ -256,6 +271,7 @@ def _get_iso_packet_list(transfer): return list_type.from_address(addressof(transfer.iso_packet_desc)) _lib = None +_lib_object = None def _load_library(find_library=None): # Windows backend uses stdcall calling convention @@ -582,6 +598,8 @@ def _check(ret): if ret < 0: if ret == LIBUSB_ERROR_NOT_SUPPORTED: raise NotImplementedError(_strerror(ret)) + elif ret == LIBUSB_ERROR_TIMEOUT: + raise USBTimeoutError(_strerror(ret), ret, _libusb_errno[ret]) else: raise USBError(_strerror(ret), ret, _libusb_errno[ret]) @@ -700,7 +718,8 @@ class _LibUSB(usb.backend.IBackend): @methodtrace(_logger) def _finalize_object(self): - self.lib.libusb_exit(self.ctx) + if self.ctx: + self.lib.libusb_exit(self.ctx) @methodtrace(_logger) @@ -936,12 +955,13 @@ class _LibUSB(usb.backend.IBackend): return transferred.value def get_backend(find_library=None): - global _lib + global _lib, _lib_object try: - if _lib is None: + if _lib_object is None: _lib = _load_library(find_library=find_library) _setup_prototypes(_lib) - return _LibUSB(_lib) + _lib_object = _LibUSB(_lib) + return _lib_object except usb.libloader.LibraryException: # exception already logged (if any) _logger.error('Error loading libusb 1.0 backend', exc_info=False) diff --git a/build/device/usb/backend/openusb.py b/build/device/usb/backend/openusb.py old mode 100755 new mode 100644 index 55e75c994..11e419ac9 --- a/build/device/usb/backend/openusb.py +++ b/build/device/usb/backend/openusb.py @@ -1,17 +1,32 @@ -# Copyright (C) 2009-2017 Wander Lairson Costa -# Copyright (C) 2017-2018 Robert Wlodarczyk +# Copyright 2009-2017 Wander Lairson Costa +# Copyright 2009-2021 PyUSB contributors # -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: # -# http://www.apache.org/licenses/LICENSE-2.0 +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. # -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. from ctypes import * import ctypes.util @@ -24,7 +39,7 @@ import usb._interop as _interop import usb._objfinalizer as _objfinalizer import usb.util as util import usb.libloader -from usb.core import USBError +from usb.core import USBError, USBTimeoutError __author__ = 'Wander Lairson Costa' @@ -458,7 +473,7 @@ def _setup_prototypes(lib): POINTER(_openusb_intr_request) ] - lib.openusb_bulk_xfer.restype = c_int32 + lib.openusb_intr_xfer.restype = c_int32 # int32_t openusb_bulk_xfer(openusb_dev_handle_t dev, # uint8_t ifc, @@ -491,7 +506,11 @@ def _check(ret): ret = ret.value if ret != 0: - raise USBError(_lib.openusb_strerror(ret), ret, _openusb_errno[ret]) + if ret == OPENUSB_IO_TIMEOUT: + raise USBTimeoutError(_lib.openusb_strerror(ret), ret, _openusb_errno[ret]) + else: + raise USBError(_lib.openusb_strerror(ret), ret, _openusb_errno[ret]) + return ret class _Context(_objfinalizer.AutoFinalizedObject): @@ -726,6 +745,7 @@ def get_backend(find_library=None): _lib = _load_library(find_library) _setup_prototypes(_lib) _ctx = _Context() + _logger.warning('OpenUSB backend deprecated (https://github.com/pyusb/pyusb/issues/284)') return _OpenUSB() except usb.libloader.LibraryException: # exception already logged (if any) diff --git a/build/device/usb/control.py b/build/device/usb/control.py old mode 100755 new mode 100644 index 53b18826d..f46ced1bf --- a/build/device/usb/control.py +++ b/build/device/usb/control.py @@ -1,17 +1,32 @@ -# Copyright (C) 2009-2017 Wander Lairson Costa -# Copyright (C) 2017-2018 Robert Wlodarczyk +# Copyright 2009-2017 Wander Lairson Costa +# Copyright 2009-2021 PyUSB contributors # -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: # -# http://www.apache.org/licenses/LICENSE-2.0 +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. # -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. r"""usb.control - USB standard control requests @@ -152,13 +167,18 @@ def get_descriptor(dev, desc_size, desc_type, desc_index, wIndex = 0): util.CTRL_TYPE_STANDARD, util.CTRL_RECIPIENT_DEVICE) - return dev.ctrl_transfer( + desc = dev.ctrl_transfer( bmRequestType = bmRequestType, bRequest = 0x06, wValue = wValue, wIndex = wIndex, data_or_wLength = desc_size) + if len(desc) < 2: + raise USBError('Invalid descriptor') + + return desc + def set_descriptor(dev, desc, desc_type, desc_index, wIndex = None): r"""Update an existing descriptor or add a new one. diff --git a/build/device/usb/core.py b/build/device/usb/core.py old mode 100755 new mode 100644 index 39685fe1b..7546de2bc --- a/build/device/usb/core.py +++ b/build/device/usb/core.py @@ -1,17 +1,32 @@ -# Copyright (C) 2009-2017 Wander Lairson Costa -# Copyright (C) 2017-2018 Robert Wlodarczyk +# Copyright 2009-2017 Wander Lairson Costa +# Copyright 2009-2021 PyUSB contributors # -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: # -# http://www.apache.org/licenses/LICENSE-2.0 +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. # -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. r"""usb.core - Core USB features. @@ -27,8 +42,8 @@ show_devices() - a function to show the devices present. __author__ = 'Wander Lairson Costa' -__all__ = [ 'Device', 'Configuration', 'Interface', 'Endpoint', 'find', - 'show_devices' ] +__all__ = [ 'Device', 'Configuration', 'Interface', 'Endpoint', 'USBError', + 'USBTimeoutError', 'NoBackendError', 'find', 'show_devices' ] import usb.util as util import copy @@ -45,10 +60,19 @@ _logger = logging.getLogger('usb.core') _DEFAULT_TIMEOUT = 1000 +_sentinel = object() + def _set_attr(input, output, fields): for f in fields: setattr(output, f, getattr(input, f)) +def _try_getattr(object, name): + try: + attr = getattr(object, name) + except : + attr = _sentinel + return attr + def _try_get_string(dev, index, langid = None, default_str_i0 = "", default_access_error = "Error Accessing String"): """ try to get a string, but return a string no matter what @@ -182,6 +206,8 @@ class _ResourceManager(object): i = util.find_descriptor(cfg, bInterfaceNumber=intf, bAlternateSetting=alt) else: i = util.find_descriptor(cfg, bInterfaceNumber=intf) + if i is None: + raise ValueError('No matching interface (' + str(intf) + ',' + str(alt) + ')') self.managed_claim_interface(device, i) @@ -270,6 +296,14 @@ class USBError(IOError): IOError.__init__(self, errno, strerror) self.backend_error_code = error_code +class USBTimeoutError(USBError): + r"""Exception class for connection timeout errors. + + Backends must raise this exception when a call on a USB connection returns + a timeout error code. + """ + pass + class NoBackendError(ValueError): r"Exception class when a valid backend is not found." pass @@ -1247,7 +1281,7 @@ def find(find_all=False, backend = None, custom_match = None, **args): def device_iter(**kwargs): for dev in backend.enumerate_devices(): d = Device(dev, backend) - tests = (val == getattr(d, key) for key, val in kwargs.items()) + tests = (val == _try_getattr(d, key) for key, val in kwargs.items()) if _interop._all(tests) and (custom_match is None or custom_match(d)): yield d diff --git a/build/device/usb/legacy.py b/build/device/usb/legacy.py old mode 100755 new mode 100644 index ae84ae1b0..67d1d175d --- a/build/device/usb/legacy.py +++ b/build/device/usb/legacy.py @@ -1,17 +1,32 @@ -# Copyright (C) 2009-2017 Wander Lairson Costa -# Copyright (C) 2017-2018 Robert Wlodarczyk +# Copyright 2009-2017 Wander Lairson Costa +# Copyright 2009-2021 PyUSB contributors # -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: # -# http://www.apache.org/licenses/LICENSE-2.0 +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. # -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import usb.core as core import usb.util as util diff --git a/build/device/usb/libloader.py b/build/device/usb/libloader.py old mode 100755 new mode 100644 index 07fa85a9d..b4bea55df --- a/build/device/usb/libloader.py +++ b/build/device/usb/libloader.py @@ -1,19 +1,34 @@ # -*- coding: utf-8 -*- # -# Copyright (C) 2009-2017 Wander Lairson Costa -# Copyright (C) 2017-2018 Robert Wlodarczyk +# Copyright 2009-2017 Wander Lairson Costa +# Copyright 2009-2021 PyUSB contributors # -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: # -# http://www.apache.org/licenses/LICENSE-2.0 +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. # -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import ctypes import ctypes.util diff --git a/build/device/usb/util.py b/build/device/usb/util.py old mode 100755 new mode 100644 index ff9ec81e0..0f3967efb --- a/build/device/usb/util.py +++ b/build/device/usb/util.py @@ -1,17 +1,32 @@ -# Copyright (C) 2009-2017 Wander Lairson Costa -# Copyright (C) 2017-2018 Robert Wlodarczyk +# Copyright 2009-2017 Wander Lairson Costa +# Copyright 2009-2021 PyUSB contributors # -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: # -# http://www.apache.org/licenses/LICENSE-2.0 +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. # -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. r"""usb.util - Utility functions. @@ -286,32 +301,28 @@ def get_string(dev, index, langid = None): The return value is the unicode string present in the descriptor, or None if the requested index was zero. - - It is a ValueError to request a real string (index not zero), if: the - device's langid tuple is empty, or with an explicit langid the device does - not support. """ if 0 == index: return None from usb.control import get_descriptor - langids = dev.langids - if 0 == len(langids): - raise ValueError("The device has no langid") if langid is None: + langids = dev.langids + if 0 == len(langids): + raise ValueError("The device has no langid" + " (permission issue, no string descriptors supported or device error)") langid = langids[0] - elif langid not in langids: - raise ValueError("The device does not support the specified langid") buf = get_descriptor( dev, - 255, # Maximum descriptor size + 254, # maximum even length DESC_TYPE_STRING, index, langid ) + blen = buf[0] & 0xfe # should be even, ignore any trailing byte (see #154) if hexversion >= 0x03020000: - return buf[2:buf[0]].tobytes().decode('utf-16-le') + return buf[2:blen].tobytes().decode('utf-16-le') else: - return buf[2:buf[0]].tostring().decode('utf-16-le') + return buf[2:blen].tostring().decode('utf-16-le')