udev_rules_get_name(&rules, &udev, class_dev);
if (udev.ignore_device) {
info("device event will be ignored");
+ sysfs_close_class_device(class_dev);
goto cleanup;
}
if (udev.name[0] == '\0') {
info("device node creation supressed");
+ sysfs_close_class_device(class_dev);
goto cleanup;
}
-
/* create node, store in db */
retval = udev_add_device(&udev, class_dev);
} else {
dbg("no dev-file found");
- udev_rules_get_run(&rules, &udev, NULL);
+ udev_rules_get_run(&rules, &udev, class_dev, NULL);
if (udev.ignore_device) {
info("device event will be ignored");
+ sysfs_close_class_device(class_dev);
goto cleanup;
}
}
sysfs_close_class_device(class_dev);
} else if (strcmp(action, "remove") == 0) {
dbg("node remove");
- udev_rules_get_run(&rules, &udev, NULL);
+ udev_rules_get_run(&rules, &udev, NULL, NULL);
if (udev.ignore_device) {
dbg("device event will be ignored");
goto cleanup;
}
dbg("devices device opened '%s'", path);
wait_for_devices_device(devices_dev, &error);
- udev_rules_get_run(&rules, &udev, devices_dev);
+ udev_rules_get_run(&rules, &udev, NULL, devices_dev);
sysfs_close_device(devices_dev);
if (udev.ignore_device) {
info("device event will be ignored");
}
} else {
dbg("default handling");
- udev_rules_get_run(&rules, &udev, NULL);
+ udev_rules_get_run(&rules, &udev, NULL, NULL);
if (udev.ignore_device) {
info("device event will be ignored");
goto cleanup;
return 0;
}
-int udev_rules_get_run(struct udev_rules *rules, struct udevice *udev, struct sysfs_device *sysfs_device)
+int udev_rules_get_run(struct udev_rules *rules, struct udevice *udev,
+ struct sysfs_class_device *class_dev, struct sysfs_device *sysfs_dev)
{
struct udev_rule *rule;
+ if (class_dev && !sysfs_dev)
+ sysfs_dev = sysfs_get_classdev_device(class_dev);
+ if (sysfs_dev) {
+ dbg("found devices device: path='%s', bus_id='%s', bus='%s'",
+ sysfs_dev->path, sysfs_dev->bus_id, sysfs_dev->bus);
+ strlcpy(udev->bus_id, sysfs_dev->bus_id, sizeof(udev->bus_id));
+ }
+
+ dbg("udev->kernel_name='%s'", udev->kernel_name);
+
/* look for a matching rule to apply */
udev_rules_iter_init(rules);
while (1) {
continue;
}
- if (match_rule(udev, rule, NULL, sysfs_device) == 0) {
+ if (match_rule(udev, rule, class_dev, sysfs_dev) == 0) {
if (rule->ignore_device) {
info("rule applied, '%s' is ignored", udev->kernel_name);
udev->ignore_device = 1;
}
}
strlcpy(program, key_val(rule, &rule->run), sizeof(program));
- apply_format(udev, program, sizeof(program), NULL, sysfs_device);
+ apply_format(udev, program, sizeof(program), class_dev, sysfs_dev);
dbg("add run '%s'", program);
name_list_add(&udev->run_list, program, 0);
if (rule->run.operation == KEY_OP_ASSIGN_FINAL)
dbg("last rule to be applied");
break;
}
+
+ if (rule->goto_label.operation != KEY_OP_UNSET) {
+ dbg("moving forward to label '%s'", key_val(rule, &rule->goto_label));
+ udev_rules_iter_label(rules, key_val(rule, &rule->goto_label));
+ }
}
}
extern struct udev_rule *udev_rules_iter_next(struct udev_rules *rules);
extern struct udev_rule *udev_rules_iter_label(struct udev_rules *rules, const char *label);
-extern int udev_rules_get_name(struct udev_rules *rules, struct udevice *udev, struct sysfs_class_device *class_dev);
-extern int udev_rules_get_run(struct udev_rules *rules, struct udevice *udev, struct sysfs_device *sysfs_device);
+extern int udev_rules_get_name(struct udev_rules *rules, struct udevice *udev,
+ struct sysfs_class_device *class_dev);
+extern int udev_rules_get_run(struct udev_rules *rules, struct udevice *udev,
+ struct sysfs_class_device *class_dev, struct sysfs_device *sysfs_dev);
#endif
#include <sys/un.h>
#include <sys/sysinfo.h>
#include <sys/stat.h>
+#include <linux/types.h>
#include <linux/netlink.h>
#include "list.h"