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

Function SysAccept

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

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

Source from the content-addressed store, hash-verified

1240 * On Failure - return -1
1241 */
1242long 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

Callers

nothing calls this directly

Calls 8

GetCurrentProcessFunction · 0.85
WarningFunction · 0.85
CheckUsermodePointerFunction · 0.85
get_atMethod · 0.80
OpenFunction · 0.50
AcceptMethod · 0.45
get_lengthMethod · 0.45
add_backMethod · 0.45

Tested by

no test coverage detected