capget(2)

NUME
capget, capset - stabilește/obține capacitățile firului (firelor)

BIBLIOTECA
Biblioteca C standard (libc, -lc)

SINOPSIS
#include <linux/capability.h> /* Definirea constantelor CAP_*
                                 și _LINUX_CAPABILITY_* */
#include <sys/syscall.h>      /* Definirea constantelor SYS_* */
#include <unistd.h>

int syscall(SYS_capget, cap_user_header_t hdrp,
            cap_user_data_t datap);
int syscall(SYS_capset, cap_user_header_t hdrp,
            const cap_user_data_t datap);

Notă: Nu există nicio funcție învăluitoare (wrapper) glibc pentru aceste apeluri de sistem astfel că este necesară utilizarea a syscall(2).

DESCRIERE
Aceste două apeluri de sistem reprezintă interfața brută a nucleului pentru obținerea și definirea capacităților firelor. Nu numai că aceste apeluri de sistem sunt specifice Linux-ului, dar API-ul nucleului este posibil să se schimbe și utilizarea acestor apeluri de sistem (în special formatul tipurilor cap_user_*_t) este supusă extinderii cu fiecare revizuire a nucleului, dar programele vechi vor continua să funcționeze.

Interfețele portabile sunt cap_set_proc(3) și cap_get_proc(3); dacă este posibil, ar trebui să utilizați aceste interfețe în aplicații; a se vedea secțiunea NOTE.

  Detalii actuale
Acum că ați fost avertizați, câteva detalii despre nucleul curent. Structurile sunt definite după cum urmează.

    #define _LINUX_CAPABILITY_VERSION_1  0x19980330
    #define _LINUX_CAPABILITY_U32S_1     1

            /* V2 adăugată în Linux 2.6.25; depreciată */
    #define _LINUX_CAPABILITY_VERSION_2  0x20071026
    #define _LINUX_CAPABILITY_U32S_2     2

            /* V3 adăugată în Linux 2.6.26 */
    #define _LINUX_CAPABILITY_VERSION_3  0x20080522
    #define _LINUX_CAPABILITY_U32S_3     2

    typedef struct __user_cap_header_struct {
       __u32 version;
       int pid;
    } *cap_user_header_t;

    typedef struct __user_cap_data_struct {
       __u32 effective;
       __u32 permitted;
       __u32 inheritable;
    } *cap_user_data_t;

Câmpurile effective, permitted și inheritable sunt măști de biți ale capacităților definite în capabilities(7). Rețineți că valorile CAP_* sunt indexuri de biți și trebuie să fie deplasate înainte de a fi adăugate în câmpurile de biți. Pentru a defini structurile care trebuie transmise apelului de sistem, trebuie să utilizați numele struct __user_cap_header_struct și struct __user_cap_data_struct deoarece typedefs sunt doar indicatori.

Nucleele anterioare Linux 2.6.25 preferă capacitățile pe 32 de biți cu versiunea _LINUX_CAPABILITY_VERSION_1. Linux 2.6.25 a adăugat seturi de capacități pe 64 de biți, cu versiunea _LINUX_CAPABILITY_VERSION_2. A existat, totuși, o eroare API, iar Linux 2.6.26 a adăugat _LINUX_CAPABILITY_VERSION_3 pentru a rezolva problema.

Rețineți că capacitățile pe 64 de biți utilizează datap[0] și datap[1], în timp ce capacitățile pe 32 de biți utilizează numai datap[0].

Pe nucleele care oferă suport pentru capacitățile fișierelor (suport pentru capacitățile VFS), aceste apeluri de sistem se comportă ușor diferit. Acest suport a fost adăugat ca opțiune în Linux 2.6.24 și a devenit fix (neopțional) în Linux 2.6.33.

Pentru apelurile capget(), se pot sonda capacitățile oricărui proces prin specificarea ID-ului acestuia cu valoarea câmpului hdrp->pid.

Pentru detalii privind datele, consultați capabilities(7).

  Cu suport pentru capacitățile VFS
