MCPcopy Create free account
hub / github.com/LemonOSProject/LemonOS / SysRecvMsg

Function SysRecvMsg

Kernel/src/arch/x86_64/syscalls.cpp:1702–1758  ·  view source on GitHub ↗

* 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 */

Source from the content-addressed store, hash-verified

1700 * On Failure - return -1
1701 */
1702long 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

Callers

nothing calls this directly

Calls 6

GetCurrentProcessFunction · 0.85
WarningFunction · 0.85
CheckUsermodePointerFunction · 0.85
get_atMethod · 0.80
ReceiveMethod · 0.80
get_lengthMethod · 0.45

Tested by

no test coverage detected