NAME

     sysctl - read/write system parameters


SYNOPSIS

     #include <unistd.h>

     #include <linux/unistd.h>

     #include <linux/sysctl.h>

     _syscall1(int, _sysctl, struct __sysctl_args *, args);

     int _sysctl(struct __sysctl_args *args));


DESCRIPTION

     The _sysctl call reads and/or writes kernel parameters.  For
     example,  the hostname, or the maximum number of open files.
     The argument has the form

     struct __sysctl_args {
             int *name;        /* integer vector describing variable */
             int nlen;         /* length of this vector */
             void *oldval;     /* 0 or address where to store old value */
             size_t *oldlenp;  /* available room for old value,
                                  overwritten by actual size of old value */
             void *newval;     /* 0 or address of new value */
             size_t newlen;    /* size of new value */
     };

     This call does a search in a tree structure, possibly resem-
     bling a directory tree under /proc/sys, and if the requested
     item is found calls some  appropriate  routine  to  read  or
     modify the value.



EXAMPLE

     #include <linux/unistd.h>
     #include <linux/types.h>
     #include <linux/sysctl.h>

     _syscall1(int, _sysctl, struct __sysctl_args *, args);
     int sysctl(int *name, int nlen, void *oldval, size_t *oldlenp,
                void *newval, size_t newlen)
     {
             struct __sysctl_args args={name,nlen,oldval,oldlenp,newval,newlen};
             return _sysctl(&args);
     }

     #define SIZE(x) sizeof(x)/sizeof(x[0])
     #define OSNAMESZ 100

     char osname[OSNAMESZ];
     int osnamelth;
     int name[] = { CTL_KERN, KERN_OSTYPE };

     main(){
             osnamelth = SIZE(osname);
             if (sysctl(name, SIZE(name), osname, &osnamelth, 0, 0))
                     perror("sysctl");
             else
                     printf("This machine is running %*s\n", osnamelth, osname);
             return 0;
     }



RETURN VALUES

     Upon successful completion, _sysctl returns 0. Otherwise,  a
     value  of  -1  is  returned and errno is set to indicate the
     error.


ERRORS

     ENOTDIR name was not found.

     EPERM   No search permission  for  one  of  the  encountered
             `directories',  or  no  read permission where oldval
             was nonzero, or no write permission where newval was
             nonzero.

     EFAULT  The invocation asked for the previous value by  set-
             ting  oldval  non-NULL,  but  allowed  zero  room in
             oldlenp.


CONFORMING TO

     This call is Linux-specific, and should not be used in  pro-
     grams  intended  to  be  portable.   A  sysctl call has been
     present in Linux since  version  1.3.57.  It  originated  in
     4.4BSD.  Only Linux has the /proc/sys mirror, and the object
     naming schemes differ between Linux and  BSD  4.4,  but  the
     declaration of the sysctl(2) function is the same in both.


BUGS

     The object names vary between kernel versions.   THIS  MAKES
     THIS  SYSTEM  CALL  WORTHLESS  FOR  APPLICATIONS.   Use  the
     /proc/sys interface instead.
     Not all available objects are properly documented.
     It is not yet possible to change operating system by writing
     to /proc/sys/kernel/ostype.


SEE ALSO

     proc(5).