1 /* Declarations for GNU's read utmp module.
3 Copyright (C) 1992-2007 Free Software Foundation, Inc.
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2, or (at your option)
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software Foundation,
17 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
19 /* Written by jla; revised by djm */
21 #ifndef __READUTMP_H__
22 # define __READUTMP_H__
24 # include <sys/types.h>
26 /* AIX 4.3.3 has both utmp.h and utmpx.h, but only struct utmp
27 has the ut_exit member. */
28 # if (HAVE_UTMPX_H && HAVE_UTMP_H && HAVE_STRUCT_UTMP_UT_EXIT \
29 && ! HAVE_STRUCT_UTMPX_UT_EXIT)
35 /* HPUX 10.20 needs utmp.h, for the definition of e.g., UTMP_FILE. */
38 # if defined _THREAD_SAFE && defined UTMP_DATA_INIT
39 /* When including both utmp.h and utmpx.h on AIX 4.3, with _THREAD_SAFE
40 defined, work around the duplicate struct utmp_data declaration. */
41 # define utmp_data gl_aix_4_3_workaround_utmp_data
44 # define UTMP_STRUCT_NAME utmpx
45 # define UT_TIME_MEMBER(UT_PTR) ((UT_PTR)->ut_tv.tv_sec)
46 # define SET_UTMP_ENT setutxent
47 # define GET_UTMP_ENT getutxent
48 # define END_UTMP_ENT endutxent
49 # ifdef HAVE_UTMPXNAME
50 # define UTMP_NAME_FUNCTION utmpxname
53 # if HAVE_STRUCT_UTMPX_UT_EXIT_E_TERMINATION
54 # define UT_EXIT_E_TERMINATION(U) ((U)->ut_exit.e_termination)
56 # if HAVE_STRUCT_UTMPX_UT_EXIT_UT_TERMINATION
57 # define UT_EXIT_E_TERMINATION(U) ((U)->ut_exit.ut_termination)
59 # define UT_EXIT_E_TERMINATION(U) 0
63 # if HAVE_STRUCT_UTMPX_UT_EXIT_E_EXIT
64 # define UT_EXIT_E_EXIT(U) ((U)->ut_exit.e_exit)
66 # if HAVE_STRUCT_UTMPX_UT_EXIT_UT_EXIT
67 # define UT_EXIT_E_EXIT(U) ((U)->ut_exit.ut_exit)
69 # define UT_EXIT_E_EXIT(U) 0
76 # if !HAVE_DECL_GETUTENT
77 struct utmp *getutent();
79 # define UTMP_STRUCT_NAME utmp
80 # define UT_TIME_MEMBER(UT_PTR) ((UT_PTR)->ut_time)
81 # define SET_UTMP_ENT setutent
82 # define GET_UTMP_ENT getutent
83 # define END_UTMP_ENT endutent
85 # define UTMP_NAME_FUNCTION utmpname
88 # if HAVE_STRUCT_UTMP_UT_EXIT_E_TERMINATION
89 # define UT_EXIT_E_TERMINATION(U) ((U)->ut_exit.e_termination)
91 # if HAVE_STRUCT_UTMP_UT_EXIT_UT_TERMINATION
92 # define UT_EXIT_E_TERMINATION(U) ((U)->ut_exit.ut_termination)
94 # define UT_EXIT_E_TERMINATION(U) 0
98 # if HAVE_STRUCT_UTMP_UT_EXIT_E_EXIT
99 # define UT_EXIT_E_EXIT(U) ((U)->ut_exit.e_exit)
101 # if HAVE_STRUCT_UTMP_UT_EXIT_UT_EXIT
102 # define UT_EXIT_E_EXIT(U) ((U)->ut_exit.ut_exit)
104 # define UT_EXIT_E_EXIT(U) 0
110 /* Accessor macro for the member named ut_user or ut_name. */
113 # if HAVE_STRUCT_UTMPX_UT_USER
114 # define UT_USER(Utmp) ((Utmp)->ut_user)
116 # if HAVE_STRUCT_UTMPX_UT_NAME
118 # define UT_USER(Utmp) ((Utmp)->ut_name)
123 # if HAVE_STRUCT_UTMP_UT_USER
124 # define UT_USER(Utmp) ((Utmp)->ut_user)
126 # if HAVE_STRUCT_UTMP_UT_NAME
128 # define UT_USER(Utmp) ((Utmp)->ut_name)
133 # define HAVE_STRUCT_XTMP_UT_EXIT \
134 (HAVE_STRUCT_UTMP_UT_EXIT \
135 || HAVE_STRUCT_UTMPX_UT_EXIT)
137 # define HAVE_STRUCT_XTMP_UT_ID \
138 (HAVE_STRUCT_UTMP_UT_ID \
139 || HAVE_STRUCT_UTMPX_UT_ID)
141 # define HAVE_STRUCT_XTMP_UT_PID \
142 (HAVE_STRUCT_UTMP_UT_PID \
143 || HAVE_STRUCT_UTMPX_UT_PID)
145 typedef struct UTMP_STRUCT_NAME STRUCT_UTMP;
147 enum { UT_USER_SIZE = sizeof UT_USER ((STRUCT_UTMP *) 0) };
149 # if !defined UTMP_FILE && defined _PATH_UTMP
150 # define UTMP_FILE _PATH_UTMP
153 # if !defined WTMP_FILE && defined _PATH_WTMP
154 # define WTMP_FILE _PATH_WTMP
157 # ifdef UTMPX_FILE /* Solaris, SysVr4 */
159 # define UTMP_FILE UTMPX_FILE
162 # ifdef WTMPX_FILE /* Solaris, SysVr4 */
164 # define WTMP_FILE WTMPX_FILE
168 # define UTMP_FILE "/etc/utmp"
172 # define WTMP_FILE "/etc/wtmp"
175 # if HAVE_STRUCT_XTMP_UT_PID
176 # define UT_PID(U) ((U)->ut_pid)
181 # if HAVE_STRUCT_UTMP_UT_TYPE || HAVE_STRUCT_UTMPX_UT_TYPE
182 # define UT_TYPE_EQ(U, V) ((U)->ut_type == (V))
183 # define UT_TYPE_NOT_DEFINED 0
185 # define UT_TYPE_EQ(U, V) 0
186 # define UT_TYPE_NOT_DEFINED 1
190 # define UT_TYPE_BOOT_TIME(U) UT_TYPE_EQ (U, BOOT_TIME)
192 # define UT_TYPE_BOOT_TIME(U) 0
196 # define UT_TYPE_USER_PROCESS(U) UT_TYPE_EQ (U, USER_PROCESS)
198 # define UT_TYPE_USER_PROCESS(U) 0
201 # define IS_USER_PROCESS(U) \
203 && (UT_TYPE_USER_PROCESS (U) \
204 || (UT_TYPE_NOT_DEFINED && UT_TIME_MEMBER (U) != 0)))
206 /* Options for read_utmp. */
209 READ_UTMP_CHECK_PIDS = 1,
210 READ_UTMP_USER_PROCESS = 2
213 char *extract_trimmed_name (const STRUCT_UTMP *ut);
214 int read_utmp (char const *file, size_t *n_entries, STRUCT_UTMP **utmp_buf,
217 #endif /* __READUTMP_H__ */