getutent(3) Library Functions Manual getutent(3) NOM getutent, getutid, getutline, pututline, setutent, endutent, utmpname - Acceder aux enregistrements utmp BIBLIOTHEQUE Bibliotheque C standard (libc, -lc) SYNOPSIS #include 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); DESCRIPTION Les nouvelles applications devraient utiliser les versions << utmpx >> specifiees par POSIX.1 de ces fonctions ; voir STANDARDS. utmpname() indique le nom du fichier au format utmp a utiliser avec les autres fonctions. Si utmpname() n'est pas appele avant les autres fonctions, elles utiliseront le fichier _PATH_UTMP, defini dans . setutent() ramene le pointeur au debut du fichier utmp. Il est generalement conseille d'appeler cette fonction au debut du programme. endutent() ferme le fichier utmp. Ceci devrait etre appele une fois que le programme a termine ses acces au fichier. getutent() lit une ligne du fichier utmp, a la position courante. Elle renvoie un pointeur sur une structure contenant les divers champs de la ligne. La definition de cette structure peut etre consultee dans utmp(5). getutid() effectue une recherche dans le fichier utmp, a 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 a 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 a ut->ut_id. getutline() effectue une recherche dans le fichier utmp, a 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 a ut->ut_line. pututline() ecrit la structure utmp ut dans le fichier utmp. Elle utilise getutid() pour rechercher l'emplacement ou inserer le nouvel enregistrement. Si elle ne trouve pas d'emplacement approprie pour ut, pututline() ajoutera le nouvel enregistrement a la fin du fichier. VALEUR RENVOYEE 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 trouve >>). Cette structure utmp est allouee statiquement, et peut etre ecrasee par des appels successifs. Si elle reussit, pututline() renvoie ut ; si elle echoue, elle renvoie NULL. utmpname() renvoie 0 si le nouveau nom a ete correctement enregistre, ou -1 si elle echoue. En cas d'echec, ces fonctions definissent errno pour indiquer l'erreur. ERREURS ENOMEM Plus assez de memoire. ESRCH Enregistrement non trouve. setutent(), pututline() et les fonctions getut*() peuvent egalement echouer pour les raisons decrites dans open(2). FICHIERS /var/run/utmp base de donnees des utilisateurs actuellement connectes /var/log/wtmp base de donnees des connexions passees. ATTRIBUTS Pour une explication des termes utilises dans cette section, consulter attributes(7). +------------+--------------------------+------------------------------+ |Interface | Attribut | Valeur | +------------+--------------------------+------------------------------+ |getutent() | Securite des threads | MT-Unsafe init race:utent | | | | race:utentbuf sig:ALRM timer | +------------+--------------------------+------------------------------+ |getutid(), | Securite des threads | MT-Unsafe init race:utent | |getutline() | | sig:ALRM timer | +------------+--------------------------+------------------------------+ |pututline() | Securite des threads | MT-Unsafe race:utent | | | | sig:ALRM timer | +------------+--------------------------+------------------------------+ |setutent(), | Securite des threads | MT-Unsafe race:utent | |endutent(), | | | |utmpname() | | | +------------+--------------------------+------------------------------+ 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 utilisee en parallele dans differents fils d'execution (thread) d'un programme, alors des situations de concurrences de donnees peuvent se produire. STANDARDS Aucun. HISTORIQUE XPG2, SVr4. Dans XPG2 et SVID 2, la fonction pututline() est decrite comme renvoyant << void >>, et c'est le cas sur de nombreux systemes (AIX, HP-UX). HP-UX introduit une nouvelle fonction _pututline() avec le prototype fourni plus haut pour pututline(). Toutes ces fonctions sont maintenant obsoletes sur les systemes non Linux. POSIX.1-2001 et POSIX.1-2008, suivant SUSv1, ne proposent aucune de ces fonctions, mais utilisent plutot #include 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 memes taches que leurs equivalents sans le << x >> mais utilisent une structure utmpx, definie sous Linux pour etre identique a la structure utmp. Pour etre complet, la glibc fournit egalement utmpxname(), bien que cette fonction ne soit pas specifiee par POSIX.1. Sur quelques autres systemes, la structure utmpx est un surensemble de la structure utmp, avec des champs supplementaires, et des versions plus grandes des champs existants, et des fichiers sont maintenus en parallele, souvent /var/*/utmpx et /var/*/wtmpx. D'un autre cote, la glibc sous Linux n'utilise pas de fichier utmpx en parallele car sa structure utmp est deja assez grande. Les fonctions contenant un << x >> listees ci-dessus sont simplement des alias des fonctions sans le << x >> (par exemple, getutxent() est un alias de getutent()). NOTES Notes de la glibc Les fonctions ci-dessus ne sont pas sures dans un contexte de thread. La glibc ajoute les versions reentrantes. #include 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 fonctionnalites pour la glibc (consulter feature_test_macros(7)) : getutent_r(), getutid_r(), getutline_r() : _GNU_SOURCE || /* depuis la glibc 2.19 : */ _DEFAULT_SOURCE || /* glibc <= 2.19 : */ _SVID_SOURCE || _BSD_SOURCE Ces fonctions sont des extensions GNU, analogues aux fonctions de meme nom sans le suffixe << _r >>. Le parametre ubuf fournit a ces fonctions un endroit ou stocker leur resultat. Si elles reussissent, elles renvoient 0 et un pointeur vers le resultat est ecrit dans *ubufp. Si elles echouent, ces fonctions renvoient -1. Il n'y a pas d'equivalent << utmpx >> aux fonctions ci-dessus. (POSIX.1 ne specifie pas ces fonctions.) EXEMPLES L'exemple suivant ajoute et retire un enregistrement utmp, en supposant qu'il est invoque depuis un pseudoterminal. Dans une veritable application, il faudrait verifier les valeurs renvoyees par getpwuid(3) et ttyname(3). #include #include #include #include #include #include int main(void) { struct utmp entry; system("echo avant l'ajout d'une entree :;who"); entry.ut_type = USER_PROCESS; entry.ut_pid = getpid(); strcpy(entry.ut_line, ttyname(STDIN_FILENO) + strlen("/dev/")); /* correct seulement pour les ptys nommes /dev/tty[pqr][0-9a-z] */ strcpy(entry.ut_id, ttyname(STDIN_FILENO) + strlen("/dev/tty")); entry.ut_time = time(NULL); strcpy(entry.ut_user, getpwuid(getuid())->pw_name); memset(entry.ut_host, 0, UT_HOSTSIZE); entry.ut_addr = 0; setutent(); pututline(&entry); system("echo apres l'ajout d'une entree :;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 apres le retrait d'une entree:;who"); endutent(); exit(EXIT_SUCCESS); } VOIR AUSSI getutmp(3), utmp(5) TRADUCTION La traduction francaise de cette page de manuel a ete creee par Christophe Blaess , Stephan Rafin , Thierry Vignaud , Francois Micaux, Alain Portal , Jean-Philippe Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas Francois , Florentin Duneau , Simon Paillard , Denis Barbier , David Prevot , Jean-Baptiste Holcroft et Gregoire Scano Cette traduction est une documentation libre ; veuillez vous reporter a la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE. Si vous decouvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message a . Pages du manuel de Linux 6.06 31 octobre 2023 getutent(3)