getpwnam(3)

BEZEICHNUNG
getpwnam, getpwnam_r, getpwuid, getpwuid_r - Eintrag in Passwortdatei abfragen

BIBLIOTHEK
Standard-C-Bibliothek (libc, -lc)

ÜBERSICHT
#include <sys/types.h>
#include <pwd.h>

struct passwd *getpwnam(const char *Name);
struct passwd *getpwuid(uid_t uid);

int getpwnam_r(const char *restrict Name, struct passwd *restrict pwd,
               char Puffer[restrict .Puffergröße], size_t Puffergröße,
               struct passwd **restrict Ergebnis);
int getpwuid_r(uid_t uid, struct passwd *restrict pwd,
               char Puffer[restrict .Puffergröße], size_t Puffergröße,
               struct passwd **restrict Ergebnis);

    Mit Glibc erforderliche Feature-Test-Makros (siehe feature_test_macros(7)):

getpwnam_r(), getpwuid_r():
_POSIX_C_SOURCE
    || /* Glibc <= 2.19: */ _BSD_SOURCE || _SVID_SOURCE

BESCHREIBUNG
Die Funktion getpwnam() gibt einen Zeiger auf eine Struktur zurück, die aus einem Datensatz herausgelöste Felder aus der Passwort-Datenbank enthält (z.B. die lokale Passwortdatei, NIS und LDAP), die zum Benutzername Name passen.

Die Funktion getpwnam() gibt einen Zeiger auf eine Struktur zurück, die aus einem Datensatz herausgelöste Felder aus der Passwort-Datenbank enthält, die zur Benutzerkennung uid passen.

Die Struktur passwd ist in <pwd.h> wie folgt definiert:

    struct passwd {
        char   *pw_name;       /* Benutzername */
        char   *pw_passwd;     /* Passwort des Benutzers */
        uid_t   pw_uid;        /* Benutzerkennung */
        gid_t   pw_gid;        /* Gruppenkennung */
        char   *pw_gecos;      /* Benutzerinformationen */
        char   *pw_dir;        /* Home-Verzeichnis */
        char   *pw_shell;      /* Anmelde-Shell */
    };

Weitere Informationen über die Felder dieser Struktur finden Sie unter passwd(5).

Die Funktionen getpwnam_r() und getpwuid_r() erhalten die gleichen Informationen wie getpwnam() und getpwuid(), speichern aber die empfangene passwd-Struktur an dem Platz, auf den pwd zeigt. Die Zeichenkettenfelder, auf die die Mitglieder der passwd-Struktur zeigen, werden im Puffer Puffer der Länge Puffergröße gespeichert. Ein Zeiger auf das Ergebnis (im Erfolgsfall) oder NULL (im Fall, dass kein Eintrag gefunden wurde oder ein Fehler auftrat) wird in *Ergebnis gespeichert.

Der Aufruf

    sysconf(_SC_GETPW_R_SIZE_MAX)

liefert entweder -1 ohne Änderung von errno oder die anfänglich vorgeschlagene Größe für Puffer zurück. (Falls diese Größe zu klein ist, schlägt der Aufruf mit ERANGE fehl. In diesem Fall kann der Aufrufende es mit einem größeren Puffer erneut versuchen.)

RÜCKGABEWERT
Die Funktionen getpwnam() und getpwuid() geben einen Zeiger auf eine passwd-Struktur oder NULL zurück, falls kein passender Eintrag gefunden wird oder ein Fehler auftritt. Wenn ein Fehler auftritt wird errno gesetzt, um den Fehler anzuzeigen. Falls errno nach dem Aufruf geprüft werden soll, sollte es vor dem Aufruf auf Null gesetzt werden.

Der Rückgabewert könnte auf einen statischen Bereich zeigen und von nachfolgenden Aufrufen von getpwent(3), getpwnam() oder getpwuid(3) überschrieben werden. (Übergeben Sie den zurückgegebenen Zeiger nicht an free(3).)

Bei Erfolg geben getpwnam_r() und getpwuid_r() Null zurück und setzen *Ergebnis auf pwd. Falls kein passender Passwort-Datensatz gefunden wurde, geben diese Funktionen 0 zurück und speichern NULL in *Ergebnis. Im Fall eines Fehlers wird eine Fehlernummer zurückgegeben und NULL in *Ergebnis gespeichert.

FEHLER

0 oder ENOENT oder ESRCH oder EBADF oder EPERM oder …
    Der angegebene Name oder die uid wurde nicht gefunden

EINTR
    Ein Signal wurde abgefangen; siehe signal(7).

EIO E/A-Fehler (engl. I/O).

EMFILE
    Die Beschränkung pro Prozess der Anzahl offener Datei-Deskriptoren wurde erreicht.

ENFILE
    Die systemweite Beschränkung für die Gesamtzahl offener Dateien wurde erreicht.

ENOMEM
    Der Speicher reicht nicht aus, um ihn für die Struktur passwd zu reservieren.

