- Added support for directory-based lastlogs
 - Really fix typedefs, patch from Ben Taylor <bent@clark.net>
 - Prevent multiple inclusion of config.h and defines.h. Suggested
   by Andre Lucas <andre.lucas@dial.pipex.com>
diff --git a/ChangeLog b/ChangeLog
index f68458c..04b200d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -13,6 +13,12 @@
  - Really fix broken default path. Fix from Jim Knoble 
    <jmknoble@pobox.com>
  - Remove test for quad_t. No longer needed.
+ - Released 1.2.1pre24
+
+ - Added support for directory-based lastlogs
+ - Really fix typedefs, patch from Ben Taylor <bent@clark.net>
+ - Prevent multiple inclusion of config.h and defines.h. Suggested
+   by Andre Lucas <andre.lucas@dial.pipex.com>
 
 19991230
  - OpenBSD CVS updates:
diff --git a/acconfig.h b/acconfig.h
index 91eb43a..c66983e 100644
--- a/acconfig.h
+++ b/acconfig.h
@@ -1,3 +1,6 @@
+#ifndef _CONFIG_H
+#define _CONFIG_H
+
 /* Generated automatically from acconfig.h by autoheader. */
 /* Please make your changes there */
 
@@ -143,3 +146,5 @@
 /* ******************* Shouldn't need to edit below this line ************** */
 
 #include "defines.h"
+
+#endif _CONFIG_H
diff --git a/bsd-misc.c b/bsd-misc.c
index 0ffe516..a4dafb9 100644
--- a/bsd-misc.c
+++ b/bsd-misc.c
@@ -33,6 +33,8 @@
 **
 */
 
+#include "config.h"
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -47,7 +49,6 @@
 
 #include "xmalloc.h"
 #include "ssh.h"
-#include "config.h"
 #include "bsd-misc.h"
 
 #ifndef offsetof
diff --git a/configure.in b/configure.in
index 8b3af35..34c4dfa 100644
--- a/configure.in
+++ b/configure.in
@@ -354,8 +354,6 @@
 			if test "x$gotlastlog" = "xdir" ; then
 				AC_MSG_RESULT(${lastlog}/)
 				AC_DEFINE(LASTLOG_IS_DIR)
-				AC_MSG_WARN([*** Directory-based lastlogs are not yet supported ***])
-				nolastlog=1
 			else
 				AC_MSG_RESULT($lastlog)
 				AC_DEFINE_UNQUOTED(LASTLOG_LOCATION, "$lastlog")
diff --git a/defines.h b/defines.h
index 2a26559..40c1a3e 100644
--- a/defines.h
+++ b/defines.h
@@ -1,3 +1,6 @@
+#ifndef _DEFINES_H
+#define _DEFINES_H
+
 /* Necessary headers */
 
 #include <sys/types.h> /* For u_intXX_t */
@@ -61,7 +64,7 @@
 # else
 #  if (SIZEOF_LONG_LONG_INT == 8)
 typedef long long int int64_t;
-#   define HAVE_INTXX_T
+#   define HAVE_INTXX_T 1
 #  else
 #   error "64 bit int type not found."
 #  endif
@@ -74,6 +77,7 @@
 typedef uint16_t u_int16_t;
 typedef uint32_t u_int32_t;
 typedef  uint64_t u_int64_t;
+# define HAVE_U_INTXX_T 1
 # else
 #  if (SIZEOF_SHORT_INT == 2)
 typedef unsigned short int u_int16_t;
@@ -90,7 +94,7 @@
 #  else
 #   if (SIZEOF_LONG_LONG_INT == 8)
 typedef unsigned long long int u_int64_t;
-#    define HAVE_U_INTXX_T
+#    define HAVE_U_INTXX_T 1
 #   else
 #    error "64 bit int type not found."
 #   endif
@@ -224,3 +228,4 @@
 # define PAM_STRERROR(a,b) pam_strerror((a),(b))
 #endif
 
+#endif /* _DEFINES_H */
diff --git a/login.c b/login.c
index 3dd208a..7adc4f2 100644
--- a/login.c
+++ b/login.c
@@ -18,7 +18,7 @@
  */
 
 #include "includes.h"
-RCSID("$Id: login.c,v 1.16 1999/12/30 22:42:24 damien Exp $");
+RCSID("$Id: login.c,v 1.17 2000/01/02 00:45:33 damien Exp $");
 
 #if defined(HAVE_UTMPX_H) && defined(USE_UTMPX)
 # include <utmpx.h>
@@ -57,14 +57,24 @@
 	struct lastlog ll;
 	char *lastlog;
 	int fd;
+#ifdef LASTLOG_IS_DIR
+	char buf[1024];
+#endif /* LASTLOG_IS_DIR */
 
 	lastlog = _PATH_LASTLOG;
 	buf[0] = '\0';
 
+#ifdef LASTLOG_IS_DIR
 	fd = open(lastlog, O_RDONLY);
 	if (fd < 0)
 		return 0;
 	lseek(fd, (off_t) ((long) uid * sizeof(ll)), SEEK_SET);
+#else /* LASTLOG_IS_DIR */
+	snprintf(buf, sizeof(buf), "%s/%s", lastlog, logname);
+	fd = open(buf, O_RDONLY);
+	if (fd < 0)
+		return 0;
+#endif /* LASTLOG_IS_DIR */
 	if (read(fd, &ll, sizeof(ll)) != sizeof(ll)) {
 		close(fd);
 		return 0;
@@ -132,6 +142,9 @@
 #if defined(_PATH_LASTLOG) && !defined(DISABLE_LASTLOG)
 	struct lastlog ll;
 	char *lastlog;
+#ifdef LASTLOG_IS_DIR
+	char buf[1024];
+#endif /* LASTLOG_IS_DIR */
 #endif /* defined(_PATH_LASTLOG) && !defined(DISABLE_LASTLOG) */
 	struct utmp u;
 #if defined(HAVE_UTMPX_H) && defined(USE_UTMPX)
@@ -207,9 +220,15 @@
 		ll.ll_time = time(NULL);
 		strncpy(ll.ll_line, ttyname + 5, sizeof(ll.ll_line));
 		strncpy(ll.ll_host, host, sizeof(ll.ll_host));
+#ifdef LASTLOG_IS_DIR
+		snprintf(buf, sizeof(buf), "%s/%s", lastlog, logname);
+		fd = open(buf, O_RDWR);
+		if (fd >= 0) {
+#else /* LASTLOG_IS_DIR */
 		fd = open(lastlog, O_RDWR);
 		if (fd >= 0) {
 			lseek(fd, (off_t) ((long) uid * sizeof(ll)), SEEK_SET);
+#endif /* LASTLOG_IS_DIR */
 			if (write(fd, &ll, sizeof(ll)) != sizeof(ll))
 				log("Could not write %.100s: %.100s", lastlog, strerror(errno));
 			close(fd);