From ae57fcad5d36dc2ba00179ef3e44154c10223862 Mon Sep 17 00:00:00 2001
From: Joshua Judson Rosen <jrosen@harvestai.com>
Date: Thu, 3 Jul 2014 14:51:47 +0200
Subject: syslogd: make "reopen log file every second" logic work for multiple
 logs

Move last_log_time from a single global to *each logFile_t*
so that we can actually apply the logic to every log-file
in multi-file configurations, rather than working only
for the first file written in each 1-second interval
and then leaving the others connected to possibly wrong files.

Signed-off-by: Joshua Judson Rosen <jrosen@harvestai.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
---
 sysklogd/syslogd.c | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

(limited to 'sysklogd')

diff --git a/sysklogd/syslogd.c b/sysklogd/syslogd.c
index 04221fc33..266657f3b 100644
--- a/sysklogd/syslogd.c
+++ b/sysklogd/syslogd.c
@@ -110,6 +110,7 @@ typedef struct {
 typedef struct logFile_t {
 	const char *path;
 	int fd;
+	time_t last_log_time;
 #if ENABLE_FEATURE_ROTATE_LOGFILE
 	unsigned size;
 	uint8_t isRegular;
@@ -165,7 +166,6 @@ struct globals {
 #if ENABLE_FEATURE_IPC_SYSLOG
 	struct shbuf_ds *shbuf;
 #endif
-	time_t last_log_time;
 	/* localhost's name. We print only first 64 chars */
 	char *hostname;
 
@@ -588,15 +588,16 @@ static void log_locally(time_t now, char *msg, logFile_t *log_file)
 	/* fd can't be 0 (we connect fd 0 to /dev/log socket) */
 	/* fd is 1 if "-O -" is in use */
 	if (log_file->fd > 1) {
-		/* Reopen log file every second. This allows admin
-		 * to delete the file and not worry about restarting us.
+		/* Reopen log files every second. This allows admin
+		 * to delete the files and not worry about restarting us.
 		 * This costs almost nothing since it happens
-		 * _at most_ once a second.
+		 * _at most_ once a second for each file, and happens
+		 * only when each file is actually written.
 		 */
 		if (!now)
 			now = time(NULL);
-		if (G.last_log_time != now) {
-			G.last_log_time = now;
+		if (log_file->last_log_time != now) {
+			log_file->last_log_time = now;
 			close(log_file->fd);
 			goto reopen;
 		}
-- 
cgit v1.2.3