getpwnam(3) Library Functions Manual getpwnam(3) NAZWA getpwnam, getpwnam_r, getpwuid, getpwuid_r - odczytanie wpisu 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 .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); 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). Funkcje getpwnam_r() i getpwuid_r() zwracaja te same informacje, co getpwnam() i getpwuid(), ale zapisuja pobrana strukture passwd w przestrzeni wskazywanej przez argument pwd. Pola tekstowe, na ktore wskazuja czlonkowie struktury passwd sa przekazywane w buforze buf o rozmiarze buflen. W zmiennej *result jest zapisywany wskaznik do wyniku funkcji (w przypadku powodzenia) lub NULL (jesli nie znaleziono wpisu w bazie lub gdy wystapil blad). 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 The getpwnam() and getpwuid() functions return a pointer to a passwd structure, or NULL if the matching entry is not found or an error occurs. If an error occurs, errno is set to indicate the error. If one wants to check errno after the call, it should be set to zero before the call. 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 or ENOENT or ESRCH or EBADF or EPERM or ... 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-Unsafe race:pwnam | | | | locale | +--------------+--------------------------+----------------------------+ |getpwuid() | Bezpieczenstwo watkowe | MT-Unsafe race:pwuid | | | | locale | +--------------+--------------------------+----------------------------+ |getpwnam_r(), | Bezpieczenstwo watkowe | MT-bezpieczne locale | |getpwuid_r() | | | +--------------+--------------------------+----------------------------+ WERSJE The pw_gecos field is not specified in POSIX, but is present on most implementations. 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, "Usage: %s username\n", argv[0]); exit(EXIT_FAILURE); } bufsize = sysconf(_SC_GETPW_R_SIZE_MAX); if (bufsize == -1) /* Value was indeterminate */ bufsize = 16384; /* Should be more than enough */ 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("Not found\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); } 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 i Robert Luberda 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.06 31 pazdziernika 2023 r. getpwnam(3)