Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 19 Jan 2010 19:53:05 +0000 (UTC)
From:      Ed Schouten <ed@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r202643 - head/usr.bin/last
Message-ID:  <201001191953.o0JJr5Ko090620@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ed
Date: Tue Jan 19 19:53:05 2010
New Revision: 202643
URL: http://svn.freebsd.org/changeset/base/202643

Log:
  Make last(1) display the full log file.
  
  I must have misread when I ported the original last(1) source code.
  Instead of only processing the last 1024 entries, it reads them in in
  chucks of 1024 entries at a time.
  
  Unfortunately we cannot walk through the log file in reverse order,
  which means we have to allocate a piece of memory to hold all the
  entries. Call realloc() for each 128 entries we read.
  
  Reported by:	Andrzej Tobola <ato iem pw edu pl>

Modified:
  head/usr.bin/last/last.c

Modified: head/usr.bin/last/last.c
==============================================================================
--- head/usr.bin/last/last.c	Tue Jan 19 19:51:54 2010	(r202642)
+++ head/usr.bin/last/last.c	Tue Jan 19 19:53:05 2010	(r202643)
@@ -196,8 +196,6 @@ main(int argc, char *argv[])
 	exit(0);
 }
 
-#define	MAXUTXENTRIES	1024
-
 /*
  * wtmp --
  *	read through the wtmp file
@@ -205,9 +203,9 @@ main(int argc, char *argv[])
 void
 wtmp(void)
 {
-	struct utmpx buf[MAXUTXENTRIES];
+	struct utmpx *buf = NULL;
 	struct utmpx *ut;
-	static unsigned int first = 0, amount = 0;
+	static unsigned int amount = 0;
 	time_t t;
 	char ct[80];
 	struct tm *tm;
@@ -219,11 +217,12 @@ wtmp(void)
 	if (setutxdb(UTXDB_LOG, file) != 0)
 		err(1, "%s", file);
 	while ((ut = getutxent()) != NULL) {
-		memcpy(&buf[(first + amount) % MAXUTXENTRIES], ut, sizeof *ut);
-		if (amount == MAXUTXENTRIES)
-			first++;
-		else
-			amount++;
+		if (amount % 128 == 0) {
+			buf = realloc(buf, (amount + 128) * sizeof *ut);
+			if (buf == NULL)
+				err(1, "realloc");
+		}
+		memcpy(&buf[amount++], ut, sizeof *ut);
 		if (t > ut->ut_tv.tv_sec)
 			t = ut->ut_tv.tv_sec;
 	}
@@ -231,7 +230,7 @@ wtmp(void)
 
 	/* Display them in reverse order. */
 	while (amount > 0)
-		doentry(&buf[(first + amount--) % MAXUTXENTRIES]);
+		doentry(&buf[--amount]);
 
 	tm = localtime(&t);
 	(void) strftime(ct, sizeof(ct), "\nwtmp begins %+\n", tm);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201001191953.o0JJr5Ko090620>