diff options
-rw-r--r-- | test/udev-test.pl | 11 | ||||
-rw-r--r-- | udev_rules.c | 6 | ||||
-rw-r--r-- | udev_rules.h | 4 | ||||
-rw-r--r-- | udev_rules_parse.c | 4 |
4 files changed, 23 insertions, 2 deletions
diff --git a/test/udev-test.pl b/test/udev-test.pl index c7e1a9d47e..52c5c8d481 100644 --- a/test/udev-test.pl +++ b/test/udev-test.pl @@ -1115,11 +1115,20 @@ EOF subsys => "block", devpath => "/block/sda/sda1", exp_name => "start-udev-root-end", - option => "clean", conf => <<EOF BUS="scsi", KERNEL="sda1", NAME="start-%r-end" EOF }, + { + desc => "last_rule option", + subsys => "block", + devpath => "/block/sda/sda1", + exp_name => "last", + conf => <<EOF +BUS="scsi", KERNEL="sda1", SYMLINK="last", OPTIONS="last_rule" +BUS="scsi", KERNEL="sda1", NAME="very-last" +EOF + }, ); # set env diff --git a/udev_rules.c b/udev_rules.c index cbdf7de317..16f23ccb04 100644 --- a/udev_rules.c +++ b/udev_rules.c @@ -759,6 +759,12 @@ int udev_rules_get_name(struct udevice *udev, struct sysfs_class_device *class_d break; } + + if (rule->last_rule) { + dbg("last rule to be applied"); + break; + } + } } diff --git a/udev_rules.h b/udev_rules.h index 71c510bce5..42552cfa41 100644 --- a/udev_rules.h +++ b/udev_rules.h @@ -43,6 +43,7 @@ #define FIELD_MODE "MODE" #define FIELD_OPTIONS "OPTIONS" +#define OPTION_LAST_RULE "last_rule" #define OPTION_IGNORE_DEVICE "ignore_device" #define OPTION_IGNORE_REMOVE "ignore_remove" #define OPTION_PARTITIONS "all_partitions" @@ -74,9 +75,10 @@ struct udev_rule { char group[USER_SIZE]; mode_t mode; - int partitions; + int last_rule; int ignore_device; int ignore_remove; + int partitions; char config_file[PATH_SIZE]; int config_line; diff --git a/udev_rules_parse.c b/udev_rules_parse.c index 4f431decf5..f77f3db915 100644 --- a/udev_rules_parse.c +++ b/udev_rules_parse.c @@ -283,6 +283,10 @@ static int rules_parse(struct udevice *udev, const char *filename) } if (strcasecmp(temp2, FIELD_OPTIONS) == 0) { + if (strstr(temp3, OPTION_LAST_RULE) != NULL) { + dbg("last rule to be applied"); + rule.last_rule = 1; + } if (strstr(temp3, OPTION_IGNORE_DEVICE) != NULL) { dbg("device should be ignored"); rule.ignore_device = 1; |