#ifndef _STRUCT_UTMPX_H_
#define _STRUCT_UTMPX_H_
#include "config.h"
#include "includes.h"
/*
* utmpx-wrapper.h:
*
* this is a generic wrapper around the utmpx/utmp functionality
* that wuzzah needs in order to function. based on the results
* of configure, it will try and use whatever functionality the
* system might have wrt utmpx. of course it's ugly as all fucking
* hell, but this is the price to pay for having the rest of the code
* be completely portable (that is, the stuff that doesn't port easily
* is isolated)
*
*/
/*
* first, let's cover the functions. if they have utmpx, we're golden,
* otherwise depending on the level of support we get we're going to have
* to rely on possibly more of our own homegrown shit.
*/
#ifdef HAVE_UTMPX_H
# define STRUCT_UTMPX struct utmpx
# define SETUTXENT() setutxent()
# define GETUTXENT() getutxent()
# define ENDUTXENT() endutxent()
# define IS_USER_PROCESS(u) ((u)->ut_type == USER_PROCESS)
#else
# ifdef HAVE_UTMP_H // if they have utmp, things might "just work"
# define STRUCT_UTMPX struct utmp
# define SETUTXENT() setutent_wrapper()
# define GETUTXENT() getutent_wrapper()
# define ENDUTXENT() endutent_wrapper()
# else // they don't HAVE_UTMP_H
# error you need utmpx or utmp support to compile wuzzah!
#endif // HAVE_UTMP_H
#endif // HAVE_UTMPX_H
/*
* Next, let's deal with data members. this is going to be
* a little uglier.
*/
#ifdef HAVE_UTMPX_H
# ifdef HAVE_STRUCT_UTMPX_UT_TYPE
# define IS_USER_PROCESS(u) ((u)->ut_type == USER_PROCESS)
# else
# define IS_USER_PROCESS(u) (1)
# endif // HAVE_STRUCT_UTMPX_UT_TYPE
# ifndef HAVE_STRUCT_UTMPX_UT_USER
# define ut_user ut_name
# endif // HAVE_STRUCT_UTMPX_UT_USER
# ifdef HAVE_STRUCT_UTMPX_UT_HOST
# define UTMPX_HOSTNAME(u) ((u)->ut_host)
# ifdef HAVE_STRUCT_UTMPX_UT_SYSLEN
# define UTMPX_HOSTLEN(u) ((u)->ut_syslen)
# else
# define UTMPX_HOSTLEN(u) (strlen((u)->ut_host))
# endif // HAVE_STRUCT_UTMPX_UT_SYSLEN
# else
# define UTMPX_HOSTNAME(u) "hostname not retrievable"
# define UTMPX_HOSTLEN(u) (strlen("hostname not retrievable"))
# endif // HAVE_STRUCT_UTMPX_UT_HOST
#else
#ifdef HAVE_UTMP_H
# ifdef HAVE_STRUCT_UTMP_UT_TYPE
# define IS_USER_PROCESS(u) ((u)->ut_type == USER_PROCESS)
# else
# define IS_USER_PROCESS(u) (1)
# endif // HAVE_STRUCT_UTMP_UT_TYPE
# ifndef HAVE_STRUCT_UTMP_UT_USER
# define ut_user ut_name
# endif // HAVE_STRUCT_UTMP_UT_USER
# ifdef HAVE_STRUCT_UTMP_UT_HOST
# define UTMPX_HOSTNAME(u) ((u)->ut_host)
# ifdef HAVE_STRUCT_UTMP_UT_SYSLEN
# define UTMPX_HOSTLEN(u) ((u)->ut_syslen)
# else
# define UTMPX_HOSTLEN(u) (strlen((u)->ut_host))
# endif // HAVE_STRUCT_UTMP_UT_SYSLEN
# else
# define UTMPX_HOSTNAME(u) "hostname not retrievable"
# define UTMPX_HOSTLEN(u) (strlen("hostname not retrievable"))
# endif // HAVE_STRUCT_UTMP_UT_HOST
#endif // HAVE_UTMP_H
#endif // HAVE_UTMPX_H
void setutent_wrapper(void);
STRUCT_UTMPX *getutent_wrapper(void);
void endutent_wrapper(void);
#endif
syntax highlighted by Code2HTML, v. 0.9.1