func()

in audit.go [276:308]


func (c *AuditClient) AddRule(rule []byte) error {
	msg := syscall.NetlinkMessage{
		Header: syscall.NlMsghdr{
			Type:  uint16(auparse.AUDIT_ADD_RULE),
			Flags: syscall.NLM_F_REQUEST | syscall.NLM_F_ACK,
		},
		Data: rule,
	}

	// Send AUDIT_ADD_RULE message to the kernel.
	seq, err := c.Netlink.Send(msg)
	if err != nil {
		return fmt.Errorf("failed sending add rule request: %w", err)
	}

	ack, err := c.getReply(seq)
	if err != nil {
		return fmt.Errorf("failed to get ACK to add rule request: %w", err)
	}

	if ack.Header.Type != syscall.NLMSG_ERROR {
		return fmt.Errorf("unexpected ACK to AUDIT_ADD_RULE, got type=%d", ack.Header.Type)
	}

	if err = ParseNetlinkError(ack.Data); err != nil {
		if errors.Is(err, syscall.EEXIST) {
			return errors.New("rule exists")
		}
		return fmt.Errorf("error adding audit rule: %w", err)
	}

	return nil
}