--- namedev.c.org 2003-11-27 14:52:50.738368424 -0500 +++ namedev.c 2003-11-25 16:45:18.000000000 -0500 @@ -298,13 +298,23 @@ break; strfieldcpy(dev.id, temp3); - /* NAME="new_name" */ + /* file="value" OR NAME="new_name" */ temp2 = strsep(&temp, ","); - retval = get_value("NAME", &temp, &temp3); + retval = get_pair(&temp, &temp2, &temp3); if (retval) break; - strfieldcpy(dev.name, temp3); + if(strcmp("NAME", temp2) != 0) { + /* file="value" */ + strfieldcpy(dev.sysfs_file, temp2); + strfieldcpy(dev.sysfs_value, temp3); + /* NAME="new_name" */ + temp2 = strsep(&temp, ","); + retval = get_value("NAME", &temp, &temp3); + dbg_parse("sysfs_file='%s' sysfs_value='%s'", + dev.sysfs_file, dev.sysfs_value); + } + strfieldcpy(dev.name, temp3); dbg_parse("NUMBER name='%s', bus='%s', id='%s'", dev.name, dev.bus, dev.id); } @@ -520,6 +530,7 @@ case 'n': if (strlen(udev->kernel_number) == 0) break; + strcat(pos, "s"); strcat(pos, udev->kernel_number); dbg("substitute kernel number '%s'", udev->kernel_number); break; @@ -724,6 +735,7 @@ char path[SYSFS_PATH_MAX]; int found; char *temp = NULL; + struct sysfs_attribute *tmpattr = NULL; /* we have to have a sysfs device for NUMBER to work */ if (!sysfs_device) @@ -749,6 +761,36 @@ } if (!found) continue; + + if (strcmp(dev->sysfs_file, "device_type") == 0) { + dbg_parse("look for device_type attribute '%s'", + dev->sysfs_file); + /* try to find the attribute in the class device directory */ + tmpattr = sysfs_get_classdev_attr(class_dev, dev->sysfs_file); + if (tmpattr) + goto number_found; + + /* look in the class device directory if present */ + if (sysfs_device) { + tmpattr = sysfs_get_device_attr(sysfs_device, dev->sysfs_file); + if (tmpattr) + goto number_found; + } + + continue; +number_found: + tmpattr->value[strlen(tmpattr->value)-1] = '\0'; + dbg_parse("compare attribute '%s' value '%s' with '%s'", + dev->sysfs_file, tmpattr->value, + dev->sysfs_value); + if (strncmp(dev->sysfs_value, tmpattr->value, strlen(dev->sysfs_value)) != 0) + continue; + + dbg_parse("found matching attribute '%s', '%s' becomes" + " '%s' - owner='%s', group='%s', mode=%#o", + dev->sysfs_file, class_dev->name, udev->name, + dev->owner, dev->group, dev->mode); + } strfieldcpy(udev->name, dev->name); if (dev->mode != 0) { udev->mode = dev->mode;