getutent(3) Library Functions Manual getutent(3) NAZWA getutent, getutid, getutline, pututline, setutent, endutent, utmpname - dostep do wpisow pliku utmp BIBLIOTEKA Standardowa biblioteka C (libc, -lc) SKLADNIA #include struct utmp *getutent(void); struct utmp *getutid(const struct utmp *ut); struct utmp *getutline(const struct utmp *ut); struct utmp *pututline(const struct utmp *ut); void setutent(void); void endutent(void); int utmpname(const char *file); OPIS New applications should use the POSIX.1-specified "utmpx" versions of these functions; see STANDARDS. utmpname() ustawia nazwe pliku w formacie utmp, ktory bedzie uzywany przez pozostale funkcje utmp. Jezeli nie uzyto utmpname() przed wywolaniem innych funkcji, to uzywaja one domyslnej nazwy _PATH_UTMP, zdefiniowanej w . setutent() przesuwa wskaznik pliku z powrotem na poczatek pliku utmp. Funkcja ta powinna zostac wywolana przed wywolaniem ktorejkolwiek z pozostalych funkcji. endutent() zamyka plik utmp. Powinna byc wywolana, gdy program juz zakonczyl uzywanie tego pliku przy pomocy innych funkcji. getutent() odczytuje linie z pliku utmp, zaczynajac od biezacej pozycji w tym pliku. Zwraca wskaznik do struktury zawierajacej pola linii. Definicje tej struktury opisano w utmp(5). getutid() przeszukuje plik w przod, zaczynajac od biezacej pozycji, biorac pod uwage parametr ut. Jezeli ut->ut_type jest jednym z RUN_LVL, BOOT_TIME, NEW_TIME lub OLD_TIME, to getutid() wyszuka pierwszy rekord, ktorego pole ut_type odpowiada ut->ut_type. Jezeli ut->ut_type jest jednym z INIT_PROCESS, LOGIN_PROCESS, USER_PROCESS lub DEAD_PROCESS, to getutid() wyszuka pierwszy wpis, ktorego pole ut_id pasuje do ut->ut_id. getutline() przeszukuje plik utmp w przod, zaczynajac od biezacej pozycji w pliku. Sprawdza wpisy, ktorych ut_type jest rowne USER_PROCESS lub LOGIN_PROCESS, i zwraca pierwszy z nich, ktorego pole ut_line odpowiada ut->ut_line. pututline() zapisuje strukture ut, ktorej typem jest utmp, do pliku utmp. Uzywa getutid(), aby znalezc odpowiednie miejsce do dodania nowego rekordu. Jesli go nie znajdzie, to pututline() doda nowy wpis na koncu pliku. WARTOSC ZWRACANA Funkcje getutent(), getutid() i getutline() zwracaja wskaznik do struct utmp, jesli zakoncza sie powodzeniem, lub NULL w razie wystapienia bledu. struct utmp jest zaalokowana w statycznej przestrzeni danych i moze zostac nadpisana przez kolejne wywolania funkcji. Funkcja pututline() zwraca ut, jesli zakonczy sie powodzeniem, lub NULL w razie wystapienia bledu. utmpname() zwraca 0, jesli zachowano nowa nazwe, lub -1 w przypadku bledu. On failure, these functions errno set to indicate the error. BLEDY ENOMEM Brak pamieci. ESRCH Nie znaleziono rekordu. Funkcje setutent(), pututline() i getut*() moga takze zwrocic bledy opisane w open(2). PLIKI /var/run/utmp baza danych obecnie zalogowanych uzytkownikow /var/log/wtmp baza danych poprzednich logowan uzytkownikow ATRYBUTY Informacje o pojeciach uzywanych w tym rozdziale mozna znalezc w podreczniku attributes(7). +------------+--------------------------+------------------------------+ |Interfejs | Atrybut | Wartosc | +------------+--------------------------+------------------------------+ |getutent() | Bezpieczenstwo watkowe | MT-Unsafe init race:utent | | | | race:utentbuf sig:ALRM timer | +------------+--------------------------+------------------------------+ |getutid(), | Bezpieczenstwo watkowe | MT-Unsafe init race:utent | |getutline() | | sig:ALRM timer | +------------+--------------------------+------------------------------+ |pututline() | Bezpieczenstwo watkowe | MT-niebezpieczne race:utent | | | | sig:ALRM timer | +------------+--------------------------+------------------------------+ |setutent(), | Bezpieczenstwo watkowe | MT-Unsafe race:utent | |endutent(), | | | |utmpname() | | | +------------+--------------------------+------------------------------+ W powyzszej tabeli, utent w race:utent oznacza, ze jesli ktoras z funkcji setutent(), getutent(), getutid(), getutline(), pututline(), utmpname() lub endutent() jest uzywana rownolegle w roznych watkach programu, moze nastapic sytuacja wyscigu danych. STANDARDY None. HISTORIA XPG2, SVr4. W dokumentacji XPG2 i SVID2 funkcja pututline() zwraca void, i to jest to, co ona rzeczywiscie zwraca na wielu systemach (AIX, HPUX). HPUX wprowadza nowa funkcje _pututline() o prototypie podanym powyzej dla pututline(). Wszystkie te funkcje sa przestarzale na systemach nielinuksowych. POSIX.1-2001 i POSIX.1-2008, nasladujac SUSv1, nie zawieraja zadnej z tych funkcji, ale zamiast nich uzywaja #include struct utmpx *getutxent(void); struct utmpx *getutxid(const struct utmpx *); struct utmpx *getutxline(const struct utmpx *); struct utmpx *pututxline(const struct utmpx *); void setutxent(void); void endutxent(void); Powyzsze funkcje sa dostarczane przez glibc i wykonuja dokladnie te same zadania, co ich odpowiedniki bez przyrostka "x", tyle ze uzywaja struktury struct utmpx, zdefiniowanej pod Linuksem dokladnie tak samo jak struct utmp. glibc dostarcza takze utmpxname(), chociaz POSIX.1 nie zawiera tej funkcji. Na niektorych systemach struktura utmpx jest rozszerzeniem struktury utmp o dodatkowe pola i o wieksze wersje istniejacych pol. Utrzymywane sa tam rownolegle wersje plikow, czesto jako /var/*/utmpx oraz /var/*/wtmpx. Z drugiej strony linuksowe glibc nie uzywa pliku utmpx, poniewaz jego struktura utmp jest juz wystarczajaco duza. Funkcje "x" opisane powyzej sa aliasami do funkcji bez "x" (np. getutxent jest aliasem getutent()). UWAGI Uwagi dla glibc The above functions are not thread-safe. glibc adds reentrant versions #include int getutent_r(struct utmp *ubuf, struct utmp **ubufp); int getutid_r(struct utmp *ut, struct utmp *ubuf, struct utmp **ubufp); int getutline_r(struct utmp *ut, struct utmp *ubuf, struct utmp **ubufp); Wymagane ustawienia makr biblioteki glibc (patrz feature_test_macros(7)): getutent_r(), getutid_r(), getutline_r(): _GNU_SOURCE || /* Since glibc 2.19: */ _DEFAULT_SOURCE || /* glibc <= 2.19: */ _SVID_SOURCE || _BSD_SOURCE Te funkcje sa rozszerzeniami GNU, analogicznymi do funkcji o tych samych nazwach, ale bez przyrostka "_r". Parametr ubuf okresla miejsce, w ktorym te funkcje powinny zapisac wynik. Jesli zakoncza sie powodzeniem, to zwracaja 0, a wskaznik do wyniku jest zapisywany w *ubufp. W razie bledu funkcje zwracaja -1. Funkcje te nie maja swoich odpowiednikow utmpx (POSIX.1 ich nie zawiera). PRZYKLADY Nastepujacy przyklad dodaje i usuwa rekord utmp, przy zalozeniu, ze zostanie uruchomiony z pseudoterminalu. Uzycie w rzeczywistej aplikacji wymagaloby sprawdzenia wartosci zwracanych przez getpwuid(3) i ttyname(3). #include #include #include #include #include #include int main(void) { struct utmp entry; system("echo before adding entry:;who"); entry.ut_type = USER_PROCESS; entry.ut_pid = getpid(); strcpy(entry.ut_line, ttyname(STDIN_FILENO) + strlen("/dev/")); /* only correct for ptys named /dev/tty[pqr][0-9a-z] */ strcpy(entry.ut_id, ttyname(STDIN_FILENO) + strlen("/dev/tty")); entry.ut_time = time(NULL); strcpy(entry.ut_user, getpwuid(getuid())->pw_name); memset(entry.ut_host, 0, UT_HOSTSIZE); entry.ut_addr = 0; setutent(); pututline(&entry); system("echo after adding entry:;who"); entry.ut_type = DEAD_PROCESS; memset(entry.ut_line, 0, UT_LINESIZE); entry.ut_time = 0; memset(entry.ut_user, 0, UT_NAMESIZE); setutent(); pututline(&entry); system("echo after removing entry:;who"); endutent(); exit(EXIT_SUCCESS); } ZOBACZ TAKZE getutmp(3), utmp(5) TLUMACZENIE Autorami polskiego tlumaczenia niniejszej strony podrecznika sa: 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.06 31 pazdziernika 2023 r. getutent(3)