- int found;
-
- dbg("class_dev->sysdevice->directory->path = '%s'", class_dev->sysdevice->directory->path);
- dbg("class_dev->sysdevice->bus_id = '%s'", class_dev->sysdevice->bus_id);
- 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:
- {
- char path[SYSFS_PATH_MAX];
- char *temp;
-
- found = 0;
- strcpy(path, class_dev->sysdevice->directory->path);
- temp = strrchr(path, '/');
- dbg("TOPOLOGY path = '%s'", path);
- dbg("TOPOLOGY temp = '%s' place = '%s'", temp, dev->place);
- if (strstr(temp, dev->place) != NULL) {
- found = 1;
- } else {
- *temp = 0x00;
- temp = strrchr(path, '/');
- dbg("TOPOLOGY temp = '%s' place = '%s'", temp, dev->place);
- if (strstr(temp, dev->place) != NULL)
- found = 1;
- }
- if (!found)
- 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("device at '%s' becomes '%s' - owner = %s, group = %s, mode = %#o",
- dev->place, attr->name,
- dev->attr.owner, dev->attr.group, dev->attr.mode);
- return retval;
- break;
+ struct perm_device *perm;
+
+ udev->mode = 0;
+
+ /* find the sysfs_device for this class device */
+ /* Wouldn't it really be nice if libsysfs could do this for us? */
+ sysfs_device = sysfs_get_classdev_device(class_dev);
+ if (sysfs_device == NULL) {
+ /* bah, let's go backwards up a level to see if the device is there,
+ * as block partitions don't point to the physical device. Need to fix that
+ * up in the kernel...
+ */
+ if (strcmp(class_dev->classname, SYSFS_BLOCK_NAME) == 0) {
+ dbg("looking at block device");
+ if (isdigit(class_dev->path[strlen(class_dev->path)-1])) {
+ dbg("really is a partition");
+ class_dev_parent = sysfs_get_classdev_parent
+ (class_dev);
+ if (class_dev_parent == NULL) {
+ dbg("sysfs_get_classdev_parent for class device '%s' failed", class_dev->name);
+ } else {
+ dbg("class_dev_parent->name='%s'", class_dev_parent->name);
+ sysfs_device = sysfs_get_classdev_device(class_dev_parent);
+ }