SYSCTL(2)

NOM
sysctl - Lire / ecrire les parametres systeme.

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
L'appel systeme _sysctl lit et/ou ecrit les parametres du noyau. Par exemple le nom d'hote ou le nombre maximum de fichiers ouverts. L'argument a la forme

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 */
};

Cet appel effectue une recherche dans la structure arborescente regroupee sous le repertoire /proc/sys, puis, si les valeurs reclamees y sont trouvees, appelle les routines appropriees pour lire ou modifier les valeurs.

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;
}

VALEUR RENVOYEE
_sysctl renvoie 0 s'il reussit, et -1 s'il echoue auquel cas errno contient le code d'erreur.

ERREURS

ENOTDIR
    name non trouve

EPERM
    pas de droits de parcours sur l'un des "repertoires" rencontres, ou pas de permission de lecture avec oldval non nul, ou encore pas de permission d'ecriture avec newval non nul.

EFAULT
    Demande de lecture de la valeur precedente en fournissant oldval non NULL, mais pas de place disponible dans oldlenp.

CONFORMITE
Cet appel systeme est specifique Linux et ne doit pas etre employe dans les programmes destines a etre portables. sysctl est present dans Linux depuis la version 1.3.57. Il existait dans BSD 4.4. Seul Linux dispose du mirroir /proc/sys et les conventions de nom d'objets different entre Linux et BSD 4.4, mais les declarations de la fonction sysctl(2) sont identiques sur les deux systemes.

BUGS
Tous les objets disponibles ne sont pas proprement documentes.
Il n'est pas possible de changer /proc/sys/kernel/ostype.

VOIR AUSSI
proc(5).