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