capget(2) System Calls Manual capget(2) NUME capget, capset - stabilete/obine capacitaile firului (firelor) BIBLIOTECA Biblioteca C standard (libc, -lc) SINOPSIS #include /* Definirea constantelor CAP_* i _LINUX_CAPABILITY_* */ #include /* Definirea constantelor SYS_* */ #include 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); Nota: Nu exista nicio funcie invaluitoare (wrapper) glibc pentru aceste apeluri de sistem astfel ca este necesara utilizarea a syscall(2). DESCRIERE Aceste doua apeluri de sistem reprezinta interfaa bruta a nucleului pentru obinerea i definirea capacitailor firelor. Nu numai ca aceste apeluri de sistem sunt specifice Linux-ului, dar API-ul nucleului este posibil sa se schimbe i utilizarea acestor apeluri de sistem (in special formatul tipurilor cap_user_*_t) este supusa extinderii cu fiecare revizuire a nucleului, dar programele vechi vor continua sa funcioneze. Interfeele portabile sunt cap_set_proc(3) i cap_get_proc(3); daca este posibil, ar trebui sa utilizai aceste interfee in aplicaii; a se vedea seciunea NOTE. Detalii actuale Acum ca ai fost avertizai, cateva detalii despre nucleul curent. Structurile sunt definite dupa cum urmeaza. #define _LINUX_CAPABILITY_VERSION_1 0x19980330 #define _LINUX_CAPABILITY_U32S_1 1 /* V2 adaugata in Linux 2.6.25; depreciata */ #define _LINUX_CAPABILITY_VERSION_2 0x20071026 #define _LINUX_CAPABILITY_U32S_2 2 /* V3 adaugata in 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; Campurile effective, permitted i inheritable sunt mati de bii ale capacitailor definite in capabilities(7). Reinei ca valorile CAP_* sunt indexuri de bii i trebuie sa fie deplasate inainte de a fi adaugate in campurile de bii. Pentru a defini structurile care trebuie transmise apelului de sistem, trebuie sa utilizai numele struct __user_cap_header_struct i struct __user_cap_data_struct deoarece typedefs sunt doar indicatori. Nucleele anterioare Linux 2.6.25 prefera capacitaile pe 32 de bii cu versiunea _LINUX_CAPABILITY_VERSION_1. Linux 2.6.25 a adaugat seturi de capacitai pe 64 de bii, cu versiunea _LINUX_CAPABILITY_VERSION_2. A existat, totui, o eroare API, iar Linux 2.6.26 a adaugat _LINUX_CAPABILITY_VERSION_3 pentru a rezolva problema. Reinei ca capacitaile pe 64 de bii utilizeaza datap[0] i datap[1], in timp ce capacitaile pe 32 de bii utilizeaza numai datap[0]. Pe nucleele care ofera suport pentru capacitaile fiierelor (suport pentru capacitaile VFS), aceste apeluri de sistem se comporta uor diferit. Acest suport a fost adaugat ca opiune in Linux 2.6.24 i a devenit fix (neopional) in Linux 2.6.33. Pentru apelurile capget(), se pot sonda capacitaile oricarui proces prin specificarea ID-ului acestuia cu valoarea campului hdrp->pid. Pentru detalii privind datele, consultai capabilities(7). Cu suport pentru capacitaile VFS Capacitaile VFS utilizeaza un atribut extins de fiier (a se vedea xattr(7)) pentru a permite ataarea capacitailor la executabile. Acest model de privilegii elimina suportul nucleului pentru stabilirea asincrona de catre un proces a capacitailor altuia. Adica, pe nucleele care accepta capacitaile VFS, atunci cand se apeleaza capset(), singurele valori permise pentru hdrp->pid sunt 0 sau, echivalent, valoarea returnata de gettid(2). Fara suport pentru capacitaile VFS In cazul nucleelor mai vechi care nu ofera suport pentru capacitaile VFS, capset() poate fi utilizat, daca apelantul are capacitatea CAP_SETPCAP, pentru a modifica nu numai capacitaile apelantului, ci i capacitaile altor fire. Apelul opereaza asupra capacitailor firului specificat de campul pid din hdrp atunci cand acesta este diferit de zero, sau asupra capacitailor firului apelant daca pid este 0. Daca pid se refera la un proces cu un singur fir, atunci pid poate fi specificat ca un ID de proces tradiional; operarea asupra unui fir al unui proces cu mai multe fire necesita un ID de fir de tipul celui returnat de gettid(2). Pentru capset(), pid poate fi de asemenea: -1, ceea ce inseamna efectuarea modificarii pe toate firele de execuie, cu excepia apelantului i a lui init(1); sau o valoare mai mica decat -1, caz in care modificarea se aplica tuturor membrilor grupului de procese al carui ID este -pid. VALOAREA RETURNATA In caz de succes, se returneaza zero. In caz de eroare, se returneaza -1, iar errno este configurata pentru a indica eroarea. Apelurile eueaza cu eroarea EINVAL i definesc campul version din hdrp la valoarea preferata de nucleu _LINUX_CAPABILITY_VERSION_? atunci cand este specificata o valoare version neacceptata. In acest fel, se poate afla care este revizuirea curenta preferata a capacitaii. ERORI-IEIRE EFAULT Adresa de memorie greita. hdrp nu trebuie sa fie NULL. datap poate fi NULL numai atunci cand utilizatorul incearca sa determine formatul preferat al versiunii capacitailor acceptate de nucleu. EINVAL Unul dintre argumente nu a fost valid. EPERM S-a incercat adaugarea unei capacitai la setul permis sau definirea unei capacitai in setul efectiv care nu este in setul permis. EPERM S-a incercat sa se adauge o capacitate la setul motenit i fie: o capacitatea respectiva nu se afla in setul de limitare al apelantului; fie o capacitatea nu se afla in setul permis al apelantului i apelantul nu avea capacitatea CAP_SETPCAP in setul sau efectiv. EPERM Apelantul a incercat sa utilizeze capset() pentru a modifica capacitaile unui alt fir de execuie decat el insui, dar nu avea suficiente privilegii. Pentru nucleele care accepta capacitaile VFS, acest lucru nu este permis niciodata. Pentru nucleele fara suport VFS, este necesara capacitatea CAP_SETPCAP. O eroare in nucleele anterioare Linux 2.6.11 a facut ca aceasta eroare sa poata aparea i in cazul in care un fir fara aceasta capacitate incerca sa ii schimbe propriile capacitai specificand campul pid ca o valoare diferita de zero (adica valoarea returnata de getpid(2)) in loc de 0. ESRCH Nu exista un astfel de fir. STANDARDE Linux. NOTE Interfaa portabila pentru funciile de interogare i definire a capacitailor este oferita de biblioteca libcap i este disponibila aici: CONSULTAI I clone(2), gettid(2), capabilities(7) TRADUCERE Traducerea in limba romana a acestui manual a fost facuta de Remus- Gabriel Chelu Aceasta traducere este documentaie gratuita; citii Licena publica generala GNU Versiunea 3 sau o versiune ulterioara cu privire la condiii privind drepturile de autor. NU se asuma NICIO RESPONSABILITATE. Daca gasii erori in traducerea acestui manual, va rugam sa trimitei un e-mail la . Pagini de manual de Linux 6.15 17 mai 2025 capget(2)