xref: /csrg-svn/lib/libc/gen/getvfsbyname.c (revision 68721)
1*68721Smckusick /*
2*68721Smckusick  * Copyright (c) 1995
3*68721Smckusick  *	The Regents of the University of California.  All rights reserved.
4*68721Smckusick  *
5*68721Smckusick  * %sccs.include.redist.c%
6*68721Smckusick  */
7*68721Smckusick 
8*68721Smckusick #ifndef lint
9*68721Smckusick static char sccsid[] = "@(#)getvfsbyname.c	8.1 (Berkeley) 04/03/95";
10*68721Smckusick #endif /* not lint */
11*68721Smckusick 
12*68721Smckusick #include <sys/param.h>
13*68721Smckusick #include <sys/mount.h>
14*68721Smckusick #include <sys/sysctl.h>
15*68721Smckusick #include <errno.h>
16*68721Smckusick #include <kvm.h>
17*68721Smckusick 
18*68721Smckusick int getvfsbyname __P((const char *, struct vfsconf *));
19*68721Smckusick 
20*68721Smckusick /*
21*68721Smckusick  * Given a filesystem name, determine if it is resident in the kernel,
22*68721Smckusick  * and if it is resident, return its vfsconf structure.
23*68721Smckusick  */
getvfsbyname(fsname,vfcp)24*68721Smckusick getvfsbyname(fsname, vfcp)
25*68721Smckusick 	const char *fsname;
26*68721Smckusick 	struct vfsconf *vfcp;
27*68721Smckusick {
28*68721Smckusick 	int name[4], maxtypenum, cnt;
29*68721Smckusick 	size_t buflen;
30*68721Smckusick 
31*68721Smckusick 	name[0] = CTL_VFS;
32*68721Smckusick 	name[1] = VFS_GENERIC;
33*68721Smckusick 	name[2] = VFS_MAXTYPENUM;
34*68721Smckusick 	buflen = 4;
35*68721Smckusick 	if (sysctl(name, 3, &maxtypenum, &buflen, (void *)0, (size_t)0) < 0)
36*68721Smckusick 		return (-1);
37*68721Smckusick 	name[2] = VFS_CONF;
38*68721Smckusick 	buflen = sizeof *vfcp;
39*68721Smckusick 	for (cnt = 0; cnt < maxtypenum; cnt++) {
40*68721Smckusick 		name[3] = cnt;
41*68721Smckusick 		if (sysctl(name, 4, vfcp, &buflen, (void *)0, (size_t)0) < 0) {
42*68721Smckusick 			if (errno != EOPNOTSUPP)
43*68721Smckusick 				return (-1);
44*68721Smckusick 			continue;
45*68721Smckusick 		}
46*68721Smckusick 		if (!strcmp(fsname, vfcp->vfc_name))
47*68721Smckusick 			return (0);
48*68721Smckusick 	}
49*68721Smckusick 	errno = ENOENT;
50*68721Smckusick 	return (-1);
51*68721Smckusick }
52