teknoraver / rpms / systemd

Forked from rpms/systemd 2 months ago
Clone
Blob Blame History Raw
From fb8d10456d7d5a085e1adb5bfd45f1cda813ac22 Mon Sep 17 00:00:00 2001
From: Martin Wilck <mwilck@suse.com>
Date: Tue, 24 Apr 2018 17:15:58 +0200
Subject: [PATCH] test/udev-test.pl: allow checking multiple symlinks

Instead of testing the existence or non-exisitence of just a single
symlink, allow testing of several links per device.

Change the test definitions accordingly.

(cherry picked from commit e62acc3159935781f05fa59c48e5a74e85c61ce2)

Related: #1642728
---
 test/udev-test.pl | 495 +++++++++++++++++++++++++++-------------------
 1 file changed, 296 insertions(+), 199 deletions(-)

diff --git a/test/udev-test.pl b/test/udev-test.pl
index 2e3089c5e0..f5edecefd0 100755
--- a/test/udev-test.pl
+++ b/test/udev-test.pl
@@ -71,7 +71,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                                exp_name        => "boot_disk" ,
+                                exp_links       => ["boot_disk"],
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="scsi", ATTRS{vendor}=="ATA", SYMLINK+="boot_disk%n"
@@ -83,7 +83,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                                exp_name        => "boot_disk" ,
+                                exp_links       => ["boot_disk"],
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="scsi", ATTRS{vendor}=="ATA", SYMLINK+="boot_disk%n"
@@ -95,7 +95,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                                exp_name        => "boot_disk" ,
+                                exp_links       => ["boot_disk"],
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="scsi", ATTRS{vendor}=="ATA", SYMLINK+="boot_disk%n"
@@ -107,7 +107,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1",
-                                exp_name        => "boot_disk1" ,
+                                exp_links       => ["boot_disk1"],
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="scsi", ATTRS{vendor}=="ATA", SYMLINK+="boot_disk%n"
@@ -118,13 +118,16 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1",
-                                exp_name        => "boot_disk1" ,
+                                exp_links       => ["boot_disk1", "boot_disk1-4", "boot_disk1-5"],
+                                not_exp_links   => ["boot_disk1-1", "boot_disk1-2", "boot_disk1-3"]
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="scsi", ATTRS{vendor}=="?ATA", SYMLINK+="boot_disk%n-1"
 SUBSYSTEMS=="scsi", ATTRS{vendor}=="ATA?", SYMLINK+="boot_disk%n-2"
 SUBSYSTEMS=="scsi", ATTRS{vendor}=="A??", SYMLINK+="boot_disk%n"
 SUBSYSTEMS=="scsi", ATTRS{vendor}=="ATAS", SYMLINK+="boot_disk%n-3"
+SUBSYSTEMS=="scsi", ATTRS{vendor}=="AT?", SYMLINK+="boot_disk%n-4"
+SUBSYSTEMS=="scsi", ATTRS{vendor}=="??A", SYMLINK+="boot_disk%n-5"
 EOF
         },
         {
@@ -132,7 +135,8 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1",
-                                exp_name        => "boot_disk1" ,
+                                exp_links       => ["boot_disk1"],
+                                not_exp_links   => ["boot_diskX1"],
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="scsi", ATTRS{vendor}=="ATA", ATTRS{model}=="ST910021AS X ", SYMLINK+="boot_diskX%n"
@@ -144,10 +148,12 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1",
-                                exp_name        => "boot_disk1" ,
+                                exp_links       => ["boot_disk1", "boot_diskXY1"],
+                                not_exp_links   => ["boot_diskXX1"],
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="scsi", ATTRS{vendor}=="ATA", ATTRS{model}=="ST910021AS", ATTRS{scsi_level}=="6", ATTRS{rev}=="4.06", ATTRS{type}=="0", ATTRS{queue_depth}=="32", SYMLINK+="boot_diskXX%n"
+SUBSYSTEMS=="scsi", ATTRS{vendor}=="ATA", ATTRS{model}=="ST910021AS", ATTRS{scsi_level}=="6", ATTRS{rev}=="4.06", ATTRS{type}=="0", ATTRS{queue_depth}=="1", SYMLINK+="boot_diskXY%n"
 SUBSYSTEMS=="scsi", ATTRS{vendor}=="ATA", ATTRS{model}=="ST910021AS", ATTRS{scsi_level}=="6", ATTRS{rev}=="4.06", ATTRS{type}=="0", SYMLINK+="boot_disk%n"
 EOF
         },
@@ -156,18 +162,21 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
-                                exp_name        => "modem/0" ,
+                                exp_links       => ["modem/0", "catch-all"],
                         }],
                 rules           => <<EOF
 KERNEL=="ttyACM*", SYMLINK+="modem/%n"
+KERNEL=="*", SYMLINK+="catch-all"
 EOF
         },
+        # 10
         {
                 desc            => "catch device by * - take 2",
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
-                                exp_name        => "modem/0" ,
+                                exp_links       => ["modem/0"],
+                                not_exp_links   => ["bad"],
                         }],
                 rules           => <<EOF
 KERNEL=="*ACM1", SYMLINK+="bad"
@@ -179,7 +188,8 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
-                                exp_name        => "modem/0" ,
+                                exp_links       => ["modem/0"],
+                                not_exp_links   => ["modem/0-1", "modem/0-2"],
                         }],
                 rules           => <<EOF
 KERNEL=="ttyACM??*", SYMLINK+="modem/%n-1"
@@ -192,7 +202,8 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
-                                exp_name        => "modem/0" ,
+                                exp_links       => ["modem/0"],
+                                not_exp_links   => ["modem/0-1", "modem/0-2"],
                         }],
                 rules           => <<EOF
 KERNEL=="ttyACM[A-Z]*", SYMLINK+="modem/%n-1"
@@ -205,7 +216,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
-                                exp_name        => "modem" ,
+                                exp_links       => ["modem"],
                         }],
                 rules           => <<EOF
 KERNEL=="ttyACM0", SYMLINK+="modem"
@@ -216,7 +227,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
-                                exp_name        => "modem" ,
+                                exp_links       => ["modem"],
                         }],
                 rules           => <<EOF
 # this is a comment
