* SysAccept (sockfd, addr, addrlen) - Accept socket connection * sockfd - Socket file descriptor * addr - sockaddr structure * addrlen - size of addr * * On Success - return file descriptor of accepted socket * On Failure - return -1 */
| 1240 | * On Failure - return -1 |
| 1241 | */ |
| 1242 | long SysAccept(regs64_t* r){ |
| 1243 | process_t* proc = Scheduler::GetCurrentProcess(); |
| 1244 | fs_fd_t* handle = proc->fileDescriptors.get_at(SC_ARG0(r)); |
| 1245 | if(!handle){ |
| 1246 | Log::Warning("sys_accept: Invalid file descriptor: ", SC_ARG0(r)); |
| 1247 | return -1; |
| 1248 | } |
| 1249 | |
| 1250 | if((handle->node->flags & FS_NODE_TYPE) != FS_NODE_SOCKET){ |
| 1251 | Log::Warning("sys_accept: File (Descriptor: %d) is not a socket", SC_ARG0(r)); |
| 1252 | return -2; |
| 1253 | } |
| 1254 | |
| 1255 | socklen_t* len = (socklen_t*)SC_ARG2(r); |
| 1256 | if(len && !Memory::CheckUsermodePointer(SC_ARG2(r), sizeof(socklen_t), proc->addressSpace)){ |
| 1257 | Log::Warning("sys_accept: Invalid socklen ptr"); |
| 1258 | return -3; |
| 1259 | } |
| 1260 | |
| 1261 | sockaddr_t* addr = (sockaddr_t*)SC_ARG1(r); |
| 1262 | if(addr && !Memory::CheckUsermodePointer(SC_ARG1(r), *len, proc->addressSpace)){ |
| 1263 | Log::Warning("sys_accept: Invalid sockaddr ptr"); |
| 1264 | return -3; |
| 1265 | } |
| 1266 | |
| 1267 | Socket* sock = (Socket*)handle->node; |
| 1268 | |
| 1269 | Socket* newSock = sock->Accept(addr, len, handle->mode); |
| 1270 | if(!newSock){ |
| 1271 | return -1; |
| 1272 | } |
| 1273 | |
| 1274 | int fd = proc->fileDescriptors.get_length(); |
| 1275 | fs_fd_t* newHandle = fs::Open(newSock); |
| 1276 | proc->fileDescriptors.add_back(newHandle); |
| 1277 | |
| 1278 | if(newSock) |
| 1279 | return fd; |
| 1280 | else |
| 1281 | return -1; |
| 1282 | } |
| 1283 | |
| 1284 | /* |
| 1285 | * SysConnect (sockfd, addr, addrlen) - Initiate socket connection |
nothing calls this directly
no test coverage detected