X-Git-Url: http://www.privoxy.org/gitweb/?a=blobdiff_plain;f=jbsockets.c;h=7ed443973fc1d6c80d95c939e2fa4f3c25b7c7d9;hb=4c5d9731001ca7082db2c70a2e45106ee7869b2d;hp=3ef7fb06c40e06c288d6ffd515d463acdf248586;hpb=b64613e1426a856490e86e67052f094fc8b09b75;p=privoxy.git diff --git a/jbsockets.c b/jbsockets.c index 3ef7fb06..7ed44397 100644 --- a/jbsockets.c +++ b/jbsockets.c @@ -1,4 +1,4 @@ -const char jbsockets_rcs[] = "$Id: jbsockets.c,v 1.62 2009/06/10 22:36:01 david__schmidt Exp $"; +const char jbsockets_rcs[] = "$Id: jbsockets.c,v 1.64 2009/06/13 11:37:07 fabiankeil Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/jbsockets.c,v $ @@ -200,7 +200,7 @@ jb_socket connect_to(const char *host, int portnum, struct client_state *csp) { log_error(LOG_LEVEL_ERROR, "Out of memory while getting the server IP address."); - return; + return JB_INVALID_SOCKET; } retval = getnameinfo(rp->ai_addr, rp->ai_addrlen, csp->http->host_ip_addr_str, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); @@ -1207,6 +1207,9 @@ unsigned long resolve_hostname_to_ip(const char *host) *********************************************************************/ int socket_is_still_usable(jb_socket sfd) { + char buf[10]; + int no_data_waiting; + #ifdef HAVE_POLL int poll_result; struct pollfd poll_fd[1]; @@ -1217,20 +1220,16 @@ int socket_is_still_usable(jb_socket sfd) poll_result = poll(poll_fd, 1, 0); - if (-1 != poll_result) - { - return !(poll_fd[0].revents & POLLIN); - } - else + if (-1 == poll_result) { log_error(LOG_LEVEL_CONNECT, "Polling socket %d failed.", sfd); return FALSE; } + no_data_waiting = !(poll_fd[0].revents & POLLIN); #else fd_set readable_fds; struct timeval timeout; int ret; - int socket_is_alive = 0; memset(&timeout, '\0', sizeof(timeout)); FD_ZERO(&readable_fds); @@ -1239,17 +1238,13 @@ int socket_is_still_usable(jb_socket sfd) ret = select((int)sfd+1, &readable_fds, NULL, NULL, &timeout); if (ret < 0) { - log_error(LOG_LEVEL_ERROR, "select() failed!: %E"); + log_error(LOG_LEVEL_CONNECT, "select() on socket %d failed: %E", sfd); + return FALSE; } - - /* - * XXX: I'm not sure why !FD_ISSET() works, - * but apparently it does. - */ - socket_is_alive = !FD_ISSET(sfd, &readable_fds); - - return socket_is_alive; + no_data_waiting = !FD_ISSET(sfd, &readable_fds); #endif /* def HAVE_POLL */ + + return (no_data_waiting || (1 == recv(sfd, buf, 1, MSG_PEEK))); } #endif /* def FEATURE_CONNECTION_KEEP_ALIVE */