NLsocket loopback_AcceptConnection(NLsocket socket) { nl_socket_t *sock = nlSockets[socket]; NLint i; if(sock->listen == NL_FALSE) { nlSetError(NL_NOT_LISTEN); return NL_INVALID; } /* look for a valid socket */ for(i=0;i<NL_MAX_ACCEPT;i++) { if(sock->accept[i] != NL_INVALID) { NLsocket newsocket = loopback_Open(0, sock->type); NLsocket osock = sock->accept[i]; nl_socket_t *othersock = nlSockets[osock]; sock->accept[i] = NL_INVALID; if(newsocket != NL_INVALID) { nl_socket_t *newsock = nlSockets[newsocket]; nlLockSocket(osock, NL_BOTH); /* do the connecting */ newsock->consock = osock; newsock->remoteport = othersock->localport; othersock->consock = newsocket; othersock->remoteport = newsock->localport; newsock->connected = NL_TRUE; othersock->connected = NL_TRUE; othersock->connecting = NL_FALSE; loopback_SetAddrPort(&othersock->address, othersock->remoteport); loopback_SetAddrPort(&newsock->address, newsock->remoteport); nlUnlockSocket(osock, NL_BOTH); return newsocket; } } } nlSetError(NL_NO_PENDING); return NL_INVALID; }
static NLint loopback_WritePacket(NLsocket to, NLvoid *buffer, NLint nbytes, NLushort fromport) { nl_socket_t *sock = nlSockets[to]; NLint i, j; NLint c = 0; /* check the packet size */ if(nbytes > NL_MAX_PACKET_LENGTH) { nlSetError(NL_PACKET_SIZE); return NL_INVALID; } nlLockSocket(to, NL_READ); /* make sure we have an empty packet buffer */ if(sock->nextinfree == NL_INVALID) { /* all buffers were filled by last write */ /* check to see if any were emptied by a read */ i = NL_NUM_PACKETS; j = sock->nextinused; while(i-- > 0) { if(sock->inlen[j] == 0) { /* found the first free */ sock->nextinfree = j; break; } j++; if(j >= NL_NUM_PACKETS) { j = 0; } } if(sock->nextinfree == NL_INVALID) { nlUnlockSocket(to, NL_READ); /* none are free */ if(sock->type == NL_RELIABLE || sock->type == NL_RELIABLE_PACKETS) { return 0; } else { /* silently fail */ return nbytes; } } } /* write the port number */ writeShort(sock->inpacket[sock->nextinfree], c, fromport); /* copy the packet buffer */ memcpy(sock->inpacket[sock->nextinfree] + 2, buffer, (size_t)nbytes); sock->inlen[sock->nextinfree] = nbytes; sock->nextinfree++; if(sock->nextinfree >= NL_NUM_PACKETS) { sock->nextinfree = 0; } /* check for full packet buffers */ if(sock->inlen[sock->nextinfree] != 0) { sock->nextinfree = NL_INVALID; } nlUnlockSocket(to, NL_READ); return nbytes; }
~Unlocker() { nlUnlockSocket(socket, NL_BOTH); }