diff options
author | Kay Sievers <kay.sievers@suse.de> | 2006-08-20 18:22:44 +0200 |
---|---|---|
committer | Kay Sievers <kay.sievers@suse.de> | 2006-08-20 18:22:44 +0200 |
commit | 04cc3a81d02af4d131b9c92defd7538f22089774 (patch) | |
tree | 5e560637a5ad6fb73ddfb38d33ceb3eb1d3a4ecf | |
parent | 3770f6093f89198151ca872c2115aff0b6079772 (diff) |
udevtrigger: add --retry-failed
-rw-r--r-- | udevtrigger.8 | 9 | ||||
-rw-r--r-- | udevtrigger.c | 72 | ||||
-rw-r--r-- | udevtrigger.xml | 11 |
3 files changed, 71 insertions, 21 deletions
diff --git a/udevtrigger.8 b/udevtrigger.8 index de31f2e745..1e14a7b101 100644 --- a/udevtrigger.8 +++ b/udevtrigger.8 @@ -14,17 +14,20 @@ udevtrigger \- request kernel devices events for coldplug .SH "SYNOPSIS" .HP 12 -\fBudevtrigger\fR [\fB\-\-verbose\fR] [\fB\-\-dry\-run\fR] +\fBudevtrigger\fR [\fB\-\-verbose\fR] [\fB\-\-dry\-run\fR] [\fB\-\-retry\-failed\fR] .SH "DESCRIPTION" .PP Trigger kernel device uevents to replay missing events at system coldplug. .SH "OPTIONS" .TP 3n \fB\-\-verbose\fR -print out the devices found in sysfs. +Print the list of devices found in sysfs. .TP 3n \fB\-\-dry\-run\fR -don't actually trigger the event. +Do not actually trigger the event. +.TP 3n +\fB\-\-retry\-failed\fR +Trigger events which are failed during a previous run. .SH "ENVIRONMENT" .TP 3n \fBUDEV_LOG\fR diff --git a/udevtrigger.c b/udevtrigger.c index 2d5772fd6b..9345a06ab7 100644 --- a/udevtrigger.c +++ b/udevtrigger.c @@ -32,8 +32,8 @@ #include <sys/types.h> #include "udev.h" +#include "udevd.h" -static const char *udev_log_str; static int verbose; static int dry_run; @@ -166,7 +166,7 @@ static int is_device(const char *path) return 1; } -static void udev_scan_bus(void) +static void scan_bus(void) { char base[PATH_SIZE]; DIR *dir; @@ -213,7 +213,7 @@ static void udev_scan_bus(void) } } -static void udev_scan_block(void) +static void scan_block(void) { char base[PATH_SIZE]; DIR *dir; @@ -272,7 +272,7 @@ static void udev_scan_block(void) } } -static void udev_scan_class(void) +static void scan_class(void) { char base[PATH_SIZE]; DIR *dir; @@ -318,6 +318,44 @@ static void udev_scan_class(void) } } +static void scan_failed(void) +{ + char base[PATH_SIZE]; + DIR *dir; + struct dirent *dent; + + strlcpy(base, udev_root, sizeof(base)); + strlcat(base, "/", 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; + + if (dent->d_name[0] == '.') + continue; + + strlcpy(linkname, base, sizeof(linkname)); + strlcat(linkname, "/", sizeof(linkname)); + strlcat(linkname, dent->d_name, sizeof(linkname)); + + len = readlink(linkname, target, sizeof(target)); + if (len <= 0) + continue; + target[len] = '\0'; + + if (is_device(target)) + device_list_insert(target); + else + continue; + } + closedir(dir); + } +} + int main(int argc, char *argv[], char *envp[]) { int i; @@ -325,31 +363,33 @@ int main(int argc, char *argv[], char *envp[]) logging_init("udevtrigger"); udev_config_init(); dbg("version %s", UDEV_VERSION); - - udev_log_str = getenv("UDEV_LOG"); + sysfs_init(); for (i = 1 ; i < argc; i++) { char *arg = argv[i]; - if (strcmp(arg, "--verbose") == 0 || strcmp(arg, "-v") == 0) + if (strcmp(arg, "--verbose") == 0 || strcmp(arg, "-v") == 0) { verbose = 1; - else if (strcmp(arg, "--dry-run") == 0 || strcmp(arg, "-n") == 0) + } else if (strcmp(arg, "--dry-run") == 0 || strcmp(arg, "-n") == 0) { dry_run = 1; - else { - fprintf(stderr, "Usage: udevtrigger [--verbose] [--dry-run]\n"); + } else if (strcmp(arg, "--retry-failed") == 0 || strcmp(arg, "-F") == 0) { + scan_failed(); + exec_lists(); + goto exit; + } else { + fprintf(stderr, "Usage: udevtrigger [--verbose] [--dry-run] [--retry-failed]\n"); goto exit; } } - sysfs_init(); - - udev_scan_bus(); - udev_scan_class(); - udev_scan_block(); + /* default action */ + scan_bus(); + scan_class(); + scan_block(); exec_lists(); - sysfs_cleanup(); exit: + sysfs_cleanup(); logging_close(); return 0; } diff --git a/udevtrigger.xml b/udevtrigger.xml index 990cf63589..170fcd6291 100644 --- a/udevtrigger.xml +++ b/udevtrigger.xml @@ -27,6 +27,7 @@ <command>udevtrigger</command> <arg><option>--verbose</option></arg> <arg><option>--dry-run</option></arg> + <arg><option>--retry-failed</option></arg> </cmdsynopsis> </refsynopsisdiv> @@ -39,13 +40,19 @@ <varlistentry> <term><option>--verbose</option></term> <listitem> - <para>print out the devices found in sysfs.</para> + <para>Print the list of devices found in sysfs.</para> </listitem> </varlistentry> <varlistentry> <term><option>--dry-run</option></term> <listitem> - <para>don't actually trigger the event.</para> + <para>Do not actually trigger the event.</para> + </listitem> + </varlistentry> + <varlistentry> + <term><option>--retry-failed</option></term> + <listitem> + <para>Trigger events which are failed during a previous run.</para> </listitem> </varlistentry> </variablelist> |