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) { for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) { char dirname[PATH_SIZE]; DIR *dir2; struct dirent *dent2; 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 */ dir2 = opendir(dirname); if (dir2 != NULL) { for (dent2 = readdir(dir2); dent2 != NULL; dent2 = readdir(dir2)) { char dirname2[PATH_SIZE]; if (dent2->d_name[0] == '.') continue; if (!strcmp(dent2->d_name,"device")) continue; strlcpy(dirname2, dirname, sizeof(dirname2)); strlcat(dirname2, "/", sizeof(dirname2)); strlcat(dirname2, dent2->d_name, sizeof(dirname2)); device_list_insert(dirname2); } closedir(dir2); } } 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) { for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) { char dirname[PATH_SIZE]; DIR *dir2; struct dirent *dent2; 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 */ dir2 = opendir(dirname); if (dir2 != NULL) { for (dent2 = readdir(dir2); dent2 != NULL; dent2 = readdir(dir2)) { char dirname2[PATH_SIZE]; if (dent2->d_name[0] == '.') continue; strlcpy(dirname2, dirname, sizeof(dirname2)); strlcat(dirname2, "/", sizeof(dirname2)); strlcat(dirname2, dent2->d_name, sizeof(dirname2)); device_list_insert(dirname2); } closedir(dir2); } } closedir(dir); } }
static void scan_subdir(const char *base, const char *subdir, bool insert, int depth) { DIR *dir; struct dirent *dent; 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 (insert) { int err; err = device_list_insert(dirname); if (err) continue; } if (subdir) strlcat(dirname, subdir, sizeof(base)); if (depth) scan_subdir(dirname, NULL, true, depth - 1); } closedir(dir); }