Capacitățile VFS utilizează un atribut extins de fișier (a se vedea xattr(7)) pentru a permite atașarea capacităților la executabile. Acest model de privilegii elimină suportul nucleului pentru stabilirea asincronă de către un proces a capacităților altuia. Adică, pe nucleele care acceptă capacitățile VFS, atunci când se apelează capset(), singurele valori permise pentru hdrp->pid sunt 0 sau, echivalent, valoarea returnată de gettid(2).

  Fără suport pentru capacitățile VFS
În cazul nucleelor mai vechi care nu oferă suport pentru capacitățile VFS, capset() poate fi utilizat, dacă apelantul are capacitatea CAP_SETPCAP, pentru a modifica nu numai capacitățile apelantului, ci și capacitățile altor fire. Apelul operează asupra capacităților firului specificat de câmpul pid din hdrp atunci când acesta este diferit de zero, sau asupra capacităților firului apelant dacă pid este 0. Dacă pid se referă la un proces cu un singur fir, atunci pid poate fi specificat ca un ID de proces tradițional; operarea asupra unui fir al unui proces cu mai multe fire necesită un ID de fir de tipul celui returnat de gettid(2). Pentru capset(), pid poate fi de asemenea: -1, ceea ce înseamnă efectuarea modificării pe toate firele de execuție, cu excepția apelantului și a lui init(1); sau o valoare mai mică decât -1, caz în care modificarea se aplică tuturor membrilor grupului de procese al cărui ID este -pid.

VALOAREA RETURNATĂ
În caz de succes, se returnează zero. În caz de eroare, se returnează -1, iar errno este configurată pentru a indica eroarea.

Apelurile eșuează cu eroarea EINVAL și definesc câmpul version din hdrp la valoarea preferată de nucleu _LINUX_CAPABILITY_VERSION_? atunci când este specificată o valoare version neacceptată. În acest fel, se poate afla care este revizuirea curentă preferată a capacității.

ERORI-IEȘIRE

EFAULT
    Adresă de memorie greșită. hdrp nu trebuie să fie NULL. datap poate fi NULL numai atunci când utilizatorul încearcă să determine formatul preferat al versiunii capacităților acceptate de nucleu.

EINVAL
    Unul dintre argumente nu a fost valid.

EPERM
    S-a încercat adăugarea unei capacități la setul permis sau definirea unei capacități în setul efectiv care nu este în setul permis.

EPERM
    S-a încercat să se adauge o capacitate la setul moștenit și fie:

    •   capacitatea respectivă nu se afla în setul de limitare al apelantului; fie

    •   capacitatea nu se afla în setul permis al apelantului și apelantul nu avea capacitatea CAP_SETPCAP în setul său efectiv.

EPERM
    Apelantul a încercat să utilizeze capset() pentru a modifica capacitățile unui alt fir de execuție decât el însuși, dar nu avea suficiente privilegii. Pentru nucleele care acceptă capacitățile VFS, acest lucru nu este permis niciodată. Pentru nucleele fără suport VFS, este necesară capacitatea CAP_SETPCAP. O eroare în nucleele anterioare Linux 2.6.11 a făcut ca această eroare să poată apărea și în cazul în care un fir fără această capacitate încerca să își schimbe propriile capacități specificând câmpul pid ca o valoare diferită de zero (adică valoarea returnată de getpid(2)) în loc de 0.

ESRCH
    Nu există un astfel de fir.

STANDARDE
Linux.

NOTE
Interfața portabilă pentru funcțiile de interogare și definire a capacităților este oferită de biblioteca libcap și este disponibilă aici:
http://git.kernel.org/cgit/linux/kernel/git/morgan/libcap.git

CONSULTAȚI ȘI
clone(2), gettid(2), capabilities(7)

TRADUCERE
Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu <remusgabriel.chelu@disroot.org>

Această traducere este documentație gratuită; citiți Licența publică generală GNU Versiunea 3 (https://www.gnu.org/licenses/gpl-3.0.html) sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO RESPONSABILITATE.

Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la translation-team-ro@lists.sourceforge.net.