- struct iovec iov;
- struct msghdr msg;
- mm_segment_t fs;
-
- fs = get_fs();
- set_fs(get_ds());
- flags |= MSG_DONTWAIT | MSG_NOSIGNAL;
-
- msg.msg_flags = flags;
- msg.msg_name = NULL;
- msg.msg_namelen = 0;
- msg.msg_iov = &iov;
- msg.msg_iovlen = 1;
- msg.msg_control = NULL;
- iov.iov_base = ubuf;
- iov.iov_len = size;
-
- size = sock_recvmsg(socket, &msg, size, flags);
-
- set_fs(fs);
- return size;
+ struct kvec iov = {ubuf, size};
+ struct msghdr msg = {.msg_flags = flags};
+ msg.msg_flags |= MSG_DONTWAIT | MSG_NOSIGNAL;
+ return kernel_recvmsg(socket, &msg, &iov, 1, size, msg.msg_flags);