]> asedeno.scripts.mit.edu Git - PuTTY.git/commitdiff
Use pututxline() in place of pututline(), since the former is standardised by
authorBen Harris <bjh21@bjh21.me.uk>
Mon, 25 Apr 2005 23:28:25 +0000 (23:28 +0000)
committerBen Harris <bjh21@bjh21.me.uk>
Mon, 25 Apr 2005 23:28:25 +0000 (23:28 +0000)
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.

[originally from svn r5678]

unix/configure.ac
unix/uxpty.c

index e1e33acbd5ae1e1e743f40010b5a40a0f54125ad..0cbd5ceeb8b9782a86f94860b2afab2d9d08900c 100644 (file)
@@ -15,13 +15,16 @@ if test "X$GCC" = Xyes; then
 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])
 
-AC_CHECK_FUNCS([getaddrinfo ptsname pututline setresuid strsignal])
+AC_CHECK_FUNCS([getaddrinfo ptsname setresuid strsignal])
 
 AC_OUTPUT
 
@@ -37,7 +40,7 @@ AH_BOTTOM([
 #ifndef HAVE_STRSIGNAL
 # define HAVE_NO_STRSIGNAL
 #endif
-#ifndef HAVE_PUTUTLINE
+#ifndef HAVE_UTMPX_H
 # define OMIT_UTMP
 #endif
 #ifndef HAVE_PTSNAME
index 8c25f932fbdb123b28c4f77f6cdd25c2d107c0f2..b5164e242b3806b5a06a2fafd58f3f3cfa548241 100644 (file)
 #include "putty.h"
 #include "tree234.h"
 
+#ifdef HAVE_UTMPX_H
+#include <utmpx.h>
+#endif
+
 #ifndef FALSE
 #define FALSE 0
 #endif
 #define TRUE 1
 #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"
 #endif
-#ifndef WTMP_FILE
-#define WTMP_FILE "/var/log/wtmp"
 #endif
+
 #ifndef LASTLOG_FILE
 #ifdef _PATH_LASTLOG
 #define LASTLOG_FILE _PATH_LASTLOG
@@ -160,7 +167,7 @@ static Pty single_pty = NULL;
 #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;
 #endif
 
 /*
@@ -180,8 +187,7 @@ static void setup_utmp(char *ttyname, char *location)
     FILE *lastlog;
 #endif
     struct passwd *pw;
-    FILE *wtmp;
-    time_t uttime;
+    struct timeval tv;
 
     pw = getpwuid(getuid());
     memset(&utmp_entry, 0, sizeof(utmp_entry));
@@ -191,22 +197,20 @@ static void setup_utmp(char *ttyname, char *location)
     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));
@@ -226,31 +230,26 @@ static void setup_utmp(char *ttyname, char *location)
 
 static void cleanup_utmp(void)
 {
-    FILE *wtmp;
-    time_t uttime;
+    struct timeval tv;
 
     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));
-    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 */
 }