Add Ian to the team
[privoxy.git] / jbsockets.c
index 0ce7507..76eddf4 100644 (file)
@@ -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 <netdb.h> 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);
       }