[Bug 198015] devd(8) overwrites "bus" on ugen event
Ian Lepore
ian at freebsd.org
Tue Feb 24 23:28:35 UTC 2015
On Tue, 2015-02-24 at 21:47 +0000, bugzilla-noreply at freebsd.org wrote:
> https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=198015
>
> Bug ID: 198015
> Summary: devd(8) overwrites "bus" on ugen event
> Product: Base System
> Version: 10.1-RELEASE
> Hardware: Any
> OS: Any
> Status: New
> Severity: Affects Only Me
> Priority: ---
> Component: usb
> Assignee: freebsd-usb at FreeBSD.org
> Reporter: johan at stromnet.se
>
> Problem:
> When trying to match a uftdi device arrival, "bus" variable is overwritten.
> This means I cannot know which /dev/ugenN.N node to work with (which in my case
> is chown to a specific user).
>
> Example: (FreeBSD 10.1, devd in console mode):
>
> Sample devd script:
> attach 10 {
> device-name "uftdi[0-9]+";
> action "chgrp dialer /dev/ugen$bus.$devaddr; chmod 660
> /dev/ugen$bus.$devaddr"
> };
>
> Processing event '+uftdi0 at bus=0 hubaddr=1 port=3 devaddr=2 interface=0
> vendor=0x1781 product=0x0c30 devclass=0x00 devsubclass=0x00 sernum="XXXXXX"
> release=0x0600 mode=host intclass=0xff intsubclass=0xff intprotocol=0xff
> ttyname=U0 ttyports=1 on uhub1'
> Pushing table
> setting device-name=uftdi0
> setting bus=0
> setting hubaddr=1
> setting port=3
> setting devaddr=2
> setting interface=0
> setting vendor=0x1781
> setting product=0x0c30
> setting devclass=0x00
> setting devsubclass=0x00
> setting sernum=A6008W8a
> setting release=0x0600
> setting mode=host
> setting intclass=0xff
> setting intsubclass=0xff
> setting intprotocol=0xff
> setting ttyname=U0
> setting ttyports=1
> setting bus=uhub1
> Processing attach event
> Testing device-name=uftdi0 against ^ed50$, invert=0
> Testing device-name=uftdi0 against ^ubt[0-9]+$, invert=0
> Testing device-name=uftdi0 against ^ukbd0$, invert=0
> Testing vendor=0x1781 against ^0x0854$, invert=0
> Testing vendor=0x1781 against ^0x1645$, invert=0
> Testing device-name=uftdi0 against ^uftdi[0-9]+$, invert=0
> Testing vendor=0x1781 against ^0x0403$, invert=0
> Testing device-name=uftdi0 against ^uftdi[0-9]+$, invert=0
> Testing vendor=0x1781 against ^0x1781$, invert=0
> Testing product=0x0c30 against ^0x0c30$, invert=0
> Executing 'chgrp dialer /dev/ugenuhub1.2; chmod 660 /dev/ugenuhub1.2'
> chgrp: /dev/ugenuhub1.2: No such file or directory
> chmod: /dev/ugenuhub1.2: No such file or directory
> Popping table
>
>
> My suspect:
> https://github.com/freebsd/freebsd/blob/master/sbin/devd/devd.cc#L821
>
>
>
> Is there any other way to reliably get the corresponding ugen device?
>
This is pretty yucky to fix.
My first thought was that the pnpinfo should contain usbus= rather than
bus=, but I checked, and making that change will break our software at
$work (and thus presumably other 3rd party software that directly reads
devd.pipe and relies on the current format of usb pnpinfo too).
Another possibility would be to add usbus= to pnpinfo and also leave
bus= there for compatibility with out-of-tree software.
Yet another possibility would be to add a ugen=n.n to pnpinfo. I
especially like this idea.
-- Ian
More information about the freebsd-usb
mailing list