summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xtest/udev-test.pl28
-rw-r--r--udev_rules.c8
2 files changed, 36 insertions, 0 deletions
diff --git a/test/udev-test.pl b/test/udev-test.pl
index 53499d8871..fe1c6da4f9 100755
--- a/test/udev-test.pl
+++ b/test/udev-test.pl
@@ -1570,6 +1570,34 @@ EOF
KERNEL=="sda", NAME="\$attr{[net/eth0]address}"
EOF
},
+ {
+ desc => "TEST absolute path",
+ subsys => "block",
+ devpath => "/block/sda",
+ exp_name => "there",
+ rules => <<EOF
+TEST=="/etc/hosts", NAME="there"
+NAME="notthere"
+EOF
+ },
+ {
+ desc => "TEST subsys/kernel lookup",
+ subsys => "block",
+ devpath => "/block/sda",
+ exp_name => "yes",
+ rules => <<EOF
+KERNEL=="sda", TEST=="[net/eth0]", NAME="yes"
+EOF
+ },
+ {
+ desc => "TEST relative path",
+ subsys => "block",
+ devpath => "/block/sda",
+ exp_name => "relative",
+ rules => <<EOF
+KERNEL=="sda", TEST=="size", NAME="relative"
+EOF
+ },
);
# set env
diff --git a/udev_rules.c b/udev_rules.c
index e2877abe70..0dcbf156ea 100644
--- a/udev_rules.c
+++ b/udev_rules.c
@@ -1003,6 +1003,14 @@ static int match_rule(struct udevice *udev, struct udev_rule *rule)
strlcat(filename, "/", sizeof(filename));
strlcat(filename, attr, sizeof(filename));
}
+ } else if (filename[0] != '/') {
+ char tmp[PATH_SIZE];
+
+ strlcpy(tmp, sysfs_path, sizeof(tmp));
+ strlcat(tmp, udev->dev->devpath, sizeof(tmp));
+ strlcat(tmp, "/", sizeof(tmp));
+ strlcat(tmp, filename, sizeof(tmp));
+ strlcpy(filename, tmp, sizeof(filename));
}
match = (stat(filename, &statbuf) == 0);