getutent, getutid, getutline, pututline, setutent, endutent, utmpname - auf
Einträge der utmp-Datei zugreifen
Standard-C-Bibliothek (
libc,
-lc)
#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 *Datei);
Neue Applikationen sollten die in POSIX.1 spezifizierten
»utmpx«-Versionen dieser Funktionen verwenden, siehe STANDARDS.
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.
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 den Fehler anzuzeigen.
- 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.
- /var/run/utmp
- Datenbank aktuell angemeldeter Benutzer
- /var/log/wtmp
- Datenbank früherer Benutzeranmeldungen
Siehe
attributes(7) für eine Erläuterung der in diesem
Abschnitt verwandten Ausdrücke.
Schnittstelle |
Attribut |
Wert |
getutent() |
Multithread-Fähigkeit |
MT-Unsafe init race:utent race:utentbuf sig:ALRM timer |
getutid(), getutline() |
Multithread-Fähigkeit |
MT-Unsafe init race:utent sig:ALRM timer |
pututline() |
Multithread-Fähigkeit |
MT-Unsafe race:utent sig:ALRM timer |
setutent(), endutent(), utmpname() |
Multithread-Fähigkeit |
MT-Unsafe race:utent |
In der obigen Tabelle bedeutet
utent in
race:utent, dass, falls
eine der Funktionen
setutent(),
getutent(),
getutid(),
getutline(),
pututline(),
utmpname() oder
endutent() in verschiedenen Threads eines Programms parallel verwandt
werden, konkurrierende Zugriffe auf Daten (»data races«)
auftreten könnten.
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). HP-UX führt eine neue Funktion
_pututline() mit dem oben
angegebenen Prototyp für
pututline() ein.
Alle diese Funktionen sind jetzt auf Nicht-Linux-Systemen überholt.
POSIX.1-2001 und POSIX.1-2008 folgt SUSv1 und 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()).
Die oben erwähnten Funktionen sind nicht multithread-fähig. Glibc
fügt ablaufinvariante Versionen hinzu.
#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);
Mit Glibc erforderliche Feature-Test-Makros (siehe
feature_test_macros(7)):
getutent_r(),
getutid_r(),
getutline_r():
_GNU_SOURCE
|| /* Seit Glibc 2.19: */ _DEFAULT_SOURCE
|| /* Glibc <= 2.19: */ _SVID_SOURCE || _BSD_SOURCE
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.)
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 <pwd.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <utmp.h>
int
main(void)
{
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);
}
getutmp(3),
utmp(5)
Die deutsche Übersetzung dieser Handbuchseite wurde von Martin Eberhard
Schauer <
[email protected]>, Mario Blättermann
<
[email protected]> und Dr. Tobias Quathamer
<
[email protected]> 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 die
Mailingliste
der Übersetzer