/*-----TCPSocket::ReceiveConnection-------------------------------------------- * Called to set up a given TCPSocket from an incoming connection on the * current TCPSocket *---------------------------------------------------------------------------*/ bool TCPSocket::RecvConnection(TCPSocket &newSocket) { socklen_t sizeofSockaddr = sizeof(myRemoteAddrStorage); bool success = false; // Make sure we stay under FD_SETSIZE // See: // * http://www.securityfocus.com/archive/1/490711 // * http://securityvulns.com/docs7669.html // for more details // This probably has no affect, since we are using multiple threads, but keep it here // to be used as a sanity check. int newDesc = accept(myDescriptor, (struct sockaddr*)&newSocket.myRemoteAddr, &sizeofSockaddr); if (newDesc < 0) { // Something went wrong, probably indicates an error somewhere else gLog.warning(tr("Cannot accept new connection:\n%s"), strerror(errno)); return false; } if (newDesc < static_cast<int>(FD_SETSIZE)) { newSocket.myDescriptor = newDesc; newSocket.SetLocalAddress(); success = true; } else { gLog.error(tr("Cannot accept new connection, too many descriptors in use.")); close(newDesc); } return success; }