Stuff
[oweals/busybox.git] / coreutils / df.c
index f8a953f7d20651802d32df67163c4c7e2fad0d8b..a84a330d89cd7b6a38db1f5e8dccdbcd7f77c3e9 100644 (file)
 static const char df_usage[] = "df [filesystem ...]\n"
     "\n" "\tPrint the filesystem space used and space available.\n";
 
+extern const char mtab_file[]; /* Defined in utility.c */
 
 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);
@@ -47,9 +49,12 @@ static int df(char *device, const char *mountPoint)
        blocks_used = s.f_blocks - s.f_bfree;
        blocks_percent_used = (long)
            (blocks_used * 100.0 / (blocks_used + s.f_bavail) + 0.5);
-       if (strcmp(device, "/dev/root") == 0)
-           device = (getfsfile("/"))->fs_spec;
-
+       /* 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;
+       }
        printf("%-20s %9ld %9ld %9ld %3ld%% %s\n",
               device,
               (long) (s.f_blocks * (s.f_bsize / 1024.0)),
@@ -62,58 +67,20 @@ static int df(char *device, const char *mountPoint)
     return 0;
 }
 
-/*
- * Given a block device, find the mount table entry if that block device
- * is mounted.
- *
- * Given any other file (or directory), find the mount table entry for its
- * filesystem.
- */
-extern struct mntent *findMountPoint(const char *name, const char *table)
-{
-    struct stat s;
-    dev_t mountDevice;
-    FILE *mountTable;
-    struct mntent *mountEntry;
-
-    if (stat(name, &s) != 0)
-       return 0;
-
-    if ((s.st_mode & S_IFMT) == S_IFBLK)
-       mountDevice = s.st_rdev;
-    else
-       mountDevice = s.st_dev;
-
-
-    if ((mountTable = setmntent(table, "r")) == 0)
-       return 0;
-
-    while ((mountEntry = getmntent(mountTable)) != 0) {
-       if (strcmp(name, mountEntry->mnt_dir) == 0
-           || strcmp(name, mountEntry->mnt_fsname) == 0)       /* String match. */
-           break;
-       if (stat(mountEntry->mnt_fsname, &s) == 0 && s.st_rdev == mountDevice)  /* Match the device. */
-           break;
-       if (stat(mountEntry->mnt_dir, &s) == 0 && s.st_dev == mountDevice)      /* Match the directory's mount point. */
-           break;
-    }
-    endmntent(mountTable);
-    return mountEntry;
-}
-
-
-
 extern int df_main(int argc, char **argv)
 {
     printf("%-20s %-14s %s %s %s %s\n", "Filesystem",
           "1k-blocks", "Used", "Available", "Use%", "Mounted on");
 
+    /* Only compiled in if BB_MTAB is not defined */
+    whine_if_fstab_is_missing();
+
     if (argc > 1) {
        struct mntent *mountEntry;
        int status;
 
        while (argc > 1) {
-           if ((mountEntry = findMountPoint(argv[1], "/proc/mounts")) ==
+           if ((mountEntry = findMountPoint(argv[1], mtab_file)) ==
                0) {
                fprintf(stderr, "%s: can't find mount point.\n", argv[1]);
                return 1;
@@ -129,9 +96,9 @@ extern int df_main(int argc, char **argv)
        FILE *mountTable;
        struct mntent *mountEntry;
 
-       mountTable = setmntent("/proc/mounts", "r");
+       mountTable = setmntent(mtab_file, "r");
        if (mountTable == 0) {
-           perror("/proc/mounts");
+           perror(mtab_file);
            exit(FALSE);
        }