$NetBSD: patch-aa,v 1.1 2002/07/04 13:32:21 agc Exp $

Add a test to see if the log file has been turned over, and to re-open
files if it has.

--- root-tail.c	2002/07/04 13:05:32	1.1
+++ root-tail.c	2002/07/04 13:18:38
@@ -27,14 +27,6 @@
 
 #define VERSION "0.0.10"
 
-/*---------------- Let's define signals functions -------------*/
-
-static void reopen (int);
-static void list_files (int);
-static void force_refresh (int);
-static void InstallSigHandler (void);
-FILE *openLog (const char *);
-
 /*------------------------ initalize variables -----------------*/
 int geom_mask, noinitial;
 int screen, listlen = STD_HEIGHT, width = STD_WIDTH, ScreenWidth, ScreenHeight,
@@ -58,6 +50,7 @@
     char desc[255];		/* alternative description              */
     FILE *f;			/* FILE struct associated with file     */
     Pixel color;		/* color to be used for printing        */
+    struct stat st;		/* stat buffer from previous 		*/
     struct logfile_entry *next;
   };
 
@@ -70,6 +63,14 @@
     Pixel color;
   };
 
+/*---------------- Let's define signals functions -------------*/
+
+static void reopen (int);
+static void list_files (int);
+static void force_refresh (int);
+static void InstallSigHandler (void);
+FILE *openLog (struct logfile_entry *, const char *);
+
 
 /*----------------------------- start code ---------------------*/
 
@@ -83,7 +84,7 @@
     {
       printf ("reopenin as %p (%s)\n", e->f, e->fname);
       fclose (e->f);
-      e->f = openLog (e->fname);
+      e->f = openLog (e, e->fname);
       printf ("reopened as %p\n", e->f);
       if (e->f == NULL)
 	{
@@ -226,15 +227,15 @@
 }
 
 FILE *
-openLog (const char *name)
+openLog (struct logfile_entry *e, const char *name)
 {
   FILE *f = fopen (name, "r");
-  struct stat statbuf;
   off_t size;
+
   if (f == NULL)
     return NULL;
-  stat (name, &statbuf);
-  size = statbuf.st_size;
+  stat (name, &e->st);
+  size = e->st.st_size;
   if (size > (listlen+1) * width)
     {
       char dummy[255];
@@ -363,8 +364,16 @@
 
       for (current = loglist; current != NULL; current = current->next)
 	{
+		struct stat	st;
 	  clearerr (current->f);
 
+	  if (stat(current->fname, &st) < 0) {
+		continue;
+	  }
+	  if (st.st_ino != current->st.st_ino) {
+		need_reopen = 1;
+	  }
+
 	  while (!lineinput (temp, width + 2, current->f))
 	    {
 	      /* 
@@ -418,7 +427,7 @@
       if (need_reopen)
         reopen (1);
 
-      /* we ignore possible errors due to windo resizing &c */
+      /* we ignore possible errors due to window resizing &c */
       while (XPending (disp))
 	{
           XNextEvent (disp, &xev);
@@ -607,13 +616,14 @@
 		}
 	    }
 
-	  if ((f = openLog (fname)) == NULL)
+	  e = (struct logfile_entry *)
+	    malloc (sizeof (struct logfile_entry));
+
+	  if ((f = openLog (e, fname)) == NULL)
 	    {
 	      perror (fname);
 	      exit (-1);
 	    }
-	  e = (struct logfile_entry *)
-	    malloc (sizeof (struct logfile_entry));
 
 	  strncpy (e->fname, fname, 255);
 	  e->fname[255] = '\0';	/* just in case */
