NAZWA¶
getutent, getutid, getutline, pututline, setutent, endutent, utmpname -
  dostęp do wpisów pliku utmp
SKŁADNIA¶
#include <utmp.h>
 
struct utmp *getutent(void);
 
struct utmp *getutid(struct utmp *ut);
 
struct utmp *getutline(struct utmp *ut);
 
struct utmp *pututline(struct utmp *ut);
 
void setutent(void);
 
void endutent(void);
 
int utmpname(const char *file);
OPIS¶
Nowe aplikacje powinny używać podanych w standardzie POSIX.1 wersji
  "utmpx" tych funkcji, patrz rozdział "ZGODNE Z"
  poniżej.
 
utmpname() ustawia nazwę pliku w formacie utmp, który
  będzie używany przez pozostałe funkcje utmp. Jeżeli nie
  użyto 
utmpname() przed wywołaniem innych funkcji, to
  używają one domyślnej nazwy 
_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.
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
ZGODNE Z¶
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, Linux
  libc5). HPUX wprowadza nową funkcję 
_pututline() o prototypie
  podanym powyżej dla 
pututline() (funkcja ta znajduje się
  również w libc5 Linuksa).
Wszystkie te funkcje są przestarzałe na systemach nielinuksowych.
  POSIX.1-2001, naśladując SUSv1, nie zawiera żadnej z tych
  funkcji, ale zamiast nich używa
 
#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ż wystarczjąco
  duża. Funkcje 
getutxent itp. są aliasami funkcji
  
getutent itp.
UWAGI¶
Uwagi dotyczące biblioteki glibc¶
Powyższe funkcje nie są bezpieczne dla wątków. Glibc dodaje
  wersje współbieżne:
 
#define _GNU_SOURCE    /* lub _SVID_SOURCE, lub _BSD_SOURCE;
                              patrz  feature_test_macros(7) */
#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);
 
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ŁAD¶
Następujący przykład dodaje i usuwa rekord utmp, przy
  założeniu, że zostanie uruchomiony z pseudoterminalu.
  Użycie w rzeczywistej aplikacji wymagałoby sprawdzenia wartości
  zwracanych przez 
getpwuid(3) i 
ttyname(3).
#include <string.h>
#include <stdlib.h>
#include <pwd.h>
#include <unistd.h>
#include <utmp.h>
int
main(int argc, char *argv[])
{
    struct utmp entry;
    system("echo przed dodaniem wpisu:;who");
    entry.ut_type = USER_PROCESS;
    entry.ut_pid = getpid();
    strcpy(entry.ut_line, ttyname(STDIN_FILENO) + strlen("/dev/"));
    /* poprawne tylko dla pseudoterminali nazwanych /dev/tty[pqr][0-9a-z] */
    strcpy(entry.ut_id, ttyname(STDIN_FILENO) + strlen("/dev/tty"));
    time(&entry.ut_time);
    strcpy(entry.ut_user, getpwuid(getuid())->pw_name);
    memset(entry.ut_host, 0, UT_HOSTSIZE);
    entry.ut_addr = 0;
    setutent();
    pututline(&entry);
    system("echo po dodaniu wpisu:;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 po usunięciu wpisu:;who");
    endutent();
    exit(EXIT_SUCCESS);
}
ZOBACZ TAKŻE¶
getutmp(3), 
utmp(5)
O STRONIE¶
Angielska wersja tej strony pochodzi z wydania 3.40 projektu Linux
  
man-pages. Opis projektu oraz informacje dotyczące zgłaszania
  błędów można znaleźć pod adresem
  
http://www.kernel.org/doc/man-pages/.
TŁUMACZENIE¶
Autorem polskiego tłumaczenia niniejszej strony podręcznika man jest
  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ą 
  3.40 oryginału.