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