/* Declarations for GNU's read utmp module.

   Copyright (C) 1992-2007, 2009-2020 Free Software Foundation, Inc.

   This program is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */

/* Written by jla; revised by djm */

#ifndef __READUTMP_H__
# define __READUTMP_H__

# include <sys/types.h>

/* AIX 4.3.3 has both utmp.h and utmpx.h, but only struct utmp
   has the ut_exit member.  */
# if (HAVE_UTMPX_H && HAVE_UTMP_H && HAVE_STRUCT_UTMP_UT_EXIT \
      && ! HAVE_STRUCT_UTMPX_UT_EXIT)
#  undef HAVE_UTMPX_H
# endif

# if HAVE_UTMPX_H
#  if HAVE_UTMP_H
    /* HPUX 10.20 needs utmp.h, for the definition of e.g., UTMP_FILE.  */
#   include <utmp.h>
#  endif
#  if defined _THREAD_SAFE && defined UTMP_DATA_INIT
    /* When including both utmp.h and utmpx.h on AIX 4.3, with _THREAD_SAFE
       defined, work around the duplicate struct utmp_data declaration.  */
#   define utmp_data gl_aix_4_3_workaround_utmp_data
#  endif
#  include <utmpx.h>
#  define UTMP_STRUCT_NAME utmpx
#  define UT_TIME_MEMBER(UT_PTR) ((UT_PTR)->ut_tv.tv_sec)
#  define SET_UTMP_ENT setutxent
#  define GET_UTMP_ENT getutxent
#  define END_UTMP_ENT endutxent
#  ifdef HAVE_UTMPXNAME
#   define UTMP_NAME_FUNCTION utmpxname
#  elif defined UTXDB_ACTIVE
#   define UTMP_NAME_FUNCTION(x) setutxdb (UTXDB_ACTIVE, x)
#  endif

#  if HAVE_STRUCT_UTMPX_UT_EXIT_E_TERMINATION
#   define UT_EXIT_E_TERMINATION(U) ((U)->ut_exit.e_termination)
#  else
#   if HAVE_STRUCT_UTMPX_UT_EXIT_UT_TERMINATION
#    define UT_EXIT_E_TERMINATION(U) ((U)->ut_exit.ut_termination)
#   else
#    define UT_EXIT_E_TERMINATION(U) 0
#   endif
#  endif

#  if HAVE_STRUCT_UTMPX_UT_EXIT_E_EXIT
#   define UT_EXIT_E_EXIT(U) ((U)->ut_exit.e_exit)
#  else
#   if HAVE_STRUCT_UTMPX_UT_EXIT_UT_EXIT
#    define UT_EXIT_E_EXIT(U) ((U)->ut_exit.ut_exit)
#   else
#    define UT_EXIT_E_EXIT(U) 0
#   endif
#  endif

# elif HAVE_UTMP_H

#  include <utmp.h>
#  if !HAVE_DECL_GETUTENT
    struct utmp *getutent (void);
#  endif
#  define UTMP_STRUCT_NAME utmp
#  define UT_TIME_MEMBER(UT_PTR) ((UT_PTR)->ut_time)
#  define SET_UTMP_ENT setutent
#  define GET_UTMP_ENT getutent
#  define END_UTMP_ENT endutent
#  ifdef HAVE_UTMPNAME
#   define UTMP_NAME_FUNCTION utmpname
#  endif

#  if HAVE_STRUCT_UTMP_UT_EXIT_E_TERMINATION
#   define UT_EXIT_E_TERMINATION(U) ((U)->ut_exit.e_termination)
#  else
#   if HAVE_STRUCT_UTMP_UT_EXIT_UT_TERMINATION
#    define UT_EXIT_E_TERMINATION(U) ((U)->ut_exit.ut_termination)
#   else
#    define UT_EXIT_E_TERMINATION(U) 0
#   endif
#  endif

#  if HAVE_STRUCT_UTMP_UT_EXIT_E_EXIT
#   define UT_EXIT_E_EXIT(U) ((U)->ut_exit.e_exit)
#  else
#   if HAVE_STRUCT_UTMP_UT_EXIT_UT_EXIT
#    define UT_EXIT_E_EXIT(U) ((U)->ut_exit.ut_exit)
#   else
#    define UT_EXIT_E_EXIT(U) 0
#   endif
#  endif

