Provided by: manpages-pl-dev_0.7-2_all bug

NAZWA

       getpwnam, getpwnam_r, getpwuid, getpwuid_r - odczytanie wpisu z pliku hasel

SKŁADNIA

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

       struct passwd *getpwnam(const char *name);

       struct passwd *getpwuid(uid_t uid);

       int getpwnam_r(const char *name, struct passwd *pwd,
                      char *buf, size_t buflen, struct passwd **result);

       int getpwuid_r(uid_t uid, struct passwd *pwd,
                      char *buf, size_t buflen, struct passwd **result);

   Wymagane ustawienia makr biblioteki glibc (patrz feature_test_macros(7)):

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

OPIS

       Funkcja  getpwnam()  zwraca wskaźnik do struktury, zawierającej pola powstałe z rozłożenia
       tego rekordu z bazy haseł (na przykład z lokalnego pliku haseł /etc/passwd  albo  z  NIS-a
       lub LDAP-a), który odpowiada użytkownikowi o nazwie name.

       Funkcja  getpwuid()  zwraca wskaźnik do struktury, zawierającej pola powstałe z rozłożenia
       tego rekordu bazy danych haseł, który odpowiada użytkownikowi o identyfikatorze uid.

       Struktura passwd jest zdefiniowana w <pwd.h> następująco:

           struct passwd {
               char   *pw_name;       /* nazwa użytkownika */
               char   *pw_passwd;     /* hasło użytkownika */
               uid_t   pw_uid;        /* identyfikator użytkownika */
               gid_t   pw_gid;        /* identyfikator grupy */
               char   *pw_gecos;      /* informacje o użytkowniku */
               char   *pw_dir;        /* katalog domowy */
               char   *pw_shell;      /* program powłoki */
           };

       Więcej informacji tych polach można znaleźć w podręczniku passwd(5).

       Funkcje  getpwnam_r()  i  getpwuid_r()  zwracają  te  same  informacje,  co  getpwnam()  i
       getpwuid(), ale zapisują pobraną strukturę passwd w przestrzeni wskazywanej przez argument
       pwd. Pola tekstowe, na które  wskazują  członkowie  struktury  passwd  są  przekazywane  w
       buforze  buf  o  rozmiarze  buflen.  W zmiennej *result jest zapisywany wskaźnik do wyniku
       funkcji (w przypadku powodzenia) lub NULL (jeśli nie znaleziono  wpisu  w  bazie  lub  gdy
       wystąpił błąd).

       Wywołanie

           sysconf(_SC_GETPW_R_SIZE_MAX)

       zwraca  albo  -1,  bez  zmieniania  wartości errno, albo początkowy sugerowany rozmiar dla
       bufora buf. (Jeśli ten rozmiar jest za mały, to opisywane funkcje  zwrócą  błąd  ERANGE  -
       wtedy proces wywołujący powinien spróbować ponownie z większym buforem).

WARTOŚĆ ZWRACANA

       Funkcje getpwnam() i getpwuid() zwracają wskaźnik do struktury passwd albo NULL, jeśli nie
       znaleziono pasującego wpisu lub gdy wystąpił błąd. W przypadku wystąpienia błędu ustawiają
       odpowiednią  wartość  zmiennej  errno.  Aby  móc sprawdzić wartość errno po wywołaniu tych
       funkcji, należy ją przed wywołaniem ustawić na zero.

       Zwrócona wartość może wskazywać na  statyczny  obszar,  który  może  być  nadpisany  przez
       kolejne wywołania getpwent(3), getpwnam() lub getpwuid(). (Zwróconego wskaźnika nie należy
       przekazywać do funkcji free(3)).

       getpwnam_r() i getpwuid_r(), jeśli się powiodą, to zwracają zero i  ustawiają  *result  na
       pwd.  Jeśli  nie  znaleziono  pasującego  rekordu  w  bazie haseł, to funkcje zwracają 0 i
       wpisują NULL do *result. W przypadku błędu zawracany  jest  numer  błędu  i  *result  jest
       ustawiany na NULL.

BŁĘDY

       0 lub ENOENT, lub ESRCH, lub EBADF, lub EPERM,prze lub ...
              Podany argument name lub uid nie został znaleziony.

       EINTR  Przechwycono sygnał, patrz signal(7).

       EIO    Błąd wejścia/wyjścia.

       EMFILE Zostało  osiągnięte  ograniczenie  na  liczbę  otwartych  deskryptorów  plików  dla
              procesu.

       ENFILE Zostało osiągnięte systemowe ograniczenie na całkowitą liczbę otwartych plików.

       ENOMEM Zabrakło pamięci na przydzielenie struktury passwd.

       ERANGE Przekazano niewystarczający bufor.

UWAGA

       Baza danych haseł użytkownika zazwyczaj oznacza  plik  /etc/passwd.  Jednakże  w  nowszych
       systemach może to także oznaczać bazy używające NIS-a, LDAP-a oraz innych lokalnych plików
       skonfigurowanych w /etc/nsswitch.conf.

