Variant f_stream_socket_accept(CObjRef server_socket, double timeout /* = 0.0 */, VRefParam peername /* = null */) { Socket *sock = server_socket.getTyped<Socket>(); pollfd p; int n; p.fd = sock->fd(); p.events = (POLLIN|POLLERR|POLLHUP); p.revents = 0; IOStatusHelper io("socket_accept"); n = poll(&p, 1, (uint64)(timeout * 1000.0)); if (n > 0) { struct sockaddr sa; socklen_t salen = sizeof(sa); Socket *new_sock = socket_accept_impl(server_socket, &sa, &salen); peername = get_sockaddr_name(&sa, salen); if (new_sock) return Object(new_sock); } else if (n < 0) { sock->setError(errno); } else { sock->setError(ETIMEDOUT); } return false; }
Variant f_stream_socket_accept(const Resource& server_socket, double timeout /* = -1.0 */, VRefParam peername /* = null */) { Socket *sock = server_socket.getTyped<Socket>(); pollfd p; int n; p.fd = sock->fd(); p.events = (POLLIN|POLLERR|POLLHUP); p.revents = 0; IOStatusHelper io("socket_accept"); if (timeout == -1) { timeout = ThreadInfo::s_threadInfo.getNoCheck()-> m_reqInjectionData.getSocketDefaultTimeout(); } n = poll(&p, 1, (uint64_t)(timeout * 1000.0)); if (n > 0) { struct sockaddr sa; socklen_t salen = sizeof(sa); Socket *new_sock = socket_accept_impl(server_socket, &sa, &salen); peername = get_sockaddr_name(&sa, salen); if (new_sock) return Resource(new_sock); } else if (n < 0) { sock->setError(errno); } else { sock->setError(ETIMEDOUT); } return false; }