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