summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErik van Konijnenburg <ekonijn@xs4all.nl>2008-05-19 09:05:20 +0200
committerKay Sievers <kay.sievers@vrfy.org>2008-05-19 09:05:20 +0200
commitff94cec3d71b5f46eb54645f4bc65e2d67ed5269 (patch)
treec514a58d2749fa05960d8b3afb12e3e54290c508
parent4e548559bacf7a29fcdd2e5eb8a3ad8bfd5441fc (diff)
add substitution in MODE= field
Do substitition processing in MODE field, similar to substitution in OWNER, GROUP etc fields. Add test case for normal and overflow behaviour. Document in manpage.
-rwxr-xr-xtest/udev-test.pl36
-rw-r--r--udev.73
-rw-r--r--udev.xml2
-rw-r--r--udev_rules.c5
4 files changed, 39 insertions, 7 deletions
diff --git a/test/udev-test.pl b/test/udev-test.pl
index fee62a6406..72b4aef6bc 100755
--- a/test/udev-test.pl
+++ b/test/udev-test.pl
@@ -1617,6 +1617,27 @@ EOF
KERNEL=="sda", MODE="0000"
EOF
},
+ {
+ desc => "TEST PROGRAM feeds MODE",
+ subsys => "block",
+ devpath => "/block/sda",
+ exp_name => "sda",
+ exp_perms => "0:0:0400",
+ rules => <<EOF
+KERNEL=="sda", PROGRAM=="/bin/echo 0 0 0400", OWNER="%c{1}", GROUP="%c{2}", MODE="%c{3}"
+EOF
+ },
+ {
+ desc => "TEST PROGRAM feeds MODE with overflow",
+ subsys => "block",
+ devpath => "/block/sda",
+ exp_name => "sda",
+ exp_perms => "0:0:0400",
+ rules => <<EOF
+KERNEL=="sda", PROGRAM=="/bin/echo 0 0 0400letsdoabuffferoverflow0123456789012345789012345678901234567890", OWNER="%c{1}", GROUP="%c{2}", MODE="%c{3}"
+EOF
+ },
+
);
# set env
@@ -1732,6 +1753,15 @@ sub symlink_test {
}
}
+sub make_udev_root {
+ system("rm -rf $udev_root");
+ mkdir($udev_root) || die "unable to create udev_root: $udev_root\n";
+ # setting group and mode of udev_root ensures the tests work
+ # even if the parent directory has setgid bit enabled.
+ chown (0, 0, $udev_root) || die "unable to chown $udev_root\n";
+ chmod (0755, $udev_root) || die "unable to chmod $udev_root\n";
+}
+
sub run_test {
my ($rules, $number) = @_;
@@ -1804,8 +1834,7 @@ sub run_test {
print "\n";
if (defined($rules->{option}) && $rules->{option} eq "clean") {
- system("rm -rf $udev_root");
- mkdir($udev_root) || die "unable to create udev_root: $udev_root\n";
+ make_udev_root ();
}
}
@@ -1818,8 +1847,7 @@ if (!($<==0)) {
}
# prepare
-system("rm -rf $udev_root");
-mkdir($udev_root) || die "unable to create udev_root: $udev_root\n";
+make_udev_root ();
# create config file
open CONF, ">$udev_conf" || die "unable to create config file: $udev_conf";
diff --git a/udev.7 b/udev.7
index 096bf38554..79e61ea9f4 100644
--- a/udev.7
+++ b/udev.7
@@ -307,7 +307,8 @@ The
\fBSYMLINK\fR,
\fBPROGRAM\fR,
\fBOWNER\fR,
-\fBGROUP\fR
+\fBGROUP\fR,
+\fBMODE\fR
and
\fBRUN\fR
fields support simple printf\-like string substitutions\. The
diff --git a/udev.xml b/udev.xml
index ac3676e466..184457aa6c 100644
--- a/udev.xml
+++ b/udev.xml
@@ -462,7 +462,7 @@
</variablelist>
<para>The <option>NAME</option>, <option>SYMLINK</option>, <option>PROGRAM</option>,
- <option>OWNER</option>, <option>GROUP</option> and <option>RUN</option>
+ <option>OWNER</option>, <option>GROUP</option>, <option>MODE</option> and <option>RUN</option>
fields support simple printf-like string substitutions. The <option>RUN</option>
format chars gets applied after all rules have been processed, right before the program
is executed. It allows the use of the complete environment set by earlier matching
diff --git a/udev_rules.c b/udev_rules.c
index 55a079be87..f4ee11a56c 100644
--- a/udev_rules.c
+++ b/udev_rules.c
@@ -1412,7 +1412,10 @@ int udev_rules_get_name(struct udev_rules *rules, struct udevice *udev)
if (!udev->mode_final && rule->mode.operation != KEY_OP_UNSET) {
if (rule->mode.operation == KEY_OP_ASSIGN_FINAL)
udev->mode_final = 1;
- udev->mode = strtol(key_val(rule, &rule->mode), NULL, 8);
+ char buf[20];
+ strlcpy(buf, key_val(rule, &rule->mode), sizeof(buf));
+ udev_rules_apply_format(udev, buf, sizeof(buf));
+ udev->mode = strtol(buf, NULL, 8);
dbg("applied mode=%#o to '%s'\n", udev->mode, udev->dev->kernel);
}
if (!udev->owner_final && rule->owner.operation != KEY_OP_UNSET) {