ERANGE
    Zu wenig Pufferspeicher bereitgestellt.

ANMERKUNGEN
Die Benutzer-Passwortdatenbank bezieht sich meistens auf /etc/passwd. Bei aktuellen Systemen bezieht sie sich jedoch außerdem auf netzwerkweite Datenbanken, die NIS, LDAP und andere lokale Datenbanken benutzen. Dies ist in /etc/nsswitch.conf konfiguriert.

DATEIEN

/etc/passwd
    lokale Passwortdatenbank

/etc/nsswitch.conf
    Konfigurationsdatei für Systemdatenbanken und Namens-Dienst-Umschalter (»Name Service Switch«)

ATTRIBUTE
Siehe attributes(7) für eine Erläuterung der in diesem Abschnitt verwandten Ausdrücke.
Schnittstelle | Attribut | Wert
getpwnam() | Multithread-Fähigkeit | MT-Unsafe race:pwnam locale
getpwuid() | Multithread-Fähigkeit | MT-Unsafe race:pwuid locale
getpwnam_r(), getpwuid_r() | Multithread-Fähigkeit | MT-Safe locale

STANDARDS
POSIX.1-2001, POSIX.1-2008, SVr4, 4.3BSD. Das Feld pw_gecos ist in POSIX nicht spezifiziert, aber in den meisten Implementierungen vorhanden.

ANMERKUNGEN
Die unter »RÜCKGABEWERT« angegebene Formulierung stammt von POSIX.1-2001. Sie lautet nicht Fehler »nicht gefunden« und gibt daher nicht an, welchen Wert errno in dieser Situation haben könnte. Dies macht es aber unmöglich Fehler zu erkennen. Es kann argumentiert werden, dass errno von POSIX unverändert bleiben sollte, wenn ein Eintrag nicht gefunden wird. Experimente auf verschiedenen UNIX-Systemen zeigen aber, dass viele verschieden Werte in dieser Situation auftreten: 0, ENOENT, EBADF, ESRCH, EWOULDBLOCK, EPERM und wahrscheinlich andere.

Das Feld pw_dir enthält den Namen des anfänglichen Arbeitsverzeichnisses des Benutzers. Anmeldeprogramme benutzen diesen Wert, um die Umgebungsvariable HOME für die Anmelde-Shell zu initialisieren. Eine Anwendung, die das Home-Verzeichnis des Benutzers feststellen möchte, sollte den Wert von HOME (anstatt des Wertes getpwuid(getuid())->pw_dir) kontrollieren, da dies dem Benutzer erlaubt, seine Vorstellung von »das Home-Verzeichnis« während einer Anmeldesitzung zu ändern. Um das (anfängliche) Home-Verzeichnis eines anderen Benutzers festzustellen, ist es nötig getpwnam(»Benutzername«)->pw_dir oder ähnliches zu benutzen.

BEISPIELE
Das folgende Programm demonstriert den Gebrauch von getpwnam_r(), um den volständigen Benutzernamen und die Benutzerkennung für den als Befehlszeilenargument angegebenen Benutzernamen herauszufinden.

    #include <errno.h>
    #include <pwd.h>
    #include <stdint.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    int
    main(int argc, char *argv[])
    {
        struct passwd pwd;
        struct passwd *Ergebnis;
        char *Puffer;
        long Puffergröße;
        int s;
        if (argc != 2) {
            fprintf(stderr, "Aufruf: %s Benutzername\n", argv[0]);
            exit(EXIT_FAILURE);
        }
        Puffergröße = sysconf(_SC_GETPW_R_SIZE_MAX);
        if (Puffergröße == -1)          /* Wert war unklar */
            Puffergröße = 16384;        /* Sollte mehr als genug sein */
        buf = malloc(Puffergröße);
        if (puffer == NULL) {
            perror("malloc");
            exit(EXIT_FAILURE);
        }
        s = getpwnam_r(argv[1], &pwd, Puffer, Puffergröße, &Ergebnis);
        if (Ergebnis == NULL) {
            if (s == 0)
                printf("Nicht gefunden\n");
            else {
                errno = s;
                perror("getpwnam_r");
            }
            exit(EXIT_FAILURE);
        }
        printf("Name: %s; UID: %jd\n", pwd.pw_gecos,
               (intmax_t) pwd.pw_uid);
        exit(EXIT_SUCCESS);
    }

SIEHE AUCH
endpwent(3), fgetpwent(3), getgrnam(3), getpw(3), getpwent(3), getspnam(3), putpwent(3), setpwent(3), nsswitch.conf(5), passwd(5)

ÜBERSETZUNG
Die deutsche Übersetzung dieser Handbuchseite wurde von Martin Schulze <joey@infodrom.org>, Chris Leick <c.leick@vollbio.de> und Mario Blättermann <mario.blaettermann@gmail.com> erstellt.

Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 (https://www.gnu.org/licenses/gpl-3.0.html) 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 die Mailingliste der Übersetzer (debian-l10n-german@lists.debian.org).