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 #include #include -#include 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 #include #include -#include 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 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 #include #include -#include #if defined BB_FEATURE_USE_DEVPS_PATCH #include #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 #include #include -#include #include @@ -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 #include #include -#include #if defined BB_FEATURE_USE_DEVPS_PATCH #include #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 #include #include -#include #include @@ -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