syslog() is a blocking call on eglibc. as procd provides the actual syslog, weneed...
[project/procd.git] / udevtrigger.c
index e09ad98..5013189 100644 (file)
@@ -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;
@@ -197,97 +198,20 @@ static void scan_subdir(const char *base)
                strlcpy(dirname, base, sizeof(dirname));
                strlcat(dirname, "/", sizeof(dirname));
                strlcat(dirname, dent->d_name, sizeof(dirname));
-               device_list_insert(dirname);
-       }
-
-       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)
-               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));
-               strlcat(dirname, "/devices", sizeof(dirname));
-
-               /* look for devices */
-               scan_subdir(dirname);
-       }
-
-       closedir(dir);
-}
-
-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)
-               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 (device_list_insert(dirname) != 0)
-                       continue;
 
-               /* look for partitions */
-               scan_subdir(dirname);
-       }
+               if (insert) {
+                       int err;
 
-       closedir(dir);
-}
-
-static void scan_class(void)
-{
-       char base[PATH_SIZE];
-       DIR *dir;
-       struct dirent *dent;
-
-       strlcpy(base, "/sys/class", sizeof(base));
-
-       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;
+                       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 (subdir)
+                       strlcat(dirname, subdir, sizeof(base));
 
-               scan_subdir(dirname);
+               if (depth)
+                       scan_subdir(dirname, NULL, true, depth - 1);
        }
 
        closedir(dir);
@@ -295,7 +219,6 @@ static void scan_class(void)
 
 int main(int argc, char *argv[], char *envp[])
 {
-       char base[PATH_SIZE];
        struct stat statbuf;
        int option;
 
@@ -327,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: