Implement support for the vfs. toplevel.

This commit is contained in:
thorpej 1998-11-13 20:16:49 +00:00
parent d23593a784
commit 54ac7be242
1 changed files with 111 additions and 3 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: sysctl.c,v 1.16 1998/03/11 17:44:02 thorpej Exp $ */
/* $NetBSD: sysctl.c,v 1.17 1998/11/13 20:16:49 thorpej Exp $ */
/*
* Copyright (c) 1993
@ -44,7 +44,7 @@ __COPYRIGHT(
#if 0
static char sccsid[] = "@(#)sysctl.c 8.1 (Berkeley) 6/6/93";
#else
__RCSID("$NetBSD: sysctl.c,v 1.16 1998/03/11 17:44:02 thorpej Exp $");
__RCSID("$NetBSD: sysctl.c,v 1.17 1998/11/13 20:16:49 thorpej Exp $");
#endif
#endif /* not lint */
@ -53,9 +53,19 @@ __RCSID("$NetBSD: sysctl.c,v 1.16 1998/03/11 17:44:02 thorpej Exp $");
#include <sys/stat.h>
#include <sys/sysctl.h>
#include <sys/socket.h>
#include <sys/mount.h>
#include <vm/vm_param.h>
#include <machine/cpu.h>
#include <ufs/ufs/dinode.h>
#include <ufs/ufs/dir.h>
#include <ufs/ffs/fs.h>
#include <ufs/ffs/ffs_extern.h>
#include <nfs/rpcv2.h>
#include <nfs/nfsproto.h>
#include <nfs/nfs.h>
#include <netinet/in.h>
#include <netinet/in_systm.h>
#include <netinet/ip.h>
@ -79,6 +89,7 @@ __RCSID("$NetBSD: sysctl.c,v 1.16 1998/03/11 17:44:02 thorpej Exp $");
struct ctlname topname[] = CTL_NAMES;
struct ctlname kernname[] = CTL_KERN_NAMES;
struct ctlname vmname[] = CTL_VM_NAMES;
struct ctlname vfsname[] = CTL_VFS_NAMES;
struct ctlname netname[] = CTL_NET_NAMES;
struct ctlname hwname[] = CTL_HW_NAMES;
struct ctlname username[] = CTL_USER_NAMES;
@ -98,7 +109,7 @@ struct list secondlevel[] = {
{ 0, 0 }, /* CTL_UNSPEC */
{ kernname, KERN_MAXID }, /* CTL_KERN */
{ vmname, VM_MAXID }, /* CTL_VM */
{ 0, 0 }, /* CTL_VFS */
{ vfsname, VFS_MAXID }, /* CTL_VFS */
{ netname, NET_MAXID }, /* CTL_NET */
{ 0, CTL_DEBUG_MAXID }, /* CTL_DEBUG */
{ hwname, HW_MAXID }, /* CTL_HW */
@ -126,6 +137,8 @@ static void listall __P((char *, struct list *));
static void parse __P((char *, int));
static void debuginit __P((void));
static int sysctl_inet __P((char *, char **, int[], int, int *));
static int sysctl_vfs __P((char *, char **, int[], int, int *));
static int sysctl_vfsgen __P((char *, char **, int[], int, int *));
static int findname __P((char *, char *, char **, struct list *));
static void usage __P((void));
@ -342,6 +355,14 @@ parse(string, flags)
break;
case CTL_VFS:
if (mib[1] == VFS_GENERIC)
len = sysctl_vfsgen(string, &bufp, mib, flags, &type);
else
len = sysctl_vfs(string, &bufp, mib, flags, &type);
if (len >= 0)
break;
return;
case CTL_USER:
case CTL_DDB:
break;
@ -565,6 +586,93 @@ sysctl_inet(string, bufpp, mib, flags, typep)
return (4);
}
struct ctlname ffsname[] = FFS_NAMES;
struct ctlname nfsname[] = NFS_NAMES;
struct list vfsvars[] = {
{ 0, 0 }, /* generic */
{ ffsname, FFS_MAXID }, /* FFS */
{ nfsname, NFS_MAXID }, /* NFS */
{ 0, 0 }, /* MFS */
{ 0, 0 }, /* MSDOS */
{ 0, 0 }, /* LFS */
{ 0, 0 }, /* old LOFS */
{ 0, 0 }, /* FDESC */
{ 0, 0 }, /* PORTAL */
{ 0, 0 }, /* NULL */
{ 0, 0 }, /* UMAP */
{ 0, 0 }, /* KERNFS */
{ 0, 0 }, /* PROCFS */
{ 0, 0 }, /* AFS */
{ 0, 0 }, /* CD9660 */
{ 0, 0 }, /* UNION */
{ 0, 0 }, /* ADOSFS */
{ 0, 0 }, /* EXT2FS */
{ 0, 0 }, /* CODA */
{ 0, 0 }, /* FILECORE */
};
/*
* handle vfs requests
*/
static int
sysctl_vfs(string, bufpp, mib, flags, typep)
char *string;
char **bufpp;
int mib[];
int flags;
int *typep;
{
struct list *lp = &vfsvars[mib[1]];
int indx;
if (lp->list == NULL) {
if (flags)
warnx("No variables defined for file system %s",
string);
return (-1);
}
if (*bufpp == NULL) {
listall(string, lp);
return (-1);
}
if ((indx = findname(string, "third", bufpp, lp)) == -1)
return (-1);
mib[2] = indx;
*typep = lp->list[indx].ctl_type;
return (3);
}
struct ctlname vfsgenname[] = CTL_VFSGENCTL_NAMES;
struct list vfsgenvars = { vfsgenname, VFSGEN_MAXID };
/*
* handle vfs.generic requests
*/
static int
sysctl_vfsgen(string, bufpp, mib, flags, typep)
char *string;
char **bufpp;
int mib[];
int flags;
int *typep;
{
struct list *lp = &vfsgenvars;
int indx;
if (*bufpp == NULL) {
listall(string, lp);
return (-1);
}
if ((indx = findname(string, "third", bufpp, lp)) == -1)
return (-1);
/* Don't bother with VFS_CONF. */
if (indx == VFS_CONF)
return (-1);
mib[2] = indx;
*typep = lp->list[indx].ctl_type;
return (3);
}
/*
* Scan a list of names searching for a particular name.
*/