Skip to contentSkip to conversation

a bug / pattern match for label method

udev Kay Sievers 1 participant 1 message Dec 4, 2003

lore
Share & tools
lore
#0 lore raw

While I was adding pattern match to the LABEL method i hit a bug. We modify a string returned from libsysfs, so with every iteration is is truncated by one char:

Dec  4 02:27:16 pim udev[23307]: do_label: dev->bus='scsi' sysfs_device->bus='scsi'
Dec  4 02:27:16 pim udev[23307]: do_label: look for device attribute 'vendor'
Dec  4 02:27:16 pim udev[23307]: do_label: xxx 'IBM-ESXS '
Dec  4 02:27:16 pim udev[23307]: do_label: compare attribute 'vendor' value 'IBM-ESX' with '?IBM-ESXS'
Dec  4 02:27:16 pim udev[23307]: do_label: dev->bus='scsi' sysfs_device->bus='scsi'
Dec  4 02:27:16 pim udev[23307]: do_label: look for device attribute 'vendor'
Dec  4 02:27:16 pim udev[23307]: do_label: xxx 'IBM-ESX'
Dec  4 02:27:16 pim udev[23307]: do_label: compare attribute 'vendor' value 'IBM-ES' with 'IBM-ESXS?'
Dec  4 02:27:16 pim udev[23307]: do_label: dev->bus='scsi' sysfs_device->bus='scsi'
Dec  4 02:27:16 pim udev[23307]: do_label: look for device attribute 'vendor'
Dec  4 02:27:16 pim udev[23307]: do_label: xxx 'IBM-ES'
Dec  4 02:27:16 pim udev[23307]: do_label: compare attribute 'vendor' value 'IBM-E' with 'IBM-ES??'
Dec  4 02:27:16 pim udev[23307]: do_label: dev->bus='scsi' sysfs_device->bus='scsi'
Dec  4 02:27:16 pim udev[23307]: do_label: look for device attribute 'vendor'
Dec  4 02:27:16 pim udev[23307]: do_label: xxx 'IBM-E'
Dec  4 02:27:16 pim udev[23307]: do_label: compare attribute 'vendor' value 'IBM-' with 'IBM-ESXSS'

I changed the behavior to remove only the line feed.

thanks,
Kay

03-bug-in-linefeed-removal.diff
remove only the line feed from string not every last char

04-patternmatch-for-label.diff
switch LABEL search to pattern match
add a test for pattern match in LABEL
remove useless rule from udev.rules

namedev.c +6 -3
diff -Nru a/namedev.c b/namedev.c
@@ -378,6 +378,7 @@
 	struct sysfs_attribute *tmpattr = NULL;
 	struct config_device *dev;
 	struct list_head *tmp;
+	char *c;
 
 	list_for_each(tmp, &config_device_list) {
 		dev = list_entry(tmp, struct config_device, node);
@@ -406,7 +407,9 @@
 		continue;
 
 label_found:
-		tmpattr->value[strlen(tmpattr->value)-1] = 0x00;
+		c = tmpattr->value + strlen(tmpattr->value)-1;
+		if (*c == '\n')
+			*c = 0x00;
 		dbg("compare attribute '%s' value '%s' with '%s'",
 			  dev->sysfs_file, tmpattr->value, dev->sysfs_value);
 		if (strcmp(dev->sysfs_value, tmpattr->value) != 0)
@@ -578,7 +581,7 @@
 			}
 		}
 	}
-		
+
 	if (sysfs_device) {
 		dbg("sysfs_device->path='%s'", sysfs_device->path);
 		dbg("sysfs_device->bus_id='%s'", sysfs_device->bus_id);
@@ -642,7 +645,7 @@
 int namedev_init(void)
 {
 	int retval;
-	
+
 	retval = namedev_init_rules();
 	if (retval)
 		return retval;
namedev.c +1 -1
diff -Nru a/namedev.c b/namedev.c
@@ -412,7 +412,7 @@
 			*c = 0x00;
 		dbg("compare attribute '%s' value '%s' with '%s'",
 			  dev->sysfs_file, tmpattr->value, dev->sysfs_value);
-		if (strcmp(dev->sysfs_value, tmpattr->value) != 0)
+		if (strcmp_pattern(dev->sysfs_value, tmpattr->value) != 0)
 			continue;
 
 		strfieldcpy(udev->name, dev->name);
test/udev-test.pl +12 -0
diff -Nru a/test/udev-test.pl b/test/udev-test.pl
@@ -52,6 +52,18 @@
 EOF
 	},
 	{
+		desc     => "label test of pattern match",
+		subsys   => "block",
+		devpath  => "block/sda/sda1",
+		expected => "boot_disk1" ,
+		conf     => <<EOF
+LABEL, BUS="scsi", vendor="?IBM-ESXS", NAME="boot_disk%n-1"
+LABEL, BUS="scsi", vendor="IBM-ESXS?", NAME="boot_disk%n-2"
+LABEL, BUS="scsi", vendor="IBM-ES??", NAME="boot_disk%n"
+LABEL, BUS="scsi", vendor="IBM-ESXSS", NAME="boot_disk%n-3"
+EOF
+	},
+	{
 		desc     => "catch device by *",
 		subsys   => "tty",
 		devpath  => "class/tty/ttyUSB0",
udev.rules +0 -1
diff -Nru a/udev.rules b/udev.rules
@@ -42,7 +42,6 @@
 REPLACE, KERNEL="ttyUSB0", NAME="pl2303"
 
 # a devfs like way to name some tty devices
-#REPLACE, KERNEL="tty", NAME="tty"
 #REPLACE, KERNEL="ttyS*", NAME="tts/%n"
 #REPLACE, KERNEL="tty*", NAME="vc/%n"