@@ -229,7 +240,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
-                                exp_name        => "modem" ,
+                                exp_links       => ["modem"],
                         }],
                 rules           => <<EOF
  # this is a comment with whitespace before the comment
@@ -242,7 +253,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
-                                exp_name        => "whitespace" ,
+                                exp_links       => ["whitespace"],
                         }],
                 rules           => <<EOF
 
@@ -260,7 +271,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
-                                exp_name        => "modem" ,
+                                exp_links       => ["modem"],
                         }],
                 rules           => <<EOF
 
@@ -273,7 +284,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
-                                exp_name        => "modem" ,
+                                exp_links       => ["modem"],
                         }],
                 rules           => <<EOF
 KERNEL=="ttyACM0", \\
@@ -286,7 +297,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
-                                exp_name        => "aaa",
+                                exp_links       => ["aaa"],
                         }],
                 rules           => <<EOF
 KERNEL=="ttyACM0", PROGRAM=="/bin/echo -e \\101", RESULT=="A", SYMLINK+="aaa"
@@ -297,7 +308,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
-                                exp_name        => "modem" ,
+                                exp_links       => ["modem"],
                         }],
                 rules           => <<EOF
 
@@ -318,7 +329,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
-                                exp_name        => "sub/direct/ory/modem" ,
+                                exp_links       => ["sub/direct/ory/modem"],
                         }],
                 rules           => <<EOF
 KERNEL=="ttyACM0", SYMLINK+="sub/direct/ory/modem"
@@ -329,7 +340,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5",
-                                exp_name        => "first_disk5" ,
+                                exp_links       => ["first_disk5"],
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="scsi", KERNELS=="0:0:0:0", SYMLINK+="first_disk%n"
@@ -340,7 +351,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5",
-                                exp_name        => "Major:8:minor:5:kernelnumber:5:id:0:0:0:0" ,
+                                exp_links       => ["Major:8:minor:5:kernelnumber:5:id:0:0:0:0"],
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="scsi", KERNELS=="0:0:0:0", SYMLINK+="Major:%M:minor:%m:kernelnumber:%n:id:%b"
@@ -351,7 +362,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                                exp_name        => "node12345678",
+                                exp_links       => ["node12345678"],
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="scsi", IMPORT{program}="/bin/echo -e \' TEST_KEY=12345678\\n  TEST_key2=98765\'", SYMLINK+="node\$env{TEST_KEY}"
@@ -363,7 +374,8 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                                exp_name        => "disk-ATA-sda" ,
+                                exp_links       => ["disk-ATA-sda"],
+                                not_exp_links   => ["modem"],
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="scsi", ATTRS{vendor}=="ATA", SYMLINK+="disk-%s{vendor}-%k"
@@ -375,8 +387,8 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5",
-                                exp_name        => "special-device-5" ,
-                                not_exp_name    => "not" ,
+                                exp_links       => ["special-device-5"],
+                                not_exp_links   => ["not"],
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="scsi", PROGRAM=="/bin/echo -n special-device", RESULT=="-special-*", SYMLINK+="not"
@@ -388,7 +400,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5",
-                                exp_name        => "newline_removed" ,
+                                exp_links       => ["newline_removed"],
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="scsi", PROGRAM=="/bin/echo test", RESULT=="test", SYMLINK+="newline_removed"
@@ -399,7 +411,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5",
-                                exp_name        => "test-0:0:0:0" ,
+                                exp_links       => ["test-0:0:0:0"],
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="scsi", PROGRAM=="/bin/echo -n test-%b", RESULT=="test-0:0*", SYMLINK+="%c"
@@ -410,7 +422,8 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5",
-                                exp_name        => "foo9" ,
+                                exp_links       => ["foo9"],
+                                not_exp_links   => ["foo3", "foo4", "foo5", "foo6", "foo7", "foo8"],
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="scsi", PROGRAM=="/bin/echo -n foo3 foo4 foo5 foo6 foo7 foo8 foo9", KERNEL=="sda5", SYMLINK+="%c{7}"
@@ -421,7 +434,8 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5",
-                                exp_name        => "bar9" ,
+                                exp_links       => ["bar9"],
+                                not_exp_links   => ["foo3", "foo4", "foo5", "foo6", "foo7", "foo8"],
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="scsi", PROGRAM=="/bin/sh -c 'echo foo3 foo4 foo5 foo6 foo7 foo8 foo9 | sed  s/foo9/bar9/'", KERNEL=="sda5", SYMLINK+="%c{7}"
@@ -432,7 +446,8 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5",
-                                exp_name        => "foo7" ,
+                                exp_links       => ["foo7"],
+                                not_exp_links   => ["foo3", "foo4", "foo5", "foo6", "foo8"],
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="scsi", PROGRAM=="/bin/echo -n 'foo3 foo4'   'foo5   foo6   foo7 foo8'", KERNEL=="sda5", SYMLINK+="%c{5}"
@@ -443,7 +458,8 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5",
-                                exp_name        => "foo2" ,
+                                exp_links       => ["foo2"],
+                                not_exp_links   => ["foo1"],
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="scsi", PROGRAM=="/bin/sh -c 'printf %%s \\\"foo1 foo2\\\" | grep \\\"foo1 foo2\\\"'", KERNEL=="sda5", SYMLINK+="%c{2}"
@@ -454,7 +470,8 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5",
-                                exp_name        => "foo2" ,
+                                exp_links       => ["foo2"],
+                                not_exp_links   => ["foo1"],
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="scsi", PROGRAM=="/bin/sh -c \\\"printf %%s 'foo1 foo2' | grep 'foo1 foo2'\\\"", KERNEL=="sda5", SYMLINK+="%c{2}"
@@ -465,7 +482,8 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5",
-                                exp_name        => "foo2" ,
+                                exp_links       => ["foo2"],
+                                not_exp_links   => ["foo1", "foo3"],
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="scsi", PROGRAM=="/bin/sh -c 'printf \\\"%%s %%s\\\" \\\"foo1 foo2\\\" \\\"foo3\\\"| grep \\\"foo1 foo2\\\"'", KERNEL=="sda5", SYMLINK+="%c{2}"
@@ -476,7 +494,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5",
-                                exp_name        => "my-foo9" ,
+                                exp_links       => ["my-foo9"],
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="scsi", PROGRAM=="/bin/echo -n foo3 foo4 foo5 foo6 foo7 foo8 foo9", KERNEL=="sda5", SYMLINK+="my-%c{7}"
@@ -487,7 +505,8 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5",
-                                exp_name        => "my-foo8" ,
+                                exp_links       => ["my-foo8"],
+                                not_exp_links   => ["my-foo3", "my-foo4", "my-foo5", "my-foo6", "my-foo7", "my-foo9"],
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="scsi", PROGRAM=="/bin/echo -n foo3 foo4 foo5 foo6 foo7 foo8 foo9", KERNEL=="sda5", SYMLINK+="my-%c{6}"
@@ -498,7 +517,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5",
-                                exp_name        => "Major:8-minor:5-kernelnumber:5-id:0:0:0:0",
+                                exp_links       => ["Major:8-minor:5-kernelnumber:5-id:0:0:0:0"],
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="scsi", KERNELS=="0:0:0:0", SYMLINK+="Major:\$major-minor:\$minor-kernelnumber:\$number-id:\$id"
@@ -509,7 +528,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5",
-                                exp_name        => "Major:8-minor:5-kernelnumber:5-id:0:0:0:0",
+                                exp_links       => ["Major:8-minor:5-kernelnumber:5-id:0:0:0:0"],
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="scsi", KERNELS=="0:0:0:0", DEVPATH=="*/sda/*", SYMLINK+="Major:\$major-minor:%m-kernelnumber:\$number-id:\$id"
@@ -520,7 +539,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5",
-                                exp_name        => "850:0:0:05" ,
+                                exp_links       => ["850:0:0:05"],
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="scsi", KERNELS=="0:0:0:0", DEVPATH=="*/sda/*", SYMLINK+="%M%m%b%n"
@@ -531,7 +550,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5",
-                                exp_name        => "855" ,
+                                exp_links       => ["855"],
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="scsi", KERNELS=="0:0:0:0", DEVPATH=="*/sda/*", SYMLINK+="\$major\$minor\$number"
@@ -542,7 +561,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5",
-                                exp_name        => "8550:0:0:0" ,
+                                exp_links       => ["8550:0:0:0"],
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="scsi", KERNELS=="0:0:0:0", DEVPATH=="*/sda/*", SYMLINK+="\$major%m%n\$id"
@@ -553,7 +572,8 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/virtual/tty/console",
-                                exp_name        => "TTY",
+                                exp_links       => ["TTY"],
+                                not_exp_links   => ["foo"],
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="scsi", PROGRAM=="/bin/echo -n foo", RESULT=="foo", SYMLINK+="foo"
@@ -565,7 +585,8 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/virtual/tty/console",
-                                exp_name        => "TTY" ,
+                                exp_links       => ["TTY"],
+                                not_exp_links   => ["foo"],
                         }],
                 rules                => <<EOF
 SUBSYSTEMS=="foo", ATTRS{dev}=="5:1", SYMLINK+="foo"
