From 798867ed27b1873b5d1344ddacd62a7bfc2f8daa Mon Sep 17 00:00:00 2001
From: "Todd C. Miller" <Todd.Miller@courtesan.com>
Date: Fri, 18 Sep 2009 00:32:32 +0000
Subject: [PATCH] Refactor code to update output and timing files.

---
 script.c | 48 +++++++++++++++++++++++++++---------------------
 1 file changed, 27 insertions(+), 21 deletions(-)

diff --git a/script.c b/script.c
index 9c1457cb1..594391232 100644
--- a/script.c
+++ b/script.c
@@ -290,6 +290,26 @@ script_duplow(fd)
     return(fd);
 }
 
+/* Update output and timing files. */
+static void
+log_output(output, n, then, now, ofile, tfile)
+    struct script_buf *output;
+    int n;
+    struct timeval *then;
+    struct timeval *now;
+    FILE *ofile;
+    FILE *tfile;
+{
+    struct timeval tv;
+
+    fwrite(output->buf + output->off, 1, n, ofile);
+    timersub(now, then, &tv);
+    fprintf(tfile, "%f %d\n",
+	tv.tv_sec + ((double)tv.tv_usec / 1000000), n);
+    then->tv_sec = now->tv_sec;
+    then->tv_usec = now->tv_usec;
+}
+
 int
 script_execv(path, argv)
     const char *path;
@@ -298,7 +318,7 @@ script_execv(path, argv)
     int n, nready;
     fd_set *fdsr, *fdsw;
     struct script_buf input, output;
-    struct timeval now, prevtime, tv;
+    struct timeval now, then;
     sigaction_t sa;
     FILE *idfile, *ofile, *tfile;
 
@@ -328,10 +348,10 @@ script_execv(path, argv)
     sa.sa_flags = SA_RESTART;
     sigaction(SIGWINCH, &sa, NULL);
 
-    gettimeofday(&prevtime, NULL);
+    gettimeofday(&then, NULL);
 
     /* XXX - log more stuff? environment too? */
-    fprintf(idfile, "%ld:%s:%s:%s:%s\n", prevtime.tv_sec, user_name,
+    fprintf(idfile, "%ld:%s:%s:%s:%s\n", then.tv_sec, user_name,
 	runas_pw->pw_name, runas_gr ? runas_gr->gr_name : "", user_tty);
     fprintf(idfile, "%s\n", user_cwd);
     fprintf(idfile, "%s%s%s\n", user_cmnd, user_args ? " " : "",
@@ -430,12 +450,7 @@ script_execv(path, argv)
 		output.len += n;
 
 		/* Update output and timing files. */
-		fwrite(output.buf + output.off, 1, n, ofile);
-		timersub(&now, &prevtime, &tv);
-		fprintf(tfile, "%f %d\n",
-		    tv.tv_sec + ((double)tv.tv_usec / 1000000), n);
-		prevtime.tv_sec = now.tv_sec;
-		prevtime.tv_usec = now.tv_usec;
+		log_output(&output, n, &then, &now, ofile, tfile);
 	    }
 	}
 	if (FD_ISSET(STDOUT_FILENO, fdsw)) {
@@ -461,24 +476,15 @@ script_execv(path, argv)
     if (output.len > output.off) {
 	n = output.len - output.off;
 	write(STDOUT_FILENO, output.buf + output.off, n);
-	fwrite(output.buf + output.off, 1, n, ofile);
-	timersub(&now, &prevtime, &tv);
-	fprintf(tfile, "%f %d\n",
-	    tv.tv_sec + ((double)tv.tv_usec / 1000000), n);
-	prevtime.tv_sec = now.tv_sec;
-	prevtime.tv_usec = now.tv_usec;
+	log_output(&output, n, &then, &now, ofile, tfile);
     }
     for (;;) {
+	output.off = 0;
 	n = read(script_fds[SFD_MASTER], output.buf, sizeof(output.buf));
 	if (n <= 0)
 	    break;
 	write(STDOUT_FILENO, output.buf, n);
-	fwrite(output.buf, 1, n, ofile);
-	timersub(&now, &prevtime, &tv);
-	fprintf(tfile, "%f %d\n",
-	    tv.tv_sec + ((double)tv.tv_usec / 1000000), n);
-	prevtime.tv_sec = now.tv_sec;
-	prevtime.tv_usec = now.tv_usec;
+	log_output(&output, n, &then, &now, ofile, tfile);
     }
     term_restore(STDIN_FILENO);
 
-- 
2.40.0