Make more robust (patch by Larry Doolittle).
authorMatt Kraai <kraai@debian.org>
Wed, 23 May 2001 14:45:09 +0000 (14:45 -0000)
committerMatt Kraai <kraai@debian.org>
Wed, 23 May 2001 14:45:09 +0000 (14:45 -0000)
libbb/find_root_device.c

index 75ed1a979be024a75f2a52028207532c1c3289c6..edfd7085a163140ac3c6b6b4a595d1820934a501 100644 (file)
@@ -39,16 +39,18 @@ extern char *find_real_root_device_name(const char* name)
        struct dirent *entry;
        struct stat statBuf, rootStat;
        char *fileName;
+       dev_t dev;
 
        if (stat("/", &rootStat) != 0) {
-               error_msg("could not stat '/'");
+               perror_msg("could not stat '/'");
                return NULL;
        }
+       if ((dev = rootStat.st_rdev)==0) dev=rootStat.st_dev;
 
        dir = opendir("/dev");
        if (!dir) {
-               error_msg("could not open '/dev'");
-               return NULL;
+               perror_msg("could not open '/dev'");
+               goto fallback;
        }
 
        while((entry = readdir(dir)) != NULL) {
@@ -64,14 +66,18 @@ extern char *find_real_root_device_name(const char* name)
                 * devices, so make sure this is a block device */
                if (stat(fileName, &statBuf) == 0 && 
                                S_ISBLK(statBuf.st_mode)!=0 &&
-                               statBuf.st_rdev == rootStat.st_rdev) {
+                               statBuf.st_rdev == dev) {
                        return fileName; 
                }
                free(fileName);
        }
        closedir(dir);
 
-       return NULL;
+fallback:
+       /* don't use stack space, caller expects to free() result */
+       fileName=xmalloc(20);
+       sprintf(fileName,"(rdev %u)",(unsigned int) rootStat.st_rdev);
+       return fileName;
 }