@@ -577,7 +598,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/virtual/tty/console",
-                                exp_name        => "foo" ,
+                                exp_links       => ["foo", "TTY"],
                         }],
                 rules           => <<EOF
 KERNEL=="console", SYMLINK+="TTY"
@@ -589,7 +610,8 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                                exp_name        => "empty" ,
+                                exp_links       => ["empty", "not-something"],
+                                not_exp_links   => ["something", "not-empty"],
                         }],
                 rules           => <<EOF
 KERNEL=="sda", ATTR{test_empty_file}=="?*", SYMLINK+="something"
@@ -603,7 +625,9 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                                exp_name        => "non-existent" ,
+                                exp_links       => ["non-existent", "wrong"],
+                                not_exp_links   => ["something", "empty", "not-empty",
+                                                    "not-something", "something"],
                         }],
                 rules           => <<EOF
 KERNEL=="sda", ATTR{nofile}=="?*", SYMLINK+="something"
@@ -619,7 +643,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                                exp_name        => "scsi-0:0:0:0" ,
+                                exp_links       => ["scsi-0:0:0:0"],
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="usb", PROGRAM=="/bin/echo -n usb-%b", SYMLINK+="%c"
@@ -632,7 +656,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
-                                exp_name        => "modem" ,
+                                exp_links       => ["modem"],
                         }],
                 rules           => <<EOF
 ATTRS{idProduct}=="007b", SYMLINK+="modem"
@@ -644,7 +668,8 @@ EOF
                         {
                                 devpath         => "/devices/virtual/block/fake!blockdev0",
                                 devnode         => "fake/blockdev0",
-                                exp_name        => "is/a/fake/blockdev0" ,
+                                exp_links       => ["is/a/fake/blockdev0"],
+                                not_exp_links       => ["is/not/a/fake/blockdev0", "modem"],
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="scsi", SYMLINK+="is/not/a/%k"
@@ -658,7 +683,7 @@ EOF
                         {
                                 devpath         => "/devices/virtual/block/fake!blockdev0",
                                 devnode         => "fake/blockdev0",
-                                exp_rem_error   => "yes",
+                                not_exp_links       => ["modem"],
                         }],
                 rules           => <<EOF
 KERNEL=="ttyACM0", SYMLINK+="modem"
@@ -669,7 +694,8 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                                exp_name        => "scsi-0:0:0:0",
+                                exp_links       => ["scsi-0:0:0:0"],
+                                not_exp_links       => ["no-match", "short-id", "not-scsi"],
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="usb", KERNELS=="0:0:0:0", SYMLINK+="not-scsi"
@@ -684,7 +710,8 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                                exp_name        => "scsi-0:0:0:0",
+                                exp_links       => ["scsi-0:0:0:0"],
+                                not_exp_links   => ["no-match", "before"],
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="scsi", KERNELS=="*:1", SYMLINK+="no-match"
@@ -699,7 +726,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                                exp_name        => "scsi-0:0:0:0",
+                                exp_links       => ["scsi-0:0:0:0", "before"],
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="scsi", KERNELS=="0:0:0:0", SYMLINK+="before"
@@ -711,7 +738,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                                exp_name        => "scsi-0:0:0:0",
+                                exp_links       => ["scsi-0:0:0:0", "before"],
                         }],
                 rules                => <<EOF
 SUBSYSTEMS=="scsi", KERNELS=="0:0:0:0", SYMLINK+="before"
