- case REPLACE:
- if (strcmp(dev->kernel_name, class_dev->name) != 0)
- continue;
- strcpy(attr->name, dev->attr.name);
- if (dev->attr.mode != 0) {
- attr->mode = dev->attr.mode;
- strcpy(attr->owner, dev->attr.owner);
- strcpy(attr->group, dev->attr.group);
+ }
+ }
+
+ if (sysfs_device) {
+ dbg_parse("sysfs_device->path='%s'", sysfs_device->path);
+ dbg_parse("sysfs_device->bus_id='%s'", sysfs_device->bus_id);
+ } else {
+ dbg_parse("class_dev->name = '%s'", class_dev->name);
+ }
+
+ /* rules are looked at in priority order */
+ retval = do_callout(class_dev, udev);
+ if (retval == 0)
+ goto found;
+
+ retval = do_label(class_dev, udev, sysfs_device);
+ if (retval == 0)
+ goto found;
+
+ retval = do_number(class_dev, udev, sysfs_device);
+ if (retval == 0)
+ goto found;
+
+ retval = do_topology(class_dev, udev, sysfs_device);
+ if (retval == 0)
+ goto found;
+
+ retval = do_replace(class_dev, udev);
+ if (retval == 0)
+ goto found;
+
+ do_kernelname(class_dev, udev);
+ goto done;
+
+found:
+ /* substitute placeholder in NAME */
+ while (1) {
+ char *pos = strchr(udev->name, '%');
+ char *dig;
+ char name[NAME_SIZE];
+
+ if (pos) {
+ strfieldcpy(name, pos+2);
+ *pos = 0x00;
+ switch (pos[1]) {
+ case 'b':
+ if (!sysfs_device)
+ break;
+ strcat(udev->name, sysfs_device->bus_id);
+ dbg("substitute bus_id '%s'", sysfs_device->bus_id);
+ break;
+ case 'n':
+ dig = class_dev->name + strlen(class_dev->name);
+ while (isdigit(*(dig-1)))
+ dig--;
+ strcat(udev->name, dig);
+ dbg("substitute kernel number '%s'", dig);
+ break;
+ case 'm':
+ sprintf(pos, "%u", udev->minor);
+ dbg("substitute minor number '%u'", udev->minor);
+ break;
+ case 'M':
+ sprintf(pos, "%u", udev->major);
+ dbg("substitute major number '%u'", udev->major);
+ break;
+ default:
+ dbg("unknown substitution type '%%%c'", pos[1]);
+ break;