36 { |
36 { |
37 size_t i; |
37 size_t i; |
38 size_t size = 0; |
38 size_t size = 0; |
39 for (i = 0; i < msg->msg_iovlen; i++) |
39 for (i = 0; i < msg->msg_iovlen; i++) |
40 { |
40 { |
41 size += msg->msg_iov->iov_len; |
41 size += msg->msg_iov[i].iov_len; |
42 } |
42 } |
43 return size; |
43 return size; |
44 } |
44 } |
45 ssize_t sim_sock_recvmsg (struct SimSocket *socket, struct msghdr *msg, int flags) |
45 ssize_t sim_sock_recvmsg (struct SimSocket *socket, struct msghdr *msg, int flags) |
46 { |
46 { |
47 struct socket *kernel_socket = (struct socket *)socket; |
47 struct socket *kernel_socket = (struct socket *)socket; |
48 struct iovec *kernel_iov = copy_iovec (msg->msg_iov, msg->msg_iovlen); |
48 struct iovec *kernel_iov = copy_iovec (msg->msg_iov, msg->msg_iovlen); |
49 struct iovec *user_iov = msg->msg_iov; |
49 struct iovec *user_iov = msg->msg_iov; |
|
50 struct cmsghdr *user_cmsgh = msg->msg_control; |
|
51 size_t user_cmsghlen = msg->msg_controllen; |
50 msg->msg_iov = kernel_iov; |
52 msg->msg_iov = kernel_iov; |
51 int retval = sock_recvmsg (kernel_socket, msg, iov_size (msg), flags); |
53 int retval = sock_recvmsg (kernel_socket, msg, iov_size (msg), flags); |
52 msg->msg_iov = user_iov; |
54 msg->msg_iov = user_iov; |
|
55 msg->msg_control = user_cmsgh; |
|
56 msg->msg_controllen = user_cmsghlen - msg->msg_controllen; |
53 sim_free (kernel_iov); |
57 sim_free (kernel_iov); |
54 return retval; |
58 return retval; |
55 } |
59 } |
56 ssize_t sim_sock_sendmsg (struct SimSocket *socket, const struct msghdr *msg, int flags) |
60 ssize_t sim_sock_sendmsg (struct SimSocket *socket, const struct msghdr *msg, int flags) |
57 { |
61 { |