blob: 1404e96216303ebc555d8df9cdee8d663b1bfd3c [file] [log] [blame]
Eric Andersenc4996011999-10-20 22:08:37 +00001/*
2 * Mini df implementation for busybox
3 *
4 * Copyright (C) 1999 by Lineo, inc.
5 * Written by Erik Andersen <andersen@lineo.com>, <andersee@debian.org>
6 * based on original code by (I think) Bruce Perens <bruce@pixar.com>.
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 *
22 */
23
Eric Andersencc8ed391999-10-05 16:24:54 +000024#include "internal.h"
25#include <stdio.h>
26#include <mntent.h>
27#include <sys/stat.h>
28#include <sys/vfs.h>
Eric Andersen596e5461999-10-07 08:30:23 +000029#include <fstab.h>
Eric Andersencc8ed391999-10-05 16:24:54 +000030
Eric Andersenc4996011999-10-20 22:08:37 +000031static const char df_usage[] = "df [filesystem ...]\n"
32 "\n" "\tPrint the filesystem space used and space available.\n";
Eric Andersencc8ed391999-10-05 16:24:54 +000033
Eric Andersend0246fb1999-11-04 21:18:07 +000034extern const char mtab_file[]; /* Defined in utility.c */
Eric Andersencc8ed391999-10-05 16:24:54 +000035
Eric Andersenc4996011999-10-20 22:08:37 +000036static int df(char *device, const char *mountPoint)
Eric Andersencc8ed391999-10-05 16:24:54 +000037{
Eric Andersenc4996011999-10-20 22:08:37 +000038 struct statfs s;
39 long blocks_used;
40 long blocks_percent_used;
Eric Andersen29d2e361999-11-06 06:07:27 +000041 struct fstab* fstabItem;
Eric Andersencc8ed391999-10-05 16:24:54 +000042
Eric Andersenc4996011999-10-20 22:08:37 +000043 if (statfs(mountPoint, &s) != 0) {
44 perror(mountPoint);
Eric Andersen96bcfd31999-11-12 01:30:18 +000045 return FALSE;
Eric Andersenc4996011999-10-20 22:08:37 +000046 }
Eric Andersencc8ed391999-10-05 16:24:54 +000047
Eric Andersenc4996011999-10-20 22:08:37 +000048 if (s.f_blocks > 0) {
49 blocks_used = s.f_blocks - s.f_bfree;
50 blocks_percent_used = (long)
51 (blocks_used * 100.0 / (blocks_used + s.f_bavail) + 0.5);
Eric Andersen29d2e361999-11-06 06:07:27 +000052 /* Note that if /etc/fstab is missing, libc can't fix up /dev/root for us */
53 if (strcmp (device, "/dev/root") == 0) {
54 fstabItem = getfsfile ("/");
55 if (fstabItem != NULL)
56 device = fstabItem->fs_spec;
57 }
Eric Andersenc4996011999-10-20 22:08:37 +000058 printf("%-20s %9ld %9ld %9ld %3ld%% %s\n",
59 device,
60 (long) (s.f_blocks * (s.f_bsize / 1024.0)),
61 (long) ((s.f_blocks - s.f_bfree) * (s.f_bsize / 1024.0)),
62 (long) (s.f_bavail * (s.f_bsize / 1024.0)),
63 blocks_percent_used, mountPoint);
Eric Andersencc8ed391999-10-05 16:24:54 +000064
Eric Andersenc4996011999-10-20 22:08:37 +000065 }
66
Eric Andersen96bcfd31999-11-12 01:30:18 +000067 return TRUE;
Eric Andersencc8ed391999-10-05 16:24:54 +000068}
69
Eric Andersenc4996011999-10-20 22:08:37 +000070extern int df_main(int argc, char **argv)
71{
72 printf("%-20s %-14s %s %s %s %s\n", "Filesystem",
73 "1k-blocks", "Used", "Available", "Use%", "Mounted on");
74
Eric Andersen29d2e361999-11-06 06:07:27 +000075 /* Only compiled in if BB_MTAB is not defined */
76 whine_if_fstab_is_missing();
77
Eric Andersenc4996011999-10-20 22:08:37 +000078 if (argc > 1) {
79 struct mntent *mountEntry;
80 int status;
81
82 while (argc > 1) {
Eric Andersend0246fb1999-11-04 21:18:07 +000083 if ((mountEntry = findMountPoint(argv[1], mtab_file)) ==
Eric Andersenc4996011999-10-20 22:08:37 +000084 0) {
85 fprintf(stderr, "%s: can't find mount point.\n", argv[1]);
Eric Andersen96bcfd31999-11-12 01:30:18 +000086 exit( FALSE);
Eric Andersenc4996011999-10-20 22:08:37 +000087 }
88 status = df(mountEntry->mnt_fsname, mountEntry->mnt_dir);
89 if (status != 0)
Eric Andersen96bcfd31999-11-12 01:30:18 +000090 exit( status);
Eric Andersenc4996011999-10-20 22:08:37 +000091 argc--;
92 argv++;
93 }
Eric Andersen96bcfd31999-11-12 01:30:18 +000094 exit( TRUE);
Eric Andersenc4996011999-10-20 22:08:37 +000095 } else {
96 FILE *mountTable;
97 struct mntent *mountEntry;
98
Eric Andersend0246fb1999-11-04 21:18:07 +000099 mountTable = setmntent(mtab_file, "r");
Eric Andersenc4996011999-10-20 22:08:37 +0000100 if (mountTable == 0) {
Eric Andersend0246fb1999-11-04 21:18:07 +0000101 perror(mtab_file);
Eric Andersenc4996011999-10-20 22:08:37 +0000102 exit(FALSE);
103 }
104
105 while ((mountEntry = getmntent(mountTable))) {
Eric Andersenc054b211999-11-27 17:41:29 +0000106 df(mountEntry->mnt_fsname, mountEntry->mnt_dir);
Eric Andersenc6cb79d1999-10-13 18:01:10 +0000107 }
108 endmntent(mountTable);
Eric Andersenc4996011999-10-20 22:08:37 +0000109 }
110
Eric Andersen96bcfd31999-11-12 01:30:18 +0000111 exit( TRUE);
Eric Andersenc6cb79d1999-10-13 18:01:10 +0000112}