udevtrigger: simplify scan_subsystem function
[project/procd.git] / udevtrigger.c
index af620c2..08ddb06 100644 (file)
@@ -179,50 +179,52 @@ static int device_list_insert(const char *path)
        return 0;
 }
 
-
-static void scan_subsystem(const char *subsys)
+static void scan_subdir(const char *base, const char *subdir,
+                       bool insert, int depth)
 {
-       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 (dir == NULL)
+               return;
 
-                       if (dent->d_name[0] == '.')
-                               continue;
+       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));
 
-                       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);
-                       }
+               if (insert) {
+                       int err;
+
+                       err = device_list_insert(dirname);
+                       if (err)
+                               continue;
                }
-               closedir(dir);
+
+               if (subdir)
+                       strlcat(dirname, subdir, sizeof(base));
+
+               if (depth)
+                       scan_subdir(dirname, NULL, true, depth - 1);
        }
+
+       closedir(dir);
+}
+
+static void scan_subsystem(const char *subsys)
+{
+       char base[PATH_SIZE];
+
+       strlcpy(base, "/sys/", sizeof(base));
+       strlcat(base, subsys, sizeof(base));
+
+       scan_subdir(base, "/devices", false, 1);
 }
 
 static void scan_block(void)
@@ -234,43 +236,26 @@ static void scan_block(void)
        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 (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));
-                       if (device_list_insert(dirname) != 0)
-                               continue;
+               if (dent->d_name[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);
+               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, NULL, true, 0);
        }
+
+       closedir(dir);
 }
 
 static void scan_class(void)
@@ -282,44 +267,27 @@ static void scan_class(void)
        strlcpy(base, "/sys/class", 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 (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));
-                       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);
+               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, NULL, true, 0);
        }
+
+       closedir(dir);
 }
 
 int main(int argc, char *argv[], char *envp[])
 {
-       char base[PATH_SIZE];
        struct stat statbuf;
        int option;
 
@@ -355,8 +323,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: