getutent(3)

NAZWA
getutent, getutid, getutline, pututline, setutent, endutent, utmpname - dostęp do wpisów pliku utmp

BIBLIOTEKA
Standardowa biblioteka C (libc, -lc)

SKŁADNIA
#include <utmp.h>

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 *path);

OPIS
Nowe aplikacje powinny używać podanych w standardzie POSIX.1 wersji „utmpx” tych funkcji, zob. rozdział STANDARDY.

utmpname() ustawia ścieżkę pliku w formacie utmp, który będzie używany przez pozostałe funkcje utmp. Jeżeli nie użyto utmpname() do ustawienia ścieżki przed wywołaniem innych funkcji, to używają one _PATH_UTMP, zdefiniowanej w <paths.h>.

setutent() przesuwa wskaźnik pliku z powrotem na początek pliku utmp. Funkcja ta powinna zostać wywołana przed wywołaniem którejkolwiek z pozostałych funkcji.

endutent() zamyka plik utmp. Powinna być wywołana, gdy program już zakończył używanie tego pliku przy pomocy innych funkcji.

getutent() odczytuje linię z pliku utmp, zaczynając od bieżącej pozycji w tym pliku. Zwraca wskaźnik do struktury zawierającej pola linii. Definicję tej struktury opisano w utmp(5).

getutid() przeszukuje plik w przód, zaczynając od bieżącej pozycji, biorąc pod uwagę parametr ut. Jeżeli ut->ut_type jest jednym z RUN_LVL, BOOT_TIME, NEW_TIME lub OLD_TIME, to getutid() wyszuka pierwszy rekord, którego pole ut_type odpowiada ut->ut_type. Jeżeli ut->ut_type jest jednym z INIT_PROCESS, LOGIN_PROCESS, USER_PROCESS lub DEAD_PROCESS, to getutid() wyszuka pierwszy wpis, którego pole ut_id pasuje do ut->ut_id.

getutline() przeszukuje plik utmp w przód, zaczynając od bieżącej pozycji w pliku. Sprawdza wpisy, których ut_type jest równe USER_PROCESS lub LOGIN_PROCESS, i zwraca pierwszy z nich, którego pole ut_line odpowiada ut->ut_line.

pututline() zapisuje strukturę ut, której typem jest utmp, do pliku utmp. Używa getutid(), aby znaleźć odpowiednie miejsce do dodania nowego rekordu. Jeśli go nie znajdzie, to pututline() doda nowy wpis na końcu pliku.

WARTOŚĆ ZWRACANA
Funkcje getutent(), getutid() i getutline() zwracają wskaźnik do struct utmp, jeśli zakończą się powodzeniem, lub NULL w razie wystąpienia błędu. struct utmp jest zaalokowana w statycznej przestrzeni danych i może zostać nadpisana przez kolejne wywołania funkcji.

Funkcja pututline() zwraca ut, jeśli zakończy się powodzeniem, lub NULL w razie wystąpienia błędu.

utmpname() zwraca 0, jeśli zachowano nową nazwę, lub -1 w przypadku błędu.

W przypadku błędu, funkcje te ustawiają errno wskazując błąd.

BŁĘDY

ENOMEM
    Brak pamięci.

ESRCH
    Nie znaleziono rekordu.

Funkcje setutent(), pututline() i getut*() mogą także zwrócić błędy opisane w open(2).

PLIKI

/var/run/utmp
    baza danych obecnie zalogowanych użytkowników

/var/log/wtmp
    baza danych poprzednich logowań użytkowników

ATRYBUTY
Informacje o pojęciach używanych w tym rozdziale można znaleźć w podręczniku attributes(7).
Interfejs | Atrybut | Wartość
getutent() | Bezpieczeństwo wątkowe | MT-niebezpieczne init race:utent race:utentbuf sig:ALRM timer
getutid(), getutline() | Bezpieczeństwo wątkowe | MT-niebezpieczne init race:utent sig:ALRM timer
pututline() | Bezpieczeństwo wątkowe | MT-niebezpieczne race:utent sig:ALRM timer
setutent(), endutent(), utmpname() | Bezpieczeństwo wątkowe | MT-niebezpieczne race:utent

W powyższej tabeli, utent w race:utent oznacza, że jeśli któraś z funkcji setutent(), getutent(), getutid(), getutline(), pututline(), utmpname() lub endutent() jest używana równolegle w różnych wątkach programu, może nastąpić sytuacja wyścigu danych.

STANDARDY
Brak.

HISTORIA
XPG2, SVr4.

W dokumentacji XPG2 i SVID2 funkcja pututline() zwraca void, i to jest to, co ona rzeczywiście zwraca na wielu systemach (AIX, HPUX). HPUX wprowadza nową funkcję _pututline() o prototypie podanym powyżej dla pututline().

Wszystkie te funkcje są przestarzałe na systemach nielinuksowych. POSIX.1-2001 i POSIX.1-2008, naśladując SUSv1, nie zawierają żadnej z tych funkcji, ale zamiast nich używają

        #include <utmpx.h>

    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);

Powyższe funkcje są dostarczane przez glibc i wykonują dokładnie te same zadania, co ich odpowiedniki bez przyrostka „x”, tyle że używają struktury struct utmpx, zdefiniowanej pod Linuksem dokładnie tak samo jak struct utmp. glibc dostarcza także utmpxname(), chociaż POSIX.1 nie zawiera tej funkcji.

Na niektórych systemach struktura utmpx jest rozszerzeniem struktury utmp o dodatkowe pola i o większe wersje istniejących pól. Utrzymywane są tam równoległe wersje plików, często jako /var/*/utmpx oraz /var/*/wtmpx.

Z drugiej strony linuksowe glibc nie używa pliku utmpx, ponieważ jego struktura utmp jest już wystarczająco duża. Funkcje „x” opisane powyżej są aliasami do funkcji bez „x” (np. getutxent jest aliasem getutent()).

UWAGI

  Uwagi dla glibc
Powyższe funkcje nie są bezpieczne dla wątków. glibc dodaje wersje współbieżne:

#include <utmp.h>

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
        || /* Od glibc 2.19: */ _DEFAULT_SOURCE
        || /* glibc <= 2.19: */    _SVID_SOURCE || _BSD_SOURCE

Te funkcje są rozszerzeniami GNU, analogicznymi do funkcji o tych samych nazwach, ale bez przyrostka „_r”. Parametr ubuf określa miejsce, w którym te funkcje powinny zapisać wynik. Jeśli zakończą się powodzeniem, to zwracają 0, a wskaźnik do wyniku jest zapisywany w *ubufp. W razie błędu funkcje zwracają -1. Funkcje te nie mają swoich odpowiedników utmpx (POSIX.1 ich nie zawiera).

PRZYKŁADY
Następujący przykład dodaje i usuwa rekord utmp, przy założeniu, że zostanie uruchomiony z pseudoterminala. Użycie w rzeczywistej aplikacji wymagałoby sprawdzenia wartości zwracanych przez getpwuid(3) i ttyname(3).

    #include <err.h>
    #include <pwd.h>
    #include <stdlib.h>
    #include <string.h>
    #include <time.h>
    #include <unistd.h>
    #include <utmp.h>

    int
    main(void)
    {
        struct utmp entry;

        if (system("echo przed dodaniem wpisu:;who") == -1)

        entry.ut_type = USER_PROCESS;
        entry.ut_pid = getpid();
        strcpy(entry.ut_line, ttyname(STDIN_FILENO) + strlen("/dev/"));
        /* poprawne tylko dla pseudoterm. nazwanych /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();
        if (pututline(&entry) == NULL)
            err(EXIT_FAILURE, "pututline");

        if (system("echo po dodaniu wpisu:;who") == -1)
            err(EXIT_FAILURE, "system");

        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);

        if (system("echo po usunięciu wpisu:;who") == -1)
            err(EXIT_FAILURE, "system");

        endutent();
        exit(EXIT_SUCCESS);
    }

ZOBACZ TAKŻE
getutmp(3), utmp(5)

TŁUMACZENIE
Tłumaczenie niniejszej strony podręcznika: Robert Luberda <robert@debian.org> i Michał Kułach <michal.kulach@gmail.com>

Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać zapoznając się z GNU General Public License w wersji 3 (https://www.gnu.org/licenses/gpl-3.0.html) lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.

Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy dyskusyjnej manpages-pl-list@lists.sourceforge.net.