* @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
| 5719 | * @see sys_sendmsg() |
| 5720 | */ |
| 5721 | sysret_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 | } |
nothing calls this directly
no test coverage detected