+ }
+ if (!found)
+ continue;
+
+ strfieldcpy(udev->name, dev->name);
+ if (dev->mode != 0) {
+ udev->mode = dev->mode;
+ strfieldcpy(udev->owner, dev->owner);
+ strfieldcpy(udev->group, dev->group);
+ }
+ dbg_parse("found matching place '%s', '%s' becomes '%s'"
+ " - owner='%s', group ='%s', mode=%#o",
+ dev->place, class_dev->name, udev->name,
+ dev->owner, dev->group, dev->mode);
+ return 0;
+ }
+ return -ENODEV;
+}
+
+static int do_replace(struct sysfs_class_device *class_dev, struct udevice *udev)
+{
+ struct config_device *dev;
+ struct list_head *tmp;
+
+ list_for_each(tmp, &config_device_list) {
+ dev = list_entry(tmp, struct config_device, node);
+ if (dev->type != REPLACE)
+ continue;
+
+ dbg_parse("compare name '%s' with '%s'",
+ dev->kernel_name, dev->name);
+ if (strcmp(dev->kernel_name, class_dev->name) != 0)
+ continue;
+
+ strfieldcpy(udev->name, dev->name);
+ if (dev->mode != 0) {
+ udev->mode = dev->mode;
+ strfieldcpy(udev->owner, dev->owner);
+ strfieldcpy(udev->group, dev->group);
+ }
+ dbg_parse("found name, '%s' becomes '%s' - owner='%s', group='%s', mode = %#o",
+ dev->kernel_name, udev->name,
+ dev->owner, dev->group, dev->mode);
+
+ return 0;
+ }
+ return -ENODEV;
+}
+
+static void do_kernelname(struct sysfs_class_device *class_dev, struct udevice *udev)
+{
+ struct config_device *dev;
+ struct list_head *tmp;
+ int len;
+
+ strfieldcpy(udev->name, class_dev->name);
+ /* look for permissions */
+ list_for_each(tmp, &config_device_list) {
+ dev = list_entry(tmp, struct config_device, node);
+ len = strlen(dev->name);
+ if (strncmp_wildcard(class_dev->name, dev->name, sizeof(dev->name)))
+ continue;
+ if (dev->mode != 0) {
+ dbg_parse("found permissions for '%s'", class_dev->name);
+ udev->mode = dev->mode;
+ strfieldcpy(udev->owner, dev->owner);
+ strfieldcpy(udev->group, dev->group);
+ }
+ }
+}
+
+static int get_attr(struct sysfs_class_device *class_dev, struct udevice *udev)
+{
+ struct sysfs_device *sysfs_device = NULL;
+ struct sysfs_class_device *class_dev_parent = NULL;
+ int retval = 0;
+ char *temp = NULL;
+
+ udev->mode = 0;
+
+ /* find the sysfs_device for this class device */
+ /* Wouldn't it really be nice if libsysfs could do this for us? */
+ if (class_dev->sysdevice) {
+ sysfs_device = class_dev->sysdevice;
+ } else {
+ /* 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 (strstr(class_dev->path, "block")) {
+ dbg_parse("looking at block device");
+ if (isdigit(class_dev->path[strlen(class_dev->path)-1])) {
+ char path[SYSFS_PATH_MAX];
+
+ dbg_parse("really is a partition");
+ strfieldcpy(path, class_dev->path);