Use the nice new find_real_root_device function to find the
authorErik Andersen <andersen@codepoet.org>
Wed, 22 Mar 2000 07:12:05 +0000 (07:12 -0000)
committerErik Andersen <andersen@codepoet.org>
Wed, 22 Mar 2000 07:12:05 +0000 (07:12 -0000)
name of the root device, instead of having libc read whatever
lies happen to be in /etc/mtab.
 -Erik

coreutils/df.c
df.c
internal.h
mount.c
umount.c
util-linux/mount.c
util-linux/umount.c
utility.c

index bc843f7a2bd8df563d6cf03c575c8dbfb50db6a8..331ef2d49d65a6d073fa69cd9e99bb85117e6abf 100644 (file)
@@ -27,7 +27,6 @@
 #include <mntent.h>
 #include <sys/stat.h>
 #include <sys/vfs.h>
-#include <fstab.h>
 
 static const char df_usage[] = "df [filesystem ...]\n"
 
@@ -40,7 +39,6 @@ static int df(char *device, const char *mountPoint)
        struct statfs s;
        long blocks_used;
        long blocks_percent_used;
-       struct fstab *fstabItem;
 
        if (statfs(mountPoint, &s) != 0) {
                perror(mountPoint);
@@ -53,9 +51,9 @@ static int df(char *device, const char *mountPoint)
                        (blocks_used * 100.0 / (blocks_used + s.f_bavail) + 0.5);
                /* Note that if /etc/fstab is missing, libc can't fix up /dev/root for us */
                if (strcmp(device, "/dev/root") == 0) {
-                       fstabItem = getfsfile("/");
-                       if (fstabItem != NULL)
-                               device = fstabItem->fs_spec;
+                       /* Adjusts device to be the real root device,
+                        * or leaves device alone if it can't find it */
+                       find_real_root_device_name( device);
                }
                printf("%-20s %9ld %9ld %9ld %3ld%% %s\n",
                           device,
diff --git a/df.c b/df.c
index bc843f7a2bd8df563d6cf03c575c8dbfb50db6a8..331ef2d49d65a6d073fa69cd9e99bb85117e6abf 100644 (file)
--- a/df.c
+++ b/df.c
@@ -27,7 +27,6 @@
 #include <mntent.h>
 #include <sys/stat.h>
 #include <sys/vfs.h>
-#include <fstab.h>
 
 static const char df_usage[] = "df [filesystem ...]\n"
 
@@ -40,7 +39,6 @@ static int df(char *device, const char *mountPoint)
        struct statfs s;
        long blocks_used;
        long blocks_percent_used;
-       struct fstab *fstabItem;
 
        if (statfs(mountPoint, &s) != 0) {
                perror(mountPoint);
@@ -53,9 +51,9 @@ static int df(char *device, const char *mountPoint)
                        (blocks_used * 100.0 / (blocks_used + s.f_bavail) + 0.5);
                /* Note that if /etc/fstab is missing, libc can't fix up /dev/root for us */
                if (strcmp(device, "/dev/root") == 0) {
-                       fstabItem = getfsfile("/");
-                       if (fstabItem != NULL)
-                               device = fstabItem->fs_spec;
+                       /* Adjusts device to be the real root device,
+                        * or leaves device alone if it can't find it */
+                       find_real_root_device_name( device);
                }
                printf("%-20s %9ld %9ld %9ld %3ld%% %s\n",
                           device,
index 353ec8ca30a75a01221a7dd2eec905969a47e5f0..9f9461defaf15f719a528f17b18d3a14b575978f 100644 (file)
@@ -216,6 +216,8 @@ extern int check_wildcard_match(const char* text, const char* pattern);
 extern long getNum (const char *cp);
 extern pid_t findPidByName( char* pidName);
 extern void *xmalloc (size_t size);
+extern int find_real_root_device_name(char* name);
+
 #ifdef BB_FEATURE_SH_COMMAND_EDITING
 #include <stdio.h>
 extern int cmdedit_read_input(char* prompt, int inputFd, int outputFd, char command[BUFSIZ]);
diff --git a/mount.c b/mount.c
index 336cff7d2cc8e6091bc72c38bad5863146f861c5..03891371aa2ccd3d3a6bc2a30aa3234a9fe73052 100644 (file)
--- a/mount.c
+++ b/mount.c
@@ -45,7 +45,6 @@
 #include <mntent.h>
 #include <sys/mount.h>
 #include <ctype.h>
-#include <fstab.h>
 #if defined BB_FEATURE_USE_DEVPS_PATCH
 #include <linux/devmtab.h>
 #endif
@@ -321,9 +320,6 @@ extern int mount_main(int argc, char **argv)
        int useMtab = TRUE;
        int i;
 
-       /* Only compiled in if BB_MTAB is not defined */
-       whine_if_fstab_is_missing();
-
 #if defined BB_FEATURE_USE_DEVPS_PATCH
        if (argc == 1) {
                int fd, i, numfilesystems;
@@ -364,14 +360,9 @@ extern int mount_main(int argc, char **argv)
                        struct mntent *m;
 
                        while ((m = getmntent(mountTable)) != 0) {
-                               struct fstab *fstabItem;
                                char *blockDevice = m->mnt_fsname;
-
-                               /* Note that if /etc/fstab is missing, libc can't fix up /dev/root for us */
                                if (strcmp(blockDevice, "/dev/root") == 0) {
-                                       fstabItem = getfsfile("/");
-                                       if (fstabItem != NULL)
-                                               blockDevice = fstabItem->fs_spec;
+                                       find_real_root_device_name( blockDevice);
                                }
                                printf("%s on %s type %s (%s)\n", blockDevice, m->mnt_dir,
                                           m->mnt_type, m->mnt_opts);
@@ -445,7 +436,7 @@ extern int mount_main(int argc, char **argv)
                FILE *f = setmntent("/etc/fstab", "r");
 
                if (f == NULL)
-                       fatalError( "\nCannot ream /etc/fstab: %s\n", strerror (errno));
+                       fatalError( "\nCannot read /etc/fstab: %s\n", strerror (errno));
 
                while ((m = getmntent(f)) != NULL) {
                        // If the file system isn't noauto, 
index 6661db8789e9d1caa25496e4cfcf02ce8b13c421..c34bf5fc3f2c778a1cae0a95dd36e38e39de8ebf 100644 (file)
--- a/umount.c
+++ b/umount.c
@@ -26,7 +26,6 @@
 #include <stdio.h>
 #include <sys/mount.h>
 #include <mntent.h>
-#include <fstab.h>
 #include <errno.h>
 
 
@@ -110,11 +109,10 @@ char *mtab_getinfo(const char *match, const char which)
                        } else {
 #if !defined BB_MTAB
                                if (strcmp(cur->device, "/dev/root") == 0) {
-                                       struct fstab *fstabItem;
-
-                                       fstabItem = getfsfile("/");
-                                       if (fstabItem != NULL)
-                                               return fstabItem->fs_spec;
+                                       /* Adjusts device to be the real root device,
+                                        * or leaves device alone if it can't find it */
+                                       find_real_root_device_name( cur->device);
+                                       return ( cur->device);
                                }
 #endif
                                return cur->device;
index 336cff7d2cc8e6091bc72c38bad5863146f861c5..03891371aa2ccd3d3a6bc2a30aa3234a9fe73052 100644 (file)
@@ -45,7 +45,6 @@
 #include <mntent.h>
 #include <sys/mount.h>
 #include <ctype.h>
-#include <fstab.h>
 #if defined BB_FEATURE_USE_DEVPS_PATCH
 #include <linux/devmtab.h>
 #endif
@@ -321,9 +320,6 @@ extern int mount_main(int argc, char **argv)
        int useMtab = TRUE;
        int i;
 
-       /* Only compiled in if BB_MTAB is not defined */
-       whine_if_fstab_is_missing();
-
 #if defined BB_FEATURE_USE_DEVPS_PATCH
        if (argc == 1) {
                int fd, i, numfilesystems;
@@ -364,14 +360,9 @@ extern int mount_main(int argc, char **argv)
                        struct mntent *m;
 
                        while ((m = getmntent(mountTable)) != 0) {
-                               struct fstab *fstabItem;
                                char *blockDevice = m->mnt_fsname;
-
-                               /* Note that if /etc/fstab is missing, libc can't fix up /dev/root for us */
                                if (strcmp(blockDevice, "/dev/root") == 0) {
-                                       fstabItem = getfsfile("/");
-                                       if (fstabItem != NULL)
-                                               blockDevice = fstabItem->fs_spec;
+                                       find_real_root_device_name( blockDevice);
                                }
                                printf("%s on %s type %s (%s)\n", blockDevice, m->mnt_dir,
                                           m->mnt_type, m->mnt_opts);
@@ -445,7 +436,7 @@ extern int mount_main(int argc, char **argv)
                FILE *f = setmntent("/etc/fstab", "r");
 
                if (f == NULL)
-                       fatalError( "\nCannot ream /etc/fstab: %s\n", strerror (errno));
+                       fatalError( "\nCannot read /etc/fstab: %s\n", strerror (errno));
 
                while ((m = getmntent(f)) != NULL) {
                        // If the file system isn't noauto, 
index 6661db8789e9d1caa25496e4cfcf02ce8b13c421..c34bf5fc3f2c778a1cae0a95dd36e38e39de8ebf 100644 (file)
@@ -26,7 +26,6 @@
 #include <stdio.h>
 #include <sys/mount.h>
 #include <mntent.h>
-#include <fstab.h>
 #include <errno.h>
 
 
@@ -110,11 +109,10 @@ char *mtab_getinfo(const char *match, const char which)
                        } else {
 #if !defined BB_MTAB
                                if (strcmp(cur->device, "/dev/root") == 0) {
-                                       struct fstab *fstabItem;
-
-                                       fstabItem = getfsfile("/");
-                                       if (fstabItem != NULL)
-                                               return fstabItem->fs_spec;
+                                       /* Adjusts device to be the real root device,
+                                        * or leaves device alone if it can't find it */
+                                       find_real_root_device_name( cur->device);
+                                       return ( cur->device);
                                }
 #endif
                                return cur->device;
index 37f698ea4452ff0711233a453a2f564c068782c0..c779cc6badb588c2f57f65278a2fd9ee761c0ffc 100644 (file)
--- a/utility.c
+++ b/utility.c
@@ -1469,25 +1469,29 @@ extern char *find_unused_loop_device(void)
 }
 #endif                                                 /* BB_FEATURE_MOUNT_LOOP */
 
-#if defined BB_MOUNT
-char* find_real_root_device_name(void)
+#if defined BB_MOUNT || defined BB_DF
+extern int find_real_root_device_name(char* name)
 {
-       int gotIt=0;
        DIR *dir;
        struct dirent *entry;
        struct stat statBuf, rootStat;
        char fileName[BUFSIZ];
 
-       if (stat("/", &rootStat) != 0)
-               fatalError("Wierd.  I could not stat '/'\n");
+       if (stat("/", &rootStat) != 0) {
+               errorMsg("could not stat '/'\n");
+               return( FALSE);
+       }
 
-       if (!(dir = opendir("/dev"));
-               fatalError("Wierd.  I could not open '/dev'\n");
+       dir = opendir("/dev");
+       if (!dir) {
+               errorMsg("could not open '/dev'\n");
+               return( FALSE);
+       }
 
        while((entry = readdir(dir)) != NULL) {
+
                /* Must skip ".." since that is "/", and so we 
                 * would get a false positive on ".."  */
-
                if (strcmp(entry->d_name, "..") == 0)
                        continue;
 
@@ -1495,12 +1499,17 @@ char* find_real_root_device_name(void)
 
                if (stat(fileName, &statBuf) != 0)
                        continue;
+               /* Some char devices have the same dev_t as block
+                * devices, so make sure this is a block device */
+               if (! S_ISBLK(statBuf.st_mode))
+                       continue;
                if (statBuf.st_rdev == rootStat.st_rdev) {
-                       return (strdup(fileName));
+                       strcpy(name, fileName); 
+                       return ( TRUE);
                }
        }
 
-       return( NULL);
+       return( FALSE);
 }
 #endif