static int do_directtcp_accept( XferElementGlue *self, int *socketp) { int sock; g_assert(*socketp != -1); if ((sock = interruptible_accept(*socketp, NULL, NULL, prolong_accept, self)) == -1) { /* if the accept was interrupted due to a cancellation, then do not * add a further error message */ if (errno == 0 && XFER_ELEMENT(self)->cancelled) return -1; xfer_cancel_with_error(XFER_ELEMENT(self), _("Error accepting incoming connection: %s"), strerror(errno)); wait_until_xfer_cancelled(XFER_ELEMENT(self)->xfer); return -1; } /* close the listening socket now, for good measure */ close(*socketp); *socketp = -1; g_debug("do_directtcp_accept: %d", sock); return sock; }
int stream_accept( int server_socket, int timeout, size_t sendsize, size_t recvsize) { time_t timeout_time; int connected_socket; int save_errno; in_port_t port; assert(server_socket >= 0); /* set the time we want to stop accepting */ timeout_time = time(NULL) + timeout; while(1) { addrlen = (socklen_t_equiv)sizeof(sockaddr_union); connected_socket = interruptible_accept(server_socket, (struct sockaddr *)&addr, &addrlen, stream_accept_prolong, &timeout_time); if(connected_socket < 0) { if (errno == 0) { g_debug(plural(_("stream_accept: timeout after %d second"), _("stream_accept: timeout after %d seconds"), timeout), timeout); errno = ETIMEDOUT; return -1; } break; } g_debug(_("stream_accept: connection from %s"), str_sockaddr(&addr)); /* * Make certain we got an inet connection and that it is not * from port 20 (a favorite unauthorized entry tool). */ if (SU_GET_FAMILY(&addr) == AF_INET #ifdef WORKING_IPV6 || SU_GET_FAMILY(&addr) == AF_INET6 #endif ){ port = SU_GET_PORT(&addr); if (port != (in_port_t)20) { try_socksize(connected_socket, SO_SNDBUF, sendsize); try_socksize(connected_socket, SO_RCVBUF, recvsize); return connected_socket; } else { g_debug(_("remote port is %u: ignored"), (unsigned int)port); } } else { #ifdef WORKING_IPV6 g_debug(_("family is %d instead of %d(AF_INET)" " or %d(AF_INET6): ignored"), SU_GET_FAMILY(&addr), AF_INET, AF_INET6); #else g_debug(_("family is %d instead of %d(AF_INET)" ": ignored"), SU_GET_FAMILY(&addr), AF_INET); #endif } aclose(connected_socket); } save_errno = errno; g_debug(_("stream_accept: accept() failed: %s"), strerror(save_errno)); errno = save_errno; return -1; }