xref: /dragonfly/lib/libc/gen/getvfsent.c (revision 2cd2d2b5)
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.
5  *
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.2 2003/06/17 04:26:42 dillon Exp $
8  */
9 
10 #include <sys/param.h>
11 #include <sys/types.h>
12 #include <sys/mount.h>
13 #include <sys/sysctl.h>
14 #include <unistd.h>
15 #include <sys/file.h>
16 #include <sys/wait.h>
17 #include <string.h>
18 #include <stdlib.h>
19 #include <stdio.h>
20 #include <paths.h>
21 
22 /* XXX hide some compatibility problems. */
23 #undef getvfsbyname
24 #define vfsconf		ovfsconf
25 
26 static struct vfsconf *_vfslist = 0;
27 static struct vfsconf _vfsconf;
28 static size_t _vfslistlen = 0;
29 static int _vfs_keeplist = 0;
30 static int _vfs_index = 0;
31 
32 static int
33 initvfs(void)
34 {
35 	int mib[2] = { CTL_VFS, VFS_VFSCONF };
36 	size_t size = 0;
37 	int rv;
38 
39 	rv = sysctl(mib, 2, (void *)0, &size, (void *)0, (size_t)0);
40 	if(rv < 0)
41 		return 0;
42 
43 	if(_vfslist)
44 		free(_vfslist);
45 	_vfslist = malloc(size);
46 	if(!_vfslist)
47 		return 0;
48 
49 	rv = sysctl(mib, 2, _vfslist, &size, (void *)0, (size_t)0);
50 	if(rv < 0) {
51 		free(_vfslist);
52 		_vfslist = 0;
53 		return 0;
54 	}
55 
56 	_vfslistlen = size / sizeof _vfslist[0];
57 	return 1;
58 }
59 
60 struct vfsconf *
61 getvfsent(void)
62 {
63 	if(!_vfslist && !initvfs()) {
64 		return 0;
65 	}
66 
67 	do {
68 		if(_vfs_index >= _vfslistlen) {
69 			return 0;
70 		}
71 
72 		_vfsconf = _vfslist[_vfs_index++];
73 	} while(!_vfsconf.vfc_vfsops);
74 
75 	if(!_vfs_keeplist) {
76 		free(_vfslist);
77 		_vfslist = 0;
78 	}
79 	return &_vfsconf;
80 }
81 
82 struct vfsconf *
83 getvfsbyname(const char *name)
84 {
85 	int i;
86 
87 	if(!_vfslist && !initvfs()) {
88 		return 0;
89 	}
90 
91 	for(i = 0; i < _vfslistlen; i++) {
92 		if( ! strcmp(_vfslist[i].vfc_name, name) )
93 			break;
94 	}
95 
96 	if(i < _vfslistlen) {
97 		_vfsconf = _vfslist[i];
98 	}
99 
100 	if(!_vfs_keeplist) {
101 		free(_vfslist);
102 		_vfslist = 0;
103 	}
104 
105 	if(i < _vfslistlen) {
106 		return &_vfsconf;
107 	} else {
108 		return 0;
109 	}
110 }
111 
112 struct vfsconf *
113 getvfsbytype(int type)
114 {
115 	int i;
116 
117 	if(!_vfslist && !initvfs()) {
118 		return 0;
119 	}
120 
121 	for(i = 0; i < _vfslistlen; i++) {
122 		if(_vfslist[i].vfc_index == type)
123 			break;
124 	}
125 
126 	if(i < _vfslistlen) {
127 		_vfsconf = _vfslist[i];
128 	}
129 
130 	if(!_vfs_keeplist) {
131 		free(_vfslist);
132 		_vfslist = 0;
133 	}
134 
135 	if(i < _vfslistlen) {
136 		return &_vfsconf;
137 	} else {
138 		return 0;
139 	}
140 }
141 
142 void
143 setvfsent(int keep)
144 {
145 	if(_vfslist && !keep) {
146 		free(_vfslist);
147 		_vfslist = 0;
148 	}
149 
150 	_vfs_keeplist = keep;
151 	_vfs_index = 0;
152 }
153 
154 void
155 endvfsent(void)
156 {
157 	if(_vfslist) {
158 		free(_vfslist);
159 		_vfslist = 0;
160 	}
161 
162 	_vfs_index = 0;
163 }
164 
165 int
166 vfsisloadable(const char *name)
167 {
168 	return 1;
169 }
170 
171 int
172 vfsload(const char *name)
173 {
174 	int status;
175 
176 	status = kldload(name);
177 	return status == -1 ? status : 0;
178 }
179 
180