2017-12-19 13:13:34 +03:00
#!/usr/bin/env perl
2003-11-23 16:47:28 +03:00
2008-09-29 04:00:17 +04:00
# udev test
2003-11-23 16:47:28 +03:00
#
# Provides automated testing of the udev binary.
# The whole test is self contained in this file, except the matching sysfs tree.
# Simply extend the @tests array, to add a new test variant.
#
# Every test is driven by its own temporary config file.
# This program prepares the environment, creates the config and calls udev.
#
2005-03-27 03:10:03 +04:00
# udev parses the rules, looks at the provided sysfs and
2003-11-23 16:47:28 +03:00
# first creates and then removes the device node.
# After creation and removal the result is checked against the
# expected value and the result is printed.
#
2018-06-12 18:15:23 +03:00
# Copyright © 2004 Leann Ogasawara <ogasawara@osdl.org>
2003-11-23 16:47:28 +03:00
use warnings ;
use strict ;
2020-11-17 19:13:31 +03:00
BEGIN {
my $ EXIT_TEST_SKIP = 77 ;
unless ( eval " use POSIX qw( WIFEXITED WEXITSTATUS ) ;
use Cwd qw( getcwd abs_path ) ;
use IPC::Semaphore ;
use IPC::SysV qw( IPC_PRIVATE S_IRUSR S_IWUSR IPC_CREAT ) ;
use Time::HiRes qw( usleep ) ; 1 " ) {
warn "Failed to import dependencies, skipping the test: $@" ;
exit ( $ EXIT_TEST_SKIP ) ;
}
}
2003-11-23 16:47:28 +03:00
2012-04-13 17:57:13 +04:00
my $ udev_bin = "./test-udev" ;
2012-01-10 04:34:15 +04:00
my $ valgrind = 0 ;
2015-03-25 14:28:15 +03:00
my $ gdb = 0 ;
2016-02-22 20:15:17 +03:00
my $ strace = 0 ;
2015-04-03 18:27:45 +03:00
my $ udev_bin_valgrind = "valgrind --tool=memcheck --leak-check=yes --track-origins=yes --quiet $udev_bin" ;
2015-03-25 14:28:15 +03:00
my $ udev_bin_gdb = "gdb --args $udev_bin" ;
2016-02-22 20:15:17 +03:00
my $ udev_bin_strace = "strace -efile $udev_bin" ;
2012-04-16 19:21:22 +04:00
my $ udev_run = "test/run" ;
2016-04-05 09:13:41 +03:00
my $ udev_tmpfs = "test/tmpfs" ;
2016-04-06 06:04:27 +03:00
my $ udev_sys = "${udev_tmpfs}/sys" ;
my $ udev_dev = "${udev_tmpfs}/dev" ;
2012-04-16 19:21:22 +04:00
my $ udev_rules_dir = "$udev_run/udev/rules.d" ;
my $ udev_rules = "$udev_rules_dir/udev-test.rules" ;
2014-12-10 12:20:11 +03:00
my $ EXIT_TEST_SKIP = 77 ;
2003-11-23 16:47:28 +03:00
2016-04-07 00:18:06 +03:00
my $ rules_10k_tags = "" ;
for ( my $ i = 1 ; $ i <= 10000 ; + + $ i ) {
2016-08-19 17:01:17 +03:00
$ rules_10k_tags . = 'KERNEL=="sda", TAG+="test' . $ i . "\"\n" ;
2016-04-07 00:18:06 +03:00
}
2019-02-19 03:21:42 +03:00
my $ rules_10k_tags_continuation = "KERNEL==\"sda\", \\\n" ;
for ( my $ i = 1 ; $ i < 10000 ; + + $ i ) {
$ rules_10k_tags_continuation . = 'TAG+="test' . $ i . "\",\\\n" ;
2019-02-18 04:38:29 +03:00
}
2019-02-19 03:21:42 +03:00
$ rules_10k_tags_continuation . = "TAG+=\"test10000\"\\n" ;
2019-02-18 04:38:29 +03:00
2018-04-25 10:54:26 +03:00
# Create a device list with all block devices under /sys
# (except virtual devices and cd-roms)
# the optional argument exp_func returns expected and non-expected
# symlinks for the device.
sub all_block_devs {
my ( $ exp_func ) = @ _ ;
my @ devices ;
foreach my $ bd ( glob "$udev_sys/dev/block/*" ) {
my $ tgt = readlink ( $ bd ) ;
my ( $ exp , $ notexp ) = ( undef , undef ) ;
next if ( $ tgt =~ m !/virtual/! || $ tgt =~ m !/sr[0-9]*$! ) ;
$ tgt =~ s!^\.\./\.\.!! ;
( $ exp , $ notexp ) = $ exp_func - > ( $ tgt ) if defined ( $ exp_func ) ;
my $ device = {
devpath = > $ tgt ,
exp_links = > $ exp ,
not_exp_links = > $ notexp ,
} ;
push ( @ devices , $ device ) ;
}
return \ @ devices ;
}
# This generator returns a suitable exp_func for use with
# all_block_devs().
sub expect_for_some {
my ( $ pattern , $ links , $ donot ) = @ _ ;
my $ _expect = sub {
my ( $ name ) = @ _ ;
if ( $ name =~ /$pattern/ ) {
return ( $ links , undef ) ;
} elsif ( $ donot ) {
return ( undef , $ links ) ;
} else {
return ( undef , undef ) ;
}
} ;
return $ _expect ;
}
2003-11-23 16:47:28 +03:00
my @ tests = (
2012-01-10 04:34:15 +04:00
{
desc = > "no rules" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
exp_rem_error = > "yes" ,
} ,
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1" ,
exp_rem_error = > "yes" ,
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
#
2008-11-12 07:50:05 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "label test of scsi disc" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "boot_disk" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2012-02-20 03:41:58 +04:00
SUBSYSTEMS == "scsi" , ATTRS { vendor } == "ATA" , SYMLINK += "boot_disk%n"
2010-01-27 11:30:48 +03:00
KERNEL == "ttyACM0" , SYMLINK += "modem"
2006-08-20 21:11:32 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "label test of scsi disc" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "boot_disk" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
SUBSYSTEMS == "scsi" , ATTRS { vendor } == "ATA" , SYMLINK += "boot_disk%n"
KERNEL == "ttyACM0" , SYMLINK += "modem"
2006-08-20 21:11:32 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "label test of scsi disc" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "boot_disk" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
SUBSYSTEMS == "scsi" , ATTRS { vendor } == "ATA" , SYMLINK += "boot_disk%n"
KERNEL == "ttyACM0" , SYMLINK += "modem"
2003-11-23 16:47:28 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "label test of scsi partition" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "boot_disk1" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
SUBSYSTEMS == "scsi" , ATTRS { vendor } == "ATA" , SYMLINK += "boot_disk%n"
2003-12-05 06:21:31 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "label test of pattern match" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "boot_disk1" , "boot_disk1-4" , "boot_disk1-5" ] ,
not_exp_links = > [ "boot_disk1-1" , "boot_disk1-2" , "boot_disk1-3" ]
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
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"
2018-04-24 18:15:58 +03:00
SUBSYSTEMS == "scsi" , ATTRS { vendor } == "AT?" , SYMLINK += "boot_disk%n-4"
SUBSYSTEMS == "scsi" , ATTRS { vendor } == "??A" , SYMLINK += "boot_disk%n-5"
2003-12-23 09:32:06 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "label test of multiple sysfs files" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "boot_disk1" ] ,
not_exp_links = > [ "boot_diskX1" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
SUBSYSTEMS == "scsi" , ATTRS { vendor } == "ATA" , ATTRS { model } == "ST910021AS X " , SYMLINK += "boot_diskX%n"
SUBSYSTEMS == "scsi" , ATTRS { vendor } == "ATA" , ATTRS { model } == "ST910021AS" , SYMLINK += "boot_disk%n"
2003-12-23 09:32:06 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "label test of max sysfs files (skip invalid rule)" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "boot_disk1" , "boot_diskXY1" ] ,
not_exp_links = > [ "boot_diskXX1" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
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"
2018-04-24 18:15:58 +03:00
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"
2010-01-27 11:30:48 +03:00
SUBSYSTEMS == "scsi" , ATTRS { vendor } == "ATA" , ATTRS { model } == "ST910021AS" , ATTRS { scsi_level } == "6" , ATTRS { rev } == "4.06" , ATTRS { type } == "0" , SYMLINK += "boot_disk%n"
2003-12-03 04:52:26 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "catch device by *" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "modem/0" , "catch-all" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
KERNEL == "ttyACM*" , SYMLINK += "modem/%n"
2018-04-24 18:15:58 +03:00
KERNEL == "*" , SYMLINK += "catch-all"
2004-02-12 11:49:52 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
2018-04-24 18:15:58 +03:00
# 10
2012-01-10 04:34:15 +04:00
{
desc = > "catch device by * - take 2" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "modem/0" ] ,
not_exp_links = > [ "bad" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
KERNEL == "*ACM1" , SYMLINK += "bad"
KERNEL == "*ACM0" , SYMLINK += "modem/%n"
2003-12-03 17:22:53 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "catch device by ?" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "modem/0" ] ,
not_exp_links = > [ "modem/0-1" , "modem/0-2" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
KERNEL == "ttyACM??*" , SYMLINK += "modem/%n-1"
KERNEL == "ttyACM??" , SYMLINK += "modem/%n-2"
KERNEL == "ttyACM?" , SYMLINK += "modem/%n"
2003-12-03 17:22:53 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "catch device by character class" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "modem/0" ] ,
not_exp_links = > [ "modem/0-1" , "modem/0-2" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
KERNEL == "ttyACM[A-Z]*" , SYMLINK += "modem/%n-1"
KERNEL == "ttyACM?[0-9]" , SYMLINK += "modem/%n-2"
KERNEL == "ttyACM[0-9]*" , SYMLINK += "modem/%n"
2003-11-23 16:47:28 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
2018-04-24 18:57:47 +03:00
desc = > "don't replace kernel name" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "modem" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
KERNEL == "ttyACM0" , SYMLINK += "modem"
2003-12-18 05:28:05 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
2018-04-24 18:57:47 +03:00
desc = > "Handle comment lines in config file (and don't replace kernel name)" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "modem" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2003-12-18 05:28:05 +03:00
# this is a comment
2010-01-27 11:30:48 +03:00
KERNEL == "ttyACM0" , SYMLINK += "modem"
2003-12-18 05:28:05 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
2018-04-24 18:57:47 +03:00
desc = > "Handle comment lines in config file with whitespace (and don't replace kernel name)" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "modem" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2012-01-06 17:34:40 +04:00
# this is a comment with whitespace before the comment
2010-01-27 11:30:48 +03:00
KERNEL == "ttyACM0" , SYMLINK += "modem"
2003-12-18 05:28:05 +03:00
2004-09-15 04:45:48 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
2018-04-24 18:57:47 +03:00
desc = > "Handle whitespace only lines (and don't replace kernel name)" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "whitespace" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2004-09-15 04:45:48 +04:00
2012-01-06 17:34:40 +04:00
# this is a comment with whitespace before the comment
2010-01-27 11:30:48 +03:00
KERNEL == "ttyACM0" , SYMLINK += "whitespace"
2004-09-15 04:45:48 +04:00
2012-01-06 17:34:40 +04:00
2004-09-15 04:45:48 +04:00
2003-12-18 05:28:05 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
2018-04-24 18:57:47 +03:00
desc = > "Handle empty lines in config file (and don't replace kernel name)" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "modem" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2003-12-18 05:28:05 +03:00
2010-01-27 11:30:48 +03:00
KERNEL == "ttyACM0" , SYMLINK += "modem"
2003-12-18 05:28:05 +03:00
2004-12-20 09:38:33 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
2018-04-24 18:57:47 +03:00
desc = > "Handle backslashed multi lines in config file (and don't replace kernel name)" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "modem" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2008-09-29 06:12:44 +04:00
KERNEL == "ttyACM0" , \ \
2010-01-27 11:30:48 +03:00
SYMLINK += "modem"
2004-12-20 09:38:33 +03:00
2005-02-26 04:52:04 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "preserve backslashes, if they are not for a newline" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "aaa" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2012-01-06 17:34:40 +04:00
KERNEL == "ttyACM0" , PROGRAM == "/bin/echo -e \\101" , RESULT == "A" , SYMLINK += "aaa"
2004-12-20 09:38:33 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
2018-04-24 18:57:47 +03:00
# 20
2012-01-10 04:34:15 +04:00
{
2018-04-24 18:57:47 +03:00
desc = > "Handle stupid backslashed multi lines in config file (and don't replace kernel name)" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "modem" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2004-12-20 09:38:33 +03:00
#
\ \
2008-10-17 15:54:50 +04:00
\ \
2004-12-20 09:38:33 +03:00
#\\
2008-09-29 06:12:44 +04:00
KERNEL == "ttyACM0" , \ \
2012-01-10 04:34:15 +04:00
SYMLINK += "modem"
2004-12-20 09:38:33 +03:00
2003-11-25 09:27:23 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "subdirectory handling" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "sub/direct/ory/modem" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
KERNEL == "ttyACM0" , SYMLINK += "sub/direct/ory/modem"
2003-11-23 16:47:28 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "parent device name match of scsi partition" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "first_disk5" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
SUBSYSTEMS == "scsi" , KERNELS == "0:0:0:0" , SYMLINK += "first_disk%n"
2006-08-20 21:11:32 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "test substitution chars" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "Major:8:minor:5:kernelnumber:5:id:0:0:0:0" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
SUBSYSTEMS == "scsi" , KERNELS == "0:0:0:0" , SYMLINK += "Major:%M:minor:%m:kernelnumber:%n:id:%b"
2005-06-25 20:58:49 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "import of shell-value returned from program" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "node12345678" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2012-01-06 17:34:40 +04:00
SUBSYSTEMS == "scsi" , IMPORT { program } = "/bin/echo -e \' TEST_KEY=12345678\\n TEST_key2=98765\'" , SYMLINK += "node\$env{TEST_KEY}"
2010-01-27 11:30:48 +03:00
KERNEL == "ttyACM0" , SYMLINK += "modem"
[PATCH] Adding '%s' format specifier to NAME and SYMLINK
On Thu, Feb 12, 2004 at 05:34:57PM -0800, Greg KH wrote:
> On Tue, Feb 10, 2004 at 09:14:20AM +0100, Hannes Reinecke wrote:
> > Hi all,
> >
> > this patch makes the format for NAME and SYMLINK a bit more flexible:
> > I've added a new format specifier '%s{<SYSFS_var>}', which allows for
> > the value of any sysfs entry found for this device to be inserted.
> > Example (for our S/390 fcp adapter):
> >
> > BUS="ccw", SYSFS_devtype="1732/03", NAME="%k" \
> > SYMLINK="zfcp-%s{hba_id}-%s{wwpn}:%s{fcp_lun}"
> >
> > I know this could also be done with an external program, but having this
> > incorporated into udev makes life easier, especially if run from
> > initramfs. Plus it makes the rules easier to follow, as the result is
> > directly visible and need not to be looked up in some external program.
> >
> > Comments etc. welcome.
>
> Oops, sorry I missed this for the 017 release. I'll look at it tomorrow
> and get back to you. At first glance it looks like a good thing.
>
> Oh, you forgot to update the documentation, that's important to do if
> you want this change to make it in :)
I took a part of the code and made a version that uses already implemented
attribute finding logic.
The parsing of the format length '%3x' and the '%x{attribute}' is a fuction now,
maybe there are more possible users in the future.
I've also added the test to udev-test.pl.
2004-02-17 08:36:34 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
2020-11-13 10:22:19 +03:00
desc = > "substitution of sysfs value (%s{file})" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "disk-ATA-sda" ] ,
not_exp_links = > [ "modem" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
SUBSYSTEMS == "scsi" , ATTRS { vendor } == "ATA" , SYMLINK += "disk-%s{vendor}-%k"
KERNEL == "ttyACM0" , SYMLINK += "modem"
2003-11-23 16:47:28 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "program result substitution" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "special-device-5" ] ,
not_exp_links = > [ "not" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2012-01-06 17:34:40 +04:00
SUBSYSTEMS == "scsi" , PROGRAM == "/bin/echo -n special-device" , RESULT == "-special-*" , SYMLINK += "not"
SUBSYSTEMS == "scsi" , PROGRAM == "/bin/echo -n special-device" , RESULT == "special-*" , SYMLINK += "%c-%n"
[PATCH] netdev - udevdb+dev.d changes
Here is a patch to change the netdev handling in the database and for
the dev.d/ calls. I applies on top of the udevd.patch, cause klibc has
no sysinfo().
o netdev's are also put into our database now. I want this for the
udevruler gui to get a list of all handled devices.
All devices in the db are stamped with the system uptime value at
the creation time. 'udevinfo -d' prints it.
o the DEVPATH value is the key for udevdb, but if we rename
a netdev, the name is replaced in the kernel, so we add
the changed name to the db to match with the remove event.
NOTE: The dev.d/ scripts still get the original name from the
hotplug call. Should we replace DEVPATH with the new name too?
o We now only add a device to the db, if we have successfully created
the main node or successfully renamed a netdev. This is the main part
of the patch, cause I needed to clean the retval passing trough all
the functions used for node creation.
o DEVNODE sounds a bit ugly for netdev's so I exported DEVNAME too.
Can we change the name?
o I've added a UDEV_NO_DEVD to possibly skip the script execution
and used it in udev-test.pl.
udevstart is the same horror now, if you have scripts with logging
statements in dev.d/ it takes minutes to finish, can we skip the
scripts here too?
o The get_device_type() function is changed to be more strict, cause
'udevinfo -a -p /block/' gets a class device for it and tries to
print the major/minor values.
o bugfix, the RESULT value has now a working newline removal and a test
for this case.
2004-04-01 11:12:57 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "program result substitution (newline removal)" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "newline_removed" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2012-01-06 17:34:40 +04:00
SUBSYSTEMS == "scsi" , PROGRAM == "/bin/echo test" , RESULT == "test" , SYMLINK += "newline_removed"
2003-11-24 09:25:13 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "program result substitution" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "test-0:0:0:0" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2012-01-06 17:34:40 +04:00
SUBSYSTEMS == "scsi" , PROGRAM == "/bin/echo -n test-%b" , RESULT == "test-0:0*" , SYMLINK += "%c"
2004-02-27 08:29:49 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "program with lots of arguments" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "foo9" ] ,
not_exp_links = > [ "foo3" , "foo4" , "foo5" , "foo6" , "foo7" , "foo8" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2012-01-06 17:34:40 +04:00
SUBSYSTEMS == "scsi" , PROGRAM == "/bin/echo -n foo3 foo4 foo5 foo6 foo7 foo8 foo9" , KERNEL == "sda5" , SYMLINK += "%c{7}"
2004-03-11 12:36:12 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "program with subshell" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "bar9" ] ,
not_exp_links = > [ "foo3" , "foo4" , "foo5" , "foo6" , "foo7" , "foo8" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2012-01-06 17:34:40 +04:00
SUBSYSTEMS == "scsi" , PROGRAM == "/bin/sh -c 'echo foo3 foo4 foo5 foo6 foo7 foo8 foo9 | sed s/foo9/bar9/'" , KERNEL == "sda5" , SYMLINK += "%c{7}"
2004-03-11 12:36:12 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "program arguments combined with apostrophes" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "foo7" ] ,
not_exp_links = > [ "foo3" , "foo4" , "foo5" , "foo6" , "foo8" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2012-01-06 17:34:40 +04:00
SUBSYSTEMS == "scsi" , PROGRAM == "/bin/echo -n 'foo3 foo4' 'foo5 foo6 foo7 foo8'" , KERNEL == "sda5" , SYMLINK += "%c{5}"
2017-09-28 09:53:46 +03:00
EOF
} ,
{
desc = > "program arguments combined with escaped double quotes, part 1" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "foo2" ] ,
not_exp_links = > [ "foo1" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2017-09-28 09:53:46 +03:00
rules = > << EOF
SUBSYSTEMS == "scsi" , PROGRAM == "/bin/sh -c 'printf %%s \\\"foo1 foo2\\\" | grep \\\"foo1 foo2\\\"'" , KERNEL == "sda5" , SYMLINK += "%c{2}"
EOF
} ,
{
desc = > "program arguments combined with escaped double quotes, part 2" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "foo2" ] ,
not_exp_links = > [ "foo1" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2017-09-28 09:53:46 +03:00
rules = > << EOF
SUBSYSTEMS == "scsi" , PROGRAM == "/bin/sh -c \\\"printf %%s 'foo1 foo2' | grep 'foo1 foo2'\\\"" , KERNEL == "sda5" , SYMLINK += "%c{2}"
EOF
} ,
{
desc = > "program arguments combined with escaped double quotes, part 3" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "foo2" ] ,
not_exp_links = > [ "foo1" , "foo3" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2017-09-28 09:53:46 +03:00
rules = > << EOF
SUBSYSTEMS == "scsi" , PROGRAM == "/bin/sh -c 'printf \\\"%%s %%s\\\" \\\"foo1 foo2\\\" \\\"foo3\\\"| grep \\\"foo1 foo2\\\"'" , KERNEL == "sda5" , SYMLINK += "%c{2}"
2004-03-04 11:55:22 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "characters before the %c{N} substitution" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "my-foo9" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2012-01-06 17:34:40 +04:00
SUBSYSTEMS == "scsi" , PROGRAM == "/bin/echo -n foo3 foo4 foo5 foo6 foo7 foo8 foo9" , KERNEL == "sda5" , SYMLINK += "my-%c{7}"
2004-03-04 11:55:22 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "substitute the second to last argument" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "my-foo8" ] ,
not_exp_links = > [ "my-foo3" , "my-foo4" , "my-foo5" , "my-foo6" , "my-foo7" , "my-foo9" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2012-01-06 17:34:40 +04:00
SUBSYSTEMS == "scsi" , PROGRAM == "/bin/echo -n foo3 foo4 foo5 foo6 foo7 foo8 foo9" , KERNEL == "sda5" , SYMLINK += "my-%c{6}"
2005-06-20 02:29:38 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "test substitution by variable name" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "Major:8-minor:5-kernelnumber:5-id:0:0:0:0" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
SUBSYSTEMS == "scsi" , KERNELS == "0:0:0:0" , SYMLINK += "Major:\$major-minor:\$minor-kernelnumber:\$number-id:\$id"
2005-06-20 02:29:38 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "test substitution by variable name 2" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "Major:8-minor:5-kernelnumber:5-id:0:0:0:0" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
SUBSYSTEMS == "scsi" , KERNELS == "0:0:0:0" , DEVPATH == "*/sda/*" , SYMLINK += "Major:\$major-minor:%m-kernelnumber:\$number-id:\$id"
2005-06-20 02:29:38 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "test substitution by variable name 3" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "850:0:0:05" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
SUBSYSTEMS == "scsi" , KERNELS == "0:0:0:0" , DEVPATH == "*/sda/*" , SYMLINK += "%M%m%b%n"
2005-06-20 02:29:38 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "test substitution by variable name 4" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "855" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
SUBSYSTEMS == "scsi" , KERNELS == "0:0:0:0" , DEVPATH == "*/sda/*" , SYMLINK += "\$major\$minor\$number"
2005-06-20 02:29:38 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "test substitution by variable name 5" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "8550:0:0:0" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
SUBSYSTEMS == "scsi" , KERNELS == "0:0:0:0" , DEVPATH == "*/sda/*" , SYMLINK += "\$major%m%n\$id"
2003-12-25 10:56:54 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "non matching SUBSYSTEMS for device with no parent" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/virtual/tty/console" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "TTY" ] ,
not_exp_links = > [ "foo" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2012-01-06 17:34:40 +04:00
SUBSYSTEMS == "scsi" , PROGRAM == "/bin/echo -n foo" , RESULT == "foo" , SYMLINK += "foo"
2010-01-27 11:30:48 +03:00
KERNEL == "console" , SYMLINK += "TTY"
2003-12-25 11:05:28 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "non matching SUBSYSTEMS" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/virtual/tty/console" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "TTY" ] ,
not_exp_links = > [ "foo" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
SUBSYSTEMS == "foo" , ATTRS { dev } == "5:1" , SYMLINK += "foo"
KERNEL == "console" , SYMLINK += "TTY"
2003-12-25 11:33:56 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "ATTRS match" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/virtual/tty/console" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "foo" , "TTY" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
KERNEL == "console" , SYMLINK += "TTY"
ATTRS { dev } == "5:1" , SYMLINK += "foo"
2009-02-05 14:40:15 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "ATTR (empty file)" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "empty" , "not-something" ] ,
not_exp_links = > [ "something" , "not-empty" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
KERNEL == "sda" , ATTR { test_empty_file } == "?*" , SYMLINK += "something"
KERNEL == "sda" , ATTR { test_empty_file } != "" , SYMLINK += "not-empty"
KERNEL == "sda" , ATTR { test_empty_file } == "" , SYMLINK += "empty"
KERNEL == "sda" , ATTR { test_empty_file } != "?*" , SYMLINK += "not-something"
2009-02-05 14:40:15 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "ATTR (non-existent file)" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "non-existent" , "wrong" ] ,
not_exp_links = > [ "something" , "empty" , "not-empty" ,
"not-something" , "something" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
KERNEL == "sda" , ATTR { nofile } == "?*" , SYMLINK += "something"
KERNEL == "sda" , ATTR { nofile } != "" , SYMLINK += "not-empty"
KERNEL == "sda" , ATTR { nofile } == "" , SYMLINK += "empty"
KERNEL == "sda" , ATTR { nofile } != "?*" , SYMLINK += "not-something"
KERNEL == "sda" , TEST != "nofile" , SYMLINK += "non-existent"
KERNEL == "sda" , SYMLINK += "wrong"
2003-11-27 04:45:26 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "program and bus type match" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "scsi-0:0:0:0" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2012-01-06 17:34:40 +04:00
SUBSYSTEMS == "usb" , PROGRAM == "/bin/echo -n usb-%b" , SYMLINK += "%c"
SUBSYSTEMS == "scsi" , PROGRAM == "/bin/echo -n scsi-%b" , SYMLINK += "%c"
SUBSYSTEMS == "foo" , PROGRAM == "/bin/echo -n foo-%b" , SYMLINK += "%c"
2004-02-17 08:44:28 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "sysfs parent hierarchy" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "modem" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
ATTRS { idProduct } == "007b" , SYMLINK += "modem"
2004-02-12 10:34:21 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "name test with ! in the name" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/virtual/block/fake!blockdev0" ,
2018-04-24 10:38:26 +03:00
devnode = > "fake/blockdev0" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "is/a/fake/blockdev0" ] ,
not_exp_links = > [ "is/not/a/fake/blockdev0" , "modem" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
SUBSYSTEMS == "scsi" , SYMLINK += "is/not/a/%k"
SUBSYSTEM == "block" , SYMLINK += "is/a/%k"
KERNEL == "ttyACM0" , SYMLINK += "modem"
2004-02-17 05:25:01 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "name test with ! in the name, but no matching rule" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/virtual/block/fake!blockdev0" ,
2018-04-24 10:38:26 +03:00
devnode = > "fake/blockdev0" ,
2018-04-24 18:15:58 +03:00
not_exp_links = > [ "modem" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
KERNEL == "ttyACM0" , SYMLINK += "modem"
2004-02-17 09:00:38 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "KERNELS rule" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "scsi-0:0:0:0" ] ,
not_exp_links = > [ "no-match" , "short-id" , "not-scsi" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
SUBSYSTEMS == "usb" , KERNELS == "0:0:0:0" , SYMLINK += "not-scsi"
SUBSYSTEMS == "scsi" , KERNELS == "0:0:0:1" , SYMLINK += "no-match"
SUBSYSTEMS == "scsi" , KERNELS == ":0" , SYMLINK += "short-id"
SUBSYSTEMS == "scsi" , KERNELS == "/0:0:0:0" , SYMLINK += "no-match"
SUBSYSTEMS == "scsi" , KERNELS == "0:0:0:0" , SYMLINK += "scsi-0:0:0:0"
2004-02-17 09:00:38 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "KERNELS wildcard all" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "scsi-0:0:0:0" ] ,
not_exp_links = > [ "no-match" , "before" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
SUBSYSTEMS == "scsi" , KERNELS == "*:1" , SYMLINK += "no-match"
SUBSYSTEMS == "scsi" , KERNELS == "*:0:1" , SYMLINK += "no-match"
SUBSYSTEMS == "scsi" , KERNELS == "*:0:0:1" , SYMLINK += "no-match"
SUBSYSTEMS == "scsi" , KERNEL == "0:0:0:0" , SYMLINK += "before"
SUBSYSTEMS == "scsi" , KERNELS == "*" , SYMLINK += "scsi-0:0:0:0"
2004-02-17 09:00:38 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "KERNELS wildcard partial" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "scsi-0:0:0:0" , "before" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
SUBSYSTEMS == "scsi" , KERNELS == "0:0:0:0" , SYMLINK += "before"
SUBSYSTEMS == "scsi" , KERNELS == "*:0" , SYMLINK += "scsi-0:0:0:0"
2004-02-17 09:00:38 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "KERNELS wildcard partial 2" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "scsi-0:0:0:0" , "before" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
rules = > << EOF
2010-01-27 11:30:48 +03:00
SUBSYSTEMS == "scsi" , KERNELS == "0:0:0:0" , SYMLINK += "before"
SUBSYSTEMS == "scsi" , KERNELS == "*:0:0:0" , SYMLINK += "scsi-0:0:0:0"
2006-09-05 04:18:06 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "substitute attr with link target value (first match)" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "driver-is-sd" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
SUBSYSTEMS == "scsi" , SYMLINK += "driver-is-\$attr{driver}"
2006-09-05 04:18:06 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "substitute attr with link target value (currently selected device)" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "driver-is-ahci" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
SUBSYSTEMS == "pci" , SYMLINK += "driver-is-\$attr{driver}"
2004-03-05 05:59:13 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "ignore ATTRS attribute whitespace" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "ignored" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
SUBSYSTEMS == "scsi" , ATTRS { whitespace_test } == "WHITE SPACE" , SYMLINK += "ignored"
2004-03-05 05:59:13 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "do not ignore ATTRS attribute whitespace" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "matched-with-space" ] ,
not_exp_links = > [ "wrong-to-ignore" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
SUBSYSTEMS == "scsi" , ATTRS { whitespace_test } == "WHITE SPACE " , SYMLINK += "wrong-to-ignore"
SUBSYSTEMS == "scsi" , ATTRS { whitespace_test } == "WHITE SPACE " , SYMLINK += "matched-with-space"
2004-03-11 12:39:53 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "permissions USER=bad GROUP=name" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/virtual/tty/tty33" ,
exp_perms = > "0:0:0600" ,
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2012-04-16 19:21:22 +04:00
KERNEL == "tty33" , OWNER = "bad" , GROUP = "name"
2004-04-16 10:14:49 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
2014-09-20 20:12:53 +04:00
desc = > "permissions OWNER=1" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "node" ] ,
2018-04-20 23:38:30 +03:00
exp_perms = > "1::0600" ,
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2014-09-20 20:12:53 +04:00
SUBSYSTEMS == "scsi" , KERNEL == "sda" , SYMLINK += "node" , OWNER = "1"
2004-04-16 10:14:49 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
2014-09-20 20:12:53 +04:00
desc = > "permissions GROUP=1" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "node" ] ,
2018-04-20 23:38:30 +03:00
exp_perms = > ":1:0660" ,
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2014-09-20 20:12:53 +04:00
SUBSYSTEMS == "scsi" , KERNEL == "sda" , SYMLINK += "node" , GROUP = "1"
2005-03-19 01:52:41 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "textual user id" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "node" ] ,
2018-04-20 23:38:30 +03:00
exp_perms = > "daemon::0600" ,
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2018-02-21 10:34:42 +03:00
SUBSYSTEMS == "scsi" , KERNEL == "sda" , SYMLINK += "node" , OWNER = "daemon"
2005-03-19 01:52:41 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "textual group id" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "node" ] ,
2018-04-20 23:38:30 +03:00
exp_perms = > ":daemon:0660" ,
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
SUBSYSTEMS == "scsi" , KERNEL == "sda" , SYMLINK += "node" , GROUP = "daemon"
2005-03-19 03:45:03 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "textual user/group id" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "node" ] ,
2018-04-20 23:38:30 +03:00
exp_perms = > "root:audio:0660" ,
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2020-09-04 19:09:20 +03:00
SUBSYSTEMS == "scsi" , KERNEL == "sda" , SYMLINK += "node" , OWNER = "root" , GROUP = "audio"
2004-04-16 10:14:49 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "permissions MODE=0777" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "node" ] ,
2018-04-20 23:38:30 +03:00
exp_perms = > "::0777" ,
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
SUBSYSTEMS == "scsi" , KERNEL == "sda" , SYMLINK += "node" , MODE = "0777"
2004-04-16 10:14:49 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
2014-09-20 20:12:53 +04:00
desc = > "permissions OWNER=1 GROUP=1 MODE=0777" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "node" ] ,
2018-04-20 23:38:30 +03:00
exp_perms = > "1:1:0777" ,
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2014-09-20 20:12:53 +04:00
SUBSYSTEMS == "scsi" , KERNEL == "sda" , SYMLINK += "node" , OWNER = "1" , GROUP = "1" , MODE = "0777"
2004-04-16 10:14:49 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
2014-09-20 20:12:53 +04:00
desc = > "permissions OWNER to 1" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0" ,
exp_perms = > "1::" ,
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2014-09-20 20:12:53 +04:00
KERNEL == "ttyACM[0-9]*" , SYMLINK += "ttyACM%n" , OWNER = "1"
2004-04-16 10:14:49 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
2014-09-20 20:12:53 +04:00
desc = > "permissions GROUP to 1" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0" ,
exp_perms = > ":1:0660" ,
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2014-09-20 20:12:53 +04:00
KERNEL == "ttyACM[0-9]*" , SYMLINK += "ttyACM%n" , GROUP = "1"
2004-04-16 10:14:49 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "permissions MODE to 0060" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0" ,
exp_perms = > "::0060" ,
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
KERNEL == "ttyACM[0-9]*" , SYMLINK += "ttyACM%n" , MODE = "0060"
2004-04-16 10:14:49 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "permissions OWNER, GROUP, MODE" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0" ,
exp_perms = > "1:1:0777" ,
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2014-09-20 20:12:53 +04:00
KERNEL == "ttyACM[0-9]*" , SYMLINK += "ttyACM%n" , OWNER = "1" , GROUP = "1" , MODE = "0777"
2004-12-21 01:44:57 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "permissions only rule" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0" ,
exp_perms = > "1:1:0777" ,
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2014-09-20 20:12:53 +04:00
KERNEL == "ttyACM[0-9]*" , OWNER = "1" , GROUP = "1" , MODE = "0777"
KERNEL == "ttyUSX[0-9]*" , OWNER = "2" , GROUP = "2" , MODE = "0444"
2010-01-27 11:30:48 +03:00
KERNEL == "ttyACM[0-9]*" , SYMLINK += "ttyACM%n"
2004-12-21 02:19:34 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "multiple permissions only rule" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0" ,
exp_perms = > "1:1:0777" ,
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2014-09-20 20:12:53 +04:00
SUBSYSTEM == "tty" , OWNER = "1"
SUBSYSTEM == "tty" , GROUP = "1"
2005-03-13 07:46:31 +03:00
SUBSYSTEM == "tty" , MODE = "0777"
2014-09-20 20:12:53 +04:00
KERNEL == "ttyUSX[0-9]*" , OWNER = "2" , GROUP = "2" , MODE = "0444"
2010-01-27 11:30:48 +03:00
KERNEL == "ttyACM[0-9]*" , SYMLINK += "ttyACM%n"
2004-12-21 02:19:34 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "permissions only rule with override at SYMLINK+ rule" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0" ,
exp_perms = > "1:2:0777" ,
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2014-09-20 20:12:53 +04:00
SUBSYSTEM == "tty" , OWNER = "1"
SUBSYSTEM == "tty" , GROUP = "1"
2005-03-13 07:46:31 +03:00
SUBSYSTEM == "tty" , MODE = "0777"
2014-09-20 20:12:53 +04:00
KERNEL == "ttyUSX[0-9]*" , OWNER = "2" , GROUP = "2" , MODE = "0444"
KERNEL == "ttyACM[0-9]*" , SYMLINK += "ttyACM%n" , GROUP = "2"
2004-03-13 04:13:59 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "major/minor number test" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "node" ] ,
2018-04-20 23:38:30 +03:00
exp_majorminor = > "8:0" ,
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
SUBSYSTEMS == "scsi" , KERNEL == "sda" , SYMLINK += "node"
2004-03-13 05:00:39 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "big major number test" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/virtual/misc/misc-fake1" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "node" ] ,
2018-04-20 23:38:30 +03:00
exp_majorminor = > "4095:1" ,
} ] ,
rules = > << EOF
2010-01-27 11:30:48 +03:00
KERNEL == "misc-fake1" , SYMLINK += "node"
2004-03-13 05:00:39 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "big major and big minor number test" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/virtual/misc/misc-fake89999" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "node" ] ,
2018-04-20 23:38:30 +03:00
exp_majorminor = > "4095:89999" ,
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
KERNEL == "misc-fake89999" , SYMLINK += "node"
2004-10-30 15:29:52 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "multiple symlinks with format char" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "symlink1-0" , "symlink2-ttyACM0" , "symlink3-" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
KERNEL == "ttyACM[0-9]*" , SYMLINK = "symlink1-%n symlink2-%k symlink3-%b"
2005-07-08 01:43:13 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "multiple symlinks with a lot of s p a c e s" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "one" , "two" ] ,
not_exp_links = > [ " " ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
KERNEL == "ttyACM[0-9]*" , SYMLINK = " one two "
2017-01-26 04:24:52 +03:00
EOF
} ,
{
desc = > "symlink with spaces in substituted variable" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "name-one_two_three-end" ] ,
not_exp_links = > [ " " ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2017-01-26 04:24:52 +03:00
rules = > << EOF
ENV { WITH_WS } = "one two three"
SYMLINK = "name-\$env{WITH_WS}-end"
EOF
} ,
{
desc = > "symlink with leading space in substituted variable" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "name-one_two_three-end" ] ,
not_exp_links = > [ " " ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2017-01-26 04:24:52 +03:00
rules = > << EOF
ENV { WITH_WS } = " one two three"
SYMLINK = "name-\$env{WITH_WS}-end"
EOF
} ,
{
desc = > "symlink with trailing space in substituted variable" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "name-one_two_three-end" ] ,
not_exp_links = > [ " " ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2017-01-26 04:24:52 +03:00
rules = > << EOF
ENV { WITH_WS } = "one two three "
SYMLINK = "name-\$env{WITH_WS}-end"
EOF
} ,
{
desc = > "symlink with lots of space in substituted variable" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "name-one_two_three-end" ] ,
not_exp_links = > [ " " ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2017-01-26 04:24:52 +03:00
rules = > << EOF
ENV { WITH_WS } = " one two three "
SYMLINK = "name-\$env{WITH_WS}-end"
EOF
} ,
{
desc = > "symlink with multiple spaces in substituted variable" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "name-one_two_three-end" ] ,
not_exp_links = > [ " " ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2017-01-26 04:24:52 +03:00
rules = > << EOF
ENV { WITH_WS } = " one two three "
SYMLINK = "name-\$env{WITH_WS}-end"
EOF
} ,
{
2018-04-24 18:15:58 +03:00
desc = > "symlink with space and var with space" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0" ,
2018-04-24 19:27:25 +03:00
exp_links = > [ "first" , "name-one_two_three-end" ,
"another_symlink" , "a" , "b" , "c" ] ,
not_exp_links = > [ " " ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2017-01-26 04:24:52 +03:00
rules = > << EOF
ENV { WITH_WS } = " one two three "
SYMLINK = " first name-\$env{WITH_WS}-end another_symlink a b c "
2004-04-16 10:14:49 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "symlink creation (same directory)" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "modem0" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
KERNEL == "ttyACM[0-9]*" , SYMLINK += "ttyACM%n" , SYMLINK = "modem%n"
2004-04-16 10:14:49 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "multiple symlinks" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "first-0" , "second-0" , "third-0" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
KERNEL == "ttyACM0" , SYMLINK = "first-%n second-%n third-%n"
2004-04-16 10:14:49 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "symlink name '.'" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "." ] ,
2018-04-20 23:38:30 +03:00
exp_add_error = > "yes" ,
exp_rem_error = > "yes" ,
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
SUBSYSTEMS == "scsi" , KERNEL == "sda" , SYMLINK += "."
2004-04-16 10:14:49 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "symlink node to itself" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/virtual/tty/tty0" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "link" ] ,
2018-04-20 23:38:30 +03:00
exp_add_error = > "yes" ,
exp_rem_error = > "yes" ,
} ] ,
option = > "clean" ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
KERNEL == "tty0" , SYMLINK += "tty0"
2004-04-16 10:14:49 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "symlink %n substitution" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "symlink0" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
KERNEL == "ttyACM[0-9]*" , SYMLINK += "ttyACM%n" , SYMLINK += "symlink%n"
2004-04-16 10:14:49 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "symlink %k substitution" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "symlink-ttyACM0" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
KERNEL == "ttyACM[0-9]*" , SYMLINK += "ttyACM%n" , SYMLINK += "symlink-%k"
2004-04-16 10:14:49 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "symlink %M:%m substitution" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "major-166:0" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
KERNEL == "ttyACM[0-9]*" , SYMLINK += "ttyACM%n" , SYMLINK += "major-%M:%m"
2004-04-16 10:14:49 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "symlink %b substitution" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "symlink-0:0:0:0" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2012-01-01 07:21:15 +04:00
SUBSYSTEMS == "scsi" , KERNEL == "sda" , SYMLINK += "symlink-%b"
2004-04-16 10:14:49 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "symlink %c substitution" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "test" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2012-01-06 17:34:40 +04:00
KERNEL == "ttyACM[0-9]*" , PROGRAM == "/bin/echo test" , SYMLINK += "%c"
2004-04-16 10:14:49 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "symlink %c{N} substitution" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "test" ] ,
not_exp_links = > [ "symlink" , "this" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2012-01-06 17:34:40 +04:00
KERNEL == "ttyACM[0-9]*" , PROGRAM == "/bin/echo symlink test this" , SYMLINK += "%c{2}"
2004-04-16 10:14:49 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "symlink %c{N+} substitution" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "test" , "this" ] ,
not_exp_links = > [ "symlink" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2012-01-06 17:34:40 +04:00
KERNEL == "ttyACM[0-9]*" , PROGRAM == "/bin/echo symlink test this" , SYMLINK += "%c{2+}"
2004-04-16 10:14:49 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "symlink only rule with %c{N+}" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "test" , "this" ] ,
not_exp_links = > [ "symlink" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2012-01-06 17:34:40 +04:00
SUBSYSTEMS == "scsi" , KERNEL == "sda" , PROGRAM == "/bin/echo link test this" SYMLINK += "%c{2+}"
2004-04-16 10:14:49 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "symlink %s{filename} substitution" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "166:0" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
KERNEL == "ttyACM[0-9]*" , SYMLINK += "%s{dev}"
2004-04-16 10:14:49 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "program result substitution (numbered part of)" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "link1" , "link2" ] ,
not_exp_links = > [ "node" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2012-01-06 17:34:40 +04:00
SUBSYSTEMS == "scsi" , PROGRAM == "/bin/echo -n node link1 link2" , RESULT == "node *" , SYMLINK += "%c{2} %c{3}"
2004-04-16 10:14:49 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "program result substitution (numbered part of+)" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "link1" , "link2" , "link3" , "link4" ] ,
not_exp_links = > [ "node" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2012-01-06 17:34:40 +04:00
SUBSYSTEMS == "scsi" , PROGRAM == "/bin/echo -n node link1 link2 link3 link4" , RESULT == "node *" , SYMLINK += "%c{2+}"
2004-11-13 16:43:24 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "SUBSYSTEM match test" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "node" ] ,
not_exp_links = > [ "should_not_match" , "should_not_match2" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
SUBSYSTEMS == "scsi" , KERNEL == "sda" , SYMLINK += "should_not_match" , SUBSYSTEM == "vc"
SUBSYSTEMS == "scsi" , KERNEL == "sda" , SYMLINK += "node" , SUBSYSTEM == "block"
SUBSYSTEMS == "scsi" , KERNEL == "sda" , SYMLINK += "should_not_match2" , SUBSYSTEM == "vc"
2004-11-13 07:21:12 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "DRIVERS match test" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "node" ] ,
not_exp_links = > [ "should_not_match" ]
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
SUBSYSTEMS == "scsi" , KERNEL == "sda" , SYMLINK += "should_not_match" , DRIVERS == "sd-wrong"
SUBSYSTEMS == "scsi" , KERNEL == "sda" , SYMLINK += "node" , DRIVERS == "sd"
2005-02-09 06:37:32 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "devnode substitution test" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "node" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2012-01-01 07:21:15 +04:00
SUBSYSTEMS == "scsi" , KERNEL == "sda" , PROGRAM == "/usr/bin/test -b %N" SYMLINK += "node"
2005-02-10 11:03:55 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "parent node name substitution test" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "sda-part-1" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2018-04-24 19:09:50 +03:00
SUBSYSTEMS == "scsi" , KERNEL == "sda1" , SYMLINK += "%P-part-%n"
2005-02-10 11:03:55 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "udev_root substitution" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "start-/dev-end" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
SUBSYSTEMS == "scsi" , KERNEL == "sda1" , SYMLINK += "start-%r-end"
2005-03-13 00:55:08 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
2018-04-24 19:08:18 +03:00
# This is not supported any more
2012-01-10 04:34:15 +04:00
desc = > "last_rule option" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "last" ] ,
2018-04-24 19:08:18 +03:00
not_exp_links = > [ "very-last" ] ,
exp_nodev_error = > "yes" ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2006-08-20 21:11:32 +04:00
SUBSYSTEMS == "scsi" , KERNEL == "sda1" , SYMLINK += "last" , OPTIONS = "last_rule"
2010-01-27 11:30:48 +03:00
SUBSYSTEMS == "scsi" , KERNEL == "sda1" , SYMLINK += "very-last"
2005-03-13 07:46:31 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "negation KERNEL!=" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "match" , "before" ] ,
not_exp_links = > [ "matches-but-is-negated" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
SUBSYSTEMS == "scsi" , KERNEL != "sda1" , SYMLINK += "matches-but-is-negated"
SUBSYSTEMS == "scsi" , KERNEL == "sda1" , SYMLINK += "before"
SUBSYSTEMS == "scsi" , KERNEL != "xsda1" , SYMLINK += "match"
2005-03-13 07:46:31 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "negation SUBSYSTEM!=" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "before" , "not-anything" ] ,
not_exp_links = > [ "matches-but-is-negated" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
SUBSYSTEMS == "scsi" , SUBSYSTEM == "block" , KERNEL != "sda1" , SYMLINK += "matches-but-is-negated"
SUBSYSTEMS == "scsi" , KERNEL == "sda1" , SYMLINK += "before"
SUBSYSTEMS == "scsi" , SUBSYSTEM != "anything" , SYMLINK += "not-anything"
2005-03-13 07:46:31 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "negation PROGRAM!= exit code" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "before" , "nonzero-program" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
SUBSYSTEMS == "scsi" , KERNEL == "sda1" , SYMLINK += "before"
2012-01-06 17:34:40 +04:00
KERNEL == "sda1" , PROGRAM != "/bin/false" , SYMLINK += "nonzero-program"
2005-03-13 13:40:32 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "ENV{} test" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "true" ] ,
not_exp_links = > [ "bad" , "wrong" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2008-10-14 21:55:57 +04:00
ENV { ENV_KEY_TEST } = "test"
2010-01-27 11:30:48 +03:00
SUBSYSTEMS == "scsi" , KERNEL == "sda1" , ENV { ENV_KEY_TEST } == "go" , SYMLINK += "wrong"
SUBSYSTEMS == "scsi" , KERNEL == "sda1" , ENV { ENV_KEY_TEST } == "test" , SYMLINK += "true"
SUBSYSTEMS == "scsi" , KERNEL == "sda1" , ENV { ENV_KEY_TEST } == "bad" , SYMLINK += "bad"
2005-03-13 13:40:32 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "ENV{} test" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "true" ] ,
not_exp_links = > [ "bad" , "wrong" , "no" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2008-10-14 21:55:57 +04:00
ENV { ENV_KEY_TEST } = "test"
2010-01-27 11:30:48 +03:00
SUBSYSTEMS == "scsi" , KERNEL == "sda1" , ENV { ENV_KEY_TEST } == "go" , SYMLINK += "wrong"
SUBSYSTEMS == "scsi" , KERNEL == "sda1" , ENV { ENV_KEY_TEST } == "yes" , ENV { ACTION } == "add" , ENV { DEVPATH } == "*/block/sda/sdax1" , SYMLINK += "no"
SUBSYSTEMS == "scsi" , KERNEL == "sda1" , ENV { ENV_KEY_TEST } == "test" , ENV { ACTION } == "add" , ENV { DEVPATH } == "*/block/sda/sda1" , SYMLINK += "true"
SUBSYSTEMS == "scsi" , KERNEL == "sda1" , ENV { ENV_KEY_TEST } == "bad" , SYMLINK += "bad"
2005-08-16 06:25:20 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "ENV{} test (assign)" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "true" , "before" ] ,
not_exp_links = > [ "no" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2006-08-20 21:11:32 +04:00
SUBSYSTEMS == "scsi" , KERNEL == "sda1" , ENV { ASSIGN } = "true"
2010-01-27 11:30:48 +03:00
SUBSYSTEMS == "scsi" , KERNEL == "sda1" , ENV { ASSIGN } == "yes" , SYMLINK += "no"
SUBSYSTEMS == "scsi" , KERNEL == "sda1" , SYMLINK += "before"
SUBSYSTEMS == "scsi" , KERNEL == "sda1" , ENV { ASSIGN } == "true" , SYMLINK += "true"
2006-09-05 02:50:25 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "ENV{} test (assign 2 times)" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "true" , "before" ] ,
not_exp_links = > [ "no" , "bad" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2006-09-05 02:50:25 +04:00
SUBSYSTEMS == "scsi" , KERNEL == "sda1" , ENV { ASSIGN } = "true"
SUBSYSTEMS == "scsi" , KERNEL == "sda1" , ENV { ASSIGN } = "absolutely-\$env{ASSIGN}"
2010-01-27 11:30:48 +03:00
SUBSYSTEMS == "scsi" , KERNEL == "sda1" , SYMLINK += "before"
SUBSYSTEMS == "scsi" , KERNEL == "sda1" , ENV { ASSIGN } == "yes" , SYMLINK += "no"
2018-04-24 19:09:50 +03:00
SUBSYSTEMS == "scsi" , KERNEL == "sda1" , ENV { ASSIGN } == "true" , SYMLINK += "bad"
2010-01-27 11:30:48 +03:00
SUBSYSTEMS == "scsi" , KERNEL == "sda1" , ENV { ASSIGN } == "absolutely-true" , SYMLINK += "true"
2005-08-16 06:25:20 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "ENV{} test (assign2)" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "part" ] ,
not_exp_links = > [ "disk" ] ,
} ,
2018-04-24 19:09:50 +03:00
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
exp_links = > [ "disk" ] ,
not_exp_links = > [ "part" ] ,
} ,
2018-04-24 18:15:58 +03:00
] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2006-04-24 21:25:55 +04:00
SUBSYSTEM == "block" , KERNEL == "*[0-9]" , ENV { PARTITION } = "true" , ENV { MAINDEVICE } = "false"
SUBSYSTEM == "block" , KERNEL == "*[!0-9]" , ENV { PARTITION } = "false" , ENV { MAINDEVICE } = "true"
2010-01-27 11:30:48 +03:00
ENV { MAINDEVICE } == "true" , SYMLINK += "disk"
SUBSYSTEM == "block" , SYMLINK += "before"
ENV { PARTITION } == "true" , SYMLINK += "part"
2005-03-27 03:15:07 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "untrusted string sanitize" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "sane" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2012-01-06 17:34:40 +04:00
SUBSYSTEMS == "scsi" , KERNEL == "sda1" , PROGRAM == "/bin/echo -e name; (/usr/bin/badprogram)" , RESULT == "name_ _/usr/bin/badprogram_" , SYMLINK += "sane"
2005-08-28 17:55:58 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "untrusted string sanitize (don't replace utf8)" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "uber" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2012-01-06 17:34:40 +04:00
SUBSYSTEMS == "scsi" , KERNEL == "sda1" , PROGRAM == "/bin/echo -e \\xc3\\xbcber" RESULT == "\xc3\xbcber" , SYMLINK += "uber"
2005-08-28 17:55:58 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "untrusted string sanitize (replace invalid utf8)" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "replaced" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2012-01-06 17:34:40 +04:00
SUBSYSTEMS == "scsi" , KERNEL == "sda1" , PROGRAM == "/bin/echo -e \\xef\\xe8garbage" , RESULT == "__garbage" , SYMLINK += "replaced"
2005-03-28 13:22:17 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "read sysfs value from parent device" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "serial-354172020305000" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
KERNEL == "ttyACM*" , ATTRS { serial } == "?*" , SYMLINK += "serial-%s{serial}"
2005-03-28 14:20:05 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "match against empty key string" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "ok" ] ,
not_exp_links = > [ "not-1-ok" , "not-2-ok" , "not-3-ok" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
KERNEL == "sda" , ATTRS { nothing } != "" , SYMLINK += "not-1-ok"
KERNEL == "sda" , ATTRS { nothing } == "" , SYMLINK += "not-2-ok"
KERNEL == "sda" , ATTRS { vendor } != "" , SYMLINK += "ok"
KERNEL == "sda" , ATTRS { vendor } == "" , SYMLINK += "not-3-ok"
2005-04-02 19:45:35 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "check ACTION value" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "ok" ] ,
not_exp_links = > [ "unknown-not-ok" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
ACTION == "unknown" , KERNEL == "sda" , SYMLINK += "unknown-not-ok"
ACTION == "add" , KERNEL == "sda" , SYMLINK += "ok"
2005-06-05 06:57:03 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "final assignment" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "ok" ] ,
2018-04-20 23:38:30 +03:00
exp_perms = > "root:tty:0640" ,
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2008-10-17 15:54:50 +04:00
KERNEL == "sda" , GROUP: = "tty"
2018-04-24 19:09:50 +03:00
KERNEL == "sda" , GROUP = "root" , MODE = "0640" , SYMLINK += "ok"
2005-06-05 06:57:03 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "final assignment 2" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "ok" ] ,
2018-04-20 23:38:30 +03:00
exp_perms = > "root:tty:0640" ,
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2008-10-17 15:54:50 +04:00
KERNEL == "sda" , GROUP: = "tty"
2005-06-05 06:57:03 +04:00
SUBSYSTEM == "block" , MODE: = "640"
2018-04-24 19:09:50 +03:00
KERNEL == "sda" , GROUP = "root" , MODE = "0666" , SYMLINK += "ok"
2005-06-25 15:10:16 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "env substitution" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "node-add-me" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
KERNEL == "sda" , MODE = "0666" , SYMLINK += "node-\$env{ACTION}-me"
2005-06-05 07:13:33 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "reset list to current value" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "three" ] ,
not_exp_links = > [ "two" , "one" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2008-09-29 06:12:44 +04:00
KERNEL == "ttyACM[0-9]*" , SYMLINK += "one"
KERNEL == "ttyACM[0-9]*" , SYMLINK += "two"
KERNEL == "ttyACM[0-9]*" , SYMLINK = "three"
2009-01-30 05:53:09 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "test empty SYMLINK+ (empty override)" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "right" ] ,
not_exp_links = > [ "wrong" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
KERNEL == "ttyACM[0-9]*" , SYMLINK += "wrong"
KERNEL == "ttyACM[0-9]*" , SYMLINK = ""
KERNEL == "ttyACM[0-9]*" , SYMLINK += "right"
2005-07-12 14:52:56 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "test multi matches" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "right" , "before" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
KERNEL == "ttyACM*" , SYMLINK += "before"
KERNEL == "ttyACM*|nothing" , SYMLINK += "right"
2005-07-12 14:52:56 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "test multi matches 2" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "right" , "before" ] ,
not_exp_links = > [ "nomatch" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
KERNEL == "dontknow*|*nothing" , SYMLINK += "nomatch"
KERNEL == "ttyACM*" , SYMLINK += "before"
KERNEL == "dontknow*|ttyACM*|nothing*" , SYMLINK += "right"
2008-10-25 05:00:03 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "test multi matches 3" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "right" ] ,
not_exp_links = > [ "nomatch" , "wrong1" , "wrong2" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
KERNEL == "dontknow|nothing" , SYMLINK += "nomatch"
KERNEL == "dontknow|ttyACM0a|nothing|attyACM0" , SYMLINK += "wrong1"
KERNEL == "X|attyACM0|dontknow|ttyACM0a|nothing|attyACM0" , SYMLINK += "wrong2"
KERNEL == "dontknow|ttyACM0|nothing" , SYMLINK += "right"
2008-10-25 05:00:03 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "test multi matches 4" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "right" ] ,
not_exp_links = > [ "nomatch" , "wrong1" , "wrong2" , "wrong3" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
KERNEL == "dontknow|nothing" , SYMLINK += "nomatch"
KERNEL == "dontknow|ttyACM0a|nothing|attyACM0" , SYMLINK += "wrong1"
KERNEL == "X|attyACM0|dontknow|ttyACM0a|nothing|attyACM0" , SYMLINK += "wrong2"
KERNEL == "all|dontknow|ttyACM0" , SYMLINK += "right"
KERNEL == "ttyACM0a|nothing" , SYMLINK += "wrong3"
2019-09-11 03:06:15 +03:00
EOF
} ,
{
2018-04-20 23:38:30 +03:00
desc = > "test multi matches 5" ,
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "found" ] ,
2018-04-20 23:38:30 +03:00
not_exp_name = > "bad" ,
} ] ,
2019-09-11 03:06:15 +03:00
rules = > << EOF
KERNEL == "sda" , TAG = "foo"
TAGS == "|foo" , SYMLINK += "found"
TAGS == "|aaa" , SYMLINK += "bad"
EOF
} ,
{
desc = > "test multi matches 6" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "found" ] ,
2018-04-20 23:38:30 +03:00
not_exp_name = > "bad" ,
} ] ,
2019-09-11 03:06:15 +03:00
rules = > << EOF
KERNEL == "sda" , TAG = ""
TAGS == "|foo" , SYMLINK += "found"
TAGS == "aaa|bbb" , SYMLINK += "bad"
EOF
} ,
{
desc = > "test multi matches 7" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "found" ] ,
2018-04-20 23:38:30 +03:00
not_exp_name = > "bad" ,
} ] ,
2019-09-11 03:06:15 +03:00
rules = > << EOF
KERNEL == "sda" , TAG = "foo"
TAGS == "foo||bar" , SYMLINK += "found"
TAGS == "aaa||bbb" , SYMLINK += "bad"
EOF
} ,
{
desc = > "test multi matches 8" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "found" ] ,
2018-04-20 23:38:30 +03:00
not_exp_name = > "bad" ,
} ] ,
2019-09-11 03:06:15 +03:00
rules = > << EOF
KERNEL == "sda" , TAG = ""
TAGS == "foo||bar" , SYMLINK += "found"
TAGS == "aaa|bbb" , SYMLINK += "bad"
EOF
} ,
{
desc = > "test multi matches 9" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "found" ] ,
2018-04-20 23:38:30 +03:00
not_exp_name = > "bad" ,
} ] ,
2019-09-11 03:06:15 +03:00
rules = > << EOF
KERNEL == "sda" , TAG = "foo"
TAGS == "foo|" , SYMLINK += "found"
TAGS == "aaa|" , SYMLINK += "bad"
EOF
} ,
{
desc = > "test multi matches 10" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "found" ] ,
2018-04-20 23:38:30 +03:00
not_exp_name = > "bad" ,
} ] ,
2019-09-11 03:06:15 +03:00
rules = > << EOF
KERNEL == "sda" , TAG = ""
TAGS == "foo|" , SYMLINK += "found"
TAGS == "aaa|bbb" , SYMLINK += "bad"
2020-07-12 10:27:45 +03:00
EOF
} ,
{
desc = > "test multi matches 11" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "found" ] ,
2018-04-20 23:38:30 +03:00
not_exp_name = > "bad" ,
} ] ,
2020-07-12 10:27:45 +03:00
rules = > << EOF
KERNEL == "sda" , TAG = "c"
TAGS == "foo||bar||c" , SYMLINK += "found"
TAGS == "aaa||bbb||ccc" , SYMLINK += "bad"
2005-07-12 16:46:36 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
2018-04-24 19:30:09 +03:00
desc = > "IMPORT parent test" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "parent" ] ,
2018-04-24 19:30:09 +03:00
} ,
2018-04-20 23:38:30 +03:00
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "parentenv-parent_right" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2018-04-24 19:30:09 +03:00
sleep_us = > 500000 , # Serialized! We need to sleep here after adding sda
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
KERNEL == "sda1" , IMPORT { parent } = "PARENT*" , SYMLINK += "parentenv-\$env{PARENT_KEY}\$env{WRONG_PARENT_KEY}"
2018-04-24 19:30:09 +03:00
KERNEL == "sda" , IMPORT { program } = "/bin/echo -e \'PARENT_KEY=parent_right\\nWRONG_PARENT_KEY=parent_wrong'"
KERNEL == "sda" , SYMLINK += "parent"
2005-07-16 09:46:31 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "GOTO test" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "right" ] ,
not_exp_test = > [ "wrong" , "wrong2" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2005-07-16 09:46:31 +04:00
KERNEL == "sda1" , GOTO = "TEST"
2010-01-27 11:30:48 +03:00
KERNEL == "sda1" , SYMLINK += "wrong"
2008-10-23 02:13:59 +04:00
KERNEL == "sda1" , GOTO = "BAD"
2010-01-27 11:30:48 +03:00
KERNEL == "sda1" , SYMLINK += "" , LABEL = "NO"
KERNEL == "sda1" , SYMLINK += "right" , LABEL = "TEST" , GOTO = "end"
KERNEL == "sda1" , SYMLINK += "wrong2" , LABEL = "BAD"
2009-09-06 18:55:00 +04:00
LABEL = "end"
2009-05-13 20:01:32 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "GOTO label does not exist" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "right" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2009-05-13 20:01:32 +04:00
KERNEL == "sda1" , GOTO = "does-not-exist"
2010-01-27 11:30:48 +03:00
KERNEL == "sda1" , SYMLINK += "right" ,
2009-05-13 20:01:32 +04:00
LABEL = "exists"
2006-04-24 21:25:55 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "SYMLINK+ compare test" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "right" , "link" ] ,
not_exp_links = > [ "wrong" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
KERNEL == "sda1" , SYMLINK += "link"
KERNEL == "sda1" , SYMLINK == "link*" , SYMLINK += "right"
KERNEL == "sda1" , SYMLINK == "nolink*" , SYMLINK += "wrong"
2006-04-24 21:25:55 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "invalid key operation" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "yes" ] ,
not_exp_links = > [ "no" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
KERNEL = "sda1" , SYMLINK += "no"
KERNEL == "sda1" , SYMLINK += "yes"
2007-02-25 03:06:20 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "operator chars in attribute" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "yes" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
KERNEL == "sda" , ATTR { test:colon + plus } == "?*" , SYMLINK += "yes"
2006-08-13 06:23:16 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "overlong comment line" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "yes" ] ,
not_exp_links = > [ "no" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2006-08-13 06:23:16 +04:00
# 012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
2008-10-17 15:54:50 +04:00
# 012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
2010-01-27 11:30:48 +03:00
KERNEL == "sda1" , SYMLINK += = "no"
KERNEL == "sda1" , SYMLINK += "yes"
2007-06-03 14:29:46 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "magic subsys/kernel lookup" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "00:16:41:e2:8d:ff" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
KERNEL == "sda" , SYMLINK += "\$attr{[net/eth0]address}"
2007-08-16 14:45:31 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "TEST absolute path" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "there" ] ,
not_exp_links = > [ "notthere" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2014-12-11 16:17:35 +03:00
TEST == "/etc/machine-id" , SYMLINK += "there"
TEST != "/etc/machine-id" , SYMLINK += "notthere"
2007-08-16 14:45:31 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "TEST subsys/kernel lookup" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "yes" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
KERNEL == "sda" , TEST == "[net/eth0]" , SYMLINK += "yes"
2007-08-16 14:45:31 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "TEST relative path" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "relative" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
KERNEL == "sda" , TEST == "size" , SYMLINK += "relative"
2008-03-15 01:40:06 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "TEST wildcard substitution (find queue/nr_requests)" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "found-subdir" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2010-01-27 11:30:48 +03:00
KERNEL == "sda" , TEST == "*/nr_requests" , SYMLINK += "found-subdir"
2008-04-18 23:07:29 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "TEST MODE=0000" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
exp_perms = > "0:0:0000" ,
exp_rem_error = > "yes" ,
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2008-04-18 23:07:29 +04:00
KERNEL == "sda" , MODE = "0000"
2003-11-23 16:47:28 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "TEST PROGRAM feeds OWNER, GROUP, MODE" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
exp_perms = > "1:1:0400" ,
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2008-10-23 02:13:59 +04:00
KERNEL == "sda" , MODE = "666"
2014-09-20 20:12:53 +04:00
KERNEL == "sda" , PROGRAM == "/bin/echo 1 1 0400" , OWNER = "%c{1}" , GROUP = "%c{2}" , MODE = "%c{3}"
2008-05-19 11:05:20 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "TEST PROGRAM feeds MODE with overflow" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
exp_perms = > "0:0:0440" ,
exp_rem_error = > "yes" ,
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2008-10-23 02:13:59 +04:00
KERNEL == "sda" , MODE = "440"
2012-01-06 17:34:40 +04:00
KERNEL == "sda" , PROGRAM == "/bin/echo 0 0 0400letsdoabuffferoverflow0123456789012345789012345678901234567890" , OWNER = "%c{1}" , GROUP = "%c{2}" , MODE = "%c{3}"
2008-10-26 04:48:14 +03:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "magic [subsys/sysname] attribute substitution" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "sda-8741C4G-end" ] ,
2018-04-20 23:38:30 +03:00
exp_perms = > "0:0:0600" ,
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2012-02-20 03:41:58 +04:00
KERNEL == "sda" , SYMLINK += "%k-%s{[dmi/id]product_name}-end"
2011-08-05 04:00:30 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
{
desc = > "builtin path_id" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "disk/by-path/pci-0000:00:1f.2-scsi-0:0:0:0" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2012-01-10 04:34:15 +04:00
rules = > << EOF
2011-08-05 04:00:30 +04:00
KERNEL == "sda" , IMPORT { builtin } = "path_id"
KERNEL == "sda" , ENV { ID_PATH } == "?*" , SYMLINK += "disk/by-path/\$env{ID_PATH}"
2016-04-07 00:18:06 +03:00
EOF
} ,
{
desc = > "add and match tag" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "found" ] ,
not_exp_links = > [ "bad" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2016-04-07 00:18:06 +03:00
rules = > << EOF
SUBSYSTEMS == "scsi" , ATTRS { vendor } == "ATA" , TAG += "green"
TAGS == "green" , SYMLINK += "found"
TAGS == "blue" , SYMLINK += "bad"
EOF
} ,
{
desc = > "don't crash with lots of tags" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "found" ] ,
2018-04-20 23:38:30 +03:00
} ] ,
2016-04-07 00:18:06 +03:00
rules = > $ rules_10k_tags . << EOF
TAGS == "test1" , TAGS == "test500" , TAGS == "test1234" , TAGS == "test9999" , TAGS == "test10000" , SYMLINK += "found"
2019-02-18 04:38:29 +03:00
EOF
} ,
{
2019-02-19 03:22:45 +03:00
desc = > "continuations" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "found" ] ,
2018-04-20 23:38:30 +03:00
not_exp_name = > "bad" ,
} ] ,
2019-02-18 04:38:29 +03:00
rules = > $ rules_10k_tags_continuation . << EOF
TAGS == "test1" , TAGS == "test500" , TAGS == "test1234" , TAGS == "test9999" , TAGS == "test10000" , SYMLINK += "bad"
2019-02-19 03:22:45 +03:00
KERNEL == "sda" , \ \
# comment in continuation
TAG += "hoge1" , \ \
# space before comment
TAG += "hoge2" , \ \
# spaces before and after token are dropped
TAG += "hoge3" , \ \
2019-02-21 12:03:32 +03:00
\ \
\ \
2019-02-19 03:22:45 +03:00
TAG += "hoge4"
TAGS == "hoge1" , TAGS == "hoge2" , TAGS == "hoge3" , TAGS == "hoge4" , SYMLINK += "found"
2019-02-21 12:03:32 +03:00
EOF
} ,
{
desc = > "continuations with empty line" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "found" ] ,
2018-04-20 23:38:30 +03:00
not_exp_name = > "bad" ,
} ] ,
2019-02-21 12:03:32 +03:00
rules = > << EOF
# empty line finishes continuation
KERNEL == "sda" , TAG += "foo" \ \
KERNEL == "sdb" , TAG += "hoge"
KERNEL == "sda" , TAG += "aaa" \ \
KERNEL == "sdb" , TAG += "bbb"
TAGS == "foo" , SYMLINK += "found"
TAGS == "aaa" , SYMLINK += "bad"
2018-04-20 23:38:30 +03:00
EOF
2019-02-21 12:03:32 +03:00
} ,
{
desc = > "continuations with white only line" ,
2018-04-20 23:38:30 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda" ,
2018-04-24 18:15:58 +03:00
exp_links = > [ "found" ] ,
2018-04-20 23:38:30 +03:00
not_exp_name = > "bad" ,
} ] ,
2019-02-21 12:03:32 +03:00
rules = > << EOF
# space only line finishes continuation
KERNEL == "sda" , TAG += "foo" \ \
\ t
KERNEL == "sdb" , TAG += "hoge"
KERNEL == "sda" , TAG += "aaa" \ \
KERNEL == "sdb" , TAG += "bbb"
TAGS == "foo" , SYMLINK += "found"
TAGS == "aaa" , SYMLINK += "bad"
2018-04-24 23:04:55 +03:00
EOF
} ,
{
desc = > "multiple devices" ,
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1" ,
exp_links = > [ "part-1" ] ,
} ,
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5" ,
exp_links = > [ "part-5" ] ,
} ,
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda6" ,
exp_links = > [ "part-6" ] ,
} ,
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda7" ,
exp_links = > [ "part-7" ] ,
} ,
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda8" ,
exp_links = > [ "part-8" ] ,
} ,
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda9" ,
exp_links = > [ "part-9" ] ,
} ,
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda10" ,
exp_links = > [ "part-10" ] ,
} ,
] ,
rules = > << EOF
SUBSYSTEM == "block" , SUBSYSTEMS == "scsi" , KERNEL == "sda?*" , ENV { DEVTYPE } == "partition" , SYMLINK += "part-%n"
EOF
} ,
{
desc = > "multiple devices, same link name, positive prio" ,
2018-04-24 23:24:43 +03:00
repeat = > 100 ,
2018-04-24 23:04:55 +03:00
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1" ,
exp_links = > [ "part-1" ] ,
not_exp_links = > [ "partition" ] ,
} ,
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5" ,
exp_links = > [ "part-5" ] ,
not_exp_links = > [ "partition" ] ,
} ,
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda6" ,
not_exp_links = > [ "partition" ] ,
exp_links = > [ "part-6" ] ,
} ,
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda7" ,
exp_links = > [ "part-7" , "partition" ] ,
} ,
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda8" ,
not_exp_links = > [ "partition" ] ,
exp_links = > [ "part-8" ] ,
} ,
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda9" ,
not_exp_links = > [ "partition" ] ,
exp_links = > [ "part-9" ] ,
} ,
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda10" ,
not_exp_links = > [ "partition" ] ,
exp_links = > [ "part-10" ] ,
} ,
] ,
rules = > << EOF
SUBSYSTEM == "block" , SUBSYSTEMS == "scsi" , KERNEL == "sda?*" , ENV { DEVTYPE } == "partition" , SYMLINK += "part-%n"
SUBSYSTEM == "block" , SUBSYSTEMS == "scsi" , KERNEL == "sda?*" , ENV { DEVTYPE } == "partition" , SYMLINK += "partition"
KERNEL == "*7" , OPTIONS += "link_priority=10"
EOF
} ,
{
desc = > "multiple devices, same link name, negative prio" ,
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1" ,
exp_links = > [ "part-1" ] ,
not_exp_links = > [ "partition" ] ,
} ,
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5" ,
exp_links = > [ "part-5" ] ,
not_exp_links = > [ "partition" ] ,
} ,
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda6" ,
not_exp_links = > [ "partition" ] ,
exp_links = > [ "part-6" ] ,
} ,
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda7" ,
exp_links = > [ "part-7" , "partition" ] ,
} ,
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda8" ,
not_exp_links = > [ "partition" ] ,
exp_links = > [ "part-8" ] ,
} ,
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda9" ,
not_exp_links = > [ "partition" ] ,
exp_links = > [ "part-9" ] ,
} ,
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda10" ,
not_exp_links = > [ "partition" ] ,
exp_links = > [ "part-10" ] ,
} ,
] ,
rules = > << EOF
SUBSYSTEM == "block" , SUBSYSTEMS == "scsi" , KERNEL == "sda?*" , ENV { DEVTYPE } == "partition" , SYMLINK += "part-%n"
SUBSYSTEM == "block" , SUBSYSTEMS == "scsi" , KERNEL == "sda?*" , ENV { DEVTYPE } == "partition" , SYMLINK += "partition"
KERNEL != "*7" , OPTIONS += "link_priority=-10"
EOF
} ,
{
desc = > "multiple devices, same link name, positive prio, sleep" ,
devices = > [
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1" ,
exp_links = > [ "part-1" ] ,
not_exp_links = > [ "partition" ] ,
} ,
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5" ,
exp_links = > [ "part-5" ] ,
not_exp_links = > [ "partition" ] ,
} ,
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda6" ,
not_exp_links = > [ "partition" ] ,
exp_links = > [ "part-6" ] ,
} ,
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda7" ,
exp_links = > [ "part-7" , "partition" ] ,
} ,
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda8" ,
not_exp_links = > [ "partition" ] ,
exp_links = > [ "part-8" ] ,
} ,
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda9" ,
not_exp_links = > [ "partition" ] ,
exp_links = > [ "part-9" ] ,
} ,
{
devpath = > "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda10" ,
not_exp_links = > [ "partition" ] ,
exp_links = > [ "part-10" ] ,
} ,
] ,
sleep_us = > 10000 ,
rules = > << EOF
SUBSYSTEM == "block" , SUBSYSTEMS == "scsi" , KERNEL == "sda?*" , ENV { DEVTYPE } == "partition" , SYMLINK += "part-%n"
SUBSYSTEM == "block" , SUBSYSTEMS == "scsi" , KERNEL == "sda?*" , ENV { DEVTYPE } == "partition" , SYMLINK += "partition"
KERNEL == "*7" , OPTIONS += "link_priority=10"
2008-05-19 11:05:20 +04:00
EOF
2012-01-10 04:34:15 +04:00
} ,
2018-04-25 10:54:26 +03:00
{
desc = > 'all_block_devs' ,
generator = > expect_for_some ( "\\/sda6\$" , [ "blockdev" ] ) ,
repeat = > 10 ,
rules = > << EOF
SUBSYSTEM == "block" , SUBSYSTEMS == "scsi" , KERNEL == "sd*" , SYMLINK += "blockdev"
KERNEL == "sda6" , OPTIONS += "link_priority=10"
EOF
}
2003-11-23 16:47:28 +03:00
) ;
2018-04-23 22:58:12 +03:00
sub create_rules {
my ( $ rules ) = @ _ ;
2003-11-23 16:47:28 +03:00
2012-01-10 04:34:15 +04:00
# create temporary rules
2012-04-16 19:21:22 +04:00
system ( "mkdir" , "-p" , "$udev_rules_dir" ) ;
2012-01-10 04:34:15 +04:00
open CONF , ">$udev_rules" || die "unable to create rules file: $udev_rules" ;
print CONF $$ rules ;
close CONF ;
2018-04-23 22:58:12 +03:00
}
sub udev {
my ( $ action , $ devpath ) = @ _ ;
2003-11-23 16:47:28 +03:00
2012-01-10 04:34:15 +04:00
if ( $ valgrind > 0 ) {
2016-04-07 00:17:46 +03:00
return system ( "$udev_bin_valgrind $action $devpath" ) ;
2015-03-25 14:28:15 +03:00
} elsif ( $ gdb > 0 ) {
2016-04-07 00:17:46 +03:00
return system ( "$udev_bin_gdb $action $devpath" ) ;
2016-02-22 20:15:17 +03:00
} elsif ( $ strace > 0 ) {
2016-04-07 00:17:46 +03:00
return system ( "$udev_bin_strace $action $devpath" ) ;
2012-01-10 04:34:15 +04:00
} else {
2016-04-07 00:17:46 +03:00
return system ( "$udev_bin" , "$action" , "$devpath" ) ;
2012-01-10 04:34:15 +04:00
}
2003-11-23 16:47:28 +03:00
}
2003-11-24 08:17:34 +03:00
my $ error = 0 ;
2018-04-24 21:55:01 +03:00
my $ good = 0 ;
2018-04-26 15:07:27 +03:00
my $ exp_good = 0 ;
2003-12-03 19:13:53 +03:00
2004-04-16 10:14:49 +04:00
sub permissions_test {
2012-01-10 04:34:15 +04:00
my ( $ rules , $ uid , $ gid , $ mode ) = @ _ ;
2004-04-16 10:14:49 +04:00
2012-01-10 04:34:15 +04:00
my $ wrong = 0 ;
my $ userid ;
my $ groupid ;
2005-03-19 01:52:41 +03:00
2012-01-10 04:34:15 +04:00
$ rules - > { exp_perms } =~ m/^(.*):(.*):(.*)$/ ;
if ( $ 1 ne "" ) {
if ( defined ( getpwnam ( $ 1 ) ) ) {
$ userid = int ( getpwnam ( $ 1 ) ) ;
} else {
$ userid = $ 1 ;
}
if ( $ uid != $ userid ) { $ wrong = 1 ; }
}
if ( $ 2 ne "" ) {
if ( defined ( getgrnam ( $ 2 ) ) ) {
$ groupid = int ( getgrnam ( $ 2 ) ) ;
} else {
$ groupid = $ 2 ;
}
if ( $ gid != $ groupid ) { $ wrong = 1 ; }
}
if ( $ 3 ne "" ) {
if ( ( $ mode & 07777 ) != oct ( $ 3 ) ) { $ wrong = 1 ; } ;
}
if ( $ wrong == 0 ) {
print "permissions: ok\n" ;
2018-04-24 21:55:01 +03:00
$ good + + ;
2012-01-10 04:34:15 +04:00
} else {
printf " expected permissions are: %s:%s:%#o\n" , $ 1 , $ 2 , oct ( $ 3 ) ;
printf " created permissions are : %i:%i:%#o\n" , $ uid , $ gid , $ mode & 07777 ;
print "permissions: error\n" ;
$ error + + ;
sleep ( 1 ) ;
}
2004-04-16 10:14:49 +04:00
}
sub major_minor_test {
2012-01-10 04:34:15 +04:00
my ( $ rules , $ rdev ) = @ _ ;
2004-04-16 10:14:49 +04:00
2012-01-10 04:34:15 +04:00
my $ major = ( $ rdev >> 8 ) & 0xfff ;
my $ minor = ( $ rdev & 0xff ) | ( ( $ rdev >> 12 ) & 0xfff00 ) ;
my $ wrong = 0 ;
2004-04-16 10:14:49 +04:00
2012-01-10 04:34:15 +04:00
$ rules - > { exp_majorminor } =~ m/^(.*):(.*)$/ ;
if ( $ 1 ne "" ) {
if ( $ major != $ 1 ) { $ wrong = 1 ; } ;
}
if ( $ 2 ne "" ) {
if ( $ minor != $ 2 ) { $ wrong = 1 ; } ;
}
if ( $ wrong == 0 ) {
print "major:minor: ok\n" ;
2018-04-24 21:55:01 +03:00
$ good + + ;
2012-01-10 04:34:15 +04:00
} else {
printf " expected major:minor is: %i:%i\n" , $ 1 , $ 2 ;
printf " created major:minor is : %i:%i\n" , $ major , $ minor ;
print "major:minor: error\n" ;
$ error + + ;
sleep ( 1 ) ;
}
2004-04-16 10:14:49 +04:00
}
2012-04-16 19:21:22 +04:00
sub udev_setup {
2018-04-26 14:25:11 +03:00
system ( "umount \"$udev_tmpfs\" 2>/dev/null" ) ;
2016-04-06 06:04:27 +03:00
rmdir ( $ udev_tmpfs ) ;
mkdir ( $ udev_tmpfs ) || die "unable to create udev_tmpfs: $udev_tmpfs\n" ;
2018-11-09 06:01:15 +03:00
if ( system ( "mount" , "-o" , "rw,mode=755,nosuid,noexec" , "-t" , "tmpfs" , "tmpfs" , $ udev_tmpfs ) ) {
warn "unable to mount tmpfs" ;
return 0 ;
}
2016-04-06 06:04:27 +03:00
2012-04-16 19:21:22 +04:00
mkdir ( $ udev_dev ) || die "unable to create udev_dev: $udev_dev\n" ;
# setting group and mode of udev_dev ensures the tests work
2012-01-10 04:34:15 +04:00
# even if the parent directory has setgid bit enabled.
2012-04-16 19:21:22 +04:00
chown ( 0 , 0 , $ udev_dev ) || die "unable to chown $udev_dev\n" ;
chmod ( 0755 , $ udev_dev ) || die "unable to chmod $udev_dev\n" ;
2018-11-09 06:01:15 +03:00
if ( system ( "mknod" , $ udev_dev . "/null" , "c" , "1" , "3" ) ) {
warn "unable to create $udev_dev/null" ;
return 0 ;
}
2012-04-16 19:21:22 +04:00
2018-12-11 16:55:34 +03:00
# check if we are permitted to create block device nodes
my $ block_device_filename = $ udev_dev . "/sda" ;
if ( system ( "mknod" , $ block_device_filename , "b" , "8" , "0" ) ) {
warn "unable to create $block_device_filename" ;
return 0 ;
}
unlink $ block_device_filename ;
2016-04-06 06:04:27 +03:00
system ( "cp" , "-r" , "test/sys/" , $ udev_sys ) && die "unable to copy test/sys" ;
2016-04-05 09:13:41 +03:00
2012-04-16 19:21:22 +04:00
system ( "rm" , "-rf" , "$udev_run" ) ;
2018-11-09 06:01:15 +03:00
2018-12-08 15:35:30 +03:00
if ( ! mkdir ( $ udev_run ) ) {
warn "unable to create directory $udev_run" ;
return 0 ;
}
2018-11-09 06:01:15 +03:00
return 1 ;
2008-05-19 11:05:20 +04:00
}
2018-04-24 10:38:26 +03:00
sub get_devnode {
my ( $ device ) = @ _ ;
my $ devnode ;
if ( defined ( $ device - > { devnode } ) ) {
$ devnode = "$udev_dev/$device->{devnode}" ;
} else {
$ devnode = "$device->{devpath}" ;
$ devnode =~ s!.*/!$udev_dev/! ;
}
return $ devnode ;
}
sub check_devnode {
my ( $ device ) = @ _ ;
my $ devnode = get_devnode ( $ device ) ;
my @ st = lstat ( "$devnode" ) ;
if ( ! ( - b _ || - c _ ) ) {
print "add $devnode: error\n" ;
system ( "tree" , "$udev_dev" ) ;
$ error + + ;
return undef ;
}
my ( $ dev , $ ino , $ mode , $ nlink , $ uid , $ gid , $ rdev , $ size ,
$ atime , $ mtime , $ ctime , $ blksize , $ blocks ) = @ st ;
if ( defined ( $ device - > { exp_perms } ) ) {
permissions_test ( $ device , $ uid , $ gid , $ mode ) ;
}
if ( defined ( $ device - > { exp_majorminor } ) ) {
major_minor_test ( $ device , $ rdev ) ;
}
print "add $devnode: ok\n" ;
2018-04-24 21:55:01 +03:00
$ good + + ;
2018-04-24 10:38:26 +03:00
return $ devnode ;
}
2018-04-24 18:15:58 +03:00
sub get_link_target {
my ( $ link ) = @ _ ;
2018-04-23 22:59:05 +03:00
2018-04-24 18:15:58 +03:00
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 ;
}
2018-04-24 10:38:26 +03:00
2018-04-24 18:15:58 +03:00
sub check_link_add {
my ( $ link , $ devnode , $ err_expected ) = @ _ ;
2018-04-24 10:38:26 +03:00
2018-04-24 18:15:58 +03:00
my @ st = lstat ( "$udev_dev/$link" ) ;
2018-04-24 11:50:24 +03:00
if ( - l _ ) {
2018-04-24 18:15:58 +03:00
my $ tgt = get_link_target ( $ link ) ;
2018-04-24 11:50:24 +03:00
if ( $ tgt ne $ devnode ) {
2018-04-24 18:15:58 +03:00
print "symlink $link: error, found -> $tgt\n" ;
2018-04-24 11:50:24 +03:00
$ error + + ;
system ( "tree" , "$udev_dev" ) ;
} else {
2018-04-24 18:15:58 +03:00
print "symlink $link: ok\n" ;
2018-04-24 21:55:01 +03:00
$ good + + ;
2018-04-24 11:50:24 +03:00
}
2012-01-10 04:34:15 +04:00
} else {
2018-04-24 18:15:58 +03:00
print "symlink $link: error" ;
if ( $ err_expected ) {
2012-01-10 04:34:15 +04:00
print " as expected\n" ;
2018-04-24 21:55:01 +03:00
$ good + + ;
2012-01-10 04:34:15 +04:00
} else {
print "\n" ;
2012-04-16 19:21:22 +04:00
system ( "tree" , "$udev_dev" ) ;
2012-01-10 04:34:15 +04:00
print "\n" ;
$ error + + ;
sleep ( 1 ) ;
}
}
2018-04-20 23:38:30 +03:00
}
2003-11-23 16:47:28 +03:00
2018-04-24 18:15:58 +03:00
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" ;
2018-04-24 21:55:01 +03:00
$ good + + ;
2018-04-24 18:15:58 +03:00
} else {
print "nonexistent: error \'$link\' should not be there" ;
if ( $ err_expected ) {
print " (as expected)\n" ;
2018-04-24 21:55:01 +03:00
$ good + + ;
2018-04-24 18:15:58 +03:00
} else {
print "\n" ;
system ( "tree" , "$udev_dev" ) ;
print "\n" ;
$ error + + ;
sleep ( 1 ) ;
}
}
} else {
print "nonexistent $link: ok\n" ;
2018-04-24 21:55:01 +03:00
$ good + + ;
2018-04-24 18:15:58 +03:00
}
}
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 } ) ;
}
}
}
2018-04-24 10:38:26 +03:00
sub check_remove_devnode {
my ( $ device ) = @ _ ;
my $ devnode = get_devnode ( $ device ) ;
if ( - e "$devnode" ) {
print "remove $devnode: error" ;
print "\n" ;
system ( "tree" , "$udev_dev" ) ;
print "\n" ;
$ error + + ;
sleep ( 1 ) ;
} else {
print "remove $devnode: ok\n" ;
2018-04-24 21:55:01 +03:00
$ good + + ;
2018-04-24 10:38:26 +03:00
}
}
2018-04-24 18:15:58 +03:00
sub check_link_remove {
my ( $ link , $ err_expected ) = @ _ ;
2018-04-24 10:38:26 +03:00
2018-04-24 18:15:58 +03:00
if ( ( - e "$udev_dev/$link" ) ||
( - l "$udev_dev/$link" ) ) {
print "remove $link: error" ;
if ( $ err_expected ) {
2012-01-10 04:34:15 +04:00
print " as expected\n" ;
2018-04-24 21:55:01 +03:00
$ good + + ;
2012-01-10 04:34:15 +04:00
} else {
print "\n" ;
2012-04-16 19:21:22 +04:00
system ( "tree" , "$udev_dev" ) ;
2012-01-10 04:34:15 +04:00
print "\n" ;
$ error + + ;
sleep ( 1 ) ;
}
} else {
2018-04-24 18:15:58 +03:00
print "remove $link: ok\n" ;
2018-04-24 21:55:01 +03:00
$ good + + ;
2018-04-24 18:15:58 +03:00
}
}
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 } ) ;
2018-04-20 23:38:30 +03:00
}
}
2018-04-23 22:59:05 +03:00
sub run_udev {
my ( $ action , $ dev , $ sleep_us , $ sema ) = @ _ ;
# Notify main process that this worker has started
$ sema - > op ( 0 , 1 , 0 ) ;
# Wait for start
$ sema - > op ( 0 , 0 , 0 ) ;
usleep ( $ sleep_us ) if defined ( $ sleep_us ) ;
my $ rc = udev ( $ action , $ dev - > { devpath } ) ;
exit $ rc ;
}
sub fork_and_run_udev {
my ( $ action , $ rules , $ sema ) = @ _ ;
my @ devices = @ { $ rules - > { devices } } ;
my $ dev ;
my $ k = 0 ;
$ sema - > setval ( 0 , 1 ) ;
foreach $ dev ( @ devices ) {
my $ pid = fork ( ) ;
if ( ! $ pid ) {
run_udev ( $ action , $ dev ,
defined ( $ rules - > { sleep_us } ) ? $ k * $ rules - > { sleep_us } : undef ,
$ sema ) ;
} else {
$ dev - > { pid } = $ pid ;
}
$ k + + ;
}
# This operation waits for all workers to become ready, and
# starts them off when that's the case.
$ sema - > op ( 0 , - ( $# devices + 2 ) , 0 ) ;
foreach $ dev ( @ devices ) {
my $ rc ;
my $ pid ;
$ pid = waitpid ( $ dev - > { pid } , 0 ) ;
if ( $ pid == - 1 ) {
print "error waiting for pid dev->{pid}\n" ;
}
if ( WIFEXITED ( $? ) ) {
$ rc = WEXITSTATUS ( $? ) ;
if ( $ rc ) {
print "$udev_bin $action for $dev->{devpath} failed with code $rc\n" ;
$ error += 1 ;
2018-04-24 21:55:01 +03:00
} else {
$ good + + ;
2018-04-23 22:59:05 +03:00
}
}
}
}
2018-04-20 23:38:30 +03:00
sub run_test {
2018-04-23 22:59:05 +03:00
my ( $ rules , $ number , $ sema ) = @ _ ;
2018-04-20 23:38:30 +03:00
my $ rc ;
2018-04-25 10:54:26 +03:00
my @ devices ;
2018-04-26 15:07:27 +03:00
my $ ntests ;
my $ cur_good = $ good ;
my $ cur_error = $ error ;
2018-04-25 10:54:26 +03:00
if ( ! defined $ rules - > { devices } ) {
$ rules - > { devices } = all_block_devs ( $ rules - > { generator } ) ;
}
@ devices = @ { $ rules - > { devices } } ;
2018-04-26 15:07:27 +03:00
# For each device: exit status and devnode test for add & remove
$ ntests += 4 * ( $# devices + 1 ) ;
2018-04-20 23:38:30 +03:00
2018-04-26 15:07:27 +03:00
foreach my $ dev ( @ devices ) {
$ ntests += 2 * ( $# { $ dev - > { exp_links } } + 1 )
+ ( $# { $ dev - > { not_exp_links } } + 1 )
+ ( defined $ dev - > { exp_perms } ? 1 : 0 )
+ ( defined $ dev - > { exp_majorminor } ? 1 : 0 ) ;
}
if ( defined $ rules - > { repeat } ) {
$ ntests *= $ rules - > { repeat } ;
}
$ exp_good += $ ntests ;
2018-04-20 23:38:30 +03:00
print "TEST $number: $rules->{desc}\n" ;
2018-04-23 22:58:12 +03:00
create_rules ( \ $ rules - > { rules } ) ;
2018-04-23 22:59:05 +03:00
2018-04-24 23:24:43 +03:00
REPEAT:
2018-04-23 22:59:05 +03:00
fork_and_run_udev ( "add" , $ rules , $ sema ) ;
2018-04-20 23:38:30 +03:00
foreach my $ dev ( @ devices ) {
check_add ( $ dev ) ;
}
if ( defined ( $ rules - > { option } ) && $ rules - > { option } eq "keep" ) {
print "\n\n" ;
return ;
}
2018-04-23 22:59:05 +03:00
fork_and_run_udev ( "remove" , $ rules , $ sema ) ;
2018-04-20 23:38:30 +03:00
foreach my $ dev ( @ devices ) {
check_remove ( $ dev ) ;
2012-01-10 04:34:15 +04:00
}
[PATCH] add enum tests
On Fri, Sep 10, 2004 at 01:09:07PM -0700, Greg KH wrote:
> On Tue, Sep 07, 2004 at 01:19:34PM +0200, David Zeuthen wrote:
> >
> > KERNEL="sr*", NAME="%k", SYMLINK="cdrom%e"
> > KERNEL="scd*", NAME="%k", SYMLINK="cdrom%e"
> > KERNEL="pcd*", NAME="%k", SYMLINK="cdrom%e"
> > KERNEL="hd[a-z]", PROGRAM="/bin/cat /proc/ide/%k/media", RESULT="cdrom", NAME="\%k", SYMLINK="cdrom%e"
> > KERNEL="fd[0-9]", NAME="%k", SYMLINK="floppy%e"
> > KERNEL="hd[a-z]", PROGRAM="/bin/cat /proc/ide/%k/media", RESULT="floppy", NAME=\"%k", SYMLINK="floppy%e"
> >
> > New patch is attached.
>
> Nice, I've applied this.
>
> How about sending a patch for the test/udev-test.pl script that adds a
> test for this new paramater, so we make sure to not break it in the
> future.
Here are the tests for the enumeration character %e. I've added a option
string to be able to do a whole sequence of tests without node removal,
so we can skip the "remove" event and get an increasing number to append
to the name. After the sequence test the whole directory is cleaned for
the next tests.
2004-09-15 08:44:55 +04:00
2018-04-24 23:24:43 +03:00
if ( defined ( $ rules - > { repeat } ) && - - ( $ rules - > { repeat } ) > 0 ) {
goto REPEAT ;
}
2018-04-26 15:07:27 +03:00
printf "TEST $number: errors: %d good: %d/%d\n\n" , $ error - $ cur_error ,
$ good - $ cur_good , $ ntests ;
2005-03-19 01:52:41 +03:00
2012-01-10 04:34:15 +04:00
if ( defined ( $ rules - > { option } ) && $ rules - > { option } eq "clean" ) {
2012-04-16 19:21:22 +04:00
udev_setup ( ) ;
2012-01-10 04:34:15 +04:00
}
[PATCH] add enum tests
On Fri, Sep 10, 2004 at 01:09:07PM -0700, Greg KH wrote:
> On Tue, Sep 07, 2004 at 01:19:34PM +0200, David Zeuthen wrote:
> >
> > KERNEL="sr*", NAME="%k", SYMLINK="cdrom%e"
> > KERNEL="scd*", NAME="%k", SYMLINK="cdrom%e"
> > KERNEL="pcd*", NAME="%k", SYMLINK="cdrom%e"
> > KERNEL="hd[a-z]", PROGRAM="/bin/cat /proc/ide/%k/media", RESULT="cdrom", NAME="\%k", SYMLINK="cdrom%e"
> > KERNEL="fd[0-9]", NAME="%k", SYMLINK="floppy%e"
> > KERNEL="hd[a-z]", PROGRAM="/bin/cat /proc/ide/%k/media", RESULT="floppy", NAME=\"%k", SYMLINK="floppy%e"
> >
> > New patch is attached.
>
> Nice, I've applied this.
>
> How about sending a patch for the test/udev-test.pl script that adds a
> test for this new paramater, so we make sure to not break it in the
> future.
Here are the tests for the enumeration character %e. I've added a option
string to be able to do a whole sequence of tests without node removal,
so we can skip the "remove" event and get an increasing number to append
to the name. After the sequence test the whole directory is cleaned for
the next tests.
2004-09-15 08:44:55 +04:00
2003-11-23 16:47:28 +03:00
}
2019-07-05 18:24:55 +03:00
sub cleanup {
system ( "rm" , "-rf" , "$udev_run" ) ;
system ( "umount" , "$udev_tmpfs" ) ;
rmdir ( $ udev_tmpfs ) ;
}
2004-11-11 05:11:00 +03:00
# only run if we have root permissions
# due to mknod restrictions
if ( ! ( $< == 0 ) ) {
2012-01-10 04:34:15 +04:00
print "Must have root permissions to run properly.\n" ;
2015-08-31 08:10:30 +03:00
exit ( $ EXIT_TEST_SKIP ) ;
2004-11-11 05:11:00 +03:00
}
2016-07-28 00:17:52 +03:00
# skip the test when running in a chroot
system ( "systemd-detect-virt" , "-r" , "-q" ) ;
if ( $? >> 8 == 0 ) {
2016-08-01 05:01:43 +03:00
print "Running in a chroot, skipping the test.\n" ;
exit ( $ EXIT_TEST_SKIP ) ;
2016-07-28 00:17:52 +03:00
}
2018-11-09 06:01:15 +03:00
if ( ! udev_setup ( ) ) {
warn "Failed to set up the environment, skipping the test" ;
2019-07-05 18:24:55 +03:00
cleanup ( ) ;
2018-11-09 06:01:15 +03:00
exit ( $ EXIT_TEST_SKIP ) ;
}
2018-12-08 11:02:30 +03:00
if ( system ( $ udev_bin , "check" ) ) {
2018-11-09 06:01:15 +03:00
warn "$udev_bin failed to set up the environment, skipping the test" ;
2019-07-05 18:24:55 +03:00
cleanup ( ) ;
2018-11-09 06:01:15 +03:00
exit ( $ EXIT_TEST_SKIP ) ;
}
2004-02-12 11:49:52 +03:00
my $ test_num = 1 ;
2008-09-01 18:20:06 +04:00
my @ list ;
2004-02-12 11:49:52 +03:00
2008-09-01 18:20:06 +04:00
foreach my $ arg ( @ ARGV ) {
2012-01-10 04:34:15 +04:00
if ( $ arg =~ m/--valgrind/ ) {
$ valgrind = 1 ;
printf ( "using valgrind\n" ) ;
2015-03-25 14:28:15 +03:00
} elsif ( $ arg =~ m/--gdb/ ) {
$ gdb = 1 ;
printf ( "using gdb\n" ) ;
2016-02-22 20:15:17 +03:00
} elsif ( $ arg =~ m/--strace/ ) {
$ strace = 1 ;
printf ( "using strace\n" ) ;
2012-01-10 04:34:15 +04:00
} else {
push ( @ list , $ arg ) ;
}
2008-09-01 18:20:06 +04:00
}
2018-04-23 22:59:05 +03:00
my $ sema = IPC::Semaphore - > new ( IPC_PRIVATE , 1 , S_IRUSR | S_IWUSR | IPC_CREAT ) ;
2008-09-01 18:20:06 +04:00
if ( $ list [ 0 ] ) {
2012-01-10 04:34:15 +04:00
foreach my $ arg ( @ list ) {
if ( defined ( $ tests [ $ arg - 1 ] - > { desc } ) ) {
print "udev-test will run test number $arg:\n\n" ;
2018-04-23 22:59:05 +03:00
run_test ( $ tests [ $ arg - 1 ] , $ arg , $ sema ) ;
2012-01-10 04:34:15 +04:00
} else {
print "test does not exist.\n" ;
}
}
2004-02-12 11:49:52 +03:00
} else {
2012-01-10 04:34:15 +04:00
# test all
print "\nudev-test will run " . ( $# tests + 1 ) . " tests:\n\n" ;
2004-02-12 11:49:52 +03:00
2012-01-10 04:34:15 +04:00
foreach my $ rules ( @ tests ) {
2018-04-23 22:59:05 +03:00
run_test ( $ rules , $ test_num , $ sema ) ;
2012-01-10 04:34:15 +04:00
$ test_num + + ;
}
2004-02-12 11:49:52 +03:00
}
2018-04-23 22:59:05 +03:00
$ sema - > remove ;
2018-04-26 15:07:27 +03:00
print "$error errors occurred. $good/$exp_good good results.\n\n" ;
2003-11-23 16:47:28 +03:00
2019-07-05 18:24:55 +03:00
cleanup ( ) ;
2003-11-23 16:47:28 +03:00
2008-09-16 21:03:42 +04:00
if ( $ error > 0 ) {
2016-08-19 17:01:17 +03:00
exit ( 1 ) ;
2008-09-16 21:03:42 +04:00
}
exit ( 0 ) ;