apcupsd port regression from 7x. to 8.x

Hans Petter Selasky hselasky at c2i.net
Thu May 6 20:43:20 UTC 2010


On Thursday 06 May 2010 21:49:46 Mike Tancsa wrote:
> While apcupsd works fine with one ups hooked up, apcupsd is not able
> to find multiple ones like it did on RELENG_7.  Looking at the way
> the code is compiled, it uses the generic libusd driver to talk to
> and find the UPSes on RELENG_8. Not sure if this is a bug with
> apcupsd or how it works with RELENG_8.
> 
> Running the daemon in debug mode, it loops through the following
> code, but always finds the same UPS and never 'moves on' to the next
> UPS like it did in RELENG_7. Has anyone got multiple UPSes working
> with apcupsd on RELENG_8 ?
> 
> 
>     /* Initialize libusb */
>     Dmsg0(200, "Initializing libusb\n");
>     usb_init();
> 
>     /* Enumerate usb busses and devices */
>     i = usb_find_busses();
>     Dmsg1(200, "Found %d USB busses\n", i);
>     i = usb_find_devices();
>     Dmsg1(200, "Found %d USB devices\n", i);
> 
>     /* Iterate over all devices, checking for idVendor=APC */
>     bus = usb_get_busses();
>     while (bus)
>     {
>        dev = bus->devices;
>        while (dev)
>        {
>           Dmsg4(200, "MDT bus loop %s:%s - %04x:%04x\n",
>              bus->dirname, dev->filename,
>              dev->descriptor.idVendor, dev->descriptor.idProduct);
> 
>           if (dev->descriptor.idVendor == VENDOR_APC) {
>              Dmsg2(200, "Trying device %s:%s\n", bus->dirname,
>  dev->filename); if (init_device(ups, dev)) {
>                 /* Successfully found and initialized an UPS */
>                 astrncpy(ups->device, bus->dirname, sizeof(ups->device));
>                 astrncat(ups->device, ":", sizeof(ups->device));
>                 astrncat(ups->device, dev->filename, sizeof(ups->device));
>                 return 1;
>              }
>           }
> 
>           dev = dev->next;
>        }
> 
>        bus = bus->next;
>     }
> 
>     /* Failed to find an UPS */
>     ups->device[0] = 0;
>     return 0;
> }
> 
> Where as the following are attached.  It only is ever able to talk to
> the ups on ugen1.2
> 
> 0[upsmon1]#  usbconfig
> ugen0.1: <UHCI root HUB VIA> at usbus0, cfg=0 md=HOST spd=FULL (12Mbps)
>  pwr=ON ugen1.1: <UHCI root HUB VIA> at usbus1, cfg=0 md=HOST spd=FULL
>  (12Mbps) pwr=ON ugen2.1: <UHCI root HUB VIA> at usbus2, cfg=0 md=HOST
>  spd=FULL (12Mbps) pwr=ON ugen3.1: <UHCI root HUB VIA> at usbus3, cfg=0
>  md=HOST spd=FULL (12Mbps) pwr=ON ugen4.1: <EHCI root HUB VIA> at usbus4,
>  cfg=0 md=HOST spd=HIGH (480Mbps) pwr=ON ugen0.2: <Back-UPS ES 725
>  FW:802.n2.D USB FW:n2 APC> at usbus0, cfg=0 md=HOST spd=LOW (1.5Mbps)
>  pwr=ON
> ugen4.2: <USB2.0 Hub vendor 0x05e3> at usbus4, cfg=0 md=HOST spd=HIGH
> (480Mbps) pwr=SAVE
> ugen4.3: <Back-UPS ES 500 FW:801.e5.D USB FW:e5 APC> at usbus4, cfg=0
> md=HOST spd=LOW (1.5Mbps) pwr=ON
> ugen0.3: <Back-UPS RS 1500 FW:8.g7 .D USB FW:g7 American Power
> Conversion> at usbus0, cfg=0 md=HOST spd=LOW (1.5Mbps) pwr=ON
> ugen4.4: <Back-UPS ES 650 FW:825.B1.D USB FW:B1 APC> at usbus4, cfg=0
> md=HOST spd=LOW (1.5Mbps) pwr=ON
> ugen4.5: <Back-UPS RS 1500 FW:8.g8 .D USB FW:g8 American Power
> Conversion> at usbus4, cfg=0 md=HOST spd=LOW (1.5Mbps) pwr=ON
> ugen4.6: <Back-UPS ES 500 FW:824.B1.D USB FW:B1 APC> at usbus4, cfg=0
> md=HOST spd=LOW (1.5Mbps) pwr=ON
> ugen1.2: <Back-UPS ES 500 FW:824.B1.D USB FW:B1 APC> at usbus1, cfg=0
> md=HOST spd=LOW (1.5Mbps) pwr=ON
> 0[upsmon1]#
> 
> 
> 0.000 apcupsd: apcupsd.c:219 Options parsed.
> 0.001 apcupsd: apcconfig.c:803 After config scriptdir:
> "/usr/local/etc/apcupsd.a"
> 0.001 apcupsd: apcconfig.c:804 After config pwrfailpath: "/var/run/a"
> 0.001 apcupsd: apcconfig.c:805 After config nologinpath: "/var/run"
> 0.001 apcupsd: apcupsd.c:242 Config file
> /usr/local/etc/apcupsd.a/apcupsd.conf processed.
> 0.001 apcupsd: :newups.c:102 write_lock at drivers.c:181
> 0.001 apcupsd: drivers.c:183 Looking for driver: usb
> 0.001 apcupsd: drivers.c:187 Driver dumb is configured.
> 0.001 apcupsd: drivers.c:187 Driver apcsmart is configured.
> 0.001 apcupsd: drivers.c:187 Driver net is configured.
> 0.001 apcupsd: drivers.c:187 Driver usb is configured.
> 0.001 apcupsd: drivers.c:190 Driver usb found and attached.
> 0.001 apcupsd: newups.c:108 write_unlock at drivers.c:207
> 0.001 apcupsd: drivers.c:209 Driver ptr=0x805c8e4
> 0.001 apcupsd: apcupsd.c:261 Attached to driver: usb
> 0.003 apcupsd: newups.c:102 write_lock at generic-usb.c:614
> 0.003 apcupsd: generic-usb.c:398 Initializing libusb

The FreeBSD LibUSB v0.1 reports the wrong number of busses and devices. I can 
fix this.

> 0.003 apcupsd: generic-usb.c:403 Found 0 USB busses
> 0.007 apcupsd: generic-usb.c:405 Found 0 USB devices

The problem is that the UPS code is designed to attach to the first matching 
device only. LibUSB does not hide devices with drivers already attached, which 
I think your utility assumes. You should use:

pidfile, see man pidfile

To create a temporary file with some string which consists of all numbers in 
udev->filename, separated by ".". Or USB LibUSB v.1.0!

I've made a small patch, but it won't fix your issue :-(

http://p4web.freebsd.org/@@177865?ac=10

--HPS


More information about the freebsd-usb mailing list