/* sysctl.h
 * should really be installed as sys/sysctl.h
 */

#ifndef _SYS_SYSCTL_H
#define _SYS_SYSCTL_H

/* This file contains definitions for the sysctl call.
 * The call uses a heirachy of names for objects that can be
 * examined or modified. The name is expressed as a sequence
 * of integers and works in a similar manner to a filename, ie each
 * component is dependant upon it's place in the heirachy.
 *
 * NB this file defines only the top level and kernel level (_KERN)
 *    identifiers with others being defined in files specific to
 *    the subsystem concerned.
 */

#define CTL_MAXNAME 12  /* This is the largest no. of components we support */

/* Each subsystem defines a list of variables for that subsystem.
 * The name can either be:
 * - a node that has further levels defined below it, or
 * - a leaf in a particular type.
 * Each level of sysctl has a set of name/type pairs used when manipulating
 * that level.
 */
 
struct ctlname {
	char *ctl_name;   /* the subsystem name */
	int   ctl_type;   /* type of name */
};

#define CTLTYPE_NODE     1  /* it's a node */
#define CTLTYPE_INT      2  /* integer */
#define CTLTYPE_STRING   3  /* string */
#define CTLTYPE_QUAD     4  /* 64-bit number */
#define CTLTYPE_STRUCT   5  /* it's a structure */

/* The top level identifiers we support */
#define CTL_UNSPEC       0  /* unused */
#define CTL_KERN         1  /* Kernel level */
#define CTL_VM           2  /* VM */
#define CTL_FS           3  /* Filesystem */
#define CTL_NET          4  /* networking (socket.h) */
#define CTL_HW		 5  /* hardware */

#define CTL_NAMES { \
	{ 0, 0 }, \
	{ "kern", CTLTYPE_NODE }, \
	{ "vm"  , CTLTYPE_NODE }, \
	{ "fs"  , CTLTYPE_NODE }, \
	{ "net" , CTLTYPE_NODE }, \
	{ "hardware", CTL_TYPE_NODE }, \
}

/* Identifiers for use in the CTL_KERN subsystem  */
#define KERN_OSTYPE      1  /* string: system type string */
#define KERN_OSRELEASE   2  /* string: system release */
#define KERN_OSVERSION   3  /* int: system revision */
#define KERN_HOSTNAME    4  /* string: hostname of system */
#define KERN_DOMAINNAME  5  /* string: (YP) domain name */
#define KERN_VERSION	 6  /* string: system version string */

#define CTL_KERN_NAMES { \
	{ 0, 0 }, \
	{ "ostype"     , CTLTYPE_STRING }, \
	{ "osrelease"  , CTLTYPE_STRING }, \
	{ "osversion"  , CTLTYPE_STRING }, \
	{ "hostname"   , CTLTYPE_STRING }, \
	{ "domainname" , CTLTYPE_STRING }, \
	{ "version"    , CTLTYPE_STRING }, \
}

/*
 * CTL_HW identifiers
 */
#define	HW_MACHINE	 1		/* string: machine class */
#define	HW_MODEL	 2		/* string: specific machine model */
#define	HW_NCPU		 3		/* int: number of cpus */
#define	HW_BYTEORDER	 4		/* int: machine byte order */
#define	HW_PHYSMEM	 5		/* int: total memory */
#define	HW_USERMEM	 6		/* int: non-kernel memory */
#define	HW_PAGESIZE	 7		/* int: software page size */
#define	HW_DISKNAMES	 8		/* strings: disk drive names */
#define	HW_DISKSTATS	 9		/* struct: diskstats[] */
#define	HW_DISKCOUNT	10		/* int: number of disks */
#define	HW_MAXID	11		/* number of valid hw ids */

#define	CTL_HW_NAMES { \
	{ 0, 0 }, \
	{ "machine", CTLTYPE_STRING }, \
	{ "model", CTLTYPE_STRING }, \
	{ "ncpu", CTLTYPE_INT }, \
	{ "byteorder", CTLTYPE_INT }, \
	{ "physmem", CTLTYPE_INT }, \
	{ "usermem", CTLTYPE_INT }, \
	{ "pagesize", CTLTYPE_INT }, \
	{ "disknames", CTLTYPE_STRING }, \
	{ "diskstats", CTLTYPE_STRUCT }, \
	{ "diskcount", CTLTYPE_INT }, \
}


#ifdef _KERNEL_MODE
  typedef int (sysctlfn)(int *, uint, void *, size_t *, void *, size_t);

  int sys_sysctl(int *, uint, void *, size_t *, void *, size_t);
  int hw_sysctl(int *, uint, void *, size_t *, void *, size_t);
  int sysctl_int (void *, size_t *, void *, size_t, int *);
  int sysctl_rdint (void *, size_t *, void *, int);
  int sysctl_tstring(void *, size_t *, void *, size_t, char *, int);
  int sysctl__string(void *, size_t *, void *, size_t, char *, int, int);
  int sysctl_rdstring(void *, size_t *, void *, char *);
  int user_sysctl(int *, uint, void *, size_t *, void *, size_t);
#endif

int sysctl(int *, uint, void *, size_t *, void *, size_t);

#endif /* _SYS_SYSCTL_H */

