2 .\" Copyright 1995 Mark D. Roth (roth@uiuc.edu)
4 .\" SPDX-License-Identifier: GPL-2.0-or-later
6 .\" References consulted:
7 .\" Linux libc source code
10 .\" Modified Thu Jul 25 14:43:46 MET DST 1996 by Michael Haardt
11 .\" <michael@cantor.informatik.rwth-aachen.de>
13 .TH getutent 3 (date) "Linux man-pages (unreleased)"
15 getutent, getutid, getutline, pututline, setutent, endutent,
16 utmpname \- access utmp file entries
19 .RI ( libc ", " \-lc )
24 .B struct utmp *getutent(void);
25 .BI "struct utmp *getutid(const struct utmp *" ut );
26 .BI "struct utmp *getutline(const struct utmp *" ut );
28 .BI "struct utmp *pututline(const struct utmp *" ut );
30 .B void setutent(void);
31 .B void endutent(void);
33 .BI "int utmpname(const char *" file );
36 New applications should use the POSIX.1-specified "utmpx" versions of
37 these functions; see STANDARDS.
40 sets the name of the utmp-format file for the other utmp
44 is not used to set the filename
45 before the other functions are used, they assume \fB_PATH_UTMP\fP, as
46 defined in \fI<paths.h>\fP.
49 rewinds the file pointer to the beginning of the utmp file.
50 It is generally a good idea to call it before any of the other
55 It should be called when the user
56 code is done accessing the file with the other functions.
59 reads a line from the current file position in the utmp file.
60 It returns a pointer to a structure containing the fields of
62 The definition of this structure is shown in
66 searches forward from the current file position in the utmp
67 file based upon \fIut\fP.
68 If \fIut\->ut_type\fP is one of \fBRUN_LVL\fP,
69 \fBBOOT_TIME\fP, \fBNEW_TIME\fP, or \fBOLD_TIME\fP,
72 find the first entry whose \fIut_type\fP field matches \fIut\->ut_type\fP.
73 If \fIut\->ut_type\fP is one of \fBINIT_PROCESS\fP, \fBLOGIN_PROCESS\fP,
74 \fBUSER_PROCESS\fP, or \fBDEAD_PROCESS\fP,
79 field matches \fIut\->ut_id\fP.
82 searches forward from the current file position in the utmp file.
83 It scans entries whose
86 or \fBLOGIN_PROCESS\fP and returns the first one whose
89 matches \fIut\->ut_line\fP.
94 structure \fIut\fP into the utmp file.
97 to search for the proper place in the file to insert
99 If it cannot find an appropriate slot for \fIut\fP,
101 will append the new entry to the end of the file.
107 return a pointer to a \fIstruct utmp\fP on success,
108 and NULL on failure (which includes the "record not found" case).
109 This \fIstruct utmp\fP is allocated in static storage, and may be
110 overwritten by subsequent calls.
116 on failure, it returns NULL.
119 returns 0 if the new name was successfully stored, or \-1 on failure.
121 On failure, these functions
123 set to indicate the error.
136 functions can also fail for the reasons described in
141 database of currently logged-in users
144 database of past user logins
146 For an explanation of the terms used in this section, see
152 Interface Attribute Value
160 MT-Unsafe init race:utent
161 race:utentbuf sig:ALRM timer
171 MT-Unsafe init race:utent
190 T} Thread safety MT-Unsafe race:utent
197 signifies that if any of the functions
206 are used in parallel in different threads of a program,
207 then data races could occur.
213 In XPG2 and SVID 2 the function
215 is documented to return void, and that is what it does on many systems
217 HP-UX introduces a new function
219 with the prototype given above for
222 All these functions are obsolete now on non-Linux systems.
223 POSIX.1-2001 and POSIX.1-2008, following SUSv1,
224 does not have any of these functions, but instead uses
228 .B #include <utmpx.h>
230 .B struct utmpx *getutxent(void);
231 .B struct utmpx *getutxid(const struct utmpx *);
232 .B struct utmpx *getutxline(const struct utmpx *);
233 .B struct utmpx *pututxline(const struct utmpx *);
234 .B void setutxent(void);
235 .B void endutxent(void);
239 These functions are provided by glibc,
240 and perform the same task as their equivalents without the "x", but use
242 defined on Linux to be the same as
244 For completeness, glibc also provides
246 although this function is not specified by POSIX.1.
248 On some other systems,
249 the \fIutmpx\fP structure is a superset of the \fIutmp\fP structure,
250 with additional fields, and larger versions of the existing fields,
251 and parallel files are maintained, often
256 Linux glibc on the other hand does not use a parallel \fIutmpx\fP file
257 since its \fIutmp\fP structure is already large enough.
258 The "x" functions listed above are just aliases for
259 their counterparts without the "x" (e.g.,
265 The above functions are not thread-safe.
266 glibc adds reentrant versions
271 .BI "int getutent_r(struct utmp *" ubuf ", struct utmp **" ubufp );
272 .BI "int getutid_r(struct utmp *" ut ,
273 .BI " struct utmp *" ubuf ", struct utmp **" ubufp );
274 .BI "int getutline_r(struct utmp *" ut ,
275 .BI " struct utmp *" ubuf ", struct utmp **" ubufp );
278 Feature Test Macro Requirements for glibc (see
279 .BR feature_test_macros (7)):
286 || /* Since glibc 2.19: */ _DEFAULT_SOURCE
287 || /* glibc <= 2.19: */ _SVID_SOURCE || _BSD_SOURCE
290 These functions are GNU extensions, analogs of the functions of the
291 same name without the _r suffix.
294 argument gives these functions a place to store their result.
295 On success, they return 0, and a pointer to the result is written in
297 On error, these functions return \-1.
298 There are no utmpx equivalents of the above functions.
299 (POSIX.1 does not specify such functions.)
301 The following example adds and removes a utmp record, assuming it is run
302 from within a pseudo terminal.
303 For usage in a real application, you
304 should check the return values of
309 .\" SRC BEGIN (getutent.c)
323 system("echo before adding entry:;who");
325 entry.ut_type = USER_PROCESS;
326 entry.ut_pid = getpid();
327 strcpy(entry.ut_line, ttyname(STDIN_FILENO) + strlen("/dev/"));
328 /* only correct for ptys named /dev/tty[pqr][0\-9a\-z] */
329 strcpy(entry.ut_id, ttyname(STDIN_FILENO) + strlen("/dev/tty"));
330 entry.ut_time = time(NULL);
331 strcpy(entry.ut_user, getpwuid(getuid())\->pw_name);
332 memset(entry.ut_host, 0, UT_HOSTSIZE);
337 system("echo after adding entry:;who");
339 entry.ut_type = DEAD_PROCESS;
340 memset(entry.ut_line, 0, UT_LINESIZE);
342 memset(entry.ut_user, 0, UT_NAMESIZE);
346 system("echo after removing entry:;who");