MCPcopy Create free account
hub / github.com/RT-Thread/rt-thread / sys_recvmsg

Function sys_recvmsg

components/lwp/lwp_syscall.c:5721–5778  ·  view source on GitHub ↗

* @brief Receives a message from a socket using a message header structure. * * This system call is used to receive data and associated metadata from a socket. * It supports both stream-oriented and message-oriented sockets and allows control * over the behavior of the receiving operation via the `flags` parameter. * * @param[in] socket The socket descriptor from which the message will be

Source from the content-addressed store, hash-verified

5719 * @see sys_sendmsg()
5720 */
5721sysret_t sys_recvmsg(int socket, struct msghdr *msg, int flags)
5722{
5723 int flgs, ret = -1;
5724 struct msghdr kmsg;
5725#ifdef ARCH_MM_MMU
5726 void *msg_control;
5727 struct iovec *uiov, *kiov;
5728#endif
5729
5730 if (!msg)
5731 {
5732 return -EPERM;
5733 }
5734
5735 flgs = netflags_muslc_2_lwip(flags);
5736
5737#ifdef ARCH_MM_MMU
5738 ret = copy_msghdr_from_user(&kmsg, msg, &uiov, &msg_control);
5739
5740 if (!ret)
5741 {
5742 ret = recvmsg(socket, &kmsg, flgs);
5743
5744 if (ret < 0)
5745 {
5746 goto _free_res;
5747 }
5748
5749 kiov = kmsg.msg_iov;
5750
5751 for (int i = 0; i < kmsg.msg_iovlen; ++i)
5752 {
5753 lwp_put_to_user(uiov->iov_base, kiov->iov_base, kiov->iov_len);
5754
5755 ++kiov;
5756 ++uiov;
5757 }
5758
5759 lwp_put_to_user(msg_control, kmsg.msg_control, kmsg.msg_controllen);
5760 lwp_put_to_user(&msg->msg_flags, &kmsg.msg_flags, sizeof(kmsg.msg_flags));
5761
5762 _free_res:
5763 kmem_put(kmsg.msg_iov->iov_base);
5764 kmem_put(kmsg.msg_iov);
5765 }
5766#else
5767 rt_memcpy(&kmsg, msg, sizeof(kmsg));
5768
5769 ret = recvmsg(socket, &kmsg, flgs);
5770
5771 if (!ret)
5772 {
5773 msg->msg_flags = kmsg.msg_flags;
5774 }
5775#endif /* ARCH_MM_MMU */
5776
5777 return (ret < 0 ? GET_ERRNO() : ret);
5778}

Callers

nothing calls this directly

Calls 6

netflags_muslc_2_lwipFunction · 0.85
copy_msghdr_from_userFunction · 0.85
lwp_put_to_userFunction · 0.85
kmem_putFunction · 0.85
rt_memcpyFunction · 0.85
recvmsgFunction · 0.50

Tested by

no test coverage detected