summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xtest/udev-test.pl10
-rw-r--r--udev_rules.c10
-rw-r--r--udev_rules.h3
-rw-r--r--udev_rules_parse.c3
4 files changed, 17 insertions, 9 deletions
diff --git a/test/udev-test.pl b/test/udev-test.pl
index 2621e2b13a..fee62a6406 100755
--- a/test/udev-test.pl
+++ b/test/udev-test.pl
@@ -1607,6 +1607,16 @@ EOF
KERNEL=="sda", TEST=="*/nr_requests", NAME="found-subdir"
EOF
},
+ {
+ desc => "TEST MODE=0000",
+ subsys => "block",
+ devpath => "/block/sda",
+ exp_name => "sda",
+ exp_perms => "0:0:0000",
+ rules => <<EOF
+KERNEL=="sda", MODE="0000"
+EOF
+ },
);
# set env
diff --git a/udev_rules.c b/udev_rules.c
index 6565a2e51d..8a793ffded 100644
--- a/udev_rules.c
+++ b/udev_rules.c
@@ -1385,11 +1385,11 @@ int udev_rules_get_name(struct udev_rules *rules, struct udevice *udev)
}
/* apply permissions */
- if (!udev->mode_final && rule->mode != 0000) {
- if (rule->mode_operation == KEY_OP_ASSIGN_FINAL)
+ if (!udev->mode_final && rule->mode.operation != KEY_OP_UNSET) {
+ if (rule->mode.operation == KEY_OP_ASSIGN_FINAL)
udev->mode_final = 1;
- udev->mode = rule->mode;
- dbg("applied mode=%#o to '%s'", rule->mode, udev->dev->kernel);
+ udev->mode = strtol(key_val(rule, &rule->mode), NULL, 8);
+ dbg("applied mode=%#o to '%s'", udev->mode, udev->dev->kernel);
}
if (!udev->owner_final && rule->owner.operation != KEY_OP_UNSET) {
if (rule->owner.operation == KEY_OP_ASSIGN_FINAL)
@@ -1534,7 +1534,7 @@ int udev_rules_get_run(struct udev_rules *rules, struct udevice *udev)
rule->symlink.operation == KEY_OP_ASSIGN ||
rule->symlink.operation == KEY_OP_ASSIGN_FINAL ||
rule->symlink.operation == KEY_OP_ADD ||
- rule->mode_operation != KEY_OP_UNSET ||
+ rule->mode.operation != KEY_OP_UNSET ||
rule->owner.operation != KEY_OP_UNSET || rule->group.operation != KEY_OP_UNSET) {
dbg("skip rule that names a device");
continue;
diff --git a/udev_rules.h b/udev_rules.h
index 0ad4ec3271..a84b0de837 100644
--- a/udev_rules.h
+++ b/udev_rules.h
@@ -93,8 +93,7 @@ struct udev_rule {
struct key symlink_match;
struct key owner;
struct key group;
- mode_t mode;
- enum key_operation mode_operation;
+ struct key mode;
enum escape_type string_escape;
unsigned int link_priority;
diff --git a/udev_rules_parse.c b/udev_rules_parse.c
index ce659d73ce..6d88354dbd 100644
--- a/udev_rules_parse.c
+++ b/udev_rules_parse.c
@@ -579,8 +579,7 @@ static int add_to_rules(struct udev_rules *rules, char *line, const char *filena
}
if (strcasecmp(key, "MODE") == 0) {
- rule->mode = strtol(value, NULL, 8);
- rule->mode_operation = operation;
+ add_rule_key(rule, &rule->mode, operation, value);
valid = 1;
continue;
}