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