NOM¶
getutent, getutid, getutline, pututline, setutent, endutent, utmpname -
Accéder aux enregistrements utmp
SYNOPSIS¶
#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);
DESCRIPTION¶
Les nouvelles applications devraient utiliser les versions
« utmpx » spécifiées par POSIX.1 de
ces fonctions ; voir CONFORMITÉ.
utmpname() indique le nom du fichier au format utmp à utiliser
avec les autres fonctions. Si
utmpname() n'est pas appelé avant
les autres fonctions, elles utiliseront le fichier
_PATH_UTMP,
défini dans
<paths.h>.
setutent() ramène le pointeur au début du fichier utmp. Il
est généralement conseillé d'appeler cette fonction au
début du programme.
endutent() ferme le fichier utmp. Ceci devrait être appelé
une fois que le programme a terminé ses accès au fichier.
getutent() lit une ligne du fichier utmp, à la position courante.
Elle renvoie un pointeur sur une structure contenant les divers champs de la
ligne. La définition de cette structure peut être
consultée dans
utmp(5).
getutid() effectue une recherche dans le fichier utmp, à partir de
la position courante, en se basant sur
ut. Si
ut->ut_type
vaut
RUN_LVL,
BOOT_TIME,
NEW_TIME, ou
OLD_TIME,
getutid() recherchera le premier enregistrement dont le champ
ut_type correspond à
ut->ut_type. Si
ut->ut_type vaut
INIT_PROCESS,
LOGIN_PROCESS,
USER_PROCESS, ou
DEAD_PROCESS,
getutid() recherchera le
premier enregistrement dont le champ
ut_id correspond à
ut->ut_id.
getutline() effectue une recherche dans le fichier utmp, à partir
de la position courante. Elle examine les enregistrements dont le champ
ut_type est
USER_PROCESS ou
LOGIN_PROCESS et renvoie le
premier dont le champ
ut_line correspond à
ut->ut_line.
pututline() écrit la structure
utmp ut dans le
fichier utmp. Elle utilise
getutid() pour rechercher l'emplacement ou
insérer le nouvel enregistrement. Si elle ne trouve pas d'emplacement
approprié pour
ut,
pututline() ajoutera le nouvel
enregistrement à la fin du fichier.
VALEUR RENVOYÉE¶
getutent(),
getutid() et
getutline() renvoient un pointeur
sur une structure
utmp, ou NULL en cas d'erreur (ce qui inclut le cas
« pas d'enregistrement trouvé »). Cette
structure
utmp est allouée statiquement, et peut être
écrasée par des appels successifs.
Si elle réussit,
pututline() renvoie
ut ; si elle
échoue, elle renvoie NULL.
utmpname() renvoie 0 si le nouveau nom a été correctement
enregistré, ou -1 si elle échoue.
En cas d'échec, ces fonctions renseignent le code d'erreur dans
errno.
ERREURS¶
- ENOMEM
- Plus de mémoire disponible.
- ESRCH
- Enregistrement non trouvé.
setutent(),
pututline() et les fonctions
getut*() peuvent
également échouer pour les raisons décrites dans
open(2).
FICHIERS¶
/var/run/utmp - Base de données des utilisateurs connectés.
/var/log/wtmp - Base de données des connexions passées.
XPG2, SVr4.
Dans XPG2 et SVID 2, la fonction
pututline() est décrite
comme renvoyant « void », et c'est le cas sur de
nombreux systèmes (AIX, HP-UX, Linux libc5). HP-UX introduit une
nouvelle fonction
_pututline() avec le prototype fourni plus haut pour
pututline() (existe aussi dans la libc5 de Linux).
Toutes ces fonctions sont maintenant obsolètes sur les systèmes
non Linux. POSIX.1-2001, suivant SUSv1, ne propose aucune de ces fonctions,
mais utilise plutôt
#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);
Ces fonctions sont fournies par la glibc et effectuent les mêmes
tâches que leurs équivalents sans le
« x » mais utilisent une structure
utmpx,
définie sous Linux pour être identique à la structure
utmp. Pour être complet, la glibc fournit également
utmpxname(), bien que cette fonction ne soit pas
spécifiée par POSIX.1.
Sur quelques autres systèmes, la structure
utmpx est un
surensemble de la structure
utmp, avec des champs
supplémentaires, et des versions plus grandes des champs existants, et
des fichiers sont maintenus en parallèle, souvent
/var/*/utmpx
et
/var/*/wtmpx.
D'un autre côté, la glibc sous Linux n'utilise pas de fichier
utmpx en parallèle car sa structure
utmp est
déjà assez grande. Les fonctions contenant un
« x » listées ci-dessus sont simplement des
alias des fonctions sans le « x » (par exemple,
getutxent() est un alias de
getutent()).
NOTES¶
Notes sur la glibc¶
Les fonctions ci-dessus ne sont pas sûres dans un contexte de thread. La
glibc ajoute les versions réentrantes.
#define _GNU_SOURCE /* ou _SVID_SOURCE ou _BSD_SOURCE;
consultez 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);
Ces fonctions sont des extensions GNU, analogues aux fonctions de même
nom sans le suffixe « _r ». Le paramètre
ubuf fournit à ces fonctions un endroit où stocker leur
résultat. Si elles réussissent elles renvoient 0 et un pointeur
vers le résultat dans
*ubufp. Si elles échouent, ces
fonctions renvoient -1. Il n'y a pas d'équivalent
« utmpx » aux fonctions ci-dessus. (POSIX.1 ne
spécifie pas de telles fonctions.)
EXEMPLE¶
L'exemple suivant ajoute et retire un enregistrement utmp, en supposant qu'il
est invoqué depuis un pseudoterminal. Dans une véritable
application, il faudrait vérifier les valeurs renvoyées par
getpwuid(3) et
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 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"));
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 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);
}
VOIR AUSSI¶
getutmp(3),
utmp(5)
COLOPHON¶
Cette page fait partie de la publication 3.65 du projet
man-pages Linux.
Une description du projet et des instructions pour signaler des anomalies
peuvent être trouvées à l'adresse
http://www.kernel.org/doc/man-pages/.
TRADUCTION¶
Depuis 2010, cette traduction est maintenue à l'aide de l'outil po4a
<
http://po4a.alioth.debian.org/> par l'équipe de traduction
francophone au sein du projet perkamon
<
http://perkamon.alioth.debian.org/>.
Christophe Blaess <
http://www.blaess.fr/christophe/> (1996-2003), Alain
Portal <
http://manpagesfr.free.fr/> (2003-2006). Florentin Duneau et
l'équipe francophone de traduction de Debian (2006-2009).
Veuillez signaler toute erreur de traduction en écrivant à
<debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
paquet
manpages-fr.
Vous pouvez toujours avoir accès à la version anglaise de ce
document en utilisant la commande «
man -L C
<section>
<page_de_man> ».