@@ -723,7 +750,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                                exp_name        => "driver-is-sd",
+                                exp_links       => ["driver-is-sd"],
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="scsi", SYMLINK+="driver-is-\$attr{driver}"
@@ -734,7 +761,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                                exp_name        => "driver-is-ahci",
+                                exp_links       => ["driver-is-ahci"],
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="pci", SYMLINK+="driver-is-\$attr{driver}"
@@ -745,7 +772,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                                exp_name        => "ignored",
+                                exp_links       => ["ignored"],
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="scsi", ATTRS{whitespace_test}=="WHITE  SPACE", SYMLINK+="ignored"
@@ -756,7 +783,8 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                                exp_name        => "matched-with-space",
+                                exp_links       => ["matched-with-space"],
+                                not_exp_links   => ["wrong-to-ignore"],
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="scsi", ATTRS{whitespace_test}=="WHITE  SPACE ", SYMLINK+="wrong-to-ignore"
@@ -779,7 +807,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                                exp_name        => "node",
+                                exp_links       => ["node"],
                                 exp_perms       => "1::0600",
                         }],
                 rules           => <<EOF
@@ -791,7 +819,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                                exp_name        => "node",
+                                exp_links       => ["node"],
                                 exp_perms       => ":1:0660",
                         }],
                 rules           => <<EOF
@@ -803,7 +831,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                                exp_name        => "node",
+                                exp_links       => ["node"],
                                 exp_perms       => "daemon::0600",
                         }],
                 rules           => <<EOF
@@ -815,7 +843,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                                exp_name        => "node",
+                                exp_links       => ["node"],
                                 exp_perms       => ":daemon:0660",
                         }],
                 rules           => <<EOF
@@ -827,7 +855,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                                exp_name        => "node",
+                                exp_links       => ["node"],
                                 exp_perms       => "root:audio:0660",
                         }],
                 rules           => <<EOF
@@ -839,7 +867,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                                exp_name        => "node",
+                                exp_links       => ["node"],
                                 exp_perms       => "::0777",
                         }],
                 rules           => <<EOF
@@ -851,7 +879,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                                exp_name        => "node",
+                                exp_links       => ["node"],
                                 exp_perms       => "1:1:0777",
                         }],
                 rules           => <<EOF
@@ -950,7 +978,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                                exp_name        => "node",
+                                exp_links       => ["node"],
                                 exp_majorminor  => "8:0",
                         }],
                 rules           => <<EOF
@@ -962,7 +990,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/virtual/misc/misc-fake1",
-                                exp_name        => "node",
+                                exp_links       => ["node"],
                                 exp_majorminor  => "4095:1",
                         }],
                 rules                => <<EOF
@@ -974,7 +1002,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/virtual/misc/misc-fake89999",
-                                exp_name        => "node",
+                                exp_links       => ["node"],
                                 exp_majorminor  => "4095:89999",
                         }],
                 rules           => <<EOF
@@ -986,7 +1014,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
-                                exp_name        => "symlink2-ttyACM0",
+                                exp_links       => ["symlink1-0", "symlink2-ttyACM0", "symlink3-"],
                         }],
                 rules           => <<EOF
 KERNEL=="ttyACM[0-9]*", SYMLINK="symlink1-%n symlink2-%k symlink3-%b"
@@ -997,8 +1025,8 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
-                                exp_name        => "one",
-                                not_exp_name        => " ",
+                                exp_links       => ["one", "two"],
+                                not_exp_links       => [" "],
                         }],
                 rules           => <<EOF
 KERNEL=="ttyACM[0-9]*", SYMLINK="  one     two        "
@@ -1009,8 +1037,8 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
-                                exp_name        => "name-one_two_three-end",
-                                not_exp_name    => " ",
+                                exp_links       => ["name-one_two_three-end"],
+                                not_exp_links   => [" "],
                         }],
                 rules           => <<EOF
 ENV{WITH_WS}="one two three"
@@ -1022,8 +1050,8 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
-                                exp_name        => "name-one_two_three-end",
-                                not_exp_name    => " ",
+                                exp_links       => ["name-one_two_three-end"],
+                                not_exp_links   => [" "],
                         }],
                 rules           => <<EOF
 ENV{WITH_WS}="   one two three"
@@ -1035,8 +1063,8 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
-                                exp_name        => "name-one_two_three-end",
-                                not_exp_name    => " ",
+                                exp_links       => ["name-one_two_three-end"],
+                                not_exp_links   => [" "],
                         }],
                 rules           => <<EOF
 ENV{WITH_WS}="one two three   "
@@ -1048,8 +1076,8 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
-                                exp_name        => "name-one_two_three-end",
-                                not_exp_name    => " ",
+                                exp_links       => ["name-one_two_three-end"],
+                                not_exp_links   => [" "],
                         }],
                 rules           => <<EOF
 ENV{WITH_WS}="   one two three   "
@@ -1061,8 +1089,8 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
-                                exp_name        => "name-one_two_three-end",
-                                not_exp_name    => " ",
+                                exp_links       => ["name-one_two_three-end"],
+                                not_exp_links   => [" "],
                         }],
                 rules           => <<EOF
 ENV{WITH_WS}="   one  two  three   "
@@ -1070,12 +1098,12 @@ SYMLINK="name-\$env{WITH_WS}-end"
 EOF
         },
         {
-                desc            => "symlink with space and var with space, part 1",
+                desc            => "symlink with space and var with space",
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
-                                exp_name        => "first",
-                                not_exp_name    => " ",
+                                exp_links        => ["first"],
+                                not_exp_links    => [" "],
                         }],
                 rules           => <<EOF
 ENV{WITH_WS}="   one  two  three   "
