Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
SYSCTLMIBINFO2(3)	     Library Functions Manual	       SYSCTLMIBINFO2(3)

NAME
     SYSCTLMIF_VERSION, 	  sysctlmif_name,	    sysctlmif_oidbyname,
     sysctlmif_oidextendedbyname,     sysctlmif_desc,	   sysctlmif_descbyname,
     sysctlmif_label, sysctlmif_labelbyname, sysctlmif_fmt, sysctlmif_fmtbyname,
     sysctlmif_hashandler,	sysctlmif_hashandlerbyname,	 sysctlmif_kind,
     sysctlmif_kindbyname,	 SYSCTLMIF_KINDTYPE,	    SYSCTLMIF_KINDFLAGS,
     sysctlmif_nextnode,      sysctlmif_nextnodebyname,      sysctlmif_nextleaf,
     sysctlmif_nextleafbyname,	   sysctlmif_object,	 sysctlmif_objectbyname,
     sysctlmif_freeobject,	    sysctlmif_list,	    sysctlmif_grouplist,
     sysctlmif_grouplistbyname,    sysctlmif_leaves,	 sysctlmif_leavesbyname,
     sysctlmif_freelist,	  sysctlmif_tree,	   sysctlmif_treebyname,
     sysctlmif_freetree, sysctlmif_mib, sysctlmif_freemib -- sysctl MIB-Tree API

LIBRARY
     To load the required kernel modules at boot time, place the following lines
     in loader.conf(5):

	   sysctlinfo_load="YES"
	   sysctlbyname_improved_load="YES"

     libsysctlmibinfo2

SYNOPSIS
     #include <sysctlmibinfo2.h>
     #define SYSCTLMIF_VERSION

     int
     sysctlmif_name(int *id, size_t idlevel, char *name, size_t *namelen);

     int
     sysctlmif_oidbyname(const char *name, int *id, size_t *idlevel);

     int
     sysctlmif_oidextendedbyname(const char *name, int *id, size_t *idlevel);

     int
     sysctlmif_desc(int *id, size_t idlevel, char *desc, size_t *desclen);

     int
     sysctlmif_descbyname(const char *name, char *desc, size_t *desclen);

     int
     sysctlmif_label(int *id, size_t idlevel, char *label, size_t *labellen);

     int
     sysctlmif_labelbyname(const char *name, char *label, size_t *labellen);

     int
     sysctlmif_fmt(int *id, size_t idlevel, char *fmt, size_t *fmtlen);

     int
     sysctlmif_fmtbyname(const char *name, char *fmt, size_t *fmtlen);

     int
     sysctlmif_hashandler(int *id, size_t idlevel, bool *handler);

     int
     sysctlmif_hashandlerbyname(const char *name, bool *handler);

     int
     sysctlmif_kind(int *id, size_t idlevel, unsigned int *kind);

     int
     sysctlmif_kindbyname(const char *name, unsigned int *kind);

     unsigned int
     SYSCTLMIF_KINDTYPE(unsigned int kind);

     unsigned int
     SYSCTLMIF_KINDFLAGS(unsigned int kind);

     int
     sysctlmif_nextleaf(int *id, size_t idlevel, int *idnext,
	 size_t *idnextlevel);

     int
     sysctlmif_nextleafbyname(const char *name, char *next, size_t *nextlen);

     int
     sysctlmif_nextnode(int *id, size_t idlevel, int *idnext,
	 size_t *idnextlevel);

     int
     sysctlmif_nextnodebyname(const char *name, char *next, size_t *nextlen);

     struct sysctlmif_object *
     sysctlmif_object(int *id, size_t idlevel);

     struct sysctlmif_object *
     sysctlmif_objectbyname(const char *name);

     void
     sysctlmif_freeobject(struct sysctlmif_object *object);

     struct sysctlmif_list *
     sysctlmif_list();

     struct sysctlmif_list *
     sysctlmif_grouplist(int *idroot, size_t idrootlen);

     struct sysctlmif_list *
     sysctlmif_grouplistbyname(const char *name);

     struct sysctlmif_list *
     sysctlmif_leaves(int *idroot, size_t idrootlen);

     struct sysctlmif_list *
     sysctlmif_leavesbyname(const char *name);

     void
     sysctlmif_freelist(struct sysctlmif_list *list);

     struct sysctlmif_object *
     sysctlmif_tree(int *idroot, size_t idrootlevel);

     struct sysctlmif_object *
     sysctlmif_treebyname(const char *name);

     void
     sysctlmif_freetree(struct sysctlmif_object *node);

     struct sysctlmif_list *
     sysctlmif_mib();

     void
     sysctlmif_freemib(struct sysctlmif_list *mib);

