LIST_HEAD(device_default_list);
LIST_HEAD(device_last_list);
-LIST_HEAD(filter_subsytem_match_list);
-LIST_HEAD(filter_subsytem_nomatch_list);
+LIST_HEAD(filter_subsystem_match_list);
+LIST_HEAD(filter_subsystem_nomatch_list);
LIST_HEAD(filter_attr_match_list);
LIST_HEAD(filter_attr_nomatch_list);
struct name_entry *loop_name;
/* skip devices matching the listed subsystems */
- list_for_each_entry(loop_name, &filter_subsytem_nomatch_list, node)
- if (fnmatch(subsystem, loop_name->name, 0) == 0)
+ list_for_each_entry(loop_name, &filter_subsystem_nomatch_list, node)
+ if (fnmatch(loop_name->name, subsystem, 0) == 0)
return 1;
/* skip devices not matching the listed subsystems */
- if (!list_empty(&filter_subsytem_match_list)) {
- list_for_each_entry(loop_name, &filter_subsytem_match_list, node)
- if (fnmatch(subsystem, loop_name->name, 0) == 0)
+ if (!list_empty(&filter_subsystem_match_list)) {
+ list_for_each_entry(loop_name, &filter_subsystem_match_list, node)
+ if (fnmatch(loop_name->name, subsystem, 0) == 0)
return 0;
return 1;
}
struct dirent *dent;
strlcpy(base, udev_root, sizeof(base));
- strlcat(base, "/", sizeof(base));
- strlcat(base, EVENT_FAILED_DIR, sizeof(base));
+ strlcat(base, "/" EVENT_FAILED_DIR, sizeof(base));
dir = opendir(base);
if (dir != NULL) {
for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) {
- char linkname[PATH_SIZE];
- char target[PATH_SIZE];
- int len;
+ char device[PATH_SIZE];
+ size_t start, end, i;
if (dent->d_name[0] == '.')
continue;
- strlcpy(linkname, base, sizeof(linkname));
- strlcat(linkname, "/", sizeof(linkname));
- strlcat(linkname, dent->d_name, sizeof(linkname));
+ strlcpy(device, sysfs_path, sizeof(device));
+ start = strlcat(device, "/", sizeof(device));
+ end = strlcat(device, dent->d_name, sizeof(device));
+ if (end > sizeof(device))
+ end = sizeof(device);
- len = readlink(linkname, target, sizeof(target));
- if (len <= 0)
- continue;
- target[len] = '\0';
+ /* replace PATH_TO_NAME_CHAR with '/' */
+ for (i = start; i < end; i++)
+ if (device[i] == PATH_TO_NAME_CHAR)
+ device[i] = '/';
- if (is_device(target))
- device_list_insert(target);
+ if (is_device(device))
+ device_list_insert(device);
else
continue;
}
{
int failed = 0;
int option;
- struct option options[] = {
+ static const struct option options[] = {
{ "verbose", 0, NULL, 'v' },
{ "dry-run", 0, NULL, 'n' },
{ "retry-failed", 0, NULL, 'F' },
failed = 1;
break;
case 's':
- name_list_add(&filter_subsytem_match_list, optarg, 0);
+ name_list_add(&filter_subsystem_match_list, optarg, 0);
break;
case 'S':
- name_list_add(&filter_subsytem_nomatch_list, optarg, 0);
+ name_list_add(&filter_subsystem_nomatch_list, optarg, 0);
break;
case 'a':
name_list_add(&filter_attr_match_list, optarg, 0);
break;
case 'h':
printf("Usage: udevtrigger OPTIONS\n"
- " --verbose print the list of devices which will be triggered\n"
- " --dry-run do not actually trigger the event\n"
- " --retry-failed trigger only the events which are failed during a previous run\n"
- " --subsystem-match=<subsystem> select only devices from the specified subystem\n"
- " --subsystem-nomatch=<subsystem> exclude devices from the specified subystem\n"
- " --attr-match=<file[=<value>]> select only devices with a matching sysfs attribute\n"
- " --attr-nomatch=<file[=<value>]> exclude devices with a matching sysfs attribute\n"
- " --help print this text\n"
+ " --verbose print the list of devices while running\n"
+ " --dry-run do not actually trigger the events\n"
+ " --retry-failed trigger only the events which have been\n"
+ " marked as failed during a previous run\n"
+ " --subsystem-match=<subsystem> trigger devices from a matching subystem\n"
+ " --subsystem-nomatch=<subsystem> exclude devices from a matching subystem\n"
+ " --attr-match=<file[=<value>]> trigger devices with a matching sysfs\n"
+ " attribute\n"
+ " --attr-nomatch=<file[=<value>]> exclude devices with a matching sysfs\n"
+ " attribute\n"
+ " --help print this text\n"
"\n");
goto exit;
default:
exec_lists();
exit:
- name_list_cleanup(&filter_subsytem_match_list);
- name_list_cleanup(&filter_subsytem_nomatch_list);
+ name_list_cleanup(&filter_subsystem_match_list);
+ name_list_cleanup(&filter_subsystem_nomatch_list);
name_list_cleanup(&filter_attr_match_list);
name_list_cleanup(&filter_attr_nomatch_list);