X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fprocd.git;a=blobdiff_plain;f=udevtrigger.c;h=5013189530a1741b8bfd8f3c9db85085124477f8;hp=fd293a4645647ca3550d6966d18e463613f7ca48;hb=b5e17105b163442a030559b7b2c2454b82b3fd4c;hpb=92b3b9ae934a631d9f872c66e39fc2f82e05a642 diff --git a/udevtrigger.c b/udevtrigger.c index fd293a4..5013189 100644 --- a/udevtrigger.c +++ b/udevtrigger.c @@ -179,115 +179,46 @@ static int device_list_insert(const char *path) return 0; } -static void scan_subdir(const char *dirname) +static void scan_subdir(const char *base, const char *subdir, + bool insert, int depth) { - DIR *dir2; - struct dirent *dent2; - - 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); - } -} - -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]; + if (dir == NULL) + return; - if (dent->d_name[0] == '.') - continue; + for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) { + char dirname[PATH_SIZE]; - strlcpy(dirname, base, sizeof(dirname)); - strlcat(dirname, "/", sizeof(dirname)); - strlcat(dirname, dent->d_name, sizeof(dirname)); - strlcat(dirname, "/devices", sizeof(dirname)); + if (dent->d_name[0] == '.') + continue; - /* look for devices */ - scan_subdir(dirname); - } - closedir(dir); - } -} - -static void scan_block(void) -{ - char base[PATH_SIZE]; - DIR *dir; - struct dirent *dent; + strlcpy(dirname, base, sizeof(dirname)); + strlcat(dirname, "/", sizeof(dirname)); + strlcat(dirname, dent->d_name, sizeof(dirname)); - strlcpy(base, "/sys/block", sizeof(base)); + if (insert) { + int err; - dir = opendir(base); - if (dir != NULL) { - for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) { - char dirname[PATH_SIZE]; - - if (dent->d_name[0] == '.') + 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 (device_list_insert(dirname) != 0) - continue; - - /* look for partitions */ - scan_subdir(dirname); } - closedir(dir); - } -} - -static void scan_class(void) -{ - char base[PATH_SIZE]; - DIR *dir; - struct dirent *dent; - strlcpy(base, "/sys/class", sizeof(base)); + if (subdir) + strlcat(dirname, subdir, sizeof(base)); - dir = opendir(base); - if (dir != NULL) { - 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)); - - scan_subdir(dirname); - } - closedir(dir); + if (depth) + scan_subdir(dirname, NULL, true, depth - 1); } + + closedir(dir); } int main(int argc, char *argv[], char *envp[]) { - char base[PATH_SIZE]; struct stat statbuf; int option; @@ -319,13 +250,12 @@ int main(int argc, char *argv[], char *envp[]) /* 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" */ - strlcpy(base, "/sys/class/block", sizeof(base)); - if (stat(base, &statbuf) != 0) - scan_block(); + if (stat("/sys/class/block", &statbuf) != 0) + scan_subdir("/sys/block", NULL, true, 1); exit: