getutent, getutid, getutline, pututline, setutent, endutent, utmpname -
Accéder aux enregistrements utmp
Bibliothèque C standard (
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 *file);
New applications should use the POSIX.1-specified "utmpx" versions of
these functions; see STANDARDS.
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.
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.
On failure, these functions
errno set to indicate the error.
- ENOMEM
- Plus assez de mémoire.
- ESRCH
- Enregistrement non trouvé.
setutent(),
pututline() et les fonctions
getut*() peuvent
également échouer pour les raisons décrites dans
open(2).
- /var/run/utmp
- base de données des utilisateurs actuellement
connectés
- /var/log/wtmp
- base de données des connexions passées.
Pour une explication des termes utilisés dans cette section, consulter
attributes(7).
Interface |
Attribut |
Valeur |
getutent() |
Sécurité des threads |
MT-Unsafe init race:utent race:utentbuf sig:ALRM timer |
getutid(), getutline() |
Sécurité des threads |
MT-Unsafe init race:utent sig:ALRM timer |
pututline() |
Sécurité des threads |
MT-Unsafe race:utent sig:ALRM timer |
setutent(), endutent(), utmpname() |
Sécurité des threads |
MT-Unsafe race:utent |
Dans la table ci-dessus,
utent dans
race:utent veut dire que si
une des fonctions
setutent(),
getutent(),
getutid(),
getutline(),
pututline(),
utmpname() ou
endutent()
est utilisée en parallèle dans différents fils
d'exécution (thread) d'un programme, alors des situations de
concurrences de données peuvent se produire.
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). HP-UX introduit une nouvelle fonction
_pututline() avec le prototype fourni plus haut pour
pututline().
Toutes ces fonctions sont maintenant obsolètes sur les systèmes
non Linux. POSIX.1-2001 et POSIX.1-2008, suivant SUSv1, ne proposent aucune de
ces fonctions, mais utilisent 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()).
The above functions are not thread-safe. glibc adds reentrant versions
#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);
Exigences de macros de test de fonctionnalités pour la glibc (consulter
feature_test_macros(7)) :
getutent_r(),
getutid_r(),
getutline_r() :
_GNU_SOURCE
|| /* Since glibc 2.19: */ _DEFAULT_SOURCE
|| /* glibc <= 2.19: */ _SVID_SOURCE || _BSD_SOURCE
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 est écrit 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 ces fonctions.)
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 <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 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);
}
getutmp(3),
utmp(5)
La traduction française de cette page de manuel a été
créée par Christophe Blaess
<
https://www.blaess.fr/christophe/>, Stéphan Rafin
<
[email protected]>, Thierry Vignaud
<
[email protected]>, François Micaux, Alain Portal
<
[email protected]>, Jean-Philippe Guérard
<
[email protected]>, Jean-Luc Coulon (f5ibh)
<
[email protected]>, Julien Cristau
<
[email protected]>, Thomas Huriaux <
[email protected]>,
Nicolas François <
[email protected]>, Florentin
Duneau <
[email protected]>, Simon Paillard
<
[email protected]>, Denis Barbier
<
[email protected]>, David Prévot <
[email protected]>,
Jean-Baptiste Holcroft <
[email protected]> et Grégoire
Scano <
[email protected]>
Cette traduction est une documentation libre ; veuillez vous reporter
à la
GNU
General Public License version 3 concernant les conditions de copie
et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel,
veuillez envoyer un message à
[email protected]