#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
-#include "netlink.h"
+#include "test_netlink.h"
#include <linux/selinux_netlink.h>
static void
fd, nlh.nlmsg_len, (unsigned) sizeof(nlh), sprintrc(rc));
}
+static void
+test_selnl_msg_unspec(const int fd)
+{
+ void *const nlh0 = tail_alloc(NLMSG_HDRLEN);
+
+ TEST_NETLINK_(fd, nlh0,
+ 0xffff, "0xffff /* SELNL_MSG_??? */",
+ NLM_F_REQUEST, "NLM_F_REQUEST",
+ 4, "1234", 4,
+ printf("\"\\x31\\x32\\x33\\x34\""));
+}
+
+static void
+test_selnl_msg_setenforce(const int fd)
+{
+ void *const nlh0 = tail_alloc(NLMSG_HDRLEN);
+
+ static const struct selnl_msg_setenforce msg = {
+ .val = 0xfbdcdfab
+ };
+ TEST_NETLINK_OBJECT(fd, nlh0,
+ SELNL_MSG_SETENFORCE, NLM_F_REQUEST, msg,
+ PRINT_FIELD_D("{", msg, val);
+ printf("}"));
+}
+
+static void
+test_selnl_msg_policyload(const int fd)
+{
+ void *const nlh0 = tail_alloc(NLMSG_HDRLEN);
+
+ static const struct selnl_msg_policyload msg = {
+ .seqno = 0xabdcfabc
+ };
+ TEST_NETLINK_OBJECT(fd, nlh0,
+ SELNL_MSG_POLICYLOAD, NLM_F_REQUEST, msg,
+ PRINT_FIELD_U("{", msg, seqno);
+ printf("}"));
+}
+
int main(void)
{
skip_if_unavailable("/proc/self/fd/");
int fd = create_nl_socket(NETLINK_SELINUX);
test_nlmsg_type(fd);
+ test_selnl_msg_unspec(fd);
+ test_selnl_msg_setenforce(fd);
+ test_selnl_msg_policyload(fd);
printf("+++ exited with 0 +++\n");
(type_), #type_, \
(flags_), #flags_, \
(data_len_), (src_), (slen_), __VA_ARGS__)
+
+#define TEST_NETLINK_OBJECT(fd_, nlh0_, \
+ type_, flags_, \
+ obj_, ...) \
+ do { \
+ char pattern[DEFAULT_STRLEN]; \
+ fill_memory_ex(pattern, sizeof(pattern), \
+ 'a', 'z' - 'a' + 1); \
+ const unsigned int plen = \
+ sizeof(obj_) - 1 > DEFAULT_STRLEN \
+ ? DEFAULT_STRLEN : (int) sizeof(obj_) - 1; \
+ /* len < sizeof(obj_) */ \
+ TEST_NETLINK_((fd_), (nlh0_), \
+ (type_), #type_, \
+ (flags_), #flags_, \
+ plen, pattern, plen, \
+ print_quoted_hex(pattern, plen)); \
+ /* short read of sizeof(obj_) */ \
+ TEST_NETLINK_((fd_), (nlh0_), \
+ (type_), #type_, \
+ (flags_), #flags_, \
+ sizeof(obj_), \
+ pattern, plen, \
+ printf("%p", \
+ NLMSG_DATA(TEST_NETLINK_nlh))); \
+ /* sizeof(obj_) */ \
+ TEST_NETLINK_((fd_), (nlh0_), \
+ (type_), #type_, \
+ (flags_), #flags_, \
+ sizeof(obj_), \
+ &(obj_), sizeof(obj_), \
+ __VA_ARGS__); \
+ } while (0)