blob: a0692afc5fb820de89b2ecad59e9908036963c8d [file] [log] [blame]
Eric Andersencc8ed391999-10-05 16:24:54 +00001#include "internal.h"
2#include <stdio.h>
3#include <mntent.h>
4#include <sys/stat.h>
5#include <sys/vfs.h>
6
7const char df_usage[] = "df [filesystem ...]\n"
8"\n"
9"\tPrint the filesystem space used and space available.\n";
10
11
12static int
13df(const char * device, const char * mountPoint)
14{
15 struct statfs s;
16 long blocks_used;
17 long blocks_percent_used;
18
19 if ( statfs(mountPoint, &s) != 0 ) {
20 name_and_error(mountPoint);
21 return 1;
22 }
23
24 if ( s.f_blocks > 0 ) {
25 blocks_used = s.f_blocks - s.f_bfree;
26 blocks_percent_used = (long)
27 (blocks_used * 100.0 / (blocks_used + s.f_bavail) + 0.5);
28
29/*
30 printf(
31 "%-20s %7ld %7ld %7ld %5ld%% %s\n"
32 ,device
33 ,s.f_blocks
34 ,s.f_blocks - s.f_bfree
35 ,s.f_bavail
36 ,blocks_percent_used
37 ,mountPoint);
38*/
39
40 printf(
41 "%-20s %7.0f %7.0f %7.0f %5ld%% %s\n"
42 ,device
43 ,s.f_blocks * (s.f_bsize / 1024.0)
44 ,(s.f_blocks - s.f_bfree) * (s.f_bsize / 1024.0)
45 ,s.f_bavail * (s.f_bsize / 1024.0)
46 ,blocks_percent_used
47 ,mountPoint);
48
49 }
50
51 return 0;
52}
53
54extern int
55df_main(struct FileInfo * i, int argc, char * * argv)
56{
57 static const char header[] =
58 "Filesystem 1024-blocks Used Available Capacity Mounted on\n";
59 printf(header);
60
61 if ( argc > 1 ) {
62 struct mntent * mountEntry;
63 int status;
64
65 while ( argc > 1 ) {
66 if ( (mountEntry = findMountPoint(argv[1], "/etc/mtab")) == 0
67 && (mountEntry = findMountPoint(argv[1], "/proc/mounts")) == 0 )
68 {
69 fprintf(stderr, "%s: can't find mount point.\n"
70 ,argv[1]);
71 return 1;
72 }
73 status = df(mountEntry->mnt_fsname, mountEntry->mnt_dir);
74 if ( status != 0 )
75 return status;
76 argc--;
77 argv++;
78 }
79 return 0;
80 }
81 else {
82 FILE * mountTable;
83 struct mntent * mountEntry;
84
85 if ( (mountTable = setmntent("/etc/mtab", "r")) == 0
86 && (mountTable = setmntent("/proc/mounts", "r")) == 0
87 ) {
88 name_and_error("/etc/mtab");
89 return 1;
90 }
91
92 while ( (mountEntry = getmntent(mountTable)) != 0 ) {
93 int status = df(
94 mountEntry->mnt_fsname
95 ,mountEntry->mnt_dir);
96 if ( status != 0 )
97 return status;
98 }
99 endmntent(mountTable);
100 }
101
102 return 0;
103}