* SysRecvMsg (sockfd, msg, flags) - Recieve data through socket * sockfd - Socket file descriptor * msg - Message Header * flags - flags * * On Success - return amount of data received * On Failure - return -1 */
| 1700 | * On Failure - return -1 |
| 1701 | */ |
| 1702 | long SysRecvMsg(regs64_t* r){ |
| 1703 | process_t* proc = Scheduler::GetCurrentProcess(); |
| 1704 | |
| 1705 | if(SC_ARG0(r) >= proc->fileDescriptors.get_length()){ |
| 1706 | Log::Warning("sys_sendmsg: Invalid File Descriptor: %d", SC_ARG0(r)); |
| 1707 | return -1; |
| 1708 | } |
| 1709 | |
| 1710 | fs_fd_t* handle = proc->fileDescriptors.get_at(SC_ARG0(r)); |
| 1711 | |
| 1712 | msghdr* msg = (msghdr*)SC_ARG1(r); |
| 1713 | uint64_t flags = SC_ARG3(r); |
| 1714 | |
| 1715 | if(!handle){ |
| 1716 | Log::Warning("sys_recvmsg: Invalid file descriptor: ", SC_ARG0(r)); |
| 1717 | return -1; |
| 1718 | } |
| 1719 | |
| 1720 | if((handle->node->flags & FS_NODE_TYPE) != FS_NODE_SOCKET){ |
| 1721 | Log::Warning("sys_recvmsg: File (Descriptor: %d) is not a socket", SC_ARG0(r)); |
| 1722 | return -2; |
| 1723 | } |
| 1724 | |
| 1725 | if(!Memory::CheckUsermodePointer(SC_ARG1(r), sizeof(msghdr), proc->addressSpace)){ |
| 1726 | Log::Warning("sys_recvmsg: Invalid msg ptr"); |
| 1727 | return -EFAULT; |
| 1728 | } |
| 1729 | |
| 1730 | if(!Memory::CheckUsermodePointer((uintptr_t)msg->iov, sizeof(iovec) * msg->iovlen, proc->addressSpace)){ |
| 1731 | Log::Warning("sys_recvmsg: msg: Invalid iovec ptr"); |
| 1732 | return -EFAULT; |
| 1733 | } |
| 1734 | |
| 1735 | if(msg->name){ |
| 1736 | Log::Warning("sys_recvmsg: msg: name ignored"); |
| 1737 | } |
| 1738 | |
| 1739 | long read = 0; |
| 1740 | Socket* sock = (Socket*)handle->node; |
| 1741 | |
| 1742 | for(unsigned i = 0; i < msg->iovlen; i++){ |
| 1743 | if(!Memory::CheckUsermodePointer((uintptr_t)msg->iov[i].base, msg->iov[i].len, proc->addressSpace)){ |
| 1744 | Log::Warning("sys_recvmsg: msg: Invalid iovec entry base"); |
| 1745 | return -EFAULT; |
| 1746 | } |
| 1747 | |
| 1748 | long ret = sock->Receive(msg->iov[i].base, msg->iov[i].len, flags); |
| 1749 | |
| 1750 | if(ret < 0) { |
| 1751 | return ret; |
| 1752 | } |
| 1753 | |
| 1754 | read += ret; |
| 1755 | } |
| 1756 | |
| 1757 | return read; |
| 1758 | } |
| 1759 |
nothing calls this directly
no test coverage detected