return 0;
}
-static void scan_subdir(const char *base)
+static void scan_subdir(const char *base, const char *subdir,
+ bool insert, int depth)
{
DIR *dir;
struct dirent *dent;
strlcpy(dirname, base, sizeof(dirname));
strlcat(dirname, "/", sizeof(dirname));
strlcat(dirname, dent->d_name, sizeof(dirname));
- device_list_insert(dirname);
- }
-
- closedir(dir);
-}
-
-static void scan_subsystem(const char *subsys)
-{
- char base[PATH_SIZE];
- DIR *dir;
- struct dirent *dent;
-
- strlcpy(base, "/sys/", sizeof(base));
- strlcat(base, subsys, sizeof(base));
-
- dir = opendir(base);
- if (dir == NULL)
- return;
-
- for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) {
- char dirname[PATH_SIZE];
-
- if (dent->d_name[0] == '.')
- continue;
-
- strlcpy(dirname, base, sizeof(dirname));
- strlcat(dirname, "/", sizeof(dirname));
- strlcat(dirname, dent->d_name, sizeof(dirname));
- strlcat(dirname, "/devices", sizeof(dirname));
-
- /* look for devices */
- scan_subdir(dirname);
- }
-
- closedir(dir);
-}
-
-static void scan_block(void)
-{
- char base[PATH_SIZE];
- DIR *dir;
- struct dirent *dent;
-
- strlcpy(base, "/sys/block", sizeof(base));
-
- dir = opendir(base);
- if (dir == NULL)
- return;
-
- for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) {
- char dirname[PATH_SIZE];
-
- if (dent->d_name[0] == '.')
- continue;
-
- strlcpy(dirname, base, sizeof(dirname));
- strlcat(dirname, "/", sizeof(dirname));
- strlcat(dirname, dent->d_name, sizeof(dirname));
- if (device_list_insert(dirname) != 0)
- continue;
- /* look for partitions */
- scan_subdir(dirname);
- }
+ if (insert) {
+ int err;
- closedir(dir);
-}
-
-static void scan_class(void)
-{
- char base[PATH_SIZE];
- DIR *dir;
- struct dirent *dent;
-
- strlcpy(base, "/sys/class", sizeof(base));
-
- dir = opendir(base);
- if (dir == NULL)
- return;
-
- for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) {
- char dirname[PATH_SIZE];
-
- if (dent->d_name[0] == '.')
- continue;
+ err = device_list_insert(dirname);
+ if (err)
+ continue;
+ }
- strlcpy(dirname, base, sizeof(dirname));
- strlcat(dirname, "/", sizeof(dirname));
- strlcat(dirname, dent->d_name, sizeof(dirname));
+ if (subdir)
+ strlcat(dirname, subdir, sizeof(base));
- scan_subdir(dirname);
+ if (depth)
+ scan_subdir(dirname, NULL, true, depth - 1);
}
closedir(dir);
/* if we have /sys/subsystem, forget all the old stuff */
- scan_subsystem("bus");
- scan_class();
+ scan_subdir("/sys/bus", "/devices", false, 1);
+ scan_subdir("/sys/class", NULL, false, 1);
/* scan "block" if it isn't a "class" */
if (stat("/sys/class/block", &statbuf) != 0)
- scan_block();
+ scan_subdir("/sys/block", NULL, true, 1);
exit: