GETUTENT(3)

BEZEICHNUNG
getutent, getutid, getutline, pututline, setutent, endutent, utmpname - auf Einträge der utmp-Datei zugreifen

ÜBERSICHT
#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 *file);

BESCHREIBUNG
Neue Applikationen sollten die in POSIX.1 spezifizierten »utmpx«-Versionen dieser Funktionen verwenden, siehe KONFORM ZU. utmpname() setzt den Namen der Datei im utmp-Format, auf die die anderen utmp-Funktionen zugreifen. Wenn utmpname() nicht benutzt wird, um den Dateinamen zu setzen bevor die anderen Funktionen benutzt werden, wird von diesen _PATH_UTMP angenommen, wie in <paths.h> definiert.

setutent() setzt den Dateizeiger auf den Anfang der Datei utmp zurück. Im Allgemeinen ist es sinnvoll, dies vor Verwendung der anderen Funktionen aufzurufen.

endutent() schließt die Datei utmp. Sie sollte aufgerufen werden, wenn die Verwendung der anderen Funktionen im Benutzercode beendet ist.

getutent() liest eine Zeile ab der aktuellen Dateiposition in der Datei utmp. Es wird ein Zeiger auf eine Struktur zurückgegeben, welche die Felder der Zeile enthält. Die Definition dieser Struktur ist in utmp(5) aufgeschlüsselt.

getutid() sucht ab der aktuellen Dateiposition in der Datei utmp vorwärts, basierend auf ut. Wenn ut->ut_type gleich RUN_LVL, BOOT_TIME, NEW_TIME oder OLD_TIME ist, findet getutid() den ersten Eintrag, dessen Feld ut_type ut->ut_type entspricht. Wenn ut->ut_type gleich INIT_PROCESS, LOGIN_PROCESS, USER_PROCESS oder DEAD_PROCESS ist, findet getutid() den ersten Eintrag, dessen Feld ut_id ut->ut_id entspricht.

getutline() sucht ab der aktuellen Dateiposition in der Datei utmp vorwärts. Die Funktion überprüft Einträge, deren Feld ut_type gleich USER_PROCESS oder LOGIN_PROCESS ist und gibt den ersten Eintrag zurück, dessen Feld ut_line ut->ut_line entspricht.

pututline() schreibt die utmp-Struktur ut in die Datei utmp. Die Funktion benutzt getutid(), um den geeigneten Platz in der Datei für das Einfügen des neuen Eintrags zu finden. Wenn kein geeigneter Platz für ut gefunden werden kann, hängt pututline() den neuen Eintrag am Ende der Datei an.

RÜCKGABEWERT
getutent(), getutid() und getutline() liefern bei Erfolg einen Zeiger auf eine struct utmp-Struktur zurück und NULL bei Fehlern (dies schließt den Fall ein, dass ein Eintrag nicht gefunden wird, »record not found«). Die Struktur struct utmp wird als statischer Speicher alloziert und kann von nachfolgenden Aufrufen überschrieben werden. Bei Erfolg gibt pututline() ut zurück; bei Fehlern gibt die Funktion NULL zurück. Wenn der Name erfolgreich gespeichert wurde, gibt utmpname() 0 zurück, bei Fehlern -1. Im Fehlerfall setzen diese Funktionen errno, um die Ursache anzuzeigen.

FEHLER

ENOMEM
    Speicher aufgebraucht.

ESRCH
    Eintrag nicht gefunden.

setutent(), pututline() und die getut*()-Funktionen können aus den gleichen Gründen fehlschlagen wie in open(2) beschrieben.

DATEIEN
/var/run/utmp    Datenbank aktuell angemeldeter Benutzer
/var/log/wtmp    Datenbank früher angemeldeter Benutzer

KONFORM ZU
XPG2, SVr4.

In XPG2 und SVID 2 ist dokumentiert, dass die Funktion pututline() void zurückgibt und das tut sie auch auf vielen Systemen (AIX, HP-UX, Linux Libc5). HP-UX führt eine neue Funktion _pututline() mit dem oben angegebenen Prototyp für pututline() ein (findet sich auch unter Linux Libc5).

Alle diese Funktionen sind jetzt auf Nicht-Linux-Systemen überholt. POSIX.1-2001 folgt SUSv1 erwähnt keine dieser Funktionen, sondern nutzt

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

Diese Funktionen werden von der Glibc bereitgestellt und erledigen die gleiche Aufgabe wie ihre Äquivalente ohne das »x«, aber verwenden struct utmpx, welche unter Linux als das Gleiche wie struct utmp definiert ist. Der Vollständigkeit wegen stellt Glibc auch utmpxname() bereit, obwohl diese Funktion nicht von POSIX.1 beschrieben wird.

Auf manchen anderen Systemen ist die utmpx-Struktur eine Obermenge der utmp-Struktur mit zusätzlichen Feldern und größeren Versionen der vorhandenen Felder. Zudem werden auch parallele Dateien unterstützt, oft /var/*/utmpx und /var/*/wtmpx.

Die Linux-Glibc auf der anderen Seite verwendet keine parallele utmpx-Datei, weil ihre utmp-Struktur schon groß genug ist. Die oben aufgeführten »x«-Funktionen sind nur Aliase für ihre Gegenstücke ohne »x« (z. B. ist getutxent() ein Alias für getutent()).

ANMERKUNGEN

  Anmerkungen zur Glibc
Die oben erwähnten Funktionen sind nicht multithread-fähig. Glibc fügt ablaufinvariante Versionen hinzu.

#define _GNU_SOURCE    /* oder _SVID_SOURCE oder _BSD_SOURCE;
                          siehe 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);

Diese Funktionen sind GNU-Erweiterungen, Gegenstücke der Funktionen gleichen Namens ohne den Suffix _r. Das Argument ubuf gibt diesen Funktionen einen Ort für die Speicherung ihrer Ergebnisse. Bei Erfolg geben Sie 0 zurück und schreiben einen Zeiger auf das Ergebnis in * ubufp. Tritt ein Fehler auf, geben diese Funktionen -1 zurück. Es gibt keine utmpx-Äquivalente dieser Funktionen. (POSIX.1 beschreibt diese Funktionen nicht.)

BEISPIEL
Das folgende Beispiel erstellt und entfernt einen umtp-Datensatz. Es wird angenommen, dass es in einem Pseudo-Terminal läuft. Zur Verwendung in einer realen Anwendung sollten Sie die Rückgabewerte von getpwuid(3) und ttyname(3) prüfen.

#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 vor dem Hinzufügen des Eintrags:;who");
    entry.ut_type = USER_PROCESS;
    entry.ut_pid = getpid();
    strcpy(entry.ut_line, ttyname(STDIN_FILENO) + strlen("/dev/"));
    /* stimmt nur für ptys namens /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 nach dem Hinzufügen des Eintrags:;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 nach dem Entfernen des Eintrags:;who");
    endutent();
    exit(EXIT_SUCCESS);
}

SIEHE AUCH
getutmp(3), utmp(5)

KOLOPHON
This page is part of release 3.70 of the Linux man-pages project. A description of the project, information about reporting bugs, and the latest version of this page, can be found at http://www.kernel.org/doc/man-pages/.

ÜBERSETZUNG
Die deutsche Übersetzung dieser Handbuchseite wurde von Tobias Quathamer <toddy@debian.org> und Martin Eberhard Schauer <Martin.E.Schauer@gmx.de> erstellt. Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezüglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen. Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an <debian-l10n-german@lists.debian.org>.