chiark / gitweb /
[PATCH] reverse order of scanning of udevstart to look at class before block.
[elogind.git] / udevstart.c
index eda6355b534e68e6b8cbc4502579255afbe9ab53..2d11edeca2d6fd291e5d6985c47bcbf48274f0ca 100644 (file)
@@ -33,6 +33,7 @@
 #include <unistd.h>
 
 #include "logging.h"
+#include "udev_lib.h"
 
 
 #ifdef LOG
@@ -61,8 +62,8 @@ static void udev_exec(const char *path, const char* subsystem)
        char nosleep[] = "UDEV_NO_SLEEP=1";
        char *env[] = { action, devpath, nosleep, NULL };
 
-       snprintf(devpath, MAX_PATHLEN, "DEVPATH=%s", path);
-       devpath[MAX_PATHLEN-1] = '\0';
+       strcpy(devpath, "DEVPATH=");
+       strfieldcat(devpath, path);
 
        pid = fork();
        switch (pid) {
@@ -86,8 +87,13 @@ static void udev_scan(void)
        DIR *dir;
        struct dirent *dent;
 
-       devpath = "block";
-       dir = opendir(SYSBLOCK);
+       /* 
+        * We want to scan the class tree first as lvm and dm needs to be able
+        * to have access to the char control device when probing the block
+        * devices.
+        */
+       devpath = "class";
+       dir = opendir(SYSCLASS);
        if (dir != NULL) {
                for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) {
                        char dirname[MAX_PATHLEN];
@@ -98,15 +104,12 @@ static void udev_scan(void)
                            (strcmp(dent->d_name, "..") == 0))
                                continue;
 
-                       snprintf(dirname, MAX_PATHLEN, "/block/%s", dent->d_name);
-                       dirname[MAX_PATHLEN-1] = '\0';
-                       udev_exec(dirname, "block");
-
-                       snprintf(dirname, MAX_PATHLEN, "%s/%s", SYSBLOCK, dent->d_name);
+                       snprintf(dirname, MAX_PATHLEN, "%s/%s", SYSCLASS, dent->d_name);
+                       dirname[MAX_PATHLEN] = '\0';
                        dir2 = opendir(dirname);
                        if (dir2 != NULL) {
                                for (dent2 = readdir(dir2); dent2 != NULL; dent2 = readdir(dir2)) {
-                                       char dirname2[MAX_PATHLEN];
+                                       char dirname2[MAX_PATHLEN-1];
                                        DIR *dir3;
                                        struct dirent *dent3;
 
@@ -123,20 +126,23 @@ static void udev_scan(void)
                                                        char filename[MAX_PATHLEN];
 
                                                        if (strcmp(dent3->d_name, "dev") == 0) {
-                                                               snprintf(filename, MAX_PATHLEN, "/block/%s/%s",
+                                                               snprintf(filename, MAX_PATHLEN, "/class/%s/%s",
                                                                         dent->d_name, dent2->d_name);
                                                                filename[MAX_PATHLEN-1] = '\0';
-                                                               udev_exec(filename, "block");
+                                                               udev_exec(filename, dent->d_name);
                                                        }
                                                }
+                                               closedir(dir3);
                                        }
                                }
+                               closedir(dir2);
                        }
                }
+               closedir(dir);
        }
 
-       devpath = "class";
-       dir = opendir(SYSCLASS);
+       devpath = "block";
+       dir = opendir(SYSBLOCK);
        if (dir != NULL) {
                for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) {
                        char dirname[MAX_PATHLEN];
@@ -147,12 +153,15 @@ static void udev_scan(void)
                            (strcmp(dent->d_name, "..") == 0))
                                continue;
 
-                       snprintf(dirname, MAX_PATHLEN, "%s/%s", SYSCLASS, dent->d_name);
-                       dirname[MAX_PATHLEN] = '\0';
+                       snprintf(dirname, MAX_PATHLEN, "/block/%s", dent->d_name);
+                       dirname[MAX_PATHLEN-1] = '\0';
+                       udev_exec(dirname, "block");
+
+                       snprintf(dirname, MAX_PATHLEN, "%s/%s", SYSBLOCK, dent->d_name);
                        dir2 = opendir(dirname);
                        if (dir2 != NULL) {
                                for (dent2 = readdir(dir2); dent2 != NULL; dent2 = readdir(dir2)) {
-                                       char dirname2[MAX_PATHLEN-1];
+                                       char dirname2[MAX_PATHLEN];
                                        DIR *dir3;
                                        struct dirent *dent3;
 
@@ -169,20 +178,22 @@ static void udev_scan(void)
                                                        char filename[MAX_PATHLEN];
 
                                                        if (strcmp(dent3->d_name, "dev") == 0) {
-                                                               snprintf(filename, MAX_PATHLEN, "/class/%s/%s",
+                                                               snprintf(filename, MAX_PATHLEN, "/block/%s/%s",
                                                                         dent->d_name, dent2->d_name);
                                                                filename[MAX_PATHLEN-1] = '\0';
-                                                               udev_exec(filename, dent->d_name);
+                                                               udev_exec(filename, "block");
                                                        }
                                                }
+                                               closedir(dir3);
                                        }
                                }
+                               closedir(dir2);
                        }
                }
+               closedir(dir);
        }
 }
 
-
 int main(int argc, char *argv[], char *envp[])
 {
        init_logging("udevstart");