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