diff options
-rwxr-xr-x | test/udev-test.pl | 28 | ||||
-rw-r--r-- | udev_rules.c | 8 |
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); |