amd64: declare initializecpu outside of SMP
[dragonfly.git] / lib / libc / gen / getvfsent.c
blobeaa67426fb448af26e597b0b57497d95742cceec
1 /*
2 * getvfsent.c - get a listing of installed filesystems
3 * Written September 1994 by Garrett A. Wollman
4 * This file is in the public domain.
6 * $FreeBSD: src/lib/libc/gen/getvfsent.c,v 1.14.2.1 2001/03/05 09:19:38 obrien Exp $
7 * $DragonFly: src/lib/libc/gen/getvfsent.c,v 1.3 2005/04/26 06:16:29 joerg Exp $
8 */
10 #include <sys/param.h>
11 #include <sys/linker.h>
12 #include <sys/mount.h>
13 #include <sys/sysctl.h>
14 #include <stdlib.h>
15 #include <string.h>
16 #include <unistd.h>
18 /* XXX hide some compatibility problems. */
19 #undef getvfsbyname
21 static struct ovfsconf *_vfslist = 0;
22 static struct ovfsconf _vfsconf;
23 static size_t _vfslistlen = 0;
24 static int _vfs_keeplist = 0;
25 static size_t _vfs_index = 0;
27 static int
28 initvfs(void)
30 int mib[2] = { CTL_VFS, VFS_VFSCONF };
31 size_t size = 0;
32 int rv;
34 rv = sysctl(mib, 2, NULL, &size, NULL, (size_t)0);
35 if(rv < 0)
36 return 0;
38 if(_vfslist)
39 free(_vfslist);
40 _vfslist = malloc(size);
41 if(!_vfslist)
42 return 0;
44 rv = sysctl(mib, 2, _vfslist, &size, NULL, (size_t)0);
45 if(rv < 0) {
46 free(_vfslist);
47 _vfslist = 0;
48 return 0;
51 _vfslistlen = size / sizeof(_vfslist[0]);
52 return 1;
55 struct ovfsconf *
56 getvfsent(void)
58 if(!_vfslist && !initvfs())
59 return 0;
61 do {
62 if(_vfs_index >= _vfslistlen)
63 return 0;
65 _vfsconf = _vfslist[_vfs_index++];
66 } while(!_vfsconf.vfc_vfsops);
68 if(!_vfs_keeplist) {
69 free(_vfslist);
70 _vfslist = 0;
72 return &_vfsconf;
75 struct ovfsconf *
76 getvfsbyname(const char *name)
78 size_t i;
80 if(!_vfslist && !initvfs())
81 return 0;
83 for(i = 0; i < _vfslistlen; i++) {
84 if( ! strcmp(_vfslist[i].vfc_name, name) )
85 break;
88 if(i < _vfslistlen)
89 _vfsconf = _vfslist[i];
91 if(!_vfs_keeplist) {
92 free(_vfslist);
93 _vfslist = 0;
96 if(i < _vfslistlen)
97 return &_vfsconf;
98 else
99 return 0;
102 struct ovfsconf *
103 getvfsbytype(int type)
105 size_t i;
107 if(!_vfslist && !initvfs())
108 return 0;
110 for(i = 0; i < _vfslistlen; i++) {
111 if(_vfslist[i].vfc_index == type)
112 break;
115 if(i < _vfslistlen)
116 _vfsconf = _vfslist[i];
118 if(!_vfs_keeplist) {
119 free(_vfslist);
120 _vfslist = 0;
123 if(i < _vfslistlen)
124 return &_vfsconf;
125 else
126 return 0;
129 void
130 setvfsent(int keep)
132 if(_vfslist && !keep) {
133 free(_vfslist);
134 _vfslist = 0;
137 _vfs_keeplist = keep;
138 _vfs_index = 0;
141 void
142 endvfsent(void)
144 if(_vfslist) {
145 free(_vfslist);
146 _vfslist = 0;
149 _vfs_index = 0;
153 vfsisloadable(const char *name __unused)
155 return 1;
159 vfsload(const char *name)
161 int status;
163 status = kldload(name);
164 return status == -1 ? status : 0;