return 0;
}
-static void scan_bus(void)
+static void scan_subsystem(const char *subsys)
{
char base[PATH_SIZE];
DIR *dir;
struct dirent *dent;
strlcpy(base, sysfs_path, sizeof(base));
- strlcat(base, "/bus", sizeof(base));
+ strlcat(base, "/", sizeof(base));
+ strlcat(base, subsys, sizeof(base));
dir = opendir(base);
if (dir != NULL) {
char base[PATH_SIZE];
DIR *dir;
struct dirent *dent;
- struct stat statbuf;
-
- /* skip if "block" is already a "class" */
- strlcpy(base, sysfs_path, sizeof(base));
- strlcat(base, "/class/block", sizeof(base));
- if (stat(base, &statbuf) == 0)
- return;
if (subsystem_filtered("block"))
return;
if (dir != NULL) {
for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) {
char device[PATH_SIZE];
- size_t start, end, i;
+ size_t start;
if (dent->d_name[0] == '.')
continue;
- 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);
-
- /* replace PATH_TO_NAME_CHAR with '/' */
- for (i = start; i < end; i++)
- if (device[i] == PATH_TO_NAME_CHAR)
- device[i] = '/';
-
+ start = strlcpy(device, sysfs_path, sizeof(device));
+ strlcat(device, dent->d_name, sizeof(device));
+ path_decode(&device[start]);
device_list_insert(device);
}
closedir(dir);
if (failed)
scan_failed();
else {
- scan_bus();
- scan_class();
- scan_block();
+ 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");
+ scan_class();
+
+ /* scan "block" if it isn't a "class" */
+ strlcpy(base, sysfs_path, sizeof(base));
+ strlcat(base, "/class/block", sizeof(base));
+ if (stat(base, &statbuf) != 0)
+ scan_block();
+ }
}
exec_list();