2 #include "print_fields.h"
7 #include <sys/socket.h>
10 #define TEST_NETLINK_(fd_, nlh0_, \
13 data_len_, src_, slen_, ...) \
15 struct nlmsghdr *const TEST_NETLINK_nlh = \
17 const unsigned int msg_len = \
18 NLMSG_HDRLEN + (data_len_); \
20 SET_STRUCT(struct nlmsghdr, TEST_NETLINK_nlh, \
21 .nlmsg_len = msg_len, \
22 .nlmsg_type = (type_), \
23 .nlmsg_flags = (flags_) \
25 memcpy(NLMSG_DATA(TEST_NETLINK_nlh), (src_), (slen_)); \
27 const char *const errstr = \
28 sprintrc(sendto((fd_), TEST_NETLINK_nlh, \
29 msg_len, MSG_DONTWAIT, \
32 printf("sendto(%d, {{len=%u, type=%s" \
33 ", flags=%s, seq=0, pid=0}, ", \
34 (fd_), msg_len, (type_str_), (flags_str_)); \
38 printf("}, %u, MSG_DONTWAIT, NULL, 0) = %s\n", \
42 #define TEST_NETLINK(fd_, nlh0_, type_, flags_, \
43 data_len_, src_, slen_, ...) \
44 TEST_NETLINK_((fd_), (nlh0_), \
47 (data_len_), (src_), (slen_), __VA_ARGS__)
49 #define TEST_NETLINK_OBJECT_EX_(fd_, nlh0_, \
52 obj_, fallback_func, ...) \
54 char pattern[DEFAULT_STRLEN]; \
55 fill_memory_ex(pattern, sizeof(pattern), \
56 'a', 'z' - 'a' + 1); \
57 const unsigned int plen = \
58 sizeof(obj_) - 1 > DEFAULT_STRLEN \
59 ? DEFAULT_STRLEN : (int) sizeof(obj_) - 1; \
60 /* len < sizeof(obj_) */ \
61 TEST_NETLINK_((fd_), (nlh0_), \
62 (type_), (type_str_), \
63 (flags_), (flags_str_), \
64 plen, pattern, plen, \
65 (fallback_func)(pattern, plen)); \
66 /* short read of sizeof(obj_) */ \
67 TEST_NETLINK_((fd_), (nlh0_), \
68 (type_), (type_str_), \
69 (flags_), (flags_str_), \
73 NLMSG_DATA(TEST_NETLINK_nlh))); \
75 TEST_NETLINK_((fd_), (nlh0_), \
76 (type_), (type_str_), \
77 (flags_), (flags_str_), \
79 &(obj_), sizeof(obj_), \
83 #define TEST_NETLINK_OBJECT_EX(fd_, nlh0_, \
85 obj_, fallback_func, ...) \
86 TEST_NETLINK_OBJECT_EX_((fd_), (nlh0), \
89 (obj_), (fallback_func), __VA_ARGS__)
91 #define TEST_NETLINK_OBJECT(fd_, nlh0_, \
94 TEST_NETLINK_OBJECT_EX_((fd_), (nlh0), \
97 (obj_), print_quoted_hex, __VA_ARGS__)