~ubuntu-branches/ubuntu/saucy/nut/saucy

« back to all changes in this revision

Viewing changes to drivers/libusb.c

  • Committer: Chuck Short
  • Date: 2013-05-13 12:57:25 UTC
  • Revision ID: zulcss@ubuntu.com-20130513125725-llq8wsohyhq9idsy
* Merge from Debian.  Remaining changes:
  - debian/control:
    + remove Build-Depends on libpowerman0-dev
    + remove nut-powerman-pdu
  - debian/nut-powerman-pdu.{install,manpages}: dropped for now
  - debian/{nut-cgi,nut-server}.postinst: add nut to the dialout and nut
    groups unconditonally to handle the upgrade from hardy release.
  - debian/source_nut.py, debian/{nut,nut-server,nut-client}.install,
    debian/rules: Install apport hooks for all top-level nut packages.
  - debian/rules: Use udev version for Ubuntu
  - debian/series, debian/patches/backport-fix-lp753661.patch: re-enabled
* Non-maintainer upload with fixes for wheezy.
* debian/nut-client.preinst: also revert /etc/nut/nut.conf mangling done
  by postinst during upgrade from lenny to squeeze (Really closes: #677054)
  Thanks to Andreas Beckmann for the review.
* Merge from Debian.  Remaining changes:
  - debian/control:
    + remove Build-Depends on libpowerman0-dev
    + remove nut-powerman-pdu
  - debian/nut-powerman-pdu.{install,manpages}: dropped for now
  - debian/{nut-cgi,nut-server}.postinst: add nut to the dialout and nut
    groups unconditonally to handle the upgrade from hardy release.
  - debian/source_nut.py, debian/{nut,nut-server,nut-client}.install,
    debian/rules: Install apport hooks for all top-level nut packages.
  - debian/rules: Use udev version for Ubuntu
  - debian/series, debian/patches/backport-fix-lp753661.patch: re-enabled
* Dropped the following patches, no longer required:
  - debian/patches/CVE-2012-2944.patch (included upstream)
* Non-maintainer upload with fixes for wheezy.
* Only remove /etc/init.d/nut from previous versions of nut in nut-server
  postinst if there are no local changes.
* Also remove /etc/init.d/nut in nut-client postinst. Thanks to 
  Laurent Bigonville for the hint.
* Only fix permissions of configfiles on first install.
* debian/control: Fix typo in package description. Thanks to Julien Cristau
  for spotting this.
* Non-maintainer upload.
* debian/nut-client.preinst: revert /etc/nut/nut.conf mangling done by older
  versions of the postinst (Closes: #677054)
* debian/rules: Stop the nut-client before nut-server on systems using
  static
  boot ordering (Closes: #679451)
* debian/nut-server.postinst: Remove /etc/init.d/nut on upgrade
  (Closes: #677822)
* Rename nut-server.lintian-overrides to nut-client.lintian-overrides and
  adjust overrides now that ups-monitor is shipped in nut-client package
  (Closes: #677947)
* Add debian/patches/0001-fix-upsmon-regression.patch: Fix upsmon/upssched
  regression (Taken from upstream) (Closes: #679513)
* Move nut metapackage to Section: metapackages
* Also create nut user when installing nut-client package and do not delete
  it on purge anymore (Closes: #682000)
* Drop /etc/default/nut → /etc/nut/nut.conf migration code, migration
  happends before squeeze release and this was against policy to have a
  maintainer script modifying a conffile in the first place (Closes: #684392)
* Add dependency against adduser and lsb-base on nut-client package
* Be sure that client is stopped before the server also when using
  dependencies based boot
* Fix package descriptions (Closes: #678068)
* Also install /bin/upssched-cmd in nut-client package as this script is
  referenced in default upssched.conf config file
* debian/watch: Update watch file
* Be sure that all maintainer scripts are returning 0 at their end
* New upstream release (Closes: #671444)
* acknowledges NMU (Closes: #613643)
* debian/nut-client.init: fix action "start" and use of log_*_*msg
  LSB log functions (Closes: #675619)
* debian/nut-server.preinst: remove obsolete file(s) left in
  /etc/udev/rules.d and related processing: udev files are now located
  in /lib/udev/rules, and there is no reason to modify the dedicated
  USB UPS rules (52-nut-usbups.rules) (Closes: #660072)
* debian/nut-server.init: rewrite to match upsd / drivers startup scope
* debian/nut-client.init: created to match upsmon startup scope
  (Closes: #634858)
* debian/nut.TODO.Debian, debian/Makefile.am: updated to reflect the above
* debian/rules: install nut-client.init, and update to reflect the above
* debian/control, debian/Makefile.am: updated to reflect the above
* debian/control:
  - add Breaks on nut-server (<< 2.6.3-1~)
  - bump Standards-Version to 3.9.3
* debian/nut-client.links: renamed from debian/nut-server.links, since
  ups-monitor is now provided by nut-client initscript
* debian/nut.README.Debian: renamed from nut-server.README.Debian,
  to provide it with both client and server packages
* debian/nut-server.install: add missing drivers (clone-outlet,
  liebert-esp2 and microdowell)
* debian/nut-server.manpages: add missing manual pages (apcsmart-old,
  ivtscd, liebert-esp2 and microdowell)
* SECURITY UPDATE: remote denial of service
 - debian/CVE-2012-2944.patch: limit the set of parsed characters to ' '
   through '~'
 - CVE-2012-2944
* Merge from Debian testing.  Remaining changes:
  - debian/control: Drop Build-Depends on libpowerman0-dev (currently in 
    universe)
  - debian/{nut-cgi,nut-server}.postinst: add nut to the dialout and nut 
    groups unconditonally to handle the upgrade from hardy release.
  - debian/nut-powerman-pdu.{install,manpages}: dropped for now.
  - debian/source_nut.py, debian/{nut,nut-server,nut-client}.install, 
    debian/rules: Install apport hooks for all top-level nut packages.
  - debian/rules: Use udev version for Ubuntu.
  - debian/series, debian/patches/backport-fix-lp753661.patch: re-enabled.
* New upstream release (Closes: #635186, #598741, #633756, #638221)
* debian/nut-server.{install,manpages}: add richcomm_usb
* debian/nut-server.install, debian/rules: install Avahi service file
* debian/rules, nut-client.install: install Augeas lenses
* debian/nut-server.README.Debian: clarify udev explanation (Closes: #529664)
* debian/patches/0001-fix_spelling_and_typo.patch,
  debian/patches/0003-libupsclient-version.patch: removed since these are now
  fixed upstream
* debian/patches/series: updated
* Merge from debian unstable.  Remaining changes:
  - debian/control: Drop Build-Depends on libpowerman0-dev (currently in 
    universe)
  - debian/{nut-cgi,nut-server}.postinst: add nut to the dialout and nut 
    groups unconditonally to handle the upgrade from hardy release.
  - debian/nut-powerman-pdu.{install,manpages}: dropped for now.
  - debian/source_nut.py, debian/{nut,nut-server,nut-client}.install, 
    debian/rules: Install apport hooks for all top-level nut packages.
  - debian/rules: Use udev version for Ubuntu.
  - debian/series, debian/patches/backport-fix-lp753661.patch: re-enabled.
* New upstream release (Closes: #594989)
* debian/control:
  - remove legacy Build-Depends for nut-hal-drivers on libdbus and libglib
  - Build-Depends-Indep on docbook-xsl for offline document
    generation (Closes: #635347)
* debian/nut-server.install: add apcsmart-old
* debian/nut-server.init:
  - add udev as Required-Start/Stop (Closes: #642412)
  - remove legacy support for /etc/default/nut (Closes: #638021)
* debian/patches/0003-libupsclient-version.patch: added to fix the missing
  libupsclient version info bump
* debian/libupsclient1-dev.links: update link name
* debian/libupsclient1.symbols: add with upscli_tryconnect
* debian/nut.TODO.Debian: update and complete the TODO list
* Fix FTBFS for Ubuntu (LP: #815760):
  - debian/control: Build-Depends-Indep on docbook-xsl for offline 
    document generation.
* Merge from Debian unstable (LP: #811976). Remaining changes:
  - debian/control: Drop Build-Depends on libpowerman0-dev (currently in 
    universe)
  - debian/{nut-cgi,nut-server}.postinst: add nut to the dialout and nut 
    groups unconditonally to handle the upgrade from hardy release.
  - debian/nut-powerman-pdu.{install,manpages}: dropped for now.
  - debian/source_nut.py, debian/{nut,nut-server,nut-client}.install, 
    debian/rules: Install apport hooks for all top-level nut packages.
  - debian/rules: Use udev version for Ubuntu.
  - debian/series, debian/patches/backport-fix-lp753661.patch: re-enabled.
* debian/nut.README.Debian: Adjust udev rules naming for permissions override
  (Closes: #529664)
* Re-add and refresh debian/patches/0001-fix_spelling_and_typo.patch:
  Some typos and spelling errors remain.
* Split nut package into nut-client and nut-server, keep nut package as
  metapackage
* Generate PDF and html doc and install it in nut-doc package
* debian/rules:
  - List non-installed files
  - Includes python-module.mk
  - Add flags to build documentation and install it
* debian/control:
  - Add python-nut package and add python build-dependency
  - Set nut-powerman-pdu priority to extras
  - Add nut-monitor package
  - Add nut-doc package and add required C/R/P
  - Add libups-nut-perl package
* debian/nut-server.prerm: Remove /var/run/nut during removal
* Merge from debian unstable.  Remaining changes:
  - debian/control:
    + Drop Build-Depends on libpowerman0-dev (currently in universe)
  - debian/{nut-cgi,nut}.postinst: add nut to the dialout and nut groups
    unconditonally to handle the upgrade from hardy release.
  - debian/nut-powerman-pdu.{install,manpages}: dropped for now.
  - debian/source_nut.py, debian/nut.install, debian/rules: Install apport hook.
  - debian/rules: Use udev version for Ubuntu.
* debian/patches/backport-fix-lp753661.patch: Refreshed.
* Drop changes due to .pc being not clean.
* New upstream release (Closes: #595953, #614842, #595773)
* debian/patches/*.patch: removed since these are now fixed upstream
* Drop HAL package and build-dependencies (Closes: #613197)
* debian/control:
  - Bump Standards-Version to 3.9.2 (no further changes)
  - Drop autotools build-dependencies (not needed anymore)
  - Drop non-existing build-dependencies
* debian/rules:
  - Correctly pass flags to configure
* Merge from debian unstable (LP: #789323).  Remaining changes:
  + debian/control:
    - Update maintainer as per spec.
    - Add Breaks on nut-hal-drivers to ensure we have correct udev version.
    - Drop libpowerman0-dev from the Build-Depends (currently in universe)
  + debian/{nut-cgi,nut}.postinst: add nut to the dialout and nut groups
    unconditonally to handle the upgrade from hardy release.
  + debian/nut-powerman-pdu.install, debian/nut-powerman-pdu.manpages: dropped for now.
  + debian/nul-hal-drivers.{docs,install,postinst,preinst}: Dropped since hal is in universe now
  + debian/nut.links: must create the init script link, used if the upse needs to be powered down
    (LP: #357583)
  + debian/source_nut.py, debian/nut.install, debian/rules: Install apport hook.
  + debian/patches/backport-fix-lp753661.patch
  + Dropped:
    - debian/patches/fix_pc_file.patch: replaced by debian's 0002-fix_libupsclient_pc.patch
* debian/patches/fix_pc_file.patch: add DEP3 patch header
* debian/patches/debian-changes-2.6.0-1: remove that accidental file
* debian/nut-snmp.docs: Distribute snmp.txt doc file (Closes: #548295)
* d/p/0001-fix_spelling_and_typo.patch: Update and refresh
* debian/nut.lintian-overrides: Fix typo
* debian/patch/0002-fix_libupsclient_pc.patch: Fix libupsclient.pc (Closes:
  #624255)
* debian/rules:
  - Switch to cdbs
  - Remove not existing configure options (Closes: #611813)
  - Drop Phony rules (Closes: #613699)
* debian/control:
  - Add cdbs build-dependency
* debian/patches/backport-fix-lp753661.patch: Backport fix 
  to trim extraneous end-of-line, in buggy HID string tables, 
  which results in upsc breaking the communication pipe.
  (LP: #753661)
* fix_pc_file.patch: fix .pc source files by using LIBSSL_LIBS instead of
  LIBSSL_LDFLAGS to avoid a FTBFS in packages that uses libupsclient.pc
  (LP: #743484)
* Merge from Debian unstable, remaining changes:
  + debian/control:
    - Update maintainer as per spec.
    - Add Breaks on nut-hal-drivers to ensure we have correct udev version.
    - Drop libpowerman0-dev from the Build-Depends (currently in universe)
  + debian/{nut-cgi,nut}.postinst: add nut to the dialout and nut groups
    unconditonally to hanle the upgrade from hardy release.
  + debian/nut-powerman-pdu.install, debian/nut-powerman-pdu.manpages: dropped for now.
  + debian/nul-hal-drivers.{docs,install,postinst,preinst}: Dropped since hal is in universe now
  + debian/nut.links: must create the init script link, used if the upse needs to be powered down
    (LP: #357583)
  + debian/source_nut.py, debian/nut.install, debian/rules: Install apport hook.
  + Dropped:
    - debian/patches/0002-fix_udev_action.patch: Accepted upstream.
    - debian/patches/0004-netvision-improvements-lp-600950: no longer needed.
    - debian/patches/0005-fix-nut-m4.patch: no longer needed.
    - debian/patches/9999-autoconf.patch: no longer needed.
* New upstream release (Closes: #575176, #588648, #609597, #687985)
* debian/patches/*.patch: removed since these are now fixed upstream
* debian/patches/0001-fix_spelling_and_typo.patch,
  debian/patches/series: reworked to match the new upstream release
* debian/nut.install, debian/nut.manpages: remove obsolete reference to
  megatec and megatec_usb, now respectively replaced by blazer_ser and
  blazer_usb
* debian/nut.docs: limit distributed documentation
* debian/control:
  - Wrap build-dependencies
  - Change nut-cgi Recommends to apache2 | httpd-cgi
* debian/nut.postinst: Only trigger USB subsystem, should Closes: #574769
* debian/patches/0002-fix_udev_action.patch: Use SUBSYSTEM instead of BUS
* debian/control, debian/rules, 
  debian/nut-hal-drivers.{docs,install,postinst,preinst}: Drop
  nut-hal-drivers since Nut doesnt go into universe.
* Split patches/debian-changes-2.4.3-2ubuntu1 into
  patches/0005-fix-nut-m4.patch and patches/9999-autoconf.patch
* Readd lost debian/patches0004-netvision-improvements-lp-600950.patch patch
  (LP: #707050)
* debian/patches/0002-fix_udev_action.patch:
  Change BUS to SUBSYSTEMS, since the former is deprecated. (LP: #692171)
* debian/nut.postinst: Uncomment missing call to adduser
* debian/control: Drop hal build dependency, we don't need the daemon to
  build the package. Add a hal dependency to nut-hal-drivers, which is the
  only thing that actually needs it.
* Merge from debian unstable.  Remaining changes:
  + debian/control:
    - Update maintainer as per spec.
    - Add Breaks on nut-hal-drivers to ensure we have correct udev version.
    - Drop libpowerman0-dev from the Build-Depends (currently in universe)
  + debian/{nut-cgi,nut}.postinst: add nut to the dialout and nut groups
    unconditonally to hanle the upgrade from hardy release.
  + debian/nut-powerman-pdu.install, debian/nut-powerman-pdu.manpages: dropped for now.
  + debian/nut.links: must create the init script link, used if the upse needs to be powered down
    (LP: #357583)
  + debian/nut.postinst: Update udevadm trigger.
    "libusb_get_report: error sending control message: 
     Operation not permitted" error on some UPS devices. (LP: #572262)
  + debian/source_nut.py, debian/nut.install, debian/rules: Install apport hook.
  + debian/patches/netvision-improvements-lp-600950.patch: Add improvements
    for netvision UPSes
  + Fix FTBFS with ld --as-needed.
  + Dropped:
    - debian/patches/03_udev_rules_change.dpatch: Use debian's instead.
    - debian/patches/04_nut_small-buffers.dpatch: Use debian's instead.
* debian/control:
  - Bump Standards-Version to 3.9.1
  - Update Vcs-* fields to new GIT repository
  - Add myself as Uploaders
* Switch to dpkg-source 3.0 (quilt) format (Closes: #573601)
* debian/patches/0001-low_speed_usb_ups.patch: Use patch system for changes
  that were applied directly in the source
* Add debian/gbp.conf file
* debian/watch: Bump version to 3
* Add debian/patches/0002-fix_udev_action.patch: Also set permission for
  "change" udev ACTION (Closes: #557178)
* debian/nut.postrm: Do not try to remove nut user is deluser is not
  installed anymore
* debian/nut.manpages: Install manpage nut.conf.5 (Closes: #528222)
* debian/copyright: Fix copyright-with-old-dh-make-debian-copyright
* Remove nut-snmp.lintian-overrides, not needed anymore
* debian/patches/0003-fix_spelling_and_typo.patch: Fix some spelling errors
* Add debian/libupsclient1.symbols file
* Add debian/nut.links: Re-add /etc/init.d/ups-monitor that was lost for
  some reasons (Closes: #592351)
* debian/nut.lintian-overrides: Add override for
  init.d-script-does-not-provide-itself /etc/init.d/ups-monitor
* Drop libupsclient1.post{inst,rm}: ldconfig call is added automatically by
  debhelper
* debian/libupsclient1-dev.install: Do not ship /lib/libupsclient.la anymore
* debian/rules: Remove dpatch logic as we are using package source version
  '3.0 (quilt)'
* debian/compat: Bump debhelper compatibility to 8
* Non-maintainer upload.
* drivers/libhid.c: Apply r2407 from upstream to fix bug with some
  low speed UPS devices. (Closes: #583371)
* Fix FTBFS with ld --as-needed.
* debian/patches/netvision-improvements-lp-600950.patch: Add improvements for netvision UPSes 
  (LP: #600950) 
* debian/source_nut.py, debian/nut.install, debian/rules: Install apport hook. 
* debian/patches/04_nut-small-buffers.dpatch: Fix "libusb_get_report: error sending control message: 
  Operation not permitted" error on some UPS devices. (LP: #572262)
* debian/nut.postinst: Revert dropping of --action=change. "add" events must
  not ever be triggered automatically.
* Add 03_udev_rules_change.dpatch: Run udev rules on change events, too.
* debian/control: grr...fix ftbfs. 
* Merge from debian testing.  Remaining changes (LP: #535152):
  + debian/control:
    - Update maintainer as per spec.
    - Add Breaks on nut-hal-drivers to ensure we have correct udev version.
    - Drop libpowerman0-dev from the Build-Depends (currently in universe)
  + debian/{nut-cgi,nut}.postinst: add nut to the dialout and nut groups
    unconditonally to hanle the upgrade from hardy release.
  + debian/nut-powerman-pdu.install, debian/nut-powerman-pdu.manpages: dropped for now.
  + debian/nut.links: must create the init script link, used if the upse needs to be powered down
    (LP: #357583)
  + debian/nut.postinst: Update udevadm trigger.
  + Dropped:
    - debian/patches/02-fix-trust-pw4130m.dpatch: No longer needed.
* New upstream release (Closes: #544390, #528222, #539747, #526811,
  #562064)
* debian/nut.install, debian/nut.manpages:
  - remove cyberpower driver and manpage
  - add bestfortress, clone and ivtscd drivers and manpages
* debian/rules:
  - change udev dir to /lib/udev (Closes: #522327)
  - replace deprecated calls to 'dh_clean -k' by dh_prep (Closes: #536599)
* debian/rules, debian/nut.install, debian/nut.install,
  debian/nut.README.Debian: install configuration files, without the
  sample suffix (Closes: #528641)
* debian/nut.links: restored (Closes: #522506)
* debian/nut.init:
  - source nut.conf instead of default/nut for POWEROFF_WAIT(Closes:
    #538173)
  - fix status checking (Closes: #538785)
  - improve detection of non configured system and beautify related
    output (Closes: #563112)
  - use 'invoke-rc.d' instead of calling the reboot script directly
  - add $remote_fs to Required-Start and Required-Stop
* debian/nut.postrm: remove udev files and simplify cleanup (Closes:
  #541629)
* debian/control:
  - remove Luca Filipozzi from the Uploaders list (Closes: #568987)
  - update Standards-Version to 3.8.4
  - remove the debconf dependency
  - bump debhelper version to (>= 7) in Build-Depends, for dh_prep
  - add Breaks on nut-hal-drivers to ensure we have correct udev version
* Remove debconf support since it was related to really old nut
  version (Closes: #518056):
  - remove nut-cgi.config, nut.config, nut-cgi.templates, nut.templates,
    and po/ directory
  - update nut-cgi.postinst
* debian/nut.dirs: remove /var/run/nut to conform to Debian Policy
* debian/nut.postint:
  - create /var/run/nut if needed
  - improve security checks
* debian/nut.README.Debian: add a security note for ups.conf
* debian/watch: URL update
* debian/patches/02-fix-trust-pw4130m.dpatch: Fix issues with Trust
  PW-4130M UPS. (LP: #447586) 

Show diffs side-by-side

added added

removed removed

Lines of Context:
28
28
 *
29
29
 * -------------------------------------------------------------------------- */
30
30
 
31
 
#include "config.h" /* for LIBUSB_HAS_DETACH_KRNL_DRV flag */
 
31
#include "config.h" /* for HAVE_USB_DETACH_KERNEL_DRIVER_NP flag */
32
32
#include "common.h" /* for xmalloc, upsdebugx prototypes */
33
33
#include "usb-common.h"
34
34
#include "libusb.h"
87
87
static int libusb_open(usb_dev_handle **udevp, USBDevice_t *curDevice, USBDeviceMatcher_t *matcher,
88
88
        int (*callback)(usb_dev_handle *udev, USBDevice_t *hd, unsigned char *rdbuf, int rdlen))
89
89
{
90
 
#if LIBUSB_HAS_DETACH_KRNL_DRV
 
90
#ifdef HAVE_USB_DETACH_KERNEL_DRIVER_NP
91
91
        int retries;
92
92
#endif
93
93
        int rdlen1, rdlen2; /* report descriptor length, method 1+2 */
96
96
        struct usb_bus *bus;
97
97
        usb_dev_handle *udev;
98
98
        struct usb_interface_descriptor *iface;
99
 
        
100
 
        int ret, res; 
 
99
 
 
100
        int ret, res;
101
101
        unsigned char buf[20];
102
102
        unsigned char *p;
103
103
        char string[256];
121
121
                for (dev = bus->devices; dev; dev = dev->next) {
122
122
                        upsdebugx(2, "Checking device (%04X/%04X) (%s/%s)", dev->descriptor.idVendor,
123
123
                                dev->descriptor.idProduct, bus->dirname, dev->filename);
124
 
                        
 
124
 
125
125
                        /* supported vendors are now checked by the
126
126
                           supplied matcher */
127
127
 
147
147
                        curDevice->VendorID = dev->descriptor.idVendor;
148
148
                        curDevice->ProductID = dev->descriptor.idProduct;
149
149
                        curDevice->Bus = strdup(bus->dirname);
150
 
                        
 
150
 
151
151
                        if (dev->descriptor.iManufacturer) {
152
152
                                ret = usb_get_string_simple(udev, dev->descriptor.iManufacturer,
153
153
                                        string, sizeof(string));
194
194
                                }
195
195
                        }
196
196
                        upsdebugx(2, "Device matches");
197
 
                        
 
197
 
198
198
                        /* Now we have matched the device we wanted. Claim it. */
199
199
 
200
 
#if LIBUSB_HAS_DETACH_KRNL_DRV
 
200
#ifdef HAVE_USB_DETACH_KERNEL_DRIVER_NP
201
201
                        /* this method requires at least libusb 0.1.8:
202
202
                         * it force device claiming by unbinding
203
203
                         * attached driver... From libhid */
204
204
                        retries = 3;
205
205
                        while (usb_claim_interface(udev, 0) < 0) {
206
 
                                
 
206
 
207
207
                                upsdebugx(2, "failed to claim USB device: %s", usb_strerror());
208
 
                                
 
208
 
209
209
                                if (usb_detach_kernel_driver_np(udev, 0) < 0) {
210
210
                                        upsdebugx(2, "failed to detach kernel driver from USB device: %s", usb_strerror());
211
211
                                } else {
223
223
                                fatalx(EXIT_FAILURE, "Can't claim USB device [%04x:%04x]: %s", curDevice->VendorID, curDevice->ProductID, usb_strerror());
224
224
                        }
225
225
#endif
226
 
                        
 
226
 
227
227
                        /* set default interface */
228
228
                        usb_set_altinterface(udev, 0);
229
 
                        
 
229
 
230
230
                        if (!callback) {
231
231
                                return 1;
232
232
                        }
235
235
                                upsdebugx(2, "  Couldn't retrieve descriptors");
236
236
                                goto next_device;
237
237
                        }
238
 
                        
 
238
 
239
239
                        rdlen1 = -1;
240
240
                        rdlen2 = -1;
241
241
 
245
245
                        /* res = usb_get_descriptor(udev, USB_DT_HID, 0, buf, 0x9); */
246
246
                        res = usb_control_msg(udev, USB_ENDPOINT_IN+1, USB_REQ_GET_DESCRIPTOR,
247
247
                                              (USB_DT_HID << 8) + 0, 0, buf, 0x9, USB_TIMEOUT);
248
 
                        
 
248
 
249
249
                        if (res < 0) {
250
250
                                upsdebugx(2, "Unable to get HID descriptor (%s)", usb_strerror());
251
251
                        } else if (res < 9) {
255
255
                                upsdebug_hex(3, "HID descriptor, method 1", buf, 9);
256
256
 
257
257
                                rdlen1 = buf[7] | (buf[8] << 8);
258
 
                        }                       
 
258
                        }
259
259
 
260
260
                        if (rdlen1 < -1) {
261
261
                                upsdebugx(2, "Warning: HID descriptor, method 1 failed");
267
267
 
268
268
                        /* Note: on some broken UPS's (e.g. Tripp Lite Smart1000LCD),
269
269
                                only this second method gives the correct result */
270
 
                        
 
270
 
271
271
                        /* for now, we always assume configuration 0, interface 0,
272
272
                           altsetting 0, as above. */
273
273
                        iface = &dev->config[0].interface[0].altsetting[0];
297
297
                                goto next_device;
298
298
                        }
299
299
                        if (rdlen1 >= 0 && rdlen2 >= 0 && rdlen1 != rdlen2) {
300
 
                                upsdebugx(2, "Warning: two different HID descriptors retrieved (Reportlen = %u vs. %u)", rdlen1, rdlen2);
 
300
                                upsdebugx(2, "Warning: two different HID descriptors retrieved (Reportlen = %d vs. %d)", rdlen1, rdlen2);
301
301
                        }
302
302
 
303
303
                        upsdebugx(2, "HID descriptor length %d", rdlen);
304
304
 
305
305
                        if (rdlen > (int)sizeof(rdbuf)) {
306
 
                                upsdebugx(2, "HID descriptor too long %d (max %d)", rdlen, sizeof(rdbuf));
 
306
                                upsdebugx(2, "HID descriptor too long %d (max %d)", rdlen, (int)sizeof(rdbuf));
307
307
                                goto next_device;
308
308
                        }
309
309
 
329
329
                                goto next_device;
330
330
                        }
331
331
 
332
 
                        upsdebugx(2, "Report descriptor retrieved (Reportlen = %u)", rdlen);
 
332
                        upsdebugx(2, "Report descriptor retrieved (Reportlen = %d)", rdlen);
333
333
                        upsdebugx(2, "Found HID device");
334
334
                        fflush(stdout);
335
335
 
347
347
        return -1;
348
348
}
349
349
 
350
 
/* return the report of ID=type in report 
 
350
/*
 
351
 * Error handler for usb_get/set_* functions. Return value > 0 success,
 
352
 * 0 unknown or temporary failure (ignored), < 0 permanent failure (reconnect)
 
353
 */
 
354
static int libusb_strerror(const int ret, const char *desc)
 
355
{
 
356
        if (ret > 0) {
 
357
                return ret;
 
358
        }
 
359
 
 
360
        switch(ret)
 
361
        {
 
362
        case -EBUSY:    /* Device or resource busy */
 
363
        case -EPERM:    /* Operation not permitted */
 
364
        case -ENODEV:   /* No such device */
 
365
        case -EACCES:   /* Permission denied */
 
366
        case -EIO:      /* I/O error */
 
367
        case -ENXIO:    /* No such device or address */
 
368
        case -ENOENT:   /* No such file or directory */
 
369
        case -EPIPE:    /* Broken pipe */
 
370
        case -ENOSYS:   /* Function not implemented */
 
371
                upslogx(LOG_DEBUG, "%s: %s", desc, usb_strerror());
 
372
                return ret;
 
373
 
 
374
        case -ETIMEDOUT:        /* Connection timed out */
 
375
                upsdebugx(2, "%s: Connection timed out", desc);
 
376
                return 0;
 
377
 
 
378
        case -EOVERFLOW:        /* Value too large for defined data type */
 
379
        case -EPROTO:   /* Protocol error */
 
380
                upsdebugx(2, "%s: %s", desc, usb_strerror());
 
381
                return 0;
 
382
 
 
383
        default:        /* Undetermined, log only */
 
384
                upslogx(LOG_DEBUG, "%s: %s", desc, usb_strerror());
 
385
                return 0;
 
386
        }
 
387
}
 
388
 
 
389
/* return the report of ID=type in report
351
390
 * return -1 on failure, report length on success
352
391
 */
353
392
 
354
393
static int libusb_get_report(usb_dev_handle *udev, int ReportId, unsigned char *raw_buf, int ReportSize )
355
394
{
 
395
        int     ret;
 
396
 
356
397
        upsdebugx(4, "Entering libusb_get_report");
357
398
 
358
399
        if (!udev) {
359
400
                return 0;
360
401
        }
361
402
 
362
 
        return usb_control_msg(udev,
363
 
                 USB_ENDPOINT_IN + USB_TYPE_CLASS + USB_RECIP_INTERFACE,
364
 
                 0x01, /* HID_REPORT_GET */
365
 
                 ReportId+(0x03<<8), /* HID_REPORT_TYPE_FEATURE */
366
 
                 0, raw_buf, ReportSize, USB_TIMEOUT);
 
403
        ret = usb_control_msg(udev,
 
404
                USB_ENDPOINT_IN + USB_TYPE_CLASS + USB_RECIP_INTERFACE,
 
405
                0x01, /* HID_REPORT_GET */
 
406
                ReportId+(0x03<<8), /* HID_REPORT_TYPE_FEATURE */
 
407
                0, raw_buf, ReportSize, USB_TIMEOUT);
 
408
 
 
409
        /* Ignore "protocol stall" (for unsupported request) on control endpoint */
 
410
        if (ret == -EPIPE) {
 
411
                return 0;
 
412
        }
 
413
 
 
414
        return libusb_strerror(ret, __func__);
367
415
}
368
416
 
369
 
 
370
417
static int libusb_set_report(usb_dev_handle *udev, int ReportId, unsigned char *raw_buf, int ReportSize )
371
418
{
 
419
        int     ret;
 
420
 
372
421
        if (!udev) {
373
422
                return 0;
374
423
        }
375
424
 
376
 
        return usb_control_msg(udev,
377
 
                 USB_ENDPOINT_OUT + USB_TYPE_CLASS + USB_RECIP_INTERFACE,
378
 
                 0x09, /* HID_REPORT_SET = 0x09*/
379
 
                 ReportId+(0x03<<8), /* HID_REPORT_TYPE_FEATURE */
380
 
                 0, raw_buf, ReportSize, USB_TIMEOUT);
 
425
        ret = usb_control_msg(udev,
 
426
                USB_ENDPOINT_OUT + USB_TYPE_CLASS + USB_RECIP_INTERFACE,
 
427
                0x09, /* HID_REPORT_SET = 0x09*/
 
428
                ReportId+(0x03<<8), /* HID_REPORT_TYPE_FEATURE */
 
429
                0, raw_buf, ReportSize, USB_TIMEOUT);
 
430
 
 
431
        /* Ignore "protocol stall" (for unsupported request) on control endpoint */
 
432
        if (ret == -EPIPE) {
 
433
                return 0;
 
434
        }
 
435
 
 
436
        return libusb_strerror(ret, __func__);
381
437
}
382
438
 
383
439
static int libusb_get_string(usb_dev_handle *udev, int StringIdx, char *buf, size_t buflen)
389
445
        }
390
446
 
391
447
        ret = usb_get_string_simple(udev, StringIdx, buf, buflen);
392
 
        if (ret > 0) {
393
 
                upsdebugx(5, "-> String: %s (len = %i/%i)", buf, ret, buflen);
394
 
        } else {
395
 
                upsdebugx(2, "- Unable to fetch string %d", StringIdx);
396
 
        }
397
448
 
398
 
        return ret;
 
449
        return libusb_strerror(ret, __func__);
399
450
}
400
451
 
401
452
static int libusb_get_interrupt(usb_dev_handle *udev, unsigned char *buf, int bufsize, int timeout)
405
456
        if (!udev) {
406
457
                return -1;
407
458
        }
408
 
#ifdef SUN_LIBUSB
409
 
/*
410
 
        usleep(timeout * 1000);
411
 
 */
412
 
        return 0;
413
 
#else
 
459
 
414
460
        /* FIXME: hardcoded interrupt EP => need to get EP descr for IF descr */
415
461
        ret = usb_interrupt_read(udev, 0x81, (char *)buf, bufsize, timeout);
416
 
        if (ret > 0) {
417
 
                upsdebugx(6, " ok");
418
 
        } else {
419
 
                upsdebugx(6, " none (%i)", ret);
 
462
 
 
463
        /* Clear stall condition */
 
464
        if (ret == -EPIPE) {
 
465
                ret = usb_clear_halt(udev, 0x81);
420
466
        }
421
 
        return ret;
422
 
#endif
 
467
 
 
468
        return libusb_strerror(ret, __func__);
423
469
}
424
470
 
425
471
static void libusb_close(usb_dev_handle *udev)