From: Greg KH <greg@kroah.com>
To: linux-hotplug@vger.kernel.org
Subject: Re: how to determine physical bus of a device and find it there
Date: Thu, 22 Jan 2004 22:58:35 +0000 [thread overview]
Message-ID: <20040122225835.GA15928@kroah.com> (raw)
In-Reply-To: <20040120025230.GA26199@vrfy.org>
On Thu, Jan 22, 2004 at 02:40:46PM -0800, Greg KH wrote:
>
> So what udev needs to do is look at each device along that "stack" in
> order to get a match. If a user specifies a idProduct sysfs file that
> is on the usb device at
> /sys/devices/pci0000:00/0000:00:1d.0/usb1/1-1/1-1:1.0 we should be able
> to match that up with this scsi block device, if so asked.
>
> It would also "solve" the problem where someone wanted to specify the
> idProduct and idVendor for a usb printer, but udev couldn't find it.
And here's a horrible abuse of gotos that adds this support to udev.
I'll go clean it up in a bit, but I'm actually amazed that this wasn't
that hard...
thanks,
greg k-h
--- 1.95/namedev.c Wed Jan 21 16:54:51 2004
+++ edited/namedev.c Thu Jan 22 14:53:41 2004
@@ -588,6 +588,7 @@
int namedev_name_device(struct sysfs_class_device *class_dev, struct udevice *udev)
{
struct sysfs_device *sysfs_device = NULL;
+ struct sysfs_device *s_device = NULL;
struct config_device *dev;
struct perm_device *perm;
char *pos;
@@ -619,16 +620,18 @@
list_for_each_entry(dev, &config_device_list, node) {
dbg("process rule");
+ s_device = sysfs_device;
+loop:
/* check for matching bus value */
if (dev->bus[0] != '\0') {
- if (sysfs_device = NULL) {
+ if (s_device = NULL) {
dbg("device has no bus");
- continue;
+ goto no_good;
}
- dbg("check for " FIELD_BUS " dev->bus='%s' sysfs_device->bus='%s'", dev->bus, sysfs_device->bus);
- if (strcmp_pattern(dev->bus, sysfs_device->bus) != 0) {
+ dbg("check for " FIELD_BUS " dev->bus='%s' s_device->bus='%s'", dev->bus, s_device->bus);
+ if (strcmp_pattern(dev->bus, s_device->bus) != 0) {
dbg(FIELD_BUS " is not matching");
- continue;
+ goto no_good;
} else {
dbg(FIELD_BUS " matches");
}
@@ -639,7 +642,7 @@
dbg("check for " FIELD_KERNEL " dev->kernel='%s' class_dev->name='%s'", dev->kernel, class_dev->name);
if (strcmp_pattern(dev->kernel, class_dev->name) != 0) {
dbg(FIELD_KERNEL " is not matching");
- continue;
+ goto no_good;
} else {
dbg(FIELD_KERNEL " matches");
}
@@ -648,9 +651,9 @@
/* check for matching bus id */
if (dev->id[0] != '\0') {
dbg("check " FIELD_ID);
- if (match_id(dev, class_dev, sysfs_device) != 0) {
+ if (match_id(dev, class_dev, s_device) != 0) {
dbg(FIELD_ID " is not matching");
- continue;
+ goto no_good;
} else {
dbg(FIELD_ID " matches");
}
@@ -659,9 +662,9 @@
/* check for matching place of device */
if (dev->place[0] != '\0') {
dbg("check " FIELD_PLACE);
- if (match_place(dev, class_dev, sysfs_device) != 0) {
+ if (match_place(dev, class_dev, s_device) != 0) {
dbg(FIELD_PLACE " is not matching");
- continue;
+ goto no_good;
} else {
dbg(FIELD_PLACE " matches");
}
@@ -670,9 +673,9 @@
/* check for matching sysfs pairs */
if (dev->sysfs_pair[0].file[0] != '\0') {
dbg("check " FIELD_SYSFS " pairs");
- if (match_sysfs_pairs(dev, class_dev, sysfs_device) != 0) {
+ if (match_sysfs_pairs(dev, class_dev, s_device) != 0) {
dbg(FIELD_SYSFS " is not matching");
- continue;
+ goto no_good;
} else {
dbg(FIELD_SYSFS " matches");
}
@@ -684,7 +687,7 @@
apply_format(udev, dev->program);
if (execute_program(dev->program, udev->program_result, NAME_SIZE) != 0) {
dbg(FIELD_PROGRAM " returned nozero");
- continue;
+ goto no_good;
} else {
dbg(FIELD_PROGRAM " returned successful");
}
@@ -697,7 +700,7 @@
dev->result, udev->program_result);
if (strcmp_pattern(dev->result, udev->program_result) != 0) {
dbg(FIELD_RESULT " is not matching");
- continue;
+ goto no_good;
} else {
dbg(FIELD_RESULT " matches");
}
@@ -715,6 +718,13 @@
strfieldcpy(udev->name, dev->name);
strfieldcpy(udev->symlink, dev->symlink);
goto found;
+
+no_good:
+ s_device = sysfs_get_device_parent(s_device);
+ if (s_device = NULL)
+ continue;
+ goto loop;
+
}
/* no rule was found so we use the kernel name */
-------------------------------------------------------
The SF.Net email is sponsored by EclipseCon 2004
Premiere Conference on Open Tools Development and Integration
See the breadth of Eclipse activity. February 3-5 in Anaheim, CA.
http://www.eclipsecon.org/osdn
_______________________________________________
Linux-hotplug-devel mailing list http://linux-hotplug.sourceforge.net
Linux-hotplug-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-hotplug-devel
next prev parent reply other threads:[~2004-01-22 22:58 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-01-20 2:52 how to determine physical bus of a device and find it there Kay Sievers
2004-01-20 14:09 ` Olaf Hering
2004-01-22 22:40 ` Greg KH
2004-01-22 22:58 ` Greg KH [this message]
2004-01-22 23:27 ` Kay Sievers
2004-01-22 23:42 ` Kay Sievers
2004-01-23 1:42 ` Greg KH
2004-01-23 1:43 ` Greg KH
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20040122225835.GA15928@kroah.com \
--to=greg@kroah.com \
--cc=linux-hotplug@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).