-static int get_attr(struct sysfs_class_device *class_dev, struct device_attr *attr)
-{
- struct list_head *tmp;
- int retval = 0;
-
- list_for_each(tmp, &config_device_list) {
- struct config_device *dev = list_entry(tmp, struct config_device, node);
- if (strcmp(dev->attr.name, class_dev->name) == 0) {
- attr->mode = dev->attr.mode;
- strcpy(attr->owner, dev->attr.owner);
- strcpy(attr->group, dev->attr.group);
- /* FIXME put the proper name here!!! */
- strcpy(attr->name, dev->attr.name);
- dbg("%s - owner = %s, group = %s, mode = %#o", dev->attr.name, dev->attr.owner, dev->attr.group, dev->attr.mode);
- goto exit;
+ /* check for matching bus id */
+ if (dev->id[0] != '\0') {
+ dbg("check " FIELD_ID);
+ if (match_id(dev, class_dev, sysfs_device) != 0) {
+ dbg(FIELD_ID " is not matching");
+ goto no_good;
+ } else {
+ dbg(FIELD_ID " matches");
+ }
+ }
+
+ /* 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;