All of lore.kernel.org
 help / color / mirror / Atom feed
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

  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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.