@@ -1087,8 +1115,8 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
-                                exp_name        => "name-one_two_three-end",
-                                not_exp_name    => " ",
+                                exp_links        => ["name-one_two_three-end"],
+                                not_exp_links    => [" "],
                         }],
                 rules           => <<EOF
 ENV{WITH_WS}="   one  two  three   "
@@ -1100,8 +1128,8 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
-                                exp_name        => "another_symlink",
-                                not_exp_name    => " ",
+                                exp_links        => ["another_symlink"],
+                                not_exp_links    => [" "],
                         }],
                 rules           => <<EOF
 ENV{WITH_WS}="   one  two  three   "
@@ -1113,7 +1141,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
-                                exp_name        => "modem0",
+                                exp_links       => ["modem0"],
                         }],
                 rules           => <<EOF
 KERNEL=="ttyACM[0-9]*", SYMLINK+="ttyACM%n", SYMLINK="modem%n"
@@ -1124,7 +1152,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
-                                exp_name        => "second-0" ,
+                                exp_links       => ["first-0", "second-0", "third-0"],
                         }],
                 rules           => <<EOF
 KERNEL=="ttyACM0", SYMLINK="first-%n second-%n third-%n"
@@ -1135,7 +1163,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                                exp_name        => ".",
+                                exp_links       => ["."],
                                 exp_add_error        => "yes",
                                 exp_rem_error        => "yes",
                         }],
@@ -1148,7 +1176,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/virtual/tty/tty0",
-                                exp_name        => "link",
+                                exp_links       => ["link"],
                                 exp_add_error        => "yes",
                                 exp_rem_error        => "yes",
                         }],
@@ -1162,7 +1190,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
-                                exp_name        => "symlink0",
+                                exp_links       => ["symlink0"],
                         }],
                 rules           => <<EOF
 KERNEL=="ttyACM[0-9]*", SYMLINK+="ttyACM%n", SYMLINK+="symlink%n"
@@ -1173,7 +1201,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
-                                exp_name        => "symlink-ttyACM0",
+                                exp_links       => ["symlink-ttyACM0"],
                         }],
                 rules           => <<EOF
 KERNEL=="ttyACM[0-9]*", SYMLINK+="ttyACM%n", SYMLINK+="symlink-%k"
@@ -1184,7 +1212,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
-                                exp_name        => "major-166:0",
+                                exp_links       => ["major-166:0"],
                         }],
                 rules           => <<EOF
 KERNEL=="ttyACM[0-9]*", SYMLINK+="ttyACM%n", SYMLINK+="major-%M:%m"
@@ -1195,7 +1223,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                                exp_name        => "symlink-0:0:0:0",
+                                exp_links       => ["symlink-0:0:0:0"],
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="scsi", KERNEL=="sda", SYMLINK+="symlink-%b"
@@ -1206,7 +1234,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
-                                exp_name        => "test",
+                                exp_links       => ["test"],
                         }],
                 rules           => <<EOF
 KERNEL=="ttyACM[0-9]*", PROGRAM=="/bin/echo test", SYMLINK+="%c"
@@ -1217,7 +1245,8 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
-                                exp_name        => "test",
+                                exp_links       => ["test"],
+                                not_exp_links   => ["symlink", "this"],
                         }],
                 rules           => <<EOF
 KERNEL=="ttyACM[0-9]*", PROGRAM=="/bin/echo symlink test this", SYMLINK+="%c{2}"
@@ -1228,7 +1257,8 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
-                                exp_name        => "this",
+                                exp_links       => ["test", "this"],
+                                not_exp_links   => ["symlink"],
                         }],
                 rules           => <<EOF
 KERNEL=="ttyACM[0-9]*", PROGRAM=="/bin/echo symlink test this", SYMLINK+="%c{2+}"
@@ -1239,7 +1269,8 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                                exp_name        => "test",
+                                exp_links       => ["test", "this"],
+                                not_exp_links   => ["symlink"],
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="scsi", KERNEL=="sda", PROGRAM=="/bin/echo link test this" SYMLINK+="%c{2+}"
@@ -1250,7 +1281,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
-                                exp_name        => "166:0",
+                                exp_links       => ["166:0"],
                         }],
                 rules           => <<EOF
 KERNEL=="ttyACM[0-9]*", SYMLINK+="%s{dev}"
@@ -1261,7 +1292,8 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5",
-                                exp_name        => "link1",
+                                exp_links       => ["link1", "link2"],
+                                not_exp_links   => ["node"],
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="scsi", PROGRAM=="/bin/echo -n node link1 link2", RESULT=="node *", SYMLINK+="%c{2} %c{3}"
@@ -1272,7 +1304,8 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5",
-                                exp_name        => "link4",
+                                exp_links       => ["link1", "link2", "link3", "link4"],
+                                not_exp_links   => ["node"],
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="scsi", PROGRAM=="/bin/echo -n node link1 link2 link3 link4", RESULT=="node *", SYMLINK+="%c{2+}"
@@ -1283,7 +1316,8 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                                exp_name        => "node",
+                                exp_links       => ["node"],
+                                not_exp_links   => ["should_not_match", "should_not_match2"],
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="scsi", KERNEL=="sda", SYMLINK+="should_not_match", SUBSYSTEM=="vc"
@@ -1296,7 +1330,8 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                                exp_name        => "node",
+                                exp_links       => ["node"],
+                                not_exp_links   => ["should_not_match"]
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="scsi", KERNEL=="sda", SYMLINK+="should_not_match", DRIVERS=="sd-wrong"
@@ -1308,7 +1343,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                                exp_name        => "node",
+                                exp_links       => ["node"],
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="scsi", KERNEL=="sda", PROGRAM=="/usr/bin/test -b %N" SYMLINK+="node"
@@ -1319,7 +1354,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1",
-                                exp_name        => "sda-part-1",
+                                exp_links       => ["sda-part-1"],
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="scsi", KERNEL=="sda1", SYMLINK+="%P-part-1"
@@ -1330,7 +1365,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1",
-                                exp_name        => "start-/dev-end",
+                                exp_links       => ["start-/dev-end"],
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="scsi", KERNEL=="sda1", SYMLINK+="start-%r-end"
@@ -1341,7 +1376,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1",
-                                exp_name        => "last",
+                                exp_links       => ["last"],
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="scsi", KERNEL=="sda1", SYMLINK+="last", OPTIONS="last_rule"
@@ -1353,7 +1388,8 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1",
-                                exp_name        => "match",
+                                exp_links       => ["match", "before"],
+                                not_exp_links   => ["matches-but-is-negated"],
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="scsi", KERNEL!="sda1", SYMLINK+="matches-but-is-negated"
@@ -1366,7 +1402,8 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1",
-                                exp_name        => "not-anything",
+                                exp_links       => ["before", "not-anything"],
+                                not_exp_links   => ["matches-but-is-negated"],
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="scsi", SUBSYSTEM=="block", KERNEL!="sda1", SYMLINK+="matches-but-is-negated"
@@ -1379,7 +1416,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1",
-                                exp_name        => "nonzero-program",
+                                exp_links       => ["before", "nonzero-program"],
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="scsi", KERNEL=="sda1", SYMLINK+="before"
@@ -1391,7 +1428,8 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1",
-                                exp_name        => "true",
+                                exp_links       => ["true"],
+                                not_exp_links   => ["bad", "wrong"],
                         }],
                 rules           => <<EOF
 ENV{ENV_KEY_TEST}="test"
