--- term.c.orig	2009-02-07 12:30:17.000000000 -0500
+++ term.c	2010-01-28 13:40:25.000000000 -0500
@@ -59,7 +59,11 @@
 #include <termios.h>
 #include <time.h>
 #include <unistd.h>
+#ifdef HAVE_UTMP_H
 #include <utmp.h>
+#else
+#include <utmpx.h>
+#endif
 
 #if defined (__linux__)
 #include <sys/vt.h>
@@ -523,6 +527,41 @@ static void writeLoginRecord(void)
 	pututline(&utmp);
 	endutent();
 	privilege_off();
+#elif defined (__FreeBSD__) && (__FreeBSD_version >= 900007)
+	struct utmpx utmp;
+	struct passwd *pw;
+	char *tn;
+
+	assert(initialized);
+
+	bzero(&utmp, sizeof(utmp));
+	pw = getpwuid(privilege_getUID());
+	if (pw == NULL) {
+		warnx("who are you?");
+		return; /* give up */
+	}
+	if (strncmp(self->device, "/dev/pts/", 9) == 0 ||
+	    strncmp(self->device, "/dev/tty", 8) == 0) {
+		/* Unix98 style: "/dev/pts/\*" */
+		/* BSD style: "/dev/tty[l-sL-S][0-9a-v]" */
+		tn = self->device + strlen("/dev/");
+		if (strlen(tn) < 5)
+			return; /* bad format */
+		strncpy(utmp.ut_id, tn, sizeof(utmp.ut_id));
+	} else
+		return; /* bad format */
+	utmp.ut_type = DEAD_PROCESS;
+	privilege_on();
+	setutxent();
+	getutxid(&utmp);
+	utmp.ut_type = USER_PROCESS;
+	utmp.ut_pid = getpid();
+	strncpy(utmp.ut_line, tn, sizeof(utmp.ut_line));
+	strncpy(utmp.ut_user, pw->pw_name, sizeof(utmp.ut_user));
+	gettimeofday(&(utmp.ut_tv), NULL);
+	pututxline(&utmp);
+	endutxent();
+	privilege_off();
 #elif defined (__FreeBSD__) || defined (__NetBSD__) || defined (__OpenBSD__)
 	struct utmp utmp;
 	struct passwd *pw;
@@ -600,6 +639,38 @@ static void eraseLoginRecord(void)
 	pututline(utp);
 	endutent();
 	privilege_off();
+#elif defined (__FreeBSD__) && (__FreeBSD_version >= 900007)
+	struct utmpx utmp, *utp;
+	char *tn;
+
+	assert(initialized);
+
+	bzero(&utmp, sizeof(utmp));
+	if (strncmp(self->device, "/dev/pts/", 9) == 0 ||
+	    strncmp(self->device, "/dev/tty", 8) == 0) {
+		/* Unix98 style: "/dev/pts/\*" */
+		/* BSD style: "/dev/tty[l-sL-S][0-9a-v]" */
+		tn = self->device + strlen("/dev/");
+		if (strlen(tn) < 5)
+			return; /* bad format */
+		strncpy(utmp.ut_id, tn, sizeof(utmp.ut_id));
+	} else
+		return; /* bad format */
+	utmp.ut_type = USER_PROCESS;
+	privilege_on();
+	setutxent();
+	utp = getutxid(&utmp);
+	if (utp == NULL) {
+		endutxent();
+		privilege_off();
+		return; /* give up */
+	}
+	utp->ut_type = DEAD_PROCESS;
+	bzero(utp->ut_user, sizeof(utmp.ut_user));
+	gettimeofday(&(utp->ut_tv), NULL);
+	pututxline(utp);
+	endutxent();
+	privilege_off();
 #elif defined (__FreeBSD__) || defined (__NetBSD__) || defined (__OpenBSD__)
 	struct utmp utmp;
 	char *tn;
