1*41fbaed0Stron /* $NetBSD: fsspace.c,v 1.1.1.1 2009/06/23 10:08:59 tron Exp $ */
2*41fbaed0Stron
3*41fbaed0Stron /*++
4*41fbaed0Stron /* NAME
5*41fbaed0Stron /* fsspace 3
6*41fbaed0Stron /* SUMMARY
7*41fbaed0Stron /* determine available file system space
8*41fbaed0Stron /* SYNOPSIS
9*41fbaed0Stron /* #include <fsspace.h>
10*41fbaed0Stron /*
11*41fbaed0Stron /* struct fsspace {
12*41fbaed0Stron /* .in +4
13*41fbaed0Stron /* unsigned long block_size;
14*41fbaed0Stron /* unsigned long block_free;
15*41fbaed0Stron /* .in -4
16*41fbaed0Stron /* };
17*41fbaed0Stron /*
18*41fbaed0Stron /* void fsspace(path, sp)
19*41fbaed0Stron /* const char *path;
20*41fbaed0Stron /* struct fsspace *sp;
21*41fbaed0Stron /* DESCRIPTION
22*41fbaed0Stron /* fsspace() returns the amount of available space in the file
23*41fbaed0Stron /* system specified in \fIpath\fR, in terms of the block size and
24*41fbaed0Stron /* of the number of available blocks.
25*41fbaed0Stron /* DIAGNOSTICS
26*41fbaed0Stron /* All errors are fatal.
27*41fbaed0Stron /* BUGS
28*41fbaed0Stron /* Use caution when doing computations with the result from fsspace().
29*41fbaed0Stron /* It is easy to cause overflow (by multiplying large numbers) or to
30*41fbaed0Stron /* cause underflow (by subtracting unsigned numbers).
31*41fbaed0Stron /* LICENSE
32*41fbaed0Stron /* .ad
33*41fbaed0Stron /* .fi
34*41fbaed0Stron /* The Secure Mailer license must be distributed with this software.
35*41fbaed0Stron /* AUTHOR(S)
36*41fbaed0Stron /* Wietse Venema
37*41fbaed0Stron /* IBM T.J. Watson Research
38*41fbaed0Stron /* P.O. Box 704
39*41fbaed0Stron /* Yorktown Heights, NY 10598, USA
40*41fbaed0Stron /*--*/
41*41fbaed0Stron
42*41fbaed0Stron /* System library. */
43*41fbaed0Stron
44*41fbaed0Stron #include <sys_defs.h>
45*41fbaed0Stron
46*41fbaed0Stron #if defined(STATFS_IN_SYS_MOUNT_H)
47*41fbaed0Stron #include <sys/param.h>
48*41fbaed0Stron #include <sys/mount.h>
49*41fbaed0Stron #elif defined(STATFS_IN_SYS_VFS_H)
50*41fbaed0Stron #include <sys/vfs.h>
51*41fbaed0Stron #elif defined(STATVFS_IN_SYS_STATVFS_H)
52*41fbaed0Stron #include <sys/statvfs.h>
53*41fbaed0Stron #elif defined(STATFS_IN_SYS_STATFS_H)
54*41fbaed0Stron #include <sys/statfs.h>
55*41fbaed0Stron #else
56*41fbaed0Stron #ifdef USE_STATFS
57*41fbaed0Stron #error "please specify the include file with `struct statfs'"
58*41fbaed0Stron #else
59*41fbaed0Stron #error "please specify the include file with `struct statvfs'"
60*41fbaed0Stron #endif
61*41fbaed0Stron #endif
62*41fbaed0Stron
63*41fbaed0Stron /* Utility library. */
64*41fbaed0Stron
65*41fbaed0Stron #include <msg.h>
66*41fbaed0Stron #include <fsspace.h>
67*41fbaed0Stron
68*41fbaed0Stron /* fsspace - find amount of available file system space */
69*41fbaed0Stron
fsspace(const char * path,struct fsspace * sp)70*41fbaed0Stron void fsspace(const char *path, struct fsspace * sp)
71*41fbaed0Stron {
72*41fbaed0Stron const char *myname = "fsspace";
73*41fbaed0Stron
74*41fbaed0Stron #ifdef USE_STATFS
75*41fbaed0Stron #ifdef USE_STRUCT_FS_DATA /* Ultrix */
76*41fbaed0Stron struct fs_data fsbuf;
77*41fbaed0Stron
78*41fbaed0Stron if (statfs(path, &fsbuf) < 0)
79*41fbaed0Stron msg_fatal("statfs %s: %m", path);
80*41fbaed0Stron sp->block_size = 1024;
81*41fbaed0Stron sp->block_free = fsbuf.fd_bfreen;
82*41fbaed0Stron #else
83*41fbaed0Stron struct statfs fsbuf;
84*41fbaed0Stron
85*41fbaed0Stron if (statfs(path, &fsbuf) < 0)
86*41fbaed0Stron msg_fatal("statfs %s: %m", path);
87*41fbaed0Stron sp->block_size = fsbuf.f_bsize;
88*41fbaed0Stron sp->block_free = fsbuf.f_bavail;
89*41fbaed0Stron #endif
90*41fbaed0Stron #endif
91*41fbaed0Stron #ifdef USE_STATVFS
92*41fbaed0Stron struct statvfs fsbuf;
93*41fbaed0Stron
94*41fbaed0Stron if (statvfs(path, &fsbuf) < 0)
95*41fbaed0Stron msg_fatal("statvfs %s: %m", path);
96*41fbaed0Stron sp->block_size = fsbuf.f_frsize;
97*41fbaed0Stron sp->block_free = fsbuf.f_bavail;
98*41fbaed0Stron #endif
99*41fbaed0Stron if (msg_verbose)
100*41fbaed0Stron msg_info("%s: %s: block size %lu, blocks free %lu",
101*41fbaed0Stron myname, path, sp->block_size, sp->block_free);
102*41fbaed0Stron }
103*41fbaed0Stron
104*41fbaed0Stron #ifdef TEST
105*41fbaed0Stron
106*41fbaed0Stron /*
107*41fbaed0Stron * Proof-of-concept test program: print free space unit and count for all
108*41fbaed0Stron * listed file systems.
109*41fbaed0Stron */
110*41fbaed0Stron
111*41fbaed0Stron #include <vstream.h>
112*41fbaed0Stron
main(int argc,char ** argv)113*41fbaed0Stron int main(int argc, char **argv)
114*41fbaed0Stron {
115*41fbaed0Stron struct fsspace sp;
116*41fbaed0Stron
117*41fbaed0Stron if (argc == 1)
118*41fbaed0Stron msg_fatal("usage: %s filesystem...", argv[0]);
119*41fbaed0Stron
120*41fbaed0Stron while (--argc && *++argv) {
121*41fbaed0Stron fsspace(*argv, &sp);
122*41fbaed0Stron vstream_printf("%10s: block size %lu, blocks free %lu\n",
123*41fbaed0Stron *argv, sp.block_size, sp.block_free);
124*41fbaed0Stron vstream_fflush(VSTREAM_OUT);
125*41fbaed0Stron }
126*41fbaed0Stron return (0);
127*41fbaed0Stron }
128*41fbaed0Stron
129*41fbaed0Stron #endif
130