xref: /onnv-gate/usr/src/lib/libast/common/comp/statvfs.c (revision 4887:feebf9260c2e)
1*4887Schin /***********************************************************************
2*4887Schin *                                                                      *
3*4887Schin *               This software is part of the ast package               *
4*4887Schin *           Copyright (c) 1985-2007 AT&T Knowledge Ventures            *
5*4887Schin *                      and is licensed under the                       *
6*4887Schin *                  Common Public License, Version 1.0                  *
7*4887Schin *                      by AT&T Knowledge Ventures                      *
8*4887Schin *                                                                      *
9*4887Schin *                A copy of the License is available at                 *
10*4887Schin *            http://www.opensource.org/licenses/cpl1.0.txt             *
11*4887Schin *         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         *
12*4887Schin *                                                                      *
13*4887Schin *              Information and Software Systems Research               *
14*4887Schin *                            AT&T Research                             *
15*4887Schin *                           Florham Park NJ                            *
16*4887Schin *                                                                      *
17*4887Schin *                 Glenn Fowler <gsf@research.att.com>                  *
18*4887Schin *                  David Korn <dgk@research.att.com>                   *
19*4887Schin *                   Phong Vo <kpv@research.att.com>                    *
20*4887Schin *                                                                      *
21*4887Schin ***********************************************************************/
22*4887Schin #pragma prototyped
23*4887Schin 
24*4887Schin #include <ast.h>
25*4887Schin #include <ls.h>
26*4887Schin 
27*4887Schin #if _lib_statvfs
28*4887Schin 
29*4887Schin NoN(statvfs)
30*4887Schin 
31*4887Schin #else
32*4887Schin 
33*4887Schin #include <error.h>
34*4887Schin 
35*4887Schin #define HUH	(-1)
36*4887Schin 
37*4887Schin #if _lib_statfs && _mem_f_files_statfs && ( _sys_statfs || _sys_vfs || _sys_mount )
38*4887Schin 
39*4887Schin #if _sys_statfs
40*4887Schin #include <sys/statfs.h>
41*4887Schin #else
42*4887Schin #if _sys_vfs
43*4887Schin #include <sys/vfs.h>
44*4887Schin #else
45*4887Schin #if _sys_mount
46*4887Schin #if _lib_getmntinfo
47*4887Schin #include <sys/param.h>		/* expect some macro redefinitions here */
48*4887Schin #endif
49*4887Schin #include <sys/mount.h>
50*4887Schin #endif
51*4887Schin #endif
52*4887Schin #endif
53*4887Schin 
54*4887Schin #if _lib_statfs4
55*4887Schin #define FSTATFS(a,b)	fstatfs(a,b,sizeof(struct statfs),0)
56*4887Schin #define STATFS(a,b)	statfs(a,b,sizeof(struct statfs),0)
57*4887Schin #else
58*4887Schin #define FSTATFS(a,b)	fstatfs(a,b)
59*4887Schin #define STATFS(a,b)	statfs(a,b)
60*4887Schin #endif
61*4887Schin 
62*4887Schin #if defined(__EXPORT__)
63*4887Schin #define extern	__EXPORT__
64*4887Schin #endif
65*4887Schin 
66*4887Schin static void
67*4887Schin us2v(register struct statfs* ufs, register struct stat* st, register struct statvfs* vfs)
68*4887Schin {
69*4887Schin 	memset(vfs, 0, sizeof(*vfs));
70*4887Schin 	vfs->f_bsize = vfs->f_frsize = ufs->f_bsize;
71*4887Schin 	vfs->f_blocks = ufs->f_blocks;
72*4887Schin 	vfs->f_bfree = ufs->f_bfree;
73*4887Schin 	vfs->f_bavail =
74*4887Schin #if _mem_f_bavail_statfs
75*4887Schin 		ufs->f_bavail;
76*4887Schin #else
77*4887Schin 		ufs->f_bfree;
78*4887Schin #endif
79*4887Schin 	vfs->f_files = ufs->f_files;
80*4887Schin 	vfs->f_ffree = ufs->f_ffree;
81*4887Schin 	vfs->f_favail = (ufs->f_ffree > 10) ? (ufs->f_ffree - 10) : 0;
82*4887Schin 	vfs->f_fsid = st->st_dev;
83*4887Schin 	strncpy(vfs->f_basetype, FS_default, sizeof(vfs->f_basetype) - 1);
84*4887Schin 	vfs->f_namemax = 14;
85*4887Schin 	strncpy(vfs->f_fstr, vfs->f_basetype, sizeof(vfs->f_fstr) - 1);
86*4887Schin }
87*4887Schin 
88*4887Schin extern int
89*4887Schin fstatvfs(int fd, struct statvfs* vfs)
90*4887Schin {
91*4887Schin 	struct statfs	ufs;
92*4887Schin 	struct stat	st;
93*4887Schin 
94*4887Schin 	if (FSTATFS(fd, &ufs) || fstat(fd, &st))
95*4887Schin 		return(-1);
96*4887Schin 	us2v(&ufs, &st, vfs);
97*4887Schin 	return(0);
98*4887Schin }
99*4887Schin 
100*4887Schin extern int
101*4887Schin statvfs(const char* path, struct statvfs* vfs)
102*4887Schin {
103*4887Schin 	struct statfs	ufs;
104*4887Schin 	struct stat	st;
105*4887Schin 
106*4887Schin 	if (STATFS(path, &ufs) || stat(path, &st))
107*4887Schin 		return(-1);
108*4887Schin 	us2v(&ufs, &st, vfs);
109*4887Schin 	return(0);
110*4887Schin }
111*4887Schin 
112*4887Schin #else
113*4887Schin 
114*4887Schin #if defined(__EXPORT__)
115*4887Schin #define extern	__EXPORT__
116*4887Schin #endif
117*4887Schin 
118*4887Schin static void
119*4887Schin s2v(register struct stat* st, register struct statvfs* vfs)
120*4887Schin {
121*4887Schin 	memset(vfs, 0, sizeof(*vfs));
122*4887Schin 	vfs->f_bsize = vfs->f_frsize =
123*4887Schin #if _mem_st_blksize_stat
124*4887Schin 		st->st_blksize;
125*4887Schin #else
126*4887Schin 		512;
127*4887Schin #endif
128*4887Schin 	vfs->f_blocks = HUH;
129*4887Schin 	vfs->f_bfree = HUH;
130*4887Schin 	vfs->f_files = HUH;
131*4887Schin 	vfs->f_ffree = HUH;
132*4887Schin 	vfs->f_favail = HUH;
133*4887Schin 	vfs->f_fsid = st->st_dev;
134*4887Schin 	strncpy(vfs->f_basetype, FS_default, sizeof(vfs->f_basetype) - 1);
135*4887Schin 	vfs->f_namemax = 14;
136*4887Schin 	strncpy(vfs->f_fstr, vfs->f_basetype, sizeof(vfs->f_fstr) - 1);
137*4887Schin }
138*4887Schin 
139*4887Schin extern int
140*4887Schin fstatvfs(int fd, struct statvfs* vfs)
141*4887Schin {
142*4887Schin 	struct stat	st;
143*4887Schin 
144*4887Schin 	if (fstat(fd, &st))
145*4887Schin 		return(-1);
146*4887Schin 	s2v(&st, vfs);
147*4887Schin 	return(0);
148*4887Schin }
149*4887Schin 
150*4887Schin extern int
151*4887Schin statvfs(const char* path, struct statvfs* vfs)
152*4887Schin {
153*4887Schin 	struct stat	st;
154*4887Schin 
155*4887Schin 	if (stat(path, &st))
156*4887Schin 		return(-1);
157*4887Schin 	s2v(&st, vfs);
158*4887Schin 	return(0);
159*4887Schin }
160*4887Schin 
161*4887Schin #endif
162*4887Schin 
163*4887Schin #endif
164