sysctl

NAME

sysctl - read/write system parameters

SYNOPSIS


#include <unistd.h>


#include <linux/sysctl.h> 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 resembling a directory tree under /proc/sys, and if the requested item is found calls some appropriate routine to read or modify the value.

RETURN VALUE

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

ERRORS

EFAULT
The invocation asked for the previous value by setting oldval non-NULL, but allowed zero room in oldlenp.
ENOTDIR
name was not found.
EPERM
No search permission for one of the encountered `directories', or no read permission where oldval was non-zero, or no write permission where newval was non-zero.

CONFORMING TO

This call is Linux specific, and should not be used in programs 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 4.4BSD, but the declaration of the sysctl(2) function is the same in both.

NOTES

Glibc does not provide a wrapper for this system call; call it using syscall(2).

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.

EXAMPLE


#define _GNU_SOURCE

#include <unistd.h>

#include <sys/syscall.h>

#include <string.h>

#include <stdio.h>

#include <stdlib.h>

#include <linux/sysctl.h>



int _sysctl(struct __sysctl_args *args );



#define OSNAMESZ 100



int

main(void)

{

    struct __sysctl_args args;

    char osname[OSNAMESZ];

    size_t osnamelth;

    int name[] = { CTL_KERN, KERN_OSTYPE };



    memset(&args, 0, sizeof(struct __sysctl_args));

    args.name = name;

    args.nlen = sizeof(name)/sizeof(name[0]);

    args.oldval = osname;

    args.oldlenp = &osnamelth;



    osnamelth = sizeof(osname);



    if (syscall(SYS__sysctl, &args) == -1) {

        perror("_sysctl");

        exit(EXIT_FAILURE);

    }

    printf("This machine is running %*s\n", osnamelth, osname);

    exit(EXIT_SUCCESS);

}

SEE ALSO

proc(5)