DESCRIPTION
     The sysctlmibinfo2 library is an interface to the kernel  sysctl  MIB-Tree.
     It implements wrappers around the sysctlinfo(4) interface and sysctlbyname-
     improved  to explore the sysctl MIB and to get the info of an object, more-
     over it defines a struct sysctlmif_object and provides a convenient API  to
     build data structures of sysctlmif_object; as it is not designed to get and
     set object values, anyone wishing to do this should see sysctl(3).

     An object is identified by an Object Identifier (OID), a series of numbers,
     represented  by  a pair int *id and size_t idlevel, the level should be be-
     tween 1 and CTL_MAXNAME.  It is possible to replace a number with a  string
     to obtain an object name, e.g., [1.1] -> "kern.ostype".

     SYSCTLMIF_VERSION	is  set  to  2 to differentiate between this library and
     sysctlmibinfo(3).

   Wrappers
     sysctlmif_name() sets name and namelen like the object with id / idlevel.

     sysctlmif_desc(),	sysctlmif_fmt()  and  sysctlmif_label()  set  desc   and
     desclen,  fmt  and  fmtlen,  label  and  labellen like the object with id /
     idlevel.  sysctlmif_descbyname(), sysctlmif_fmtbyname()  and  sysctlmif_la-
     belbyname() are equivalent but the object is identified by its name.

     sysctlmif_kind()  and  sysctlmif_kindbyname() set kind like the object with
     id / idlevel or name, it represents the object type and flags,  defined  in
     <sys/sysctl.h>.  Macros to deal with kind:
	   SYSCTLMIF_KINDFLAGS(kind) returns flags,
	   SYSCTLMIF_KINDTYPE(kind) returns type.

     sysctlmif_nextleaf()  and	sysctlmif_nextnode()  set nextid and nextidlevel
     like the next leaf  or  also  internal  node  visited  in	a  "Depth  First
     Traversal" of the object id / idlevel.

     sysctlmif_nextleafbyname()  and  sysctlmif_nextnodebyname()  set  next  and
     nextlen like the next leaf or also internal node visited in a "Depth  First
     Traversal" of the object name.

     sysctlmif_oidbyname()  and sysctlmif_oidextendedbyname() set id and idlevel
     like the object with name, sysctlmif_oidextendedbyname() can convert a name
     extended  with  an  input	for  the  handler  of  a   CTLTPYE_NODE,   e.g.,
     "kern.proc.pid.<input>" -> [1.14.1.<input>].

     The  previous functions seek the object with id / idlevel or name, then the
     property is copied into the buffer (e.g., desc, label, idnext, etc.).   Be-
     fore  the	call  buflen (e.g., desclen, lebellen, idnextlevel, etc.)  gives
     the size of buffer, after a successful call buflen gives the amount of data
     copied; the size of the property can be determined with the  NULL	argument
     for the buffer, the size will be returned in the location pointed to by bu-
     flen.

   sysctlmif_object API
     The sysctlmibinfo2 library defines a struct for the info of an object:

	   SLIST_HEAD(sysctlmif_list, sysctlmif_object);

	   struct sysctlmif_object {
		   SLIST_ENTRY(sysctlmif_object) object_link;
		   int	    *id;	    /* array of idlevel entries  */
		   size_t   idlevel;	    /* between 1 and CTL_MAXNAME */
		   char     *name;	    /* name in MIB notation	 */
		   char     *desc;	    /* description		 */
		   char     *label;	    /* aggregation label	 */
		   uint8_t  type;	    /* defined in <sys/sysctl.h> */
		   uint32_t flags;	    /* defined in <sys/sysctl.h> */
		   char     *fmt;	    /* format string		 */
		   struct sysctlmif_list *children; /* children list	 */
	   };

     and a list of objects, struct sysctlmif_list, iterable by the SLIST macros,
     see queue(3) and "EXAMPLES".

     sysctlmif_object() and sysctlmif_objectbyname() return a pointer to the al-
     located  memory  for  a  struct  sysctlmif_object	of  the object with id /
     idlevel or name, the pointer can be  passed  to  sysctlmif_freeobject()  to
     free the memory.

     sysctlmif_list()  allocates  memory and returns a list with all the objects
     of the MIB, sysctlmif_freelist() frees the allocated memory.

     sysctlmif_grouplist() and sysctlmif_grouplistbyname() allocate  memory  and
     return  a	list  of  the  objects,  internal nodes and leaves, visited in a
     "Depth  First  Traversal",  id  /	idlevel  or  name   denote   the   root,
     sysctlmif_freelist() frees the allocated memory.

     sysctlmif_leaves()  and sysctlmif_leavesbyname() allocate memory for a list
     of objects, if id / idlevel or name is a leaf the list  contains  only  it,
     otherwise the list of its descendant leaves; sysctlmif_freelist() frees the
     allocated memory.

     sysctlmif_tree()  and  sysctlmif_treebyname() allocate memory for a tree of
     sysctlmif_object and returns a pointer to the root, id /  idlevel	or  name
     denote  the  root,  object.children  is  set  and iterable by SLIST macros,
     sysctlmif_freetree() frees the allocated memory.

     sysctlmif_mib() allocates memory for a collection of trees  and  returns  a
     list  where  the  entries are the roots representing the top-level objects,
     sysctlmif_freemib() frees the allocated memory.

   Capability Mode
     In "capability mode", see cap_enter(2), sysctlmibinfo2 checks if the object
     has  CTLFLAG_CAPRD  or   CTLFLAG_CAPWR   before   to   return   its   info,
     sysctlmif_nextnode(),  sysctlmif_nextnodebyname(), sysctlmif_nextleaf() and
     sysctlmif_nextleafbyname() ignore capability flags  to  traverse  the  tree
     also in capability mode; properly sysctlmibinfo2 provides "capability mode"
     via sysctlinfo(4) interface.

