1 /*-
2  * Copyright (c) 2004 The NetBSD Foundation, Inc.
3  * All rights reserved.
4  *
5  * This code is derived from software contributed to The NetBSD Foundation
6  * by Christos Zoulas.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  * 3. All advertising materials mentioning features or use of this software
17  *    must display the following acknowledgement:
18  *        This product includes software developed by the NetBSD
19  *        Foundation, Inc. and its contributors.
20  * 4. Neither the name of The NetBSD Foundation nor the names of its
21  *    contributors may be used to endorse or promote products derived
22  *    from this software without specific prior written permission.
23  *
24  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
25  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
26  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
27  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
28  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
29  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
30  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
31  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
32  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
33  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34  * POSSIBILITY OF SUCH DAMAGE.
35  */
36 
37 #include <sys/statvfs.h>
38 #include <string.h>
39 
40 __RCSID("$MirOS: src/lib/libc/sys/statvfs.c,v 1.1 2007/05/19 22:07:03 tg Exp $");
41 __RCSID("$NetBSD: statvfs.c,v 1.3 2004/08/23 03:32:12 jlam Exp $");
42 
43 static void fs2vfs(struct statvfs *vfs, const struct statfs *sfs);
44 
45 static void
fs2vfs(struct statvfs * vfs,const struct statfs * sfs)46 fs2vfs(struct statvfs *vfs, const struct statfs *sfs)
47 {
48 	vfs->f_flag = sfs->f_flags & ST_COPYALL;
49 
50 	vfs->f_bsize = sfs->f_bsize;
51 	vfs->f_frsize = sfs->f_bsize;
52 	vfs->f_iosize = sfs->f_iosize;
53 	vfs->f_blocks = sfs->f_blocks;
54 	vfs->f_bfree = sfs->f_bfree;
55 	vfs->f_bavail = sfs->f_bavail;
56 	vfs->f_bresvd = 0;		/* XXX */
57 
58 	vfs->f_files = sfs->f_files;
59 	vfs->f_ffree = sfs->f_ffree;
60 	vfs->f_favail = sfs->f_bavail;
61 	vfs->f_fresvd = 0;		/* XXX */
62 
63 	vfs->f_syncreads = 0;		/* XXX */
64 	vfs->f_syncwrites = sfs->f_syncwrites;
65 	vfs->f_asyncreads = 0;		/* XXX */
66 	vfs->f_asyncwrites = sfs->f_asyncwrites;
67 
68 	memcpy(&vfs->f_fsidx, &sfs->f_fsid, sizeof (fsid_t));
69 	vfs->f_fsid = sfs->f_fsid.val[0];
70 
71 	vfs->f_namemax = MNAMELEN;
72 	vfs->f_owner = sfs->f_owner;
73 	strlcpy(vfs->f_fstypename, sfs->f_fstypename, _VFS_NAMELEN);
74 	strlcpy(vfs->f_mntonname, sfs->f_mntonname, _VFS_MNAMELEN);
75 	strlcpy(vfs->f_mntfromname, sfs->f_mntfromname, _VFS_MNAMELEN);
76 }
77 
78 int
statvfs(const char * path,struct statvfs * vfs)79 statvfs(const char *path, struct statvfs *vfs)
80 {
81 	struct statfs sfs;
82 
83 	if (statfs(path, &sfs) == -1)
84 		return -1;
85 	fs2vfs(vfs, &sfs);
86 	return 0;
87 }
88 
89 int
fstatvfs(int fd,struct statvfs * vfs)90 fstatvfs(int fd, struct statvfs *vfs)
91 {
92 	struct statfs sfs;
93 
94 	if (fstatfs(fd, &sfs) == -1)
95 		return -1;
96 
97 	fs2vfs(vfs, &sfs);
98 	return 0;
99 }
100