@@ -1405,7 +1443,8 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1",
-                                exp_name        => "true",
+                                exp_links       => ["true"],
+                                not_exp_links   => ["bad", "wrong", "no"],
                         }],
                 rules           => <<EOF
 ENV{ENV_KEY_TEST}="test"
@@ -1420,7 +1459,8 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1",
-                                exp_name        => "true",
+                                exp_links       => ["true", "before"],
+                                not_exp_links   => ["no"],
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="scsi", KERNEL=="sda1", ENV{ASSIGN}="true"
@@ -1434,7 +1474,8 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1",
-                                exp_name        => "true",
+                                exp_links       => ["true", "before"],
+                                not_exp_links   => ["no", "bad"],
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="scsi", KERNEL=="sda1", ENV{ASSIGN}="true"
@@ -1449,8 +1490,10 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1",
-                                exp_name        => "part",
-                        }],
+                                exp_links       => ["part"],
+                                not_exp_links   => ["disk"],
+                        },
+                    ],
                 rules           => <<EOF
 SUBSYSTEM=="block", KERNEL=="*[0-9]", ENV{PARTITION}="true", ENV{MAINDEVICE}="false"
 SUBSYSTEM=="block", KERNEL=="*[!0-9]", ENV{PARTITION}="false", ENV{MAINDEVICE}="true"
@@ -1464,7 +1507,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1",
-                                exp_name        => "sane",
+                                exp_links       => ["sane"],
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="scsi", KERNEL=="sda1", PROGRAM=="/bin/echo -e name; (/usr/bin/badprogram)", RESULT=="name_ _/usr/bin/badprogram_", SYMLINK+="sane"
@@ -1475,7 +1518,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1",
-                                exp_name        => "uber",
+                                exp_links       => ["uber"],
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="scsi", KERNEL=="sda1", PROGRAM=="/bin/echo -e \\xc3\\xbcber" RESULT=="\xc3\xbcber", SYMLINK+="uber"
@@ -1486,7 +1529,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1",
-                                exp_name        => "replaced",
+                                exp_links       => ["replaced"],
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="scsi", KERNEL=="sda1", PROGRAM=="/bin/echo -e \\xef\\xe8garbage", RESULT=="__garbage", SYMLINK+="replaced"
@@ -1497,7 +1540,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
-                                exp_name        => "serial-354172020305000",
+                                exp_links       => ["serial-354172020305000"],
                         }],
                 rules           => <<EOF
 KERNEL=="ttyACM*", ATTRS{serial}=="?*", SYMLINK+="serial-%s{serial}"
@@ -1508,7 +1551,8 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                                exp_name        => "ok",
+                                exp_links       => ["ok"],
+                                not_exp_links   => ["not-1-ok", "not-2-ok", "not-3-ok"],
                         }],
                 rules           => <<EOF
 KERNEL=="sda", ATTRS{nothing}!="", SYMLINK+="not-1-ok"
@@ -1522,7 +1566,8 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                                exp_name        => "ok",
+                                exp_links       => ["ok"],
+                                not_exp_links   => ["unknown-not-ok"],
                         }],
                 rules           => <<EOF
 ACTION=="unknown", KERNEL=="sda", SYMLINK+="unknown-not-ok"
@@ -1534,7 +1579,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                                exp_name        => "ok",
+                                exp_links       => ["ok"],
                                 exp_perms       => "root:tty:0640",
                         }],
                 rules           => <<EOF
@@ -1547,7 +1592,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                                exp_name        => "ok",
+                                exp_links       => ["ok"],
                                 exp_perms       => "root:tty:0640",
                         }],
                 rules           => <<EOF
@@ -1561,7 +1606,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                                exp_name        => "node-add-me",
+                                exp_links       => ["node-add-me"],
                         }],
                 rules           => <<EOF
 KERNEL=="sda", MODE="0666", SYMLINK+="node-\$env{ACTION}-me"
@@ -1572,8 +1617,8 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
-                                exp_name        => "three",
-                                not_exp_name    => "two",
+                                exp_links       => ["three"],
+                                not_exp_links   => ["two", "one"],
                         }],
                 rules           => <<EOF
 KERNEL=="ttyACM[0-9]*", SYMLINK+="one"
@@ -1586,8 +1631,8 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
-                                exp_name        => "right",
-                                not_exp_name    => "wrong",
+                                exp_links       => ["right"],
+                                not_exp_links   => ["wrong"],
                         }],
                 rules           => <<EOF
 KERNEL=="ttyACM[0-9]*", SYMLINK+="wrong"
@@ -1600,7 +1645,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
-                                exp_name        => "right",
+                                exp_links       => ["right", "before"],
                         }],
                 rules           => <<EOF
 KERNEL=="ttyACM*", SYMLINK+="before"
@@ -1612,7 +1657,8 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
-                                exp_name        => "right",
+                                exp_links       => ["right", "before"],
+                                not_exp_links   => ["nomatch"],
                         }],
                 rules           => <<EOF
 KERNEL=="dontknow*|*nothing", SYMLINK+="nomatch"
