X-Git-Url: https://git.archive.openwrt.org/?a=blobdiff_plain;f=udevtrigger.c;h=5a9acacbcdf6acd633cf99591b19d73877409ba7;hb=3a698a2a1aad368d33b08d405fbc44d39f63982a;hp=dbb414ab7d561822b8584baacbe123b17b17e288;hpb=824a4b3da2c0be19ccf54a48dcd4c10677b82c1a;p=project%2Fprocd.git diff --git a/udevtrigger.c b/udevtrigger.c index dbb414a..5a9acac 100644 --- a/udevtrigger.c +++ b/udevtrigger.c @@ -179,7 +179,8 @@ static int device_list_insert(const char *path) 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; @@ -191,10 +192,26 @@ static void scan_subdir(const char *base) 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)); - device_list_insert(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); @@ -225,7 +242,7 @@ static void scan_subsystem(const char *subsys) strlcat(dirname, "/devices", sizeof(dirname)); /* look for devices */ - scan_subdir(dirname); + scan_subdir(dirname, NULL, true, 0); } closedir(dir); @@ -256,7 +273,7 @@ static void scan_block(void) continue; /* look for partitions */ - scan_subdir(dirname); + scan_subdir(dirname, NULL, true, 0); } closedir(dir); @@ -284,7 +301,7 @@ static void scan_class(void) strlcat(dirname, "/", sizeof(dirname)); strlcat(dirname, dent->d_name, sizeof(dirname)); - scan_subdir(dirname); + scan_subdir(dirname, NULL, true, 0); } closedir(dir); @@ -292,7 +309,6 @@ static void scan_class(void) int main(int argc, char *argv[], char *envp[]) { - char base[PATH_SIZE]; struct stat statbuf; int option; @@ -328,8 +344,7 @@ int main(int argc, char *argv[], char *envp[]) scan_class(); /* scan "block" if it isn't a "class" */ - strlcpy(base, "/sys/class/block", sizeof(base)); - if (stat(base, &statbuf) != 0) + if (stat("/sys/class/block", &statbuf) != 0) scan_block(); exit: