* SysSendTo (sockfd, buf, len, flags, destaddr, addrlen) - Send data through a socket * sockfd - Socket file descriptor * buf - data * len - data length * destaddr - Destination address * addrlen - Address length * * On Success - return amount of data sent * On Failure - return -1 */
| 1364 | * On Failure - return -1 |
| 1365 | */ |
| 1366 | long SysSendTo(regs64_t* r){ |
| 1367 | process_t* proc = Scheduler::GetCurrentProcess(); |
| 1368 | fs_fd_t* handle = proc->fileDescriptors.get_at(SC_ARG0(r)); |
| 1369 | |
| 1370 | uint8_t* buffer = (uint8_t*)(SC_ARG1(r)); |
| 1371 | size_t len = SC_ARG2(r); |
| 1372 | uint64_t flags = SC_ARG3(r); |
| 1373 | |
| 1374 | if(!handle){ |
| 1375 | Log::Warning("sys_send: Invalid file descriptor: ", SC_ARG0(r)); |
| 1376 | return -1; |
| 1377 | } |
| 1378 | |
| 1379 | if((handle->node->flags & FS_NODE_TYPE) != FS_NODE_SOCKET){ |
| 1380 | Log::Warning("sys_send: File (Descriptor: %d) is not a socket", SC_ARG0(r)); |
| 1381 | return -2; |
| 1382 | } |
| 1383 | |
| 1384 | if(!Memory::CheckUsermodePointer(SC_ARG1(r), len, proc->addressSpace)){ |
| 1385 | Log::Warning("sys_send: Invalid buffer ptr"); |
| 1386 | return -3; |
| 1387 | } |
| 1388 | |
| 1389 | socklen_t slen = SC_ARG2(r); |
| 1390 | |
| 1391 | sockaddr_t* addr = (sockaddr_t*)SC_ARG1(r); |
| 1392 | |
| 1393 | Socket* sock = (Socket*)handle->node; |
| 1394 | return sock->SendTo(buffer, len, flags, addr, slen); |
| 1395 | } |
| 1396 | |
| 1397 | /* |
| 1398 | * SysReceive (sockfd, buf, len, flags) - Receive data through a socket |
nothing calls this directly
no test coverage detected