PLIKI

       /etc/passwd
              lokalny plik bazy z hasłami

       /etc/nsswitch.conf
              plik konfiguracyjny System Databases i Name Service Switch

ATRYBUTY

       Informacje  o  pojęciach  używanych  w  tym  rozdziale   można   znaleźć   w   podręczniku
       attributes(7).

       ┌──────────────┬────────────────────────┬─────────────────────────────┐
       │InterfejsAtrybutWartość                     │
       ├──────────────┼────────────────────────┼─────────────────────────────┤
       │getpwnam()    │ Bezpieczeństwo wątkowe │ MT-Unsafe race:pwnam locale │
       ├──────────────┼────────────────────────┼─────────────────────────────┤
       │getpwuid()    │ Bezpieczeństwo wątkowe │ MT-Unsafe race:pwuid locale │
       ├──────────────┼────────────────────────┼─────────────────────────────┤
       │getpwnam_r(), │ Bezpieczeństwo wątkowe │ MT-Safe locale              │
       │getpwuid_r()  │                        │                             │
       └──────────────┴────────────────────────┴─────────────────────────────┘

ZGODNE Z

       POSIX.1-2001,  POSIX.1-2008, SVr4, 4.3BSD. Pole pw_gecos nie jest wymienione w standardzie
       POSIX, ale większość implementacji je zawiera.

UWAGI

       Sformułowania podane w rozdziale "WARTOŚĆ ZWRACANA" pochodzą  ze  standardu  POSIX.1-2001.
       Nie  uwzględnia  on jednak sytuacji "nie znaleziono wpisu w bazie" jako błąd i dlatego nie
       określa, jaką wartość powinno mieć errno  w  takim  przypadku.  Jednakże  uniemożliwia  to
       rozpoznawanie  błędów.  Można  by  dowodzić,  że zgodnie ze standardem POSIX errno powinno
       pozostać niezmienione, jeśli nie znaleziono wpisu. Eksperymentalnie stwierdzono, że  różne
       systemy  uniksowe  ustawiają różne wartości: 0, ENOENT, EBADF, ESRCH, EWOULDBLOCK, EPERM i
       być może jeszcze jakieś inne.

       Pole pw_dir  zawiera  nazwę  początkowego  katalogu  bieżącego  użytkownika.  Programy  do
       logowania  użytkowników używają wartości tego pola do zainicjowania zmiennej środowiskowej
       HOME powłok zgłoszeniowych. Aplikacja, która  chce  określić  katalog  domowy  użytkownika
       powinna  sprawdzać  wartość zmiennej HOME (a nie wartość pola getpwuid(getuid())->pw_dir),
       ponieważ pozwala to użytkownikowi zmienić  znaczenie  "katalogu  domowego".  Aby  określić
       katalog  domowy  innego  użytkownika,  należy użyć getpwnam("username")->pw_dir lub czegoś
       podobnego.

PRZYKŁAD

       Poniższy program obrazuje użycie funkcji   getpwnam_r()  do  znalezienia  pełnej  nazwy  i
       numerycznego identyfikatora użytkownika przekazanego w argumencie linii poleceń.

       #include <pwd.h>
       #include <stdio.h>
       #include <stdlib.h>
       #include <unistd.h>
       #include <errno.h>

       int
       main(int argc, char *argv[])
       {
           struct passwd pwd;
           struct passwd *result;
           char *buf;
           size_t bufsize;
           int s;

           if (argc != 2) {
               fprintf(stderr, "Użycie: %s nazwa-użytkownika\n", argv[0]);
               exit(EXIT_FAILURE);
           }

           bufsize = sysconf(_SC_GETPW_R_SIZE_MAX);
           if (bufsize == -1)          /* Wartość nie była określone */
               bufsize = 16384;        /* Powinno w zupełności wystarczyć */

           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("Nie znaleziono\n");
               else {
                   errno = s;
                   perror("getpwnam_r");
               }
               exit(EXIT_FAILURE);
           }

           printf("Nazwa: %s; UID: %ld\n", pwd.pw_gecos, (long) pwd.pw_uid);
           exit(EXIT_SUCCESS);
       }

ZOBACZ TAKŻE

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

O STRONIE

       Angielska wersja tej strony  pochodzi  z  wydania  4.07  projektu  Linux  man-pages.  Opis
       projektu,  informacje  dotyczące  zgłaszania  błędów oraz najnowszą wersję oryginału można
       znaleźć pod adresem https://www.kernel.org/doc/man-pages/.

TŁUMACZENIE

       Autorami polskiego tłumaczenia niniejszej strony podręcznika man są: Przemek  Borys  (PTM)
       <pborys@dione.ids.pl>, Andrzej M. Krzysztofowicz (PTM) <ankry@green.mf.pg.gda.pl> i Robert
       Luberda <robert@debian.org>.

       Polskie tłumaczenie jest częścią projektu manpages-pl; uwagi, pomoc, zgłaszanie błędów  na
       stronie   http://sourceforge.net/projects/manpages-pl/.   Jest   zgodne   z  wersją   4.07
       oryginału.