@@ -1625,7 +1671,8 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
-                                exp_name        => "right",
+                                exp_links       => ["right"],
+                                not_exp_links   => ["nomatch", "wrong1", "wrong2"],
                         }],
                 rules           => <<EOF
 KERNEL=="dontknow|nothing", SYMLINK+="nomatch"
@@ -1639,7 +1686,8 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
-                                exp_name        => "right",
+                                exp_links       => ["right"],
+                                not_exp_links   => ["nomatch", "wrong1", "wrong2", "wrong3"],
                         }],
                 rules           => <<EOF
 KERNEL=="dontknow|nothing", SYMLINK+="nomatch"
@@ -1654,7 +1702,7 @@ EOF
                devices => [
                        {
                                devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                               exp_name        => "found",
+                               exp_links       => ["found"],
                                not_exp_name    => "bad",
                        }],
                 rules           => <<EOF
@@ -1668,7 +1716,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                                exp_name        => "found",
+                                exp_links       => ["found"],
                                 not_exp_name    => "bad",
                        }],
                 rules           => <<EOF
@@ -1682,7 +1730,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                                exp_name        => "found",
+                                exp_links       => ["found"],
                                 not_exp_name    => "bad",
                         }],
                 rules           => <<EOF
@@ -1696,7 +1744,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                                exp_name        => "found",
+                                exp_links       => ["found"],
                                 not_exp_name    => "bad",
                         }],
                 rules           => <<EOF
@@ -1710,7 +1758,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                                exp_name        => "found",
+                                exp_links       => ["found"],
                                 not_exp_name    => "bad",
                         }],
                 rules           => <<EOF
@@ -1724,7 +1772,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                                exp_name        => "found",
+                                exp_links       => ["found"],
                                 not_exp_name    => "bad",
                         }],
                 rules           => <<EOF
@@ -1738,7 +1786,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                                exp_name        => "found",
+                                exp_links       => ["found"],
                                 not_exp_name    => "bad",
                         }],
                 rules           => <<EOF
@@ -1752,7 +1800,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                                exp_name        => "parent",
+                                exp_links       => ["parent"],
                         }],
                 option          => "keep",
                 rules           => <<EOF
@@ -1765,7 +1813,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1",
-                                exp_name        => "parentenv-parent_right",
+                                exp_links       => ["parentenv-parent_right"],
                         }],
                 option          => "clean",
                 rules           => <<EOF
@@ -1777,7 +1825,8 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1",
-                                exp_name        => "right",
+                                exp_links       => ["right"],
+                                not_exp_test    => ["wrong", "wrong2"],
                         }],
                 rules           => <<EOF
 KERNEL=="sda1", GOTO="TEST"
@@ -1794,7 +1843,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1",
-                                exp_name        => "right",
+                                exp_links       => ["right"],
                         }],
                 rules           => <<EOF
 KERNEL=="sda1", GOTO="does-not-exist"
@@ -1807,8 +1856,8 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1",
-                                exp_name        => "right",
-                                not_exp_name    => "wrong",
+                                exp_links       => ["right", "link"],
+                                not_exp_links   => ["wrong"],
                         }],
                 rules           => <<EOF
 KERNEL=="sda1", SYMLINK+="link"
@@ -1821,7 +1870,8 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1",
-                                exp_name        => "yes",
+                                exp_links       => ["yes"],
+                                not_exp_links   => ["no"],
                         }],
                 rules           => <<EOF
 KERNEL="sda1", SYMLINK+="no"
@@ -1833,7 +1883,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                                exp_name        => "yes",
+                                exp_links       => ["yes"],
                         }],
                 rules           => <<EOF
 KERNEL=="sda", ATTR{test:colon+plus}=="?*", SYMLINK+="yes"
@@ -1844,7 +1894,8 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1",
-                                exp_name        => "yes",
+                                exp_links       => ["yes"],
+                                not_exp_links   => ["no"],
                         }],
                 rules           => <<EOF
 # 012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
@@ -1858,7 +1909,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                                exp_name        => "00:16:41:e2:8d:ff",
+                                exp_links       => ["00:16:41:e2:8d:ff"],
                         }],
                 rules           => <<EOF
 KERNEL=="sda", SYMLINK+="\$attr{[net/eth0]address}"
@@ -1869,7 +1920,8 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                                exp_name        => "there",
+                                exp_links       => ["there"],
+                                not_exp_links   => ["notthere"],
                         }],
                 rules           => <<EOF
 TEST=="/etc/machine-id", SYMLINK+="there"
@@ -1881,7 +1933,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                                exp_name        => "yes",
+                                exp_links       => ["yes"],
                         }],
                 rules           => <<EOF
 KERNEL=="sda", TEST=="[net/eth0]", SYMLINK+="yes"
@@ -1892,7 +1944,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                                exp_name        => "relative",
+                                exp_links       => ["relative"],
                         }],
                 rules           => <<EOF
 KERNEL=="sda", TEST=="size", SYMLINK+="relative"
@@ -1903,7 +1955,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                                exp_name        => "found-subdir",
+                                exp_links       => ["found-subdir"],
                         }],
                 rules           => <<EOF
 KERNEL=="sda", TEST=="*/nr_requests", SYMLINK+="found-subdir"
@@ -1952,7 +2004,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                                exp_name        => "sda-8741C4G-end",
+                                exp_links       => ["sda-8741C4G-end"],
                                 exp_perms       => "0:0:0600",
                         }],
                 rules           => <<EOF
@@ -1966,7 +2018,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                                exp_name        => "disk/by-path/pci-0000:00:1f.2-scsi-0:0:0:0",
+                                exp_links       => ["disk/by-path/pci-0000:00:1f.2-scsi-0:0:0:0"],
                         }],
                 rules           => <<EOF
 KERNEL=="sda", IMPORT{builtin}="path_id"
@@ -1978,8 +2030,8 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                                exp_name        => "found",
-                                not_exp_name    => "bad" ,
+                                exp_links       => ["found"],
+                                not_exp_links   => ["bad"],
                         }],
                 rules           => <<EOF
 SUBSYSTEMS=="scsi", ATTRS{vendor}=="ATA", TAG+="green"
