compat_statfs.c revision 1.4.8.2 1 1.4.8.2 martin /* $NetBSD: compat_statfs.c,v 1.4.8.2 2008/04/28 20:23:00 martin Exp $ */
2 1.4.8.2 martin
3 1.4.8.2 martin /*-
4 1.4.8.2 martin * Copyright (c) 2004 The NetBSD Foundation, Inc.
5 1.4.8.2 martin * All rights reserved.
6 1.4.8.2 martin *
7 1.4.8.2 martin * This code is derived from software contributed to The NetBSD Foundation
8 1.4.8.2 martin * by Christos Zoulas.
9 1.4.8.2 martin *
10 1.4.8.2 martin * Redistribution and use in source and binary forms, with or without
11 1.4.8.2 martin * modification, are permitted provided that the following conditions
12 1.4.8.2 martin * are met:
13 1.4.8.2 martin * 1. Redistributions of source code must retain the above copyright
14 1.4.8.2 martin * notice, this list of conditions and the following disclaimer.
15 1.4.8.2 martin * 2. Redistributions in binary form must reproduce the above copyright
16 1.4.8.2 martin * notice, this list of conditions and the following disclaimer in the
17 1.4.8.2 martin * documentation and/or other materials provided with the distribution.
18 1.4.8.2 martin *
19 1.4.8.2 martin * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 1.4.8.2 martin * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 1.4.8.2 martin * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 1.4.8.2 martin * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 1.4.8.2 martin * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 1.4.8.2 martin * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 1.4.8.2 martin * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 1.4.8.2 martin * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 1.4.8.2 martin * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 1.4.8.2 martin * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 1.4.8.2 martin * POSSIBILITY OF SUCH DAMAGE.
30 1.4.8.2 martin */
31 1.4.8.2 martin
32 1.4.8.2 martin #include <sys/cdefs.h>
33 1.4.8.2 martin #if defined(LIBC_SCCS) && !defined(lint)
34 1.4.8.2 martin __RCSID("$NetBSD: compat_statfs.c,v 1.4.8.2 2008/04/28 20:23:00 martin Exp $");
35 1.4.8.2 martin #endif /* LIBC_SCCS and not lint */
36 1.4.8.2 martin
37 1.4.8.2 martin #define __LIBC12_SOURCE__
38 1.4.8.2 martin
39 1.4.8.2 martin #include "namespace.h"
40 1.4.8.2 martin #include <sys/types.h>
41 1.4.8.2 martin #include <sys/param.h>
42 1.4.8.2 martin #include <sys/mount.h>
43 1.4.8.2 martin #include <compat/sys/mount.h>
44 1.4.8.2 martin #include <compat/include/fstypes.h>
45 1.4.8.2 martin #include <string.h>
46 1.4.8.2 martin #include <stdlib.h>
47 1.4.8.2 martin
48 1.4.8.2 martin __warn_references(statfs,
49 1.4.8.2 martin "warning: reference to obsolete statfs(); use statvfs()")
50 1.4.8.2 martin
51 1.4.8.2 martin __warn_references(fstatfs,
52 1.4.8.2 martin "warning: reference to obsolete fstatfs(); use fstatvfs()")
53 1.4.8.2 martin
54 1.4.8.2 martin __warn_references(fhstatfs,
55 1.4.8.2 martin "warning: reference to obsolete fhstatfs(); use fhstatvfs()")
56 1.4.8.2 martin
57 1.4.8.2 martin __warn_references(getfsstat,
58 1.4.8.2 martin "warning: reference to obsolete getfsstat(); use getvfsstat()")
59 1.4.8.2 martin
60 1.4.8.2 martin /*
61 1.4.8.2 martin * Convert from a new statvfs to an old statfs structure.
62 1.4.8.2 martin */
63 1.4.8.2 martin
64 1.4.8.2 martin static void vfs2fs(struct statfs12 *, const struct statvfs *);
65 1.4.8.2 martin
66 1.4.8.2 martin #define MOUNTNO_NONE 0
67 1.4.8.2 martin #define MOUNTNO_UFS 1 /* UNIX "Fast" Filesystem */
68 1.4.8.2 martin #define MOUNTNO_NFS 2 /* Network Filesystem */
69 1.4.8.2 martin #define MOUNTNO_MFS 3 /* Memory Filesystem */
70 1.4.8.2 martin #define MOUNTNO_MSDOS 4 /* MSDOS Filesystem */
71 1.4.8.2 martin #define MOUNTNO_CD9660 5 /* iso9660 cdrom */
72 1.4.8.2 martin #define MOUNTNO_FDESC 6 /* /dev/fd filesystem */
73 1.4.8.2 martin #define MOUNTNO_KERNFS 7 /* kernel variable filesystem */
74 1.4.8.2 martin #define MOUNTNO_DEVFS 8 /* device node filesystem */
75 1.4.8.2 martin #define MOUNTNO_AFS 9 /* AFS 3.x */
76 1.4.8.2 martin static const struct {
77 1.4.8.2 martin const char *name;
78 1.4.8.2 martin const int value;
79 1.4.8.2 martin } nv[] = {
80 1.4.8.2 martin { MOUNT_UFS, MOUNTNO_UFS },
81 1.4.8.2 martin { MOUNT_NFS, MOUNTNO_NFS },
82 1.4.8.2 martin { MOUNT_MFS, MOUNTNO_MFS },
83 1.4.8.2 martin { MOUNT_MSDOS, MOUNTNO_MSDOS },
84 1.4.8.2 martin { MOUNT_CD9660, MOUNTNO_CD9660 },
85 1.4.8.2 martin { MOUNT_FDESC, MOUNTNO_FDESC },
86 1.4.8.2 martin { MOUNT_KERNFS, MOUNTNO_KERNFS },
87 1.4.8.2 martin { MOUNT_AFS, MOUNTNO_AFS },
88 1.4.8.2 martin };
89 1.4.8.2 martin
90 1.4.8.2 martin static void
91 1.4.8.2 martin vfs2fs(struct statfs12 *bfs, const struct statvfs *fs)
92 1.4.8.2 martin {
93 1.4.8.2 martin int i = 0;
94 1.4.8.2 martin bfs->f_type = 0;
95 1.4.8.2 martin bfs->f_oflags = (short)fs->f_flag;
96 1.4.8.2 martin
97 1.4.8.2 martin for (i = 0; i < sizeof(nv) / sizeof(nv[0]); i++) {
98 1.4.8.2 martin if (strcmp(nv[i].name, fs->f_fstypename) == 0) {
99 1.4.8.2 martin bfs->f_type = nv[i].value;
100 1.4.8.2 martin break;
101 1.4.8.2 martin }
102 1.4.8.2 martin }
103 1.4.8.2 martin #define CLAMP(a) (long)(((a) & ~LONG_MAX) ? LONG_MAX : (a))
104 1.4.8.2 martin bfs->f_bsize = CLAMP(fs->f_frsize);
105 1.4.8.2 martin bfs->f_iosize = CLAMP(fs->f_iosize);
106 1.4.8.2 martin bfs->f_blocks = CLAMP(fs->f_blocks);
107 1.4.8.2 martin bfs->f_bfree = CLAMP(fs->f_bfree);
108 1.4.8.2 martin if (fs->f_bfree > fs->f_bresvd)
109 1.4.8.2 martin bfs->f_bavail = CLAMP(fs->f_bfree - fs->f_bresvd);
110 1.4.8.2 martin else
111 1.4.8.2 martin bfs->f_bavail = -CLAMP(fs->f_bresvd - fs->f_bfree);
112 1.4.8.2 martin bfs->f_files = CLAMP(fs->f_files);
113 1.4.8.2 martin bfs->f_ffree = CLAMP(fs->f_ffree);
114 1.4.8.2 martin bfs->f_fsid = fs->f_fsidx;
115 1.4.8.2 martin bfs->f_owner = fs->f_owner;
116 1.4.8.2 martin bfs->f_flags = (long)fs->f_flag;
117 1.4.8.2 martin bfs->f_syncwrites = CLAMP(fs->f_syncwrites);
118 1.4.8.2 martin bfs->f_asyncwrites = CLAMP(fs->f_asyncwrites);
119 1.4.8.2 martin (void)strncpy(bfs->f_fstypename, fs->f_fstypename,
120 1.4.8.2 martin sizeof(bfs->f_fstypename));
121 1.4.8.2 martin (void)strncpy(bfs->f_mntonname, fs->f_mntonname,
122 1.4.8.2 martin sizeof(bfs->f_mntonname));
123 1.4.8.2 martin (void)strncpy(bfs->f_mntfromname, fs->f_mntfromname,
124 1.4.8.2 martin sizeof(bfs->f_mntfromname));
125 1.4.8.2 martin }
126 1.4.8.2 martin
127 1.4.8.2 martin int
128 1.4.8.2 martin statfs(const char *file, struct statfs12 *ost)
129 1.4.8.2 martin {
130 1.4.8.2 martin struct statvfs nst;
131 1.4.8.2 martin int ret;
132 1.4.8.2 martin
133 1.4.8.2 martin if ((ret = statvfs(file, &nst)) == -1)
134 1.4.8.2 martin return ret;
135 1.4.8.2 martin vfs2fs(ost, &nst);
136 1.4.8.2 martin return ret;
137 1.4.8.2 martin }
138 1.4.8.2 martin
139 1.4.8.2 martin int
140 1.4.8.2 martin fstatfs(int f, struct statfs12 *ost)
141 1.4.8.2 martin {
142 1.4.8.2 martin struct statvfs nst;
143 1.4.8.2 martin int ret;
144 1.4.8.2 martin
145 1.4.8.2 martin if ((ret = fstatvfs(f, &nst)) == -1)
146 1.4.8.2 martin return ret;
147 1.4.8.2 martin vfs2fs(ost, &nst);
148 1.4.8.2 martin return ret;
149 1.4.8.2 martin }
150 1.4.8.2 martin
151 1.4.8.2 martin int __fhstatvfs140(const void *fhp, size_t fh_size, struct statvfs *buf,
152 1.4.8.2 martin int flags);
153 1.4.8.2 martin
154 1.4.8.2 martin int
155 1.4.8.2 martin fhstatfs(const struct compat_30_fhandle *fh, struct statfs12 *ost)
156 1.4.8.2 martin {
157 1.4.8.2 martin struct statvfs nst;
158 1.4.8.2 martin int ret;
159 1.4.8.2 martin
160 1.4.8.2 martin if ((ret = __fhstatvfs140(fh, FHANDLE30_SIZE, &nst, ST_WAIT)) == -1)
161 1.4.8.2 martin return ret;
162 1.4.8.2 martin vfs2fs(ost, &nst);
163 1.4.8.2 martin return ret;
164 1.4.8.2 martin }
165 1.4.8.2 martin
166 1.4.8.2 martin int
167 1.4.8.2 martin getfsstat(struct statfs12 *ost, long size, int flags)
168 1.4.8.2 martin {
169 1.4.8.2 martin struct statvfs *nst;
170 1.4.8.2 martin int ret, i;
171 1.4.8.2 martin size_t bsize = (size_t)(size / sizeof(*ost)) * sizeof(*nst);
172 1.4.8.2 martin
173 1.4.8.2 martin if (ost != NULL) {
174 1.4.8.2 martin if ((nst = malloc(bsize)) == NULL)
175 1.4.8.2 martin return -1;
176 1.4.8.2 martin } else
177 1.4.8.2 martin nst = NULL;
178 1.4.8.2 martin
179 1.4.8.2 martin if ((ret = getvfsstat(nst, bsize, flags)) == -1)
180 1.4.8.2 martin goto done;
181 1.4.8.2 martin if (nst)
182 1.4.8.2 martin for (i = 0; i < ret; i++)
183 1.4.8.2 martin vfs2fs(&ost[i], &nst[i]);
184 1.4.8.2 martin done:
185 1.4.8.2 martin if (nst)
186 1.4.8.2 martin free(nst);
187 1.4.8.2 martin return ret;
188 1.4.8.2 martin }
189