[PATCH] split REPLACE and CALLOUT into separate functions
Finally starting to process this in priority order, not config file order.
This commit is contained in:
parent
07b80e6d55
commit
120d45d0a1
112
namedev.c
112
namedev.c
|
@ -22,7 +22,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* define this to enable parsing debugging */
|
/* define this to enable parsing debugging */
|
||||||
/* #define DEBUG_PARSER */
|
#define DEBUG_PARSER
|
||||||
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
@ -537,6 +537,65 @@ static int exec_callout(struct config_device *dev, char *value, int len)
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int do_callout(struct sysfs_class_device *class_dev, struct udevice *udev)
|
||||||
|
{
|
||||||
|
struct config_device *dev;
|
||||||
|
struct list_head *tmp;
|
||||||
|
char value[ID_SIZE];
|
||||||
|
|
||||||
|
list_for_each(tmp, &config_device_list) {
|
||||||
|
dev = list_entry(tmp, struct config_device, node);
|
||||||
|
if (dev->type != CALLOUT)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (exec_callout(dev, value, sizeof(value)))
|
||||||
|
continue;
|
||||||
|
if (strncmp(value, dev->id, sizeof(value)) != 0)
|
||||||
|
continue;
|
||||||
|
strcpy(udev->name, dev->name);
|
||||||
|
if (dev->mode != 0) {
|
||||||
|
udev->mode = dev->mode;
|
||||||
|
strcpy(udev->owner, dev->owner);
|
||||||
|
strcpy(udev->group, dev->group);
|
||||||
|
}
|
||||||
|
dbg_parse("device callout '%s' becomes '%s' - owner = %s, group = %s, mode = %#o",
|
||||||
|
dev->id, 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("REPLACE: replace name '%s' with '%s'",
|
||||||
|
dev->kernel_name, dev->name);
|
||||||
|
if (strcmp(dev->kernel_name, class_dev->name) != 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
strcpy(udev->name, dev->name);
|
||||||
|
if (dev->mode != 0) {
|
||||||
|
udev->mode = dev->mode;
|
||||||
|
strcpy(udev->owner, dev->owner);
|
||||||
|
strcpy(udev->group, dev->group);
|
||||||
|
}
|
||||||
|
dbg_parse("'%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 int get_attr(struct sysfs_class_device *class_dev, struct udevice *udev)
|
static int get_attr(struct sysfs_class_device *class_dev, struct udevice *udev)
|
||||||
{
|
{
|
||||||
struct list_head *tmp;
|
struct list_head *tmp;
|
||||||
|
@ -712,49 +771,22 @@ label_found:
|
||||||
goto done;
|
goto done;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case CALLOUT:
|
|
||||||
{
|
|
||||||
char value[ID_SIZE];
|
|
||||||
|
|
||||||
if (exec_callout(dev, value, sizeof(value)))
|
|
||||||
continue;
|
|
||||||
if (strncmp(value, dev->id, sizeof(value)) != 0)
|
|
||||||
continue;
|
|
||||||
strcpy(udev->name, dev->name);
|
|
||||||
if (dev->mode != 0) {
|
|
||||||
udev->mode = dev->mode;
|
|
||||||
strcpy(udev->owner, dev->owner);
|
|
||||||
strcpy(udev->group, dev->group);
|
|
||||||
}
|
|
||||||
dbg_parse("device callout '%s' becomes '%s' - owner = %s, group = %s, mode = %#o",
|
|
||||||
dev->id, udev->name,
|
|
||||||
dev->owner, dev->group, dev->mode);
|
|
||||||
goto done;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case REPLACE:
|
|
||||||
dbg_parse("REPLACE: replace name '%s' with '%s'",
|
|
||||||
dev->kernel_name, dev->name);
|
|
||||||
if (strcmp(dev->kernel_name, class_dev->name) != 0)
|
|
||||||
continue;
|
|
||||||
strcpy(udev->name, dev->name);
|
|
||||||
if (dev->mode != 0) {
|
|
||||||
udev->mode = dev->mode;
|
|
||||||
strcpy(udev->owner, dev->owner);
|
|
||||||
strcpy(udev->group, dev->group);
|
|
||||||
}
|
|
||||||
dbg_parse("'%s' becomes '%s' - owner = %s, group = %s, mode = %#o",
|
|
||||||
dev->kernel_name, udev->name,
|
|
||||||
dev->owner, dev->group, dev->mode);
|
|
||||||
goto done;
|
|
||||||
break;
|
|
||||||
case KERNEL_NAME:
|
case KERNEL_NAME:
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
dbg_parse("Unknown type of device '%d'", dev->type);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* rules are looked at in priority order */
|
||||||
|
|
||||||
|
retval = do_callout(class_dev, udev);
|
||||||
|
if (retval == 0)
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
retval = do_replace(class_dev, udev);
|
||||||
|
if (retval == 0)
|
||||||
|
goto done;
|
||||||
|
|
||||||
strcpy(udev->name, class_dev->name);
|
strcpy(udev->name, class_dev->name);
|
||||||
|
|
||||||
done:
|
done:
|
||||||
|
@ -764,7 +796,7 @@ done:
|
||||||
udev->owner[0] = 0x00;
|
udev->owner[0] = 0x00;
|
||||||
udev->group[0] = 0x00;
|
udev->group[0] = 0x00;
|
||||||
}
|
}
|
||||||
return retval;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int namedev_name_device(struct sysfs_class_device *class_dev, struct udevice *dev)
|
int namedev_name_device(struct sysfs_class_device *class_dev, struct udevice *dev)
|
||||||
|
|
Loading…
Reference in a new issue