getpwnam(3)

NUME
getpwnam, getpwnam_r, getpwuid, getpwuid_r - obține intrarea din fișierul de parole

BIBLIOTECA
Biblioteca C standard (libc, -lc)

SINOPSIS
#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 buf[restrict .buflen], size_t buflen,
               struct passwd **restrict result);
int getpwuid_r(uid_t uid, struct passwd *restrict pwd,
               char buf[restrict .buflen], size_t buflen,
               struct passwd **restrict result);

    Cerințe pentru macrocomenzi de testare a caracteristicilor pentru glibc (consultați feature_test_macros(7)):

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

DESCRIERE
Funcția getpwnam() returnează un indicator către o structură care conține câmpurile defalcate ale înregistrării din baza de date de parole (de exemplu, fișierul local de parole /etc/passwd, NIS și LDAP) care corespunde numelui de utilizator name.

Funcția getpwuid() returnează un indicator către o structură care conține câmpurile defalcate ale înregistrării din baza de date a parolelor care corespunde ID-ului utilizatorului uid.

Structura passwd este definită în <pwd.h> după cum urmează:

    struct passwd {
        char   *pw_name;       /* numele utilizatorului */
        char   *pw_passwd;     /* parola utilizatorului */
        uid_t   pw_uid;        /* identificatorul utilizatorului */
        gid_t   pw_gid;        /* identificatorul grupului */
        char   *pw_gecos;      /* informații despre utilizator */
        char   *pw_dir;        /* directorul personal „acasă” */
        char   *pw_shell;      /* programul shell */
    };

Consultați passwd(5) pentru mai multe informații despre aceste câmpuri.

Funcțiile getpwnam_r() și getpwuid_r() obțin aceleași informații ca getpwnam() și getpwuid(), dar stochează structura passwd recuperată în spațiul indicat de pwd. Câmpurile de șir de caractere indicate de membrii structurii passwd sunt stocate în memoria tampon buf de dimensiune buflen. Un indicator către rezultat (în caz de succes) sau NULL (în cazul în care nu a fost găsită nicio intrare sau s-a produs o eroare) este stocat în *result.

Apelarea

    sysconf(_SC_GETPW_R_SIZE_MAX)

returnează fie -1, fără a modifica errno, fie o dimensiune inițială sugerată pentru buf; (dacă această dimensiune este prea mică, apelul eșuează cu ERANGE, caz în care apelantul poate încerca din nou cu o memorie tampon mai mare).

VALOAREA RETURNATĂ
Funcțiile getpwnam() și getpwuid() returnează un indicator către o structură passwd sau NULL dacă intrarea corespunzătoare nu este găsită sau dacă apare o eroare. Dacă apare o eroare, errno este configurată pentru a indica eroarea. Dacă se dorește verificarea errno după apel, aceasta trebuie să fie stabilită la zero înainte de apel.

Valoarea returnată poate indica o zonă statică și poate fi suprascrisă prin apeluri ulterioare la getpwent(3), getpwnam() sau getpwuid(). (Nu pasați indicatorul returnat la free(3).)

În caz de succes, funcțiile getpwnam_r() și getpwuid_r() returnează zero și stabilesc *result la pwd. Dacă nu a fost găsită nicio înregistrare de parolă corespunzătoare, aceste funcții returnează 0 și stochează NULL în *result. În caz de eroare, se returnează un număr de eroare, iar NULL este stocat în *rezultat.

ERORI-IEȘIRE

0 sau ENOENT sau ESRCH sau EBADF sau EPERM sau EPERM sau ...
    Datele name sau uid specificate nu au fost găsite.

EINTR
    A fost captat un semnal; a se vedea signal(7).

EIO Eroare de In/Ieș.

EMFILE
    Limita per proces a numărului de descriptori de fișiere deschise a fost atinsă.

ENFILE
    Limita la nivel de sistem a numărului total de fișiere deschise a fost atinsă.

ENOMEM
    Memorie insuficientă pentru alocarea structurii passwd.

ERANGE
    Spațiul de memorie tampon furnizat este insuficient.

