Some syslog producers provide inconsistent timestamps, so provide an option to ignore the message timestamps and always locally timestamp. In order to implement this, invert the valid-timestamp check, but only use the timestamp if this option is not enabled.
This is in line with what what other syslogd implementations do: >From sysklogd syslogd.c: * Sun Nov 7 12:28:47 CET 2004: Martin Schulze <[email protected]> * Discard any timestamp information found in received syslog * messages. This will affect local messages sent from a * different timezone. rsyslog's imuxsock module similary has an (enabled by default) IgnoreTimestamp option: https://www.rsyslog.com/doc/v8-stable/configuration/modules/imuxsock.html function old new delta .rodata 14706 14738 +32 usage_messages 2342 2373 +31 timestamp_and_log 709 724 +15 syslogd_main 2187 2190 +3 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 4/0 up/down: 81/0) Total: 81 bytes Signed-off-by: Peter Korsgaard <[email protected]> --- sysklogd/syslogd.c | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/sysklogd/syslogd.c b/sysklogd/syslogd.c index 4265f4f90..e966208c2 100644 --- a/sysklogd/syslogd.c +++ b/sysklogd/syslogd.c @@ -140,6 +140,7 @@ //usage: ) //usage: "\n -l N Log only messages more urgent than prio N (1-8)" //usage: "\n -S Smaller output" +//usage: "\n -t Ignore message timestamps" //usage: IF_FEATURE_SYSLOGD_DUP( //usage: "\n -D Drop duplicates" //usage: ) @@ -316,6 +317,7 @@ enum { OPTBIT_outfile, // -O OPTBIT_loglevel, // -l OPTBIT_small, // -S + OPTBIT_timestamp, // -t IF_FEATURE_ROTATE_LOGFILE(OPTBIT_filesize ,) // -s IF_FEATURE_ROTATE_LOGFILE(OPTBIT_rotatecnt ,) // -b IF_FEATURE_REMOTE_LOG( OPTBIT_remotelog ,) // -R @@ -330,6 +332,7 @@ enum { OPT_outfile = 1 << OPTBIT_outfile , OPT_loglevel = 1 << OPTBIT_loglevel, OPT_small = 1 << OPTBIT_small , + OPT_timestamp = 1 << OPTBIT_timestamp, OPT_filesize = IF_FEATURE_ROTATE_LOGFILE((1 << OPTBIT_filesize )) + 0, OPT_rotatecnt = IF_FEATURE_ROTATE_LOGFILE((1 << OPTBIT_rotatecnt )) + 0, OPT_remotelog = IF_FEATURE_REMOTE_LOG( (1 << OPTBIT_remotelog )) + 0, @@ -339,7 +342,7 @@ enum { OPT_cfg = IF_FEATURE_SYSLOGD_CFG( (1 << OPTBIT_cfg )) + 0, OPT_kmsg = IF_FEATURE_KMSG_SYSLOG( (1 << OPTBIT_kmsg )) + 0, }; -#define OPTION_STR "m:nO:l:S" \ +#define OPTION_STR "m:nO:l:St" \ IF_FEATURE_ROTATE_LOGFILE("s:" ) \ IF_FEATURE_ROTATE_LOGFILE("b:" ) \ IF_FEATURE_REMOTE_LOG( "R:*") \ @@ -813,21 +816,27 @@ static void parse_fac_prio_20(int pri, char *res20) * that there is no timestamp, short-circuiting the test. */ static void timestamp_and_log(int pri, char *msg, int len) { - char *timestamp; + char *timestamp = NULL; time_t now; /* Jan 18 00:11:22 msg... */ /* 01234567890123456 */ - if (len < 16 || msg[3] != ' ' || msg[6] != ' ' - || msg[9] != ':' || msg[12] != ':' || msg[15] != ' ' + if (len >= 16 && msg[3] == ' ' && msg[6] == ' ' + && msg[9] == ':' && msg[12] == ':' && msg[15] == ' ' ) { + if (!(option_mask32 & OPT_timestamp)) { + /* use message timestamp */ + timestamp = msg; + now = 0; + } + msg += 16; + } + + if (!timestamp) { time(&now); timestamp = ctime(&now) + 4; /* skip day of week */ - } else { - now = 0; - timestamp = msg; - msg += 16; } + timestamp[15] = '\0'; if (option_mask32 & OPT_kmsg) { -- 2.11.0 _______________________________________________ busybox mailing list [email protected] http://lists.busybox.net/mailman/listinfo/busybox