RETURN VALUES
     The sysctlmif_oidbyname(), sysctlmif_oidextendedbyname(), sysctlmif_name(),
     sysctlmif_desc(),	sysctlmif_descbyname(), sysctlmif_label(), sysctlmif_la-
     belbyname(),   sysctlmif_fmt(),   sysctlmif_fmtbyname(),	sysctlmif_oidby-
     name0(),  sysctlmif_oidbyname1(),	sysctlmif_oidbyname2(), sysctlmif_oidby-
     name3(), sysctlmif_oidbyname4(),  sysctlmif_oidbyname5(),	sysctlmif_oidby-
     name6(),  and  sysctlmif_oidbyname7()  functions return the value 0 if suc-
     cessful; otherwise the value -1 is returned and the global  variable  errno
     is set to indicate the error.

     The    sysctlmif_object(),    sysctlmif_objectbyname(),   sysctlmif_list(),
     sysctlmif_grouplist(),   sysctlmif_grouplistbyname(),   sysctlmif_leaves(),
     sysctlmif_leavesbyname(),	   sysctlmif_tree(),	 sysctlmif_treebyname(),
     sysctlmif_mib() functions return NULL upon error or a pointer to  allocated
     memory for success.

EXAMPLES
     Complete		       set		    of		       examples:
     https://gitlab.com/alfix/sysctlmibinfo2/tree/master/examples

     If installed:
	   /usr/local/share/examples/sysctlmibinfo2/

     Example to print the Sound Driver objects:

	   struct sysctlmif_list *list;
	   struct sysctlmif_object *obj;

	   if ((list = sysctlmif_leavesbyname("hw.snd")) == NULL)
		   return (1);

	   SLIST_FOREACH(obj, list, object_link) {
		   printf("name:   %s\n", obj->name);
		   printf("descr.: %s\n", obj->desc);
		   printf("label:  %s\n", obj->label);
		   printf("flags:  %u\n", obj->flags);
		   printf("type:   %u\n", obj->type);
		   printf("fmt:    %s\n", obj->fmt);
		   printf("----------------------\n");
	   }

	   sysctlmif_freelist(list);

ERRORS
     The following errors may be reported:

     [ECAPMODE] 	The node has not the CTLFLAG_CAPRD or CTLFLAG_CAPWR flag
			in capability mode.

     [EINVAL]		name has more than CTL_MAXNAME levels.

     [EINVAL]		idlevel is either greater CTL_MAXNAME, equal to zero  or
			is not an integer.

     [ENAMETOOLONG]	name is >= MAXPATHLEN.

     [ENOATTR]		The node exists but its info is NULL.

     [ENOENT]		The node does not exist.

     [ENOMEM]		Cannot allocate memory.

SEE ALSO
     cap_enter(2), queue(3), sysctl(3), sysctlinfo(3), sysctlinfo(4)

HISTORY
     The sysctlmibinfo2 library first appeared in FreeBSD 13.0.

AUTHORS
     sysctlmibinfo2   was   written  by  Alfonso  Sabato  Siciliano  <alf.sicil-
     iano@gmail.com>.

FreeBSD ports 15.quarterly	February 26, 2021	       SYSCTLMIBINFO2(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=sysctlmibinfo2&sektion=3&manpath=FreeBSD+Ports+15.1.quarterly>

home | help