NOTĂ
Baza de date a parolelor utilizatorilor se referă în principal la /etc/passwd. Cu toate acestea, în cazul sistemelor recente, aceasta se referă, de asemenea, la baze de date la nivel de rețea care utilizează NIS, LDAP și alte fișiere locale configurate în /etc/nsswitch.conf.

FIȘIERE

/etc/passwd
    fișierul local al bazei de date de parole

/etc/nsswitch.conf
    Baze de date de sistem și fișier de configurare a comutatorului serviciului de nume („Name Service Switch”: NSS)

ATRIBUTE
Pentru o explicație a termenilor folosiți în această secțiune, a se vedea attributes(7).
Interfață | Atribut | Valoare
getpwnam() | Siguranța firelor | MT-Unsafe race:pwnam locale
getpwuid() | Siguranța firelor | MT-Unsafe race:pwuid locale
getpwnam_r(), getpwuid_r() | Siguranța firelor | MT-Safe locale

VERSIUNI
Câmpul pw_gecos nu este specificat în POSIX, dar este prezent în majoritatea implementărilor.

STANDARDE
POSIX.1-2008.

ISTORIC
POSIX.1-2001, SVr4, 4.3BSD.

NOTE
Formularea de mai sus de la „RETURN VALUE” este din POSIX.1-2001. Aceasta nu numește „not found” o eroare și, prin urmare, nu specifică ce valoare ar putea avea errno în această situație. Dar acest lucru face imposibilă recunoașterea erorilor. S-ar putea argumenta că, în conformitate cu POSIX, errno ar trebui lăsat neschimbată dacă o intrare nu este găsită. Experimentele pe diferite sisteme de tip UNIX arată că în această situație apar o mulțime de valori diferite: 0, ENOENT, EBADF, ESRCH, EWOULDBLOCK, EPERM și probabil altele.

Câmpul pw_dir conține numele directorului de lucru inițial al utilizatorului. Programele de autentificare utilizează valoarea acestui câmp pentru a inițializa variabila de mediu HOME pentru shell-ul de autentificare. O aplicație care dorește să determine directorul inițial al utilizatorului său ar trebui să inspecteze valoarea lui HOME (mai degrabă decât valoarea getpwuid(getuid())->pw_dir) deoarece aceasta permite utilizatorului să își modifice noțiunea de „director personal” în timpul unei sesiuni de conectare. Pentru a determina directorul personal (inițial) al unui alt utilizator, este necesar să se utilizeze getpwnam("username")->pw_dir sau ceva similar.

EXEMPLE
Programul de mai jos demonstrează utilizarea getpwnam_r() pentru a găsi numele de utilizator complet și ID-ul de utilizator pentru numele de utilizator furnizat ca argument al liniei de comandă.

    #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 *result;
        char *buf;
        long bufsize;
        int s;

        if (argc != 2) {
            fprintf(stderr, "Utilizare: %s nume-utilizator\n", argv[0]);
            exit(EXIT_FAILURE);
        }

        bufsize = sysconf(_SC_GETPW_R_SIZE_MAX);
        if (bufsize == -1)          /* Valoarea a fost indeterminată */
            bufsize = 16384;        /* Ar trebui să fie mai mult decât suficient */

        buf = malloc(bufsize);
        if (buf == NULL) {
            perror("malloc");
            exit(EXIT_FAILURE);
        }

        s = getpwnam_r(argv[1], &pwd, buf, bufsize, &result);
        if (result == NULL) {
            if (s == 0)
                printf("Nu s-a găsit\n");
            else {
                errno = s;
                perror("getpwnam_r");
            }
            exit(EXIT_FAILURE);
        }

        printf("Nume: %s; UID: %jd\n", pwd.pw_gecos,
               (intmax_t) pwd.pw_uid);
        exit(EXIT_SUCCESS);
    }

CONSULTAȚI ȘI
endpwent(3), fgetpwent(3), getgrnam(3), getpw(3), getpwent(3), getspnam(3), putpwent(3), setpwent(3), nsswitch.conf(5), passwd(5)

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.