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

Function SysReceiveFrom

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

* SysReceiveFrom (sockfd, buf, len, flags, srcaddr, addrlen) - Receive data through a socket * sockfd - Socket file descriptor * buf - data * len - data length * srcaddr - Source address * addrlen - Address length * * On Success - return amount of data read * On Failure - return -1 */

Source from the content-addressed store, hash-verified

1443 * On Failure - return -1
1444 */
1445long SysReceiveFrom(regs64_t* r){
1446 process_t* proc = Scheduler::GetCurrentProcess();
1447 fs_fd_t* handle = proc->fileDescriptors.get_at(SC_ARG0(r));
1448
1449 uint8_t* buffer = (uint8_t*)(SC_ARG1(r));
1450 size_t len = SC_ARG2(r);
1451 uint64_t flags = SC_ARG3(r);
1452
1453 if(!handle){
1454 Log::Warning("sys_send: Invalid file descriptor: ", SC_ARG0(r));
1455 return -1;
1456 }
1457
1458 if((handle->node->flags & FS_NODE_TYPE) != FS_NODE_SOCKET){
1459 Log::Warning("sys_send: File (Descriptor: %d) is not a socket", SC_ARG0(r));
1460 return -2;
1461 }
1462
1463 if(!Memory::CheckUsermodePointer(SC_ARG1(r), len, proc->addressSpace)){
1464 Log::Warning("sys_send: Invalid buffer ptr");
1465 return -3;
1466 }
1467
1468 socklen_t* slen = (socklen_t*)SC_ARG2(r);
1469
1470 sockaddr_t* addr = (sockaddr_t*)SC_ARG1(r);
1471
1472 Socket* sock = (Socket*)handle->node;
1473 return sock->ReceiveFrom(buffer, len, flags, addr, slen);
1474}
1475
1476/*
1477 * SetGetUID () - Get Process UID

Callers

nothing calls this directly

Calls 5

GetCurrentProcessFunction · 0.85
WarningFunction · 0.85
CheckUsermodePointerFunction · 0.85
get_atMethod · 0.80
ReceiveFromMethod · 0.45

Tested by

no test coverage detected