Factor receive_client_request() and
[privoxy.git] / jbsockets.c
index 74a3e43..d601fb2 100644 (file)
@@ -1,4 +1,4 @@
-const char jbsockets_rcs[] = "$Id: jbsockets.c,v 1.45 2007/09/30 16:59:22 fabiankeil Exp $";
+const char jbsockets_rcs[] = "$Id: jbsockets.c,v 1.47 2008/03/26 18:07:07 fabiankeil Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/jbsockets.c,v $
@@ -35,6 +35,14 @@ const char jbsockets_rcs[] = "$Id: jbsockets.c,v 1.45 2007/09/30 16:59:22 fabian
  *
  * Revisions   :
  *    $Log: jbsockets.c,v $
+ *    Revision 1.47  2008/03/26 18:07:07  fabiankeil
+ *    Add hostname directive. Closes PR#1918189.
+ *
+ *    Revision 1.46  2008/03/21 11:13:57  fabiankeil
+ *    Only gather host information if it's actually needed.
+ *    Also move the code out of accept_connection() so it's less likely
+ *    to delay other incoming connections if the host is misconfigured.
+ *
  *    Revision 1.45  2007/09/30 16:59:22  fabiankeil
  *    Set the maximum listen() backlog to 128. Apparently SOMAXCONN is
  *    neither high enough, nor a hard limit on mingw32. Again for BR#1795281.
@@ -724,7 +732,8 @@ int bind_port(const char *hostnam, int portnum, jb_socket *pfd)
  *          2  :  ip_address = Pointer to return the pointer to
  *                             the ip address string.
  *          3  :  hostname =   Pointer to return the pointer to
- *                             the hostname.
+ *                             the hostname or NULL if the caller
+ *                             isn't interested in it.
  *
  * Returns     :  void.
  *
@@ -750,12 +759,24 @@ void get_host_information(jb_socket afd, char **ip_address, char **hostname)
 #endif /* def HAVE_GETHOSTBYADDR_R_(8|7|5)_ARGS */
    s_length = sizeof(server);
 
-   *hostname = NULL;
+   if (NULL != hostname)
+   {
+      *hostname = NULL;
+   }
    *ip_address = NULL;
 
    if (!getsockname(afd, (struct sockaddr *) &server, &s_length))
    {
       *ip_address = strdup(inet_ntoa(server.sin_addr));
+
+      if (NULL == hostname)
+      {
+         /*
+          * We're done here, the caller isn't
+          * interested in knowing the hostname.
+          */
+         return;
+      }
 #if defined(HAVE_GETHOSTBYADDR_R_8_ARGS)
       gethostbyaddr_r((const char *)&server.sin_addr,
                       sizeof(server.sin_addr), AF_INET,
@@ -777,10 +798,10 @@ void get_host_information(jb_socket afd, char **ip_address, char **hostname)
          host = NULL;
       }
 #elif FEATURE_PTHREAD
-      pthread_mutex_lock(&resolver_mutex);
+      privoxy_mutex_lock(&resolver_mutex);
       host = gethostbyaddr((const char *)&server.sin_addr, 
                            sizeof(server.sin_addr), AF_INET);
-      pthread_mutex_unlock(&resolver_mutex);
+      privoxy_mutex_unlock(&resolver_mutex);
 #else
       host = gethostbyaddr((const char *)&server.sin_addr, 
                            sizeof(server.sin_addr), AF_INET);
@@ -923,7 +944,7 @@ unsigned long resolve_hostname_to_ip(const char *host)
          hostp = NULL;
       }
 #elif FEATURE_PTHREAD
-      pthread_mutex_lock(&resolver_mutex);
+      privoxy_mutex_lock(&resolver_mutex);
       while (NULL == (hostp = gethostbyname(host))
              && (h_errno == TRY_AGAIN) && (dns_retries++ < MAX_DNS_RETRIES))
       {   
@@ -931,7 +952,7 @@ unsigned long resolve_hostname_to_ip(const char *host)
             "Timeout #%u while trying to resolve %s. Trying again.",
             dns_retries, host);
       }
-      pthread_mutex_unlock(&resolver_mutex);
+      privoxy_mutex_unlock(&resolver_mutex);
 #else
       while (NULL == (hostp = gethostbyname(host))
              && (h_errno == TRY_AGAIN) && (dns_retries++ < MAX_DNS_RETRIES))