--- udevtrigger.c | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) Index: udev-115/udevtrigger.c =================================================================== --- udev-115.orig/udevtrigger.c 2007-08-24 01:29:54.000000000 +0200 +++ udev-115/udevtrigger.c 2007-09-21 18:45:28.000000000 +0200 @@ -39,6 +39,8 @@ LIST_HEAD(device_list); LIST_HEAD(filter_subsystem_match_list); LIST_HEAD(filter_subsystem_nomatch_list); +LIST_HEAD(filter_kernel_match_list); +LIST_HEAD(filter_kernel_nomatch_list); LIST_HEAD(filter_attr_match_list); LIST_HEAD(filter_attr_nomatch_list); @@ -218,6 +220,26 @@ return 0; } +static int kernel_filtered(const char *kernel) +{ + struct name_entry *loop_name; + + /* skip devices matching the prohibited kernel device names */ + list_for_each_entry(loop_name, &filter_kernel_nomatch_list, node) + if (fnmatch(loop_name->name, kernel, 0) == 0) + return 1; + + /* skip devices not matching the listed kernel device names */ + if (!list_empty(&filter_kernel_match_list)) { + list_for_each_entry(loop_name, &filter_kernel_match_list, node) + if (fnmatch(loop_name->name, kernel, 0) == 0) + return 0; + return 1; + } + + return 0; +} + static int attr_filtered(const char *path) { struct name_entry *loop_name; @@ -296,6 +318,9 @@ if (dent2->d_name[0] == '.') continue; + if (kernel_filtered(dent2->d_name)) + continue; + strlcpy(dirname2, dirname, sizeof(dirname2)); strlcat(dirname2, "/", sizeof(dirname2)); strlcat(dirname2, dent2->d_name, sizeof(dirname2)); @@ -402,6 +427,9 @@ if (!strcmp(dent2->d_name, "device")) continue; + if (kernel_filtered(dent2->d_name)) + continue; + strlcpy(dirname2, dirname, sizeof(dirname2)); strlcat(dirname2, "/", sizeof(dirname2)); strlcat(dirname2, dent2->d_name, sizeof(dirname2)); @@ -458,6 +486,8 @@ { "subsystem-nomatch", 1, NULL, 'S' }, { "attr-match", 1, NULL, 'a' }, { "attr-nomatch", 1, NULL, 'A' }, + { "kernel-match", 1, NULL, 'k' }, + { "kernel-nomatch", 1, NULL, 'K' }, {} }; @@ -496,6 +526,12 @@ case 'A': name_list_add(&filter_attr_nomatch_list, optarg, 0); break; + case 'k': + name_list_add(&filter_kernel_match_list, optarg, 0); + break; + case 'K': + name_list_add(&filter_kernel_nomatch_list, optarg, 0); + break; case 'h': printf("Usage: udevtrigger OPTIONS\n" " --verbose print the list of devices while running\n" @@ -504,6 +540,8 @@ " marked as failed during a previous run\n" " --subsystem-match= trigger devices from a matching subystem\n" " --subsystem-nomatch= exclude devices from a matching subystem\n" + " --kernel-match= trigger devices from a matching kernel device name\n" + " --kernel-nomatch= exclude devices from a matching kernel device name\n" " --attr-match=]> trigger devices with a matching sysfs\n" " attribute\n" " --attr-nomatch=]> exclude devices with a matching sysfs\n" @@ -549,6 +587,8 @@ exit: name_list_cleanup(&filter_subsystem_match_list); name_list_cleanup(&filter_subsystem_nomatch_list); + name_list_cleanup(&filter_kernel_match_list); + name_list_cleanup(&filter_kernel_nomatch_list); name_list_cleanup(&filter_attr_match_list); name_list_cleanup(&filter_attr_nomatch_list);