X/Open and actually seems to be more common (NetBSD has it). Also use
updwtmpx() rather than directly writing to the wtmpx file, though more for
reasons of aesthetics than anything practical.
git-svn-id: svn://svn.tartarus.org/sgt/putty@5678
cda61777-01e9-0310-a592-
d414129be87e
fi
AC_CHECK_HEADERS([sys/sockio.h],,,[ ])
fi
AC_CHECK_HEADERS([sys/sockio.h],,,[ ])
+AC_CHECK_HEADERS([utmpx.h],,,[
+#include <sys/types.h>
+#include <utmp.h>])
AM_PATH_GTK([1.2.0], [all_targets="all-cli all-gtk"], [all_targets="all-cli"])
AC_SUBST([all_targets])
AC_SEARCH_LIBS([socket], [xnet])
AM_PATH_GTK([1.2.0], [all_targets="all-cli all-gtk"], [all_targets="all-cli"])
AC_SUBST([all_targets])
AC_SEARCH_LIBS([socket], [xnet])
-AC_CHECK_FUNCS([getaddrinfo ptsname pututline setresuid strsignal])
+AC_CHECK_FUNCS([getaddrinfo ptsname setresuid strsignal])
#ifndef HAVE_STRSIGNAL
# define HAVE_NO_STRSIGNAL
#endif
#ifndef HAVE_STRSIGNAL
# define HAVE_NO_STRSIGNAL
#endif
# define OMIT_UTMP
#endif
#ifndef HAVE_PTSNAME
# define OMIT_UTMP
#endif
#ifndef HAVE_PTSNAME
#include "putty.h"
#include "tree234.h"
#include "putty.h"
#include "tree234.h"
+#ifdef HAVE_UTMPX_H
+#include <utmpx.h>
+#endif
+
#ifndef FALSE
#define FALSE 0
#endif
#ifndef FALSE
#define FALSE 0
#endif
-#ifndef UTMP_FILE
-#define UTMP_FILE "/var/run/utmp"
+/* updwtmpx() needs the name of the wtmp file. Try to find it. */
+#ifndef WTMPX_FILE
+#ifdef _PATH_WTMPX
+#define WTMPX_FILE _PATH_WTMPX
+#else
+#define WTMPX_FILE "/var/log/wtmpx"
-#ifndef WTMP_FILE
-#define WTMP_FILE "/var/log/wtmp"
#ifndef LASTLOG_FILE
#ifdef _PATH_LASTLOG
#define LASTLOG_FILE _PATH_LASTLOG
#ifndef LASTLOG_FILE
#ifdef _PATH_LASTLOG
#define LASTLOG_FILE _PATH_LASTLOG
#ifndef OMIT_UTMP
static int pty_utmp_helper_pid, pty_utmp_helper_pipe;
static int pty_stamped_utmp;
#ifndef OMIT_UTMP
static int pty_utmp_helper_pid, pty_utmp_helper_pipe;
static int pty_stamped_utmp;
-static struct utmp utmp_entry;
+static struct utmpx utmp_entry;
FILE *lastlog;
#endif
struct passwd *pw;
FILE *lastlog;
#endif
struct passwd *pw;
- FILE *wtmp;
- time_t uttime;
pw = getpwuid(getuid());
memset(&utmp_entry, 0, sizeof(utmp_entry));
pw = getpwuid(getuid());
memset(&utmp_entry, 0, sizeof(utmp_entry));
strncpy(utmp_entry.ut_id, ttyname+8, lenof(utmp_entry.ut_id));
strncpy(utmp_entry.ut_user, pw->pw_name, lenof(utmp_entry.ut_user));
strncpy(utmp_entry.ut_host, location, lenof(utmp_entry.ut_host));
strncpy(utmp_entry.ut_id, ttyname+8, lenof(utmp_entry.ut_id));
strncpy(utmp_entry.ut_user, pw->pw_name, lenof(utmp_entry.ut_user));
strncpy(utmp_entry.ut_host, location, lenof(utmp_entry.ut_host));
- /* Apparently there are some architectures where (struct utmp).ut_time
- * is not essentially time_t (e.g. Linux amd64). Hence the temporary. */
- time(&uttime);
- utmp_entry.ut_time = uttime; /* may truncate */
-
-#if defined HAVE_PUTUTLINE
- utmpname(UTMP_FILE);
- setutent();
- pututline(&utmp_entry);
- endutent();
-#endif
+ /*
+ * Apparently there are some architectures where (struct
+ * utmpx).ut_tv is not essentially struct timeval (e.g. Linux
+ * amd64). Hence the temporary.
+ */
+ gettimeofday(&tv, NULL);
+ utmp_entry.ut_tv.tv_sec = tv.tv_sec;
+ utmp_entry.ut_tv.tv_usec = tv.tv_usec;
- if ((wtmp = fopen(WTMP_FILE, "a")) != NULL) {
- fwrite(&utmp_entry, 1, sizeof(utmp_entry), wtmp);
- fclose(wtmp);
- }
+ setutxent();
+ pututxline(&utmp_entry);
+ endutxent();
+
+ updwtmpx(WTMPX_FILE, &utmp_entry);
#ifdef HAVE_LASTLOG
memset(&lastlog_entry, 0, sizeof(lastlog_entry));
#ifdef HAVE_LASTLOG
memset(&lastlog_entry, 0, sizeof(lastlog_entry));
static void cleanup_utmp(void)
{
static void cleanup_utmp(void)
{
- FILE *wtmp;
- time_t uttime;
if (!pty_stamped_utmp)
return;
utmp_entry.ut_type = DEAD_PROCESS;
memset(utmp_entry.ut_user, 0, lenof(utmp_entry.ut_user));
if (!pty_stamped_utmp)
return;
utmp_entry.ut_type = DEAD_PROCESS;
memset(utmp_entry.ut_user, 0, lenof(utmp_entry.ut_user));
- time(&uttime);
- utmp_entry.ut_time = uttime;
+ gettimeofday(&tv, NULL);
+ utmp_entry.ut_tv.tv_sec = tv.tv_sec;
+ utmp_entry.ut_tv.tv_usec = tv.tv_usec;
- if ((wtmp = fopen(WTMP_FILE, "a")) != NULL) {
- fwrite(&utmp_entry, 1, sizeof(utmp_entry), wtmp);
- fclose(wtmp);
- }
+ updwtmpx(WTMPX_FILE, &utmp_entry);
memset(utmp_entry.ut_line, 0, lenof(utmp_entry.ut_line));
memset(utmp_entry.ut_line, 0, lenof(utmp_entry.ut_line));
- utmp_entry.ut_time = 0;
+ utmp_entry.ut_tv.tv_sec = 0;
+ utmp_entry.ut_tv.tv_usec = 0;
-#if defined HAVE_PUTUTLINE
- utmpname(UTMP_FILE);
- setutent();
- pututline(&utmp_entry);
- endutent();
-#endif
+ setutxent();
+ pututxline(&utmp_entry);
+ endutxent();
pty_stamped_utmp = 0; /* ensure we never double-cleanup */
}
pty_stamped_utmp = 0; /* ensure we never double-cleanup */
}