7 #include <sys/socket.h>
17 static void test_sendmsg_recvmsg_fd(void **state)
20 int child_fd, parent_fd;
24 (void) state; /* unused */
26 rc = socketpair(AF_LOCAL, SOCK_STREAM, 0, sv);
27 assert_int_not_equal(rc, -1);
33 assert_int_not_equal(pid, -1);
37 struct msghdr child_msg;
38 char cmsgbuf[CMSG_SPACE(sizeof(int))];
44 memset(&child_msg, 0, sizeof(child_msg));
45 child_msg.msg_control = cmsgbuf;
46 child_msg.msg_controllen = sizeof(cmsgbuf);
50 rc = recvmsg(child_fd, &child_msg, 0);
51 } while (errno == EAGAIN || errno == EWOULDBLOCK);
52 assert_int_not_equal(rc, -1);
54 cmsg = CMSG_FIRSTHDR(&child_msg);
55 assert_non_null(cmsg);
56 assert_int_equal(cmsg->cmsg_type, SCM_RIGHTS);
58 memcpy(&rcv_fd, CMSG_DATA(cmsg), sizeof(rcv_fd));
59 assert_int_not_equal(rcv_fd, -1);
61 rc = read(rcv_fd, buf, sizeof(buf));
62 assert_int_not_equal(rc, -1);
63 for (i = 0; i < 8; i++) {
64 assert_int_equal(buf[i], 0);
70 struct msghdr parent_msg;
72 char cmsgbuf[CMSG_SPACE(sizeof(pass_fd))];
77 pass_fd = open("/dev/zero", O_RDONLY);
78 assert_int_not_equal(pass_fd, -1);
83 memset(&parent_msg, 0, sizeof(parent_msg));
84 parent_msg.msg_iov = &iov;
85 parent_msg.msg_iovlen = 1;
86 parent_msg.msg_control = cmsgbuf;
87 parent_msg.msg_controllen = sizeof(cmsgbuf);
89 cmsg = CMSG_FIRSTHDR(&parent_msg);
90 cmsg->cmsg_level = SOL_SOCKET;
91 cmsg->cmsg_type = SCM_RIGHTS;
92 cmsg->cmsg_len = CMSG_LEN(sizeof(pass_fd));
94 memcpy(CMSG_DATA(cmsg), &pass_fd, sizeof(pass_fd));
95 parent_msg.msg_controllen = cmsg->cmsg_len;
97 rc = sendmsg(parent_fd, &parent_msg, 0);
98 assert_int_not_equal(rc, -1);
100 alarm(5); /* 5 seconds timeout for the child */
101 rc = waitpid(pid, &cs, 0);
102 assert_int_not_equal(rc, -1);
109 const struct CMUnitTest tests[] = {
110 cmocka_unit_test(test_sendmsg_recvmsg_fd),
113 rc = cmocka_run_group_tests(tests, NULL, NULL);