CAPGET(2)

BEZEICHNUNG
capget, capset - Setzt/ermittelt die Capabilities von Thread(s)

ÜBERSICHT
#include <sys/capability.h>

int capget(cap_user_header_t hdrp, cap_user_data_t datap);

int capset(cap_user_header_t hdrp, const cap_user_data_t datap);

BESCHREIBUNG
Seit Linux 2.2 ist die Macht des Superusers (Root) in eine Gruppe von diskreten Capabilities aufgeteilt. Jeder Thread hat eine Gruppe an effektiven Capabilities, die angeben, welche Capabilities (falls zutreffend) er derzeit ausführen darf. Jeder Thread hat auch eine Gruppe an vererbbaren Capabilities, die über einen execve(2)-Aufruf weitergegeben werden können und eine Gruppe an erlaubten Capabilities, die er zu effektiven oder vererbbaren hinzufügen kann.

Diese zwei Systemaufrufe sind die rohe Kernelschnittstelle zum Ermitteln und Setzen der Thread-Capabilities. Die Systemaufrufe sind nicht nur Linux-spezifisch, auch die Kernel-API wird sich wahrscheinlich ändern und die Verwendung dieser Systemaufrufe (insbesondere das Format der cap_user_*_t-Typen) unterliegt in jeder Kernel-Revision Erweiterungen, aber alte Programme werden weiterhin funktionieren.

Die portablen Schnittstellen sind cap_set_proc(3) und cap_get_proc(3); falls möglich, sollten Sie diese Schnittstellen in Anwendungen verwenden. Falls Sie die Linux-Erweiterungen in Anwendungen verwenden möchten, sollten Sie die leichter zu verwendenden Schnittstellen capsetp(3) und capgetp(3) verwenden.

  Aktuelle Details
Nachdem Sie gewarnt wurden, einige aktuelle Kernel-Datails. Die Strukturen sind wie folgt definiert:

#define _LINUX_CAPABILITY_VERSION_1  0x19980330
#define _LINUX_CAPABILITY_U32S_1     1
        /* V2 added in Linux 2.6.25; deprecated */
#define _LINUX_CAPABILITY_VERSION_2  0x20071026
#define _LINUX_CAPABILITY_U32S_2     2
        /* V3 added 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;

The effective, permitted, and inheritable fields are bit masks of the capabilities defined in capabilities(7). Note that the CAP_* values are bit indexes and need to be bit-shifted before ORing into the bit fields. To define the structures for passing to the system call, you have to use the struct __user_cap_header_struct and struct __user_cap_data_struct names because the typedefs are only pointers. Kernels prior to 2.6.25 prefer 32-bit capabilities with version _LINUX_CAPABILITY_VERSION_1. Linux 2.6.25 added 64-bit capability sets, with version _LINUX_CAPABILITY_VERSION_2. There was, however, an API glitch, and Linux 2.6.26 added _LINUX_CAPABILITY_VERSION_3 to fix the problem. Note that 64-bit capabilities use datap[0] and datap[1], whereas 32-bit capabilities use only datap[0]. On kernels that support file capabilities (VFS capability support), these system calls behave slightly differently. This support was added as an option in Linux 2.6.24, and became fixed (nonoptional) in Linux 2.6.33. Für capget()-Aufrufe können die Capabilities eines Prozesses über die Angabe der Prozess-ID mit dem Feldwert hdrp->pid ermittelt werden.

  Mit VFS-Capability-Unterstützung
VFS-Capability-Unterstützung erstellt eine auf Dateiattributen basierende Methode zum Hinzufügen von Funktionen für privilegierte ausführbare Dateien. Dieses Privilegienmodell ersetzt die Kernel-Unterstützung dafür, dass ein Prozess asynchron die Capabilities eines anderen setzt. Das heißt, mit VFS-Unterstützung sind für Aufrufe von capset() die einzig zulässigen, gleichwertigen Werte für hdrp->pid 0 oder getpid(2).

  Ohne VFS-Capability-Unterstützung
When the kernel does not support VFS capabilities, capset() calls can operate on the capabilities of the thread specified by the pid field of hdrp when that is nonzero, or on the capabilities of the calling thread if pid is 0. If pid refers to a single-threaded process, then pid can be specified as a traditional process ID; operating on a thread of a multithreaded process requires a thread ID of the type returned by gettid(2). For capset(), pid can also be: -1, meaning perform the change on all threads except the caller and init(1); or a value less than -1, in which case the change is applied to all members of the process group whose ID is -pid. Für Details der Daten siehe capabilities(7).

RÜCKGABEWERT
Bei Erfolg wird Null zurückgegeben. Bei einem Fehler wird -1 zurückgegeben und errno entsprechend gesetzt. Die Aufrufe werden mit dem Fehler EINVAL fehlschlagen und das Feld version von hdrp auf den vom Kernel bevorzugten Wert von _LINUX_CAPABILITY_VERSION_? setzen, wenn ein nicht unterstützter version-Wert angegeben wird. Auf diese Weise kann herausgefunden werden, wie die derzeit bevorzugte Capability-Revision lautet.

FEHLER

EFAULT
    Ungültige Speicheradresse. hdrp darf nicht NULL sein. datap darf NULL nur sein, wenn der Benutzer versucht, das vom Kernel unterstützte bevorzugte Capability-Versionsformat zu ermitteln.

EINVAL
    Eines der Argumente war ungültig.

EPERM
    Es wurde versucht, eine Capability zu der erlaubten Menge hinzuzufügen oder eine Capability in der effektiven oder vererbbaren Menge zu setzen, die nicht in der erlaubten Menge enthalten ist.

EPERM
    Der Aufrufende versuchte, capset() zu verwenden, um die Capabilities eines von ihm selbst verschiedenen Threads zu verändern, hatte dazu aber nicht die benötigten Privilegien. Für Kernel, die VFS-Capabilities unterstützen, ist dies nie erlaubt. Für Kernel ohne VFS-Unterstützung wird die Capability CAP_SETPCAP benötigt. (Ein Fehler in Kerneln vor 2.6.11 führte dazu, dass dieser Fehler auch auftreten konnte, falls ein Thread ohne diese Capability versuchte, seine eigenen Capabilities zu ändern, indem er das Feld pid auf einen von numerisch Null verschiedenen Wert (d.h. den von getpid(2) zurückgelieferten Wert) anstatt 0 wählte.)

ESRCH
    Kein solcher Thread.

KONFORM ZU
Diese Systemaufrufe sind Linux-spezifisch.

ANMERKUNGEN
Die portable Schnittstelle der Capability-Abfrage- und -Setzfunktionen wird durch die Bibliothek libcap bereitgestellt, die unter folgender Adresse erhältlich ist:
http://git.kernel.org/cgit/linux/kernel/git/morgan/libcap.git

SIEHE AUCH
clone(2), gettid(2), capabilities(7)

KOLOPHON
This page is part of release 3.80 of the Linux man-pages project. A description of the project, information about reporting bugs, and the latest version of this page, can be found at http://www.kernel.org/doc/man-pages/.

ÜBERSETZUNG
Die deutsche Übersetzung dieser Handbuchseite wurde von Tobias Quathamer <toddy@debian.org>, Helge Kreutzmann <debian@helgefjell.de>, Martin Eberhard Schauer <Martin.E.Schauer@gmx.de> und Mario Blättermann <mario.blaettermann@gmail.com> erstellt. Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezüglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen. Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an <debian-l10n-german@lists.debian.org>.