a bug / pattern match for label method
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
@@ -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
@@ -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
@@ -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
@@ -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"