# endif

/* Accessor macro for the member named ut_user or ut_name.  */
# if HAVE_UTMPX_H

#  if HAVE_STRUCT_UTMPX_UT_USER
#   define UT_USER(Utmp) ((Utmp)->ut_user)
#  endif
#  if HAVE_STRUCT_UTMPX_UT_NAME
#   undef UT_USER
#   define UT_USER(Utmp) ((Utmp)->ut_name)
#  endif

# elif HAVE_UTMP_H

#  if HAVE_STRUCT_UTMP_UT_USER
#   define UT_USER(Utmp) ((Utmp)->ut_user)
#  endif
#  if HAVE_STRUCT_UTMP_UT_NAME
#   undef UT_USER
#   define UT_USER(Utmp) ((Utmp)->ut_name)
#  endif

# endif

# define HAVE_STRUCT_XTMP_UT_EXIT \
    (HAVE_STRUCT_UTMP_UT_EXIT \
     || HAVE_STRUCT_UTMPX_UT_EXIT)

# define HAVE_STRUCT_XTMP_UT_ID \
    (HAVE_STRUCT_UTMP_UT_ID \
     || HAVE_STRUCT_UTMPX_UT_ID)

# define HAVE_STRUCT_XTMP_UT_PID \
    (HAVE_STRUCT_UTMP_UT_PID \
     || HAVE_STRUCT_UTMPX_UT_PID)

typedef struct UTMP_STRUCT_NAME STRUCT_UTMP;

enum { UT_USER_SIZE = sizeof UT_USER ((STRUCT_UTMP *) 0) };

# if !defined UTMP_FILE && defined _PATH_UTMP
#  define UTMP_FILE _PATH_UTMP
# endif

# if !defined WTMP_FILE && defined _PATH_WTMP
#  define WTMP_FILE _PATH_WTMP
# endif

# ifdef UTMPX_FILE /* Solaris, SysVr4 */
#  undef UTMP_FILE
#  define UTMP_FILE UTMPX_FILE
# endif

# ifdef WTMPX_FILE /* Solaris, SysVr4 */
#  undef WTMP_FILE
#  define WTMP_FILE WTMPX_FILE
# endif

# ifndef UTMP_FILE
#  define UTMP_FILE "/etc/utmp"
# endif

# ifndef WTMP_FILE
#  define WTMP_FILE "/etc/wtmp"
# endif

# if HAVE_STRUCT_XTMP_UT_PID
#  define UT_PID(U) ((U)->ut_pid)
# else
#  define UT_PID(U) 0
# endif

# if HAVE_STRUCT_UTMP_UT_TYPE || HAVE_STRUCT_UTMPX_UT_TYPE
#  define UT_TYPE_EQ(U, V) ((U)->ut_type == (V))
#  define UT_TYPE_NOT_DEFINED 0
# else
#  define UT_TYPE_EQ(U, V) 0
#  define UT_TYPE_NOT_DEFINED 1
# endif

# ifdef BOOT_TIME
#  define UT_TYPE_BOOT_TIME(U) UT_TYPE_EQ (U, BOOT_TIME)
# else
#  define UT_TYPE_BOOT_TIME(U) 0
# endif

# ifdef USER_PROCESS
#  define UT_TYPE_USER_PROCESS(U) UT_TYPE_EQ (U, USER_PROCESS)
# else
#  define UT_TYPE_USER_PROCESS(U) 0
# endif

# define IS_USER_PROCESS(U)                                     \
   (UT_USER (U)[0]                                              \
    && (UT_TYPE_USER_PROCESS (U)                                \
        || (UT_TYPE_NOT_DEFINED && UT_TIME_MEMBER (U) != 0)))

/* Options for read_utmp.  */
enum
  {
    READ_UTMP_CHECK_PIDS = 1,
    READ_UTMP_USER_PROCESS = 2
  };

char *extract_trimmed_name (const STRUCT_UTMP *ut);
int read_utmp (char const *file, size_t *n_entries, STRUCT_UTMP **utmp_buf,
               int options);

#endif /* __READUTMP_H__ */
