1# Run client before starting syslogd. 2# The client writes one message before and one after syslogd is started. 3# The kernel writes a sendsyslog(2) error message to the log socket. 4# Start syslogd, it reads the error and the second message from the log socket. 5# Find the kernel error message in file, syslogd, server log. 6# Check that the first message got lost. 7# Create a ktrace dump of the client and check that sendsyslog(2) has failed. 8 9use strict; 10use warnings; 11use Errno ':POSIX'; 12 13use constant LOGSTASH_SIZE => 100; 14 15my $errno = ENOTCONN; 16my $kerngrep = qr/sendsyslog: dropped \d+ messages?, error $errno, pid \d+$/; 17 18our %args = ( 19 client => { 20 early => 1, 21 func => sub { 22 my $self = shift; 23 write_message($self, "stash $_") foreach (1..LOGSTASH_SIZE); 24 write_between2logs($self, sub { 25 my $self = shift; 26 ${$self->{syslogd}}->loggrep(qr/syslogd: started/, 5) 27 or die ref($self), " syslogd started not in syslogd.log"; 28 })}, 29 ktrace => { 30 qr/CALL sendsyslog\(/ => '>=103', 31 qr/RET sendsyslog -1 errno $errno / => 101, 32 }, 33 }, 34 syslogd => { 35 loggrep => { 36 get_firstlog() => 0, 37 qr/msg $kerngrep/ => 1, 38 get_testgrep() => 1, 39 }, 40 }, 41 server => { 42 loggrep => { 43 qr/syslogd\[\d+\]: start/ => 1, 44 get_firstlog() => 0, 45 $kerngrep => 1, 46 qr/syslogd\[\d+\]: running/ => 1, 47 get_testgrep() => 1, 48 }, 49 }, 50 file => { 51 loggrep => { 52 qr/syslogd\[\d+\]: start/ => 1, 53 get_firstlog() => 0, 54 $kerngrep => 1, 55 qr/syslogd\[\d+\]: running/ => 1, 56 get_testgrep() => 1, 57 }, 58 }, 59); 60 611; 62