in audit.go [466:501]
func (c *AuditClient) getReply(seq uint32) (*syscall.NetlinkMessage, error) {
var msg syscall.NetlinkMessage
var msgs []syscall.NetlinkMessage
var err error
for receiveMore := true; receiveMore; {
// Retry the non-blocking read multiple times until a response is received.
for i := 0; i < 10; i++ {
msgs, err = c.Netlink.Receive(true, parseNetlinkAuditMessage)
if err != nil {
switch {
case errors.Is(err, syscall.EINTR):
continue
case errors.Is(err, syscall.EAGAIN):
time.Sleep(50 * time.Millisecond)
continue
default:
return nil, fmt.Errorf("error receiving audit reply: %w", err)
}
}
break
}
if len(msgs) == 0 {
return nil, errors.New("no reply received")
}
msg = msgs[0]
// Skip audit event that sneak between the request/response
receiveMore = msg.Header.Seq == 0 && seq != 0
}
if msg.Header.Seq != seq {
return nil, fmt.Errorf("unexpected sequence number for reply (expected %v but got %v)",
seq, msg.Header.Seq)
}
return &msg, nil
}