- list_for_each(tmp, &config_device_list) {
- struct config_device *dev = list_entry(tmp, struct config_device, node);
- switch (dev->type) {
- case LABEL:
- dbg("LABEL name = '%s', bus = '%s', sysfs_file = '%s', sysfs_value = '%s'"
- " owner = '%s', group = '%s', mode = '%#o'",
- dev->attr.name, dev->bus, dev->sysfs_file, dev->sysfs_value,
- dev->attr.owner, dev->attr.group, dev->attr.mode);
- break;
- case NUMBER:
- dbg("NUMBER name = '%s', bus = '%s', id = '%s'"
- " owner = '%s', group = '%s', mode = '%#o'",
- dev->attr.name, dev->bus, dev->id,
- dev->attr.owner, dev->attr.group, dev->attr.mode);
- break;
- case TOPOLOGY:
- dbg("TOPOLOGY name = '%s', bus = '%s', place = '%s'"
- " owner = '%s', group = '%s', mode = '%#o'",
- dev->attr.name, dev->bus, dev->place,
- dev->attr.owner, dev->attr.group, dev->attr.mode);
- break;
- case REPLACE:
- if (strcmp(dev->kernel_name, class_dev->name) != 0)
- continue;
- strcpy(attr->name, dev->attr.name);
- attr->mode = dev->attr.mode;
- strcpy(attr->owner, dev->attr.owner);
- strcpy(attr->group, dev->attr.group);
- dbg("'%s' becomes '%s' - owner = %s, group = %s, mode = %#o",
- dev->kernel_name, attr->name,
- dev->attr.owner, dev->attr.group, dev->attr.mode);
- return retval;
- break;
- default:
- dbg("Unknown type of device!");
- break;
- }
+ /* check for matching place of device */
+ if (dev->place[0] != '\0') {
+ dbg("check " FIELD_PLACE);
+ if (match_place(dev, class_dev, sysfs_device) != 0) {
+ dbg(FIELD_PLACE " is not matching");
+ goto no_good;
+ } else {
+ dbg(FIELD_PLACE " matches");
+ }
+ }
+
+ /* 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) {
+ dbg(FIELD_SYSFS " is not matching");
+ goto no_good;
+ } else {
+ dbg(FIELD_SYSFS " matches");
+ }
+ }
+
+ /* execute external program */
+ if (dev->program[0] != '\0') {
+ dbg("check " FIELD_PROGRAM);
+ apply_format(udev, dev->program);
+ if (execute_program(dev->program, udev->program_result, NAME_SIZE) != 0) {
+ dbg(FIELD_PROGRAM " returned nozero");
+ goto no_good;
+ } else {
+ dbg(FIELD_PROGRAM " returned successful");
+ }
+ }
+
+ /* check for matching result of external program */
+ if (dev->result[0] != '\0') {
+ dbg("check for " FIELD_RESULT
+ " dev->result='%s', udev->program_result='%s'",
+ dev->result, udev->program_result);
+ if (strcmp_pattern(dev->result, udev->program_result) != 0) {
+ dbg(FIELD_RESULT " is not matching");
+ goto no_good;
+ } else {
+ dbg(FIELD_RESULT " matches");
+ }
+ }
+
+ /* check if we are instructed to ignore this device */
+ if (dev->name[0] == '\0') {
+ dbg("instructed to ignore this device");
+ return -1;
+ }
+
+ /* Yeah, we matched! */
+ return 0;
+
+no_good:
+ sysfs_device = sysfs_get_device_parent(sysfs_device);
+ if (sysfs_device == NULL)
+ return -ENODEV;
+ dbg("sysfs_device->path='%s'", sysfs_device->path);
+ dbg("sysfs_device->bus_id='%s'", sysfs_device->bus_id);
+ dbg("sysfs_device->bus='%s'", sysfs_device->bus);