10 #include "socket_wrapper.c"
12 #ifdef HAVE_STRUCT_MSGHDR_MSG_CONTROL
15 * test wrap_sendmsg_filter_cmsghdr()
17 * Prepare a message with two cmsg:
18 * - the first cmsg is a char buf with the string "Hello World"
19 * - the second cmsg is a char buf with the string "!\n"
21 * Both cmsgs will be copied without modification by
22 * wrap_sendmsg_filter_cmsghdr(), so we can check that the msg
23 * controllen, the cmsg sizes and the payload are the same.
25 * We use an not existing cmsg_type which triggers cmsg copying.
27 static void test_sendmsg_cmsg(void **state)
32 struct msghdr msg = { 0 };
36 const char *s1 = "Hello World";
37 const int s1_len = strlen(s1);
38 const char *s2 = "!\n";
39 const int s2_len = strlen(s2);
40 uint8_t *cmbuf = NULL;
43 (void)state; /* unused */
49 * Prepare cmsgbuf and msg
53 cmsgbuf_size = CMSG_SPACE(s1_len) + CMSG_SPACE(s2_len);
54 cmsgbuf = calloc(cmsgbuf_size, sizeof(char));
55 assert_non_null(cmsgbuf);
56 msg.msg_control = cmsgbuf;
57 msg.msg_controllen = cmsgbuf_size;
60 * Prepare first cmsg with string "Hello World"
62 cmsg = CMSG_FIRSTHDR(&msg);
63 assert_non_null(cmsg);
65 cmsg->cmsg_level = SOL_SOCKET;
66 cmsg->cmsg_type = ~0 - 1;
67 cmsg->cmsg_len = CMSG_LEN(s1_len);
68 memcpy(CMSG_DATA(cmsg), s1, s1_len);
71 * Prepare second cmsg with string "!\n"
73 cmsg = CMSG_NXTHDR(&msg, cmsg);
74 assert_non_null(cmsg);
76 cmsg->cmsg_level = SOL_SOCKET;
77 cmsg->cmsg_type = ~0 - 2;
78 cmsg->cmsg_len = CMSG_LEN(s2_len);
79 memcpy(CMSG_DATA(cmsg), s2, s2_len);
82 * Now call swrap_sendmsg_filter_cmsghdr() on the msg
84 rc = swrap_sendmsg_filter_cmsghdr(&msg, &cmbuf, &cmlen);
85 assert_return_code(rc, errno);
86 assert_int_equal(cmlen, msg.msg_controllen);
89 * Insert filtered cmsgbug into msg and validate cmsgs.
91 msg.msg_control = cmbuf;
93 cmsg = CMSG_FIRSTHDR(&msg);
94 assert_non_null(cmsg);
95 assert_int_equal(cmsg->cmsg_len, CMSG_LEN(s1_len));
96 assert_memory_equal(CMSG_DATA(cmsg), s1, s1_len);
98 cmsg = CMSG_NXTHDR(&msg, cmsg);
99 assert_non_null(cmsg);
100 assert_int_equal(cmsg->cmsg_len, CMSG_LEN(s2_len));
101 assert_memory_equal(CMSG_DATA(cmsg), s2, s2_len);
111 const struct CMUnitTest unit_tests[] = {
112 #ifdef HAVE_STRUCT_MSGHDR_MSG_CONTROL
113 cmocka_unit_test(test_sendmsg_cmsg),
117 rc = cmocka_run_group_tests(unit_tests, NULL, NULL);