* 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 */
| 1443 | * On Failure - return -1 |
| 1444 | */ |
| 1445 | long 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 |
nothing calls this directly
no test coverage detected