summaryrefslogtreecommitdiffstats
path: root/debian/patches/upstream/logger-always-update-header-when-read-from-stdin.patch
blob: 02e0bd85b4097795ba2304b87506ec04d9e256f5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
From: Karel Zak <kzak@redhat.com>
Date: Tue, 1 Nov 2022 10:30:06 +0100
Subject: logger: always update header when read from stdin

The current code updates the header only when the priority has been
changed. It's incorrect because wanted is a valid header or each entry
(don't forget that logger for stdin use-case is used in pipe to log
long-time running processes).

This patch also fixes the initial timestamp; it was originally generated
on logger startup, it now generates the header on the first message.

$ (sleep 2; date; sleep 2; date; sleep 2; date) | logger --stderr --no-act

old:
<13>Nov  1 10:42:14 kzak: Tue Nov  1 10:42:16 AM CET 2022
<13>Nov  1 10:42:14 kzak: Tue Nov  1 10:42:18 AM CET 2022
<13>Nov  1 10:42:14 kzak: Tue Nov  1 10:42:20 AM CET 2022

new:
<13>Nov  1 10:19:02 kzak: Tue Nov  1 10:19:02 AM CET 2022
<13>Nov  1 10:19:04 kzak: Tue Nov  1 10:19:04 AM CET 2022
<13>Nov  1 10:19:06 kzak: Tue Nov  1 10:19:06 AM CET 2022

Fixes: https://github.com/util-linux/util-linux/issues/1866
Signed-off-by: Karel Zak <kzak@redhat.com>
---
 misc-utils/logger.c | 18 +++++++-----------
 1 file changed, 7 insertions(+), 11 deletions(-)

diff --git a/misc-utils/logger.c b/misc-utils/logger.c
index bec684f..e2b0b41 100644
--- a/misc-utils/logger.c
+++ b/misc-utils/logger.c
@@ -945,8 +945,6 @@ static void logger_open(struct logger_ctl *ctl)
 		ctl->tag = ctl->login = xgetlogin();
 	if (!ctl->tag)
 		ctl->tag = "<someone>";
-
-	generate_syslog_header(ctl);
 }
 
 /* re-open; usually after failed connection */
@@ -996,10 +994,8 @@ static void logger_stdin(struct logger_ctl *ctl)
 {
 	/* note: we re-generate the syslog header for each log message to
 	 * update header timestamps and to reflect possible priority changes.
-	 * The initial header is generated by logger_open().
 	 */
 	int default_priority = ctl->pri;
-	int last_pri = default_priority;
 	char *buf = xmalloc(ctl->max_message_size + 2 + 2);
 	int pri;
 	int c;
@@ -1026,10 +1022,6 @@ static void logger_stdin(struct logger_ctl *ctl)
 			} else
 				ctl->pri = default_priority;
 
-			if (ctl->pri != last_pri) {
-				generate_syslog_header(ctl);
-				last_pri = ctl->pri;
-			}
 			if (c != EOF && c != '\n')
 				c = getchar();
 		}
@@ -1040,8 +1032,10 @@ static void logger_stdin(struct logger_ctl *ctl)
 		}
 		buf[i] = '\0';
 
-		if (i > 0 || !ctl->skip_empty_lines)
+		if (i > 0 || !ctl->skip_empty_lines) {
+			generate_syslog_header(ctl);
 			write_output(ctl, buf);
+		}
 
 		if (c == '\n')	/* discard line terminator */
 			c = getchar();
@@ -1317,12 +1311,14 @@ int main(int argc, char **argv)
 		abort();
 	}
 	logger_open(&ctl);
-	if (0 < argc)
+	if (0 < argc) {
+		generate_syslog_header(&ctl);
 		logger_command_line(&ctl, argv);
-	else
+	} else
 		/* Note. --file <arg> reopens stdin making the below
 		 * function to be used for file inputs. */
 		logger_stdin(&ctl);
+
 	logger_close(&ctl);
 	return EXIT_SUCCESS;
 }