X-Git-Url: http://www.privoxy.org/gitweb/?a=blobdiff_plain;f=jbsockets.c;h=76eddf4780451bc0a48117189668f2fcfa4d1daf;hb=a51f4b51843337c9335f6976a1acde693089de18;hp=0ce7507c113f5ead19e9a367d5717a18f19837c5;hpb=dde30f5e8bb12c63688330c97fde75493f92c09c;p=privoxy.git diff --git a/jbsockets.c b/jbsockets.c index 0ce7507c..76eddf47 100644 --- a/jbsockets.c +++ b/jbsockets.c @@ -1,4 +1,4 @@ -const char jbsockets_rcs[] = "$Id: jbsockets.c,v 1.104 2011/07/04 17:47:29 fabiankeil Exp $"; +const char jbsockets_rcs[] = "$Id: jbsockets.c,v 1.111 2011/12/10 17:26:30 fabiankeil Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/jbsockets.c,v $ @@ -12,10 +12,10 @@ const char jbsockets_rcs[] = "$Id: jbsockets.c,v 1.104 2011/07/04 17:47:29 fabia * Privoxy team. http://www.privoxy.org/ * * Based on the Internet Junkbuster originally written - * by and Copyright (C) 1997 Anonymous Coders and + * by and Copyright (C) 1997 Anonymous Coders and * Junkbusters Corporation. http://www.junkbusters.com * - * This program is free software; you can redistribute it + * This program is free software; you can redistribute it * and/or modify it under the terms of the GNU General * Public License as published by the Free Software * Foundation; either version 2 of the License, or (at @@ -168,7 +168,7 @@ jb_socket connect_to(const char *host, int portnum, struct client_state *csp) { log_error(LOG_LEVEL_ERROR, "Attempt %d of %d to connect to %s failed. Trying again.", - forwarded_connect_retries, csp->config->forwarded_connect_retries, host); + forwarded_connect_retries, csp->config->forwarded_connect_retries + 1, host); } } while (forwarded_connect_retries < csp->config->forwarded_connect_retries); @@ -313,6 +313,7 @@ static jb_socket rfc2553_connect_to(const char *host, int portnum, struct client if (errno != EINTR) { + socket_error = errno; close_socket(fd); connect_failed = 1; break; @@ -480,7 +481,7 @@ static jb_socket no_rfc2553_connect_to(const char *host, int portnum, struct cli { #ifdef _WIN32 if (errno == WSAEINPROGRESS) -#elif __OS2__ +#elif __OS2__ if (sock_errno() == EINPROGRESS) #else /* ifndef _WIN32 */ if (errno == EINPROGRESS) @@ -489,7 +490,7 @@ static jb_socket no_rfc2553_connect_to(const char *host, int portnum, struct cli break; } -#ifdef __OS2__ +#ifdef __OS2__ if (sock_errno() != EINTR) #else if (errno != EINTR) @@ -696,7 +697,7 @@ void close_socket(jb_socket fd) #if defined(_WIN32) || defined(__BEOS__) closesocket(fd); #elif defined(AMIGA) - CloseSocket(fd); + CloseSocket(fd); #elif defined(__OS2__) soclose(fd); #else @@ -975,6 +976,16 @@ void get_host_information(jb_socket afd, char **ip_address, char **port, log_error(LOG_LEVEL_ERROR, "getsockname() truncated server address"); return; } +/* + * XXX: Workaround for missing header on Windows when + * configured with --disable-ipv6-support. + * The proper fix is to not use NI_MAXSERV in + * that case. It works by accident on other platforms + * as in included unconditionally there. + */ +#ifndef NI_MAXSERV +#define NI_MAXSERV 32 +#endif *port = malloc(NI_MAXSERV); if (NULL == *port) { @@ -1005,7 +1016,6 @@ void get_host_information(jb_socket afd, char **ip_address, char **port, #else *ip_address = strdup(inet_ntoa(server.sin_addr)); snprintf(*port, NI_MAXSERV, "%hu", ntohs(server.sin_port)); - *port[NI_MAXSERV - 1] = '\0'; #endif /* HAVE_RFC2553 */ if (NULL == hostname) { @@ -1055,11 +1065,11 @@ void get_host_information(jb_socket afd, char **ip_address, char **port, } #elif defined(MUTEX_LOCKS_AVAILABLE) privoxy_mutex_lock(&resolver_mutex); - host = gethostbyaddr((const char *)&server.sin_addr, + host = gethostbyaddr((const char *)&server.sin_addr, sizeof(server.sin_addr), AF_INET); privoxy_mutex_unlock(&resolver_mutex); #else - host = gethostbyaddr((const char *)&server.sin_addr, + host = gethostbyaddr((const char *)&server.sin_addr, sizeof(server.sin_addr), AF_INET); #endif if (host == NULL) @@ -1081,12 +1091,13 @@ void get_host_information(jb_socket afd, char **ip_address, char **port, * * Function : accept_connection * - * Description : Accepts a connection on one of more socket. Sockets - * must have been created using bind_port(). + * Description : Accepts a connection on one of possibly multiple + * sockets. The socket(s) to check must have been + * created using bind_port(). * * Parameters : - * 1 : csp = Client state, cfd, ip_addr_str, and - * ip_addr_long will be set by this routine. + * 1 : csp = Client state, cfd, ip_addr_str, and + * ip_addr_long will be set by this routine. * 2 : fds = File descriptors returned from bind_port * * Returns : when a connection is accepted, it returns 1 (TRUE). @@ -1116,8 +1127,11 @@ int accept_connection(struct client_state * csp, jb_socket fds[]) c_length = sizeof(client); - /* Wait for a connection on any socket. Return immediately if no socket is - * listening. */ + /* + * Wait for a connection on any socket. + * Return immediately if no socket is listening. + * XXX: Why not treat this as fatal error? + */ FD_ZERO(&selected_fds); max_selected_socket = 0; for (i = 0; i < MAX_LISTENING_SOCKETS; i++) @@ -1160,9 +1174,9 @@ int accept_connection(struct client_state * csp, jb_socket fds[]) if (i >= MAX_LISTENING_SOCKETS) { log_error(LOG_LEVEL_ERROR, - "select(2) reported connected clients (number = %u, " - "descriptor boundary = %u), but none found.", - retval, max_selected_socket); + "select(2) reported connected clients (number = %u, " + "descriptor boundary = %u), but none found.", + retval, max_selected_socket); return 0; } fd = fds[i]; @@ -1205,7 +1219,7 @@ int accept_connection(struct client_state * csp, jb_socket fds[]) if (!csp->ip_addr_str || retval) { log_error(LOG_LEVEL_ERROR, "Can not save csp->ip_addr_str: %s", - (csp->ip_addr_str) ? gai_strerror(retval) : "Insuffcient memory"); + (csp->ip_addr_str) ? gai_strerror(retval) : "Insuffcient memory"); freez(csp->ip_addr_str); } #undef client @@ -1260,7 +1274,7 @@ unsigned long resolve_hostname_to_ip(const char *host) while (gethostbyname_r(host, &result, hbuf, HOSTENT_BUFFER_SIZE, &hostp, &thd_err) && (thd_err == TRY_AGAIN) && (dns_retries++ < MAX_DNS_RETRIES)) - { + { log_error(LOG_LEVEL_ERROR, "Timeout #%u while trying to resolve %s. Trying again.", dns_retries, host); @@ -1269,7 +1283,7 @@ unsigned long resolve_hostname_to_ip(const char *host) while (NULL == (hostp = gethostbyname_r(host, &result, hbuf, HOSTENT_BUFFER_SIZE, &thd_err)) && (thd_err == TRY_AGAIN) && (dns_retries++ < MAX_DNS_RETRIES)) - { + { log_error(LOG_LEVEL_ERROR, "Timeout #%u while trying to resolve %s. Trying again.", dns_retries, host); @@ -1291,7 +1305,7 @@ unsigned long resolve_hostname_to_ip(const char *host) privoxy_mutex_lock(&resolver_mutex); while (NULL == (hostp = gethostbyname(host)) && (h_errno == TRY_AGAIN) && (dns_retries++ < MAX_DNS_RETRIES)) - { + { log_error(LOG_LEVEL_ERROR, "Timeout #%u while trying to resolve %s. Trying again.", dns_retries, host); @@ -1324,7 +1338,7 @@ unsigned long resolve_hostname_to_ip(const char *host) errno = WSAEPROTOTYPE; #else errno = EPROTOTYPE; -#endif +#endif log_error(LOG_LEVEL_ERROR, "hostname %s resolves to unknown address type.", host); return(INADDR_NONE); }