@@ -1992,7 +2044,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                                exp_name        => "found",
+                                exp_links       => ["found"],
                         }],
                 rules           => $rules_10k_tags . <<EOF
 TAGS=="test1", TAGS=="test500", TAGS=="test1234", TAGS=="test9999", TAGS=="test10000", SYMLINK+="found"
@@ -2003,7 +2055,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                                exp_name        => "found",
+                                exp_links       => ["found"],
                                 not_exp_name    => "bad",
                         }],
                 rules           => $rules_10k_tags_continuation . <<EOF
@@ -2026,7 +2078,7 @@ EOF
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                                exp_name        => "found",
+                                exp_links       => ["found"],
                                 not_exp_name    => "bad",
 
                         }],
@@ -2046,7 +2098,7 @@ TAGS=="aaa", SYMLINK+="bad"
                 devices => [
                         {
                                 devpath         => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
-                                exp_name        => "found",
+                                exp_links       => ["found"],
                                 not_exp_name    => "bad",
                         }],
                 rules           => <<EOF
@@ -2230,41 +2282,35 @@ sub check_devnode {
         return $devnode;
 }
 
-sub check_add {
-        my ($device) = @_;
-
-        if (defined($device->{not_exp_name})) {
-                if ((-e "$udev_dev/$device->{not_exp_name}") ||
-                    (-l "$udev_dev/$device->{not_exp_name}")) {
-                        print "nonexistent: error \'$device->{not_exp_name}\' not expected to be there\n";
-                        $error++;
-                        sleep(1);
-                }
-        }
+sub get_link_target {
+        my ($link) = @_;
 
-        my $devnode = check_devnode($device);
+        my $cwd = getcwd();
+        my $dir = "$udev_dev/$link";
+        my $tgt = readlink("$udev_dev/$link");
+        $dir =~ s!/[^/]*$!!;
+        $tgt = abs_path("$dir/$tgt");
+        $tgt =~ s!^$cwd/!!;
+        return $tgt;
+}
 
-        return if (!defined($device->{exp_name}));
+sub check_link_add {
+        my ($link, $devnode, $err_expected) = @_;
 
-        my @st = lstat("$udev_dev/$device->{exp_name}");
+        my @st = lstat("$udev_dev/$link");
         if (-l _) {
-                my $cwd = getcwd();
-                my $dir = "$udev_dev/$device->{exp_name}";
-                $dir =~ s!/[^/]*$!!;
-                my $tgt = readlink("$udev_dev/$device->{exp_name}");
-                $tgt = abs_path("$dir/$tgt");
-                $tgt =~ s!^$cwd/!!;
+                my $tgt = get_link_target($link);
 
                 if ($tgt ne $devnode) {
-                        print "symlink $device->{exp_name}:         error, found -> $tgt\n";
+                        print "symlink $link:         error, found -> $tgt\n";
                         $error++;
                         system("tree", "$udev_dev");
                 } else {
-                        print "symlink $device->{exp_name}:         ok\n";
+                        print "symlink $link:         ok\n";
                 }
         } else {
-                print "symlink $device->{exp_name}:         error";
-                if ($device->{exp_add_error}) {
+                print "symlink $link:         error";
+                if ($err_expected) {
                         print " as expected\n";
                 } else {
                         print "\n";
@@ -2276,6 +2322,49 @@ sub check_add {
         }
 }
 
+sub check_link_nonexistent {
+        my ($link, $devnode, $err_expected) = @_;
+
+        if ((-e "$udev_dev/$link") || (-l "$udev_dev/$link")) {
+                my $tgt = get_link_target($link);
+
+                if ($tgt ne $devnode) {
+                        print "nonexistent: '$link' points to other device (ok)\n";
+                } else {
+                        print "nonexistent: error \'$link\' should not be there";
+                        if ($err_expected) {
+                                print " (as expected)\n";
+                        } else {
+                                print "\n";
+                                system("tree", "$udev_dev");
+                                print "\n";
+                                $error++;
+                                sleep(1);
+                        }
+                }
+        } else {
+                print "nonexistent $link:         ok\n";
+        }
+}
+
+sub check_add {
+        my ($device) = @_;
+        my $devnode = check_devnode($device);
+
+        if (defined($device->{exp_links})) {
+                foreach my $link (@{$device->{exp_links}}) {
+                        check_link_add($link, $devnode,
+                                       $device->{exp_add_error});
+                }
+        }
+        if (defined $device->{not_exp_links}) {
+                foreach my $link (@{$device->{not_exp_links}}) {
+                        check_link_nonexistent($link, $devnode,
+                                               $device->{exp_nodev_error});
+                }
+        }
+}
+
 sub check_remove_devnode {
         my ($device) = @_;
         my $devnode = get_devnode($device);
@@ -2292,17 +2381,13 @@ sub check_remove_devnode {
         }
 }
 
-sub check_remove {
-        my ($device) = @_;
+sub check_link_remove {
+        my ($link, $err_expected) = @_;
 
-        check_remove_devnode($device);
-
-        return if (!defined($device->{exp_name}));
-
-        if ((-e "$udev_dev/$device->{exp_name}") ||
-            (-l "$udev_dev/$device->{exp_name}")) {
-                print "remove  $device->{exp_name}:      error";
-                if ($device->{exp_rem_error}) {
+        if ((-e "$udev_dev/$link") ||
+            (-l "$udev_dev/$link")) {
+                print "remove  $link:      error";
+                if ($err_expected) {
                         print " as expected\n";
                 } else {
                         print "\n";
@@ -2312,7 +2397,19 @@ sub check_remove {
                         sleep(1);
                 }
         } else {
-                print "remove  $device->{exp_name}:      ok\n";
+                print "remove  $link:      ok\n";
+        }
+}
+
+sub check_remove {
+        my ($device) = @_;
+
+        check_remove_devnode($device);
+
+        return if (!defined($device->{exp_links}));
+
+        foreach my $link (@{$device->{exp_links}}) {
+                check_link_remove($link, $device->{exp_rem_error});
         }
 }