getpwnam(3) Library Functions Manual getpwnam(3) NAZWA getpwnam, getpwnam_r, getpwuid, getpwuid_r - odczytuje wpis z pliku hasel BIBLIOTEKA Standardowa biblioteka C (libc, -lc) SKLADNIA #include #include 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 .size], size_t size, struct passwd **restrict result); int getpwuid_r(uid_t uid, struct passwd *restrict pwd, char buf[restrict .size], size_t size, struct passwd **restrict result); Wymagane ustawienia makr biblioteki glibc (patrz feature_test_macros(7)): getpwnam_r(), getpwuid_r(): _POSIX_C_SOURCE || /* glibc w wersji <= 2.19: */ _BSD_SOURCE || _SVID_SOURCE OPIS Funkcja getpwnam() zwraca wskaznik do struktury, zawierajacej pola powstale z rozlozenia tego rekordu z bazy hasel (na przyklad z lokalnego pliku hasel /etc/passwd albo z NIS-a lub LDAP-a), ktory odpowiada uzytkownikowi o nazwie name. Funkcja getpwuid() zwraca wskaznik do struktury, zawierajacej pola powstale z rozlozenia tego rekordu bazy danych hasel, ktory odpowiada uzytkownikowi o identyfikatorze uid. Struktura passwd jest nastepujaco zdefiniowana w pliku : struct passwd { char *pw_name; /* nazwa uzytkownika */ char *pw_passwd; /* haslo uzytkownika */ uid_t pw_uid; /* identyfikator uzytkownika */ gid_t pw_gid; /* identyfikator grupy */ char *pw_gecos; /* informacje o uzytkowniku */ char *pw_dir; /* katalog domowy */ char *pw_shell; /* program powloki */ }; Wiecej informacji tych polach mozna znalezc w podreczniku passwd(5). The getpwnam_r() and getpwuid_r() functions obtain the same information as getpwnam() and getpwuid(), but store the retrieved passwd structure in the space pointed to by pwd. The string fields pointed to by the members of the passwd structure are stored in the buffer buf of size size. A pointer to the result (in case of success) or NULL (in case no entry was found or an error occurred) is stored in *result. Wywolanie sysconf(_SC_GETPW_R_SIZE_MAX) zwraca albo -1, bez zmieniania wartosci errno, albo poczatkowy sugerowany rozmiar dla bufora buf (jesli ten rozmiar jest za maly, to opisywane funkcje zwroca blad ERANGE - wtedy proces wywolujacy powinien sprobowac ponownie z wiekszym buforem). WARTOSC ZWRACANA Funkcje getpwnam() i getpwuid() zwracaja wskaznik do struktury passwd albo NULL, jesli nie znaleziono pasujacego wpisu lub gdy wystapil blad. W przypadku wystapienia bledu ustawiaja errno, wskazujac blad. Aby moc sprawdzic wartosc errno po wywolaniu tych funkcji, nalezy ja przed wywolaniem ustawic na zero. Zwrocona wartosc moze wskazywac na statyczny obszar, ktory moze byc nadpisany przez kolejne wywolania getpwent(3), getpwnam() lub getpwuid() (zwroconego wskaznika nie nalezy przekazywac do funkcji free(3)). getpwnam_r() i getpwuid_r(), jesli sie powioda, to zwracaja zero i ustawiaja *result na pwd. Jesli nie znaleziono pasujacego rekordu w bazie hasel, to funkcje zwracaja 0 i wpisuja NULL do *result. W przypadku bledu zawracany jest numer bledu i *result jest ustawiany na NULL. BLEDY 0 lub ENOENT, lub ESRCH, lub EBADF, lub EPERM, lub ... Podany argument name lub uid nie zostal znaleziony. EINTR Przechwycono sygnal, patrz signal(7). EIO Blad wejscia/wyjscia. EMFILE Zostalo osiagniete ograniczenie na liczbe otwartych deskryptorow plikow dla procesu. ENFILE Zostalo osiagniete systemowe ograniczenie na calkowita liczbe otwartych plikow. ENOMEM Zabraklo pamieci na przydzielenie struktury passwd. ERANGE Przekazano niewystarczajacy bufor. PLIKI /etc/passwd lokalny plik bazy z haslami ATRYBUTY Informacje o pojeciach uzywanych w tym rozdziale mozna znalezc w podreczniku attributes(7). +--------------+--------------------------+----------------------------+ |Interfejs | Atrybut | Wartosc | +--------------+--------------------------+----------------------------+ |getpwnam() | Bezpieczenstwo watkowe | MT-niebezpieczne | | | | race:pwnam locale | +--------------+--------------------------+----------------------------+ |getpwuid() | Bezpieczenstwo watkowe | MT-niebezpieczne | | | | race:pwuid locale | +--------------+--------------------------+----------------------------+ |getpwnam_r(), | Bezpieczenstwo watkowe | MT-bezpieczne locale | |getpwuid_r() | | | +--------------+--------------------------+----------------------------+ WERSJE Pole pw_gecos nie jest wymienione w standardzie POSIX, ale wiekszosc implementacji je zawiera. STANDARDY POSIX.1-2008. HISTORIA POSIX.1-2001, SVr4, 4.3BSD. UWAGI Sformulowania podane w rozdziale ,,WARTOSC ZWRACANA" pochodza ze standardu POSIX.1-2001. Nie uwzglednia on jednak sytuacji ,,nie znaleziono wpisu w bazie" jako blad i dlatego nie okresla, jaka wartosc powinno miec errno w takim przypadku. Jednakze uniemozliwia to rozpoznawanie bledow. Mozna by dowodzic, ze zgodnie ze standardem POSIX errno powinno pozostac niezmienione, jesli nie znaleziono wpisu. Eksperymentalnie stwierdzono, ze rozne systemy uniksowe ustawiaja rozne wartosci: 0, ENOENT, EBADF, ESRCH, EWOULDBLOCK, EPERM i byc moze jeszcze jakies inne. Pole pw_dir zawiera nazwe poczatkowego katalogu biezacego uzytkownika. Programy do logowania uzytkownikow uzywaja wartosci tego pola do zainicjowania zmiennej srodowiskowej HOME powlok zgloszeniowych. Aplikacja, ktora chce okreslic katalog domowy uzytkownika powinna sprawdzac wartosc zmiennej HOME (a nie wartosc pola getpwuid(getuid())->pw_dir), poniewaz pozwala to uzytkownikowi zmienic znaczenie ,,katalogu domowego". Aby okreslic katalog domowy innego uzytkownika, nalezy uzyc getpwnam("username")->pw_dir lub czegos podobnego. PRZYKLADY Ponizszy program obrazuje uzycie funkcji getpwnam_r() do znalezienia pelnej nazwy i numerycznego identyfikatora uzytkownika przekazanego w argumencie linii polecen. #include #include #include #include #include #include int main(int argc, char *argv[]) { struct passwd pwd; struct passwd *result; char *buf; long bufsize; int s; if (argc != 2) { fprintf(stderr, "Uzycie: %s nazwa-uzytkownika\n", argv[0]); exit(EXIT_FAILURE); } bufsize = sysconf(_SC_GETPW_R_SIZE_MAX); if (bufsize == -1) /* Wartosc nie byla okreslona */ bufsize = 16384; /* Powinno w zupelnosci wystarczyc */ 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: %jd\n", pwd.pw_gecos, (intmax_t) pwd.pw_uid); exit(EXIT_SUCCESS); } ZOBACZ TAKZE endpwent(3), fgetpwent(3), getgrnam(3), getpw(3), getpwent(3), getspnam(3), putpwent(3), setpwent(3), passwd(5) TLUMACZENIE Autorami polskiego tlumaczenia niniejszej strony podrecznika sa: Przemek Borys , Andrzej Krzysztofowicz , Robert Luberda i Michal Kulach Niniejsze tlumaczenie jest wolna dokumentacja. Blizsze informacje o warunkach licencji mozna uzyskac zapoznajac sie z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje sie ZADNEJ ODPOWIEDZIALNOSCI. Bledy w tlumaczeniu strony podrecznika prosimy zglaszac na adres listy dyskusyjnej . Linux man-pages 6.12 24 grudnia 2024 r. getpwnam(3)