summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--coreutils/df.c8
-rw-r--r--df.c8
-rw-r--r--internal.h2
-rw-r--r--mount.c13
-rw-r--r--umount.c10
-rw-r--r--util-linux/mount.c13
-rw-r--r--util-linux/umount.c10
-rw-r--r--utility.c29
8 files changed, 39 insertions, 54 deletions
diff --git a/coreutils/df.c b/coreutils/df.c
index bc843f7a2..331ef2d49 100644
--- a/coreutils/df.c
+++ b/coreutils/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,
diff --git a/df.c b/df.c
index bc843f7a2..331ef2d49 100644
--- 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,
diff --git a/internal.h b/internal.h
index 353ec8ca3..9f9461def 100644
--- a/internal.h
+++ b/internal.h
@@ -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 336cff7d2..03891371a 100644
--- 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,
diff --git a/umount.c b/umount.c
index 6661db878..c34bf5fc3 100644
--- 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;
diff --git a/util-linux/mount.c b/util-linux/mount.c
index 336cff7d2..03891371a 100644
--- a/util-linux/mount.c
+++ b/util-linux/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,
diff --git a/util-linux/umount.c b/util-linux/umount.c
index 6661db878..c34bf5fc3 100644
--- a/util-linux/umount.c
+++ b/util-linux/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;
diff --git a/utility.c b/utility.c
index 37f698ea4..c779cc6ba 100644
--- 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