summaryrefslogtreecommitdiffstats
path: root/lib/libc
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libc')
-rw-r--r--lib/libc/gen/getvfsbyname.327
-rw-r--r--lib/libc/gen/getvfsbyname.c40
-rw-r--r--lib/libc/gen/getvfsent.c31
3 files changed, 43 insertions, 55 deletions
diff --git a/lib/libc/gen/getvfsbyname.3 b/lib/libc/gen/getvfsbyname.3
index da115ec..277b964 100644
--- a/lib/libc/gen/getvfsbyname.3
+++ b/lib/libc/gen/getvfsbyname.3
@@ -44,7 +44,7 @@
.In sys/param.h
.In sys/mount.h
.Ft int
-.Fn getvfsbyname "const char *name" "struct vfsconf *vfc"
+.Fn getvfsbyname "const char *name" "struct xvfsconf *vfc"
.Sh DESCRIPTION
The
.Fn getvfsbyname
@@ -52,11 +52,11 @@ function provides access to information about a
filesystem module that is configured in the kernel.
If successful,
the requested filesystem
-.Fa vfsconf
+.Fa xvfsconf
is returned in the location pointed to by
.Fa vfc .
The fields in a
-.Dq Li struct vfsconf
+.Dq Li struct xvfsconf
are defined as follows:
.Pp
.Bl -tag -compact -width vfc_refcount
@@ -67,8 +67,24 @@ the filesystem type number assigned by the kernel
.It vfc_refcount
the number of active mount points using the filesystem
.It vfc_flags
-flag bits as described in
-.Xr getvfsent 3
+flag bits, as described below
+.El
+.Pp
+The flags are defined as follows:
+.Pp
+.Bl -tag -width VFCF_SYNTHETIC -compact
+.It Dv VFCF_STATIC
+statically compiled into kernel
+.It Dv VFCF_NETWORK
+may get data over the network
+.It Dv VFCF_READONLY
+writes are not implemented
+.It Dv VFCF_SYNTHETIC
+data does not represent real files
+.It Dv VFCF_LOOPBACK
+aliases some other mounted FS
+.It Dv VFCF_UNICODE
+stores file names as Unicode
.El
.Sh RETURN VALUES
.Rv -std getvfsbyname
@@ -86,7 +102,6 @@ specifies a filesystem that is unknown or not configured in the kernel.
.El
.Sh SEE ALSO
.Xr mount 2 ,
-.Xr getvfsent 3 ,
.Xr sysctl 3 ,
.Xr mount 8 ,
.Xr sysctl 8
diff --git a/lib/libc/gen/getvfsbyname.c b/lib/libc/gen/getvfsbyname.c
index eb6f26f..3ab03f4 100644
--- a/lib/libc/gen/getvfsbyname.c
+++ b/lib/libc/gen/getvfsbyname.c
@@ -41,39 +41,43 @@ __FBSDID("$FreeBSD$");
#include <sys/mount.h>
#include <sys/sysctl.h>
#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
/*
* Given a filesystem name, determine if it is resident in the kernel,
- * and if it is resident, return its vfsconf structure.
+ * and if it is resident, return its xvfsconf structure.
*/
+int
getvfsbyname(fsname, vfcp)
const char *fsname;
- struct vfsconf *vfcp;
+ struct xvfsconf *vfcp;
{
#ifdef __NETBSD_SYSCALLS
errno = ENOSYS;
#else
- int name[4], maxtypenum, cnt;
+ struct xvfsconf *xvfsp;
size_t buflen;
+ int cnt, i;
- name[0] = CTL_VFS;
- name[1] = VFS_GENERIC;
- name[2] = VFS_MAXTYPENUM;
- buflen = 4;
- if (sysctl(name, 3, &maxtypenum, &buflen, (void *)0, (size_t)0) < 0)
+ if (sysctlbyname("vfs.conflist", NULL, &buflen, NULL, 0) < 0)
return (-1);
- name[2] = VFS_CONF;
- buflen = sizeof *vfcp;
- for (cnt = 0; cnt < maxtypenum; cnt++) {
- name[3] = cnt;
- if (sysctl(name, 4, vfcp, &buflen, (void *)0, (size_t)0) < 0) {
- if (errno != EOPNOTSUPP)
- return (-1);
- continue;
- }
- if (!strcmp(fsname, vfcp->vfc_name))
+ xvfsp = malloc(buflen);
+ if (xvfsp == NULL)
+ return (-1);
+ if (sysctlbyname("vfs.conflist", xvfsp, &buflen, NULL, 0) < 0) {
+ free(xvfsp);
+ return (-1);
+ }
+ cnt = buflen / sizeof(struct xvfsconf);
+ for (i = 0; i < cnt; i++) {
+ if (strcmp(fsname, xvfsp[i].vfc_name) == 0) {
+ memcpy(vfcp, xvfsp + i, sizeof(struct xvfsconf));
+ free(xvfsp);
return (0);
+ }
}
+ free(xvfsp);
errno = ENOENT;
#endif
return (-1);
diff --git a/lib/libc/gen/getvfsent.c b/lib/libc/gen/getvfsent.c
index 140664b..3ca3eac 100644
--- a/lib/libc/gen/getvfsent.c
+++ b/lib/libc/gen/getvfsent.c
@@ -21,7 +21,6 @@ __FBSDID("$FreeBSD$");
#include <paths.h>
/* XXX hide some compatibility problems. */
-#undef getvfsbyname
#define vfsconf ovfsconf
static struct vfsconf *_vfslist = 0;
@@ -81,36 +80,6 @@ getvfsent(void)
}
struct vfsconf *
-getvfsbyname(const char *name)
-{
- int i;
-
- if(!_vfslist && !initvfs()) {
- return 0;
- }
-
- for(i = 0; i < _vfslistlen; i++) {
- if( ! strcmp(_vfslist[i].vfc_name, name) )
- break;
- }
-
- if(i < _vfslistlen) {
- _vfsconf = _vfslist[i];
- }
-
- if(!_vfs_keeplist) {
- free(_vfslist);
- _vfslist = 0;
- }
-
- if(i < _vfslistlen) {
- return &_vfsconf;
- } else {
- return 0;
- }
-}
-
-struct vfsconf *
getvfsbytype(int type)
{
int i;
OpenPOWER on IntegriCloud