chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
f4dce17
)
udevtrigger: trigger "driver" events
author
Kay Sievers
<kay.sievers@vrfy.org>
Fri, 27 Jul 2007 01:34:31 +0000
(
03:34
+0200)
committer
Kay Sievers
<kay.sievers@vrfy.org>
Fri, 27 Jul 2007 01:34:31 +0000
(
03:34
+0200)
udevtrigger.c
patch
|
blob
|
history
diff --git
a/udevtrigger.c
b/udevtrigger.c
index 4ef9612af070c0fe413c4070116af4ed1725dc89..cf8f209b1c105155727fe9f186218dd19832f6de 100644
(file)
--- a/
udevtrigger.c
+++ b/
udevtrigger.c
@@
-237,11
+237,24
@@
static int attr_filtered(const char *path)
return 0;
}
return 0;
}
-static void scan_subsystem(const char *subsys)
+enum scan_type {
+ SCAN_DEVICES,
+ SCAN_SUBSYSTEM,
+};
+
+static void scan_subsystem(const char *subsys, enum scan_type scan)
{
char base[PATH_SIZE];
DIR *dir;
struct dirent *dent;
{
char base[PATH_SIZE];
DIR *dir;
struct dirent *dent;
+ const char *subdir;
+
+ if (scan == SCAN_DEVICES)
+ subdir = "/devices";
+ else if (scan == SCAN_SUBSYSTEM)
+ subdir = "/drivers";
+ else
+ return;
strlcpy(base, sysfs_path, sizeof(base));
strlcat(base, "/", sizeof(base));
strlcpy(base, sysfs_path, sizeof(base));
strlcat(base, "/", sizeof(base));
@@
-257,15
+270,24
@@
static void scan_subsystem(const char *subsys)
if (dent->d_name[0] == '.')
continue;
if (dent->d_name[0] == '.')
continue;
- if (subsystem_filtered(dent->d_name))
- continue;
+ if (scan == SCAN_DEVICES)
+ if (subsystem_filtered(dent->d_name))
+ continue;
strlcpy(dirname, base, sizeof(dirname));
strlcat(dirname, "/", sizeof(dirname));
strlcat(dirname, dent->d_name, sizeof(dirname));
strlcpy(dirname, base, sizeof(dirname));
strlcat(dirname, "/", sizeof(dirname));
strlcat(dirname, dent->d_name, sizeof(dirname));
- strlcat(dirname, "/devices", sizeof(dirname));
- /* look for devices */
+ if (scan == SCAN_SUBSYSTEM) {
+ if (!subsystem_filtered("subsystem"))
+ device_list_insert(dirname);
+ if (subsystem_filtered("drivers"))
+ continue;
+ }
+
+ strlcat(dirname, subdir, sizeof(dirname));
+
+ /* look for devices/drivers */
dir2 = opendir(dirname);
if (dir2 != NULL) {
for (dent2 = readdir(dir2); dent2 != NULL; dent2 = readdir(dir2)) {
dir2 = opendir(dirname);
if (dir2 != NULL) {
for (dent2 = readdir(dir2); dent2 != NULL; dent2 = readdir(dir2)) {
@@
-494,19
+516,25
@@
int main(int argc, char *argv[], char *envp[])
}
}
}
}
- if (failed)
+ if (failed)
{
scan_failed();
scan_failed();
- else {
+ exec_list(action);
+ } else {
char base[PATH_SIZE];
struct stat statbuf;
/* if we have /sys/subsystem, forget all the old stuff */
strlcpy(base, sysfs_path, sizeof(base));
strlcat(base, "/subsystem", sizeof(base));
char base[PATH_SIZE];
struct stat statbuf;
/* if we have /sys/subsystem, forget all the old stuff */
strlcpy(base, sysfs_path, sizeof(base));
strlcat(base, "/subsystem", sizeof(base));
- if (stat(base, &statbuf) == 0)
- scan_subsystem("subsystem");
- else {
- scan_subsystem("bus");
+ if (stat(base, &statbuf) == 0) {
+ scan_subsystem("subsystem", SCAN_SUBSYSTEM);
+ exec_list(action);
+ scan_subsystem("subsystem", SCAN_DEVICES);
+ exec_list(action);
+ } else {
+ scan_subsystem("bus", SCAN_SUBSYSTEM);
+ exec_list(action);
+ scan_subsystem("bus", SCAN_DEVICES);
scan_class();
/* scan "block" if it isn't a "class" */
scan_class();
/* scan "block" if it isn't a "class" */
@@
-514,9
+542,9
@@
int main(int argc, char *argv[], char *envp[])
strlcat(base, "/class/block", sizeof(base));
if (stat(base, &statbuf) != 0)
scan_block();
strlcat(base, "/class/block", sizeof(base));
if (stat(base, &statbuf) != 0)
scan_block();
+ exec_list(action);
}
}
}
}
- exec_list(action);
exit:
name_list_cleanup(&filter_subsystem_match_list);
exit:
name_list_cleanup(&filter_subsystem_match_list);