-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.49 2008/11/10 17:03:57 fabiankeil Exp $";
/*********************************************************************
*
* File : $Source: /cvsroot/ijbswa/current/jbsockets.c,v $
*
* Revisions :
* $Log: jbsockets.c,v $
+ * Revision 1.49 2008/11/10 17:03:57 fabiankeil
+ * Fix a gcc44 warning and remove a now-obsolete cast.
+ *
+ * Revision 1.48 2008/09/04 08:13:58 fabiankeil
+ * Prepare for critical sections on Windows by adding a
+ * layer of indirection before the pthread mutex functions.
+ *
+ * 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.
*
* Parameters :
* 1 : host = hostname to connect to
- * 2 : portnum = port to connent on
+ * 2 : portnum = port to connent on (XXX: should be unsigned)
* 3 : csp = Current client state (buffers, headers, etc...)
* Not modified, only used for source IP and ACL.
*
{
struct sockaddr_in inaddr;
jb_socket fd;
- int addr;
+ unsigned int addr;
fd_set wfds;
struct timeval tv[1];
#if !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA)
}
#ifdef FEATURE_ACL
- dst->addr = ntohl((unsigned long) addr);
+ dst->addr = ntohl(addr);
dst->port = portnum;
if (block_acl(dst, csp))
}
+/*********************************************************************
+ *
+ * Function : data_is_available
+ *
+ * Description : Waits for data to arrive on a socket.
+ *
+ * Parameters :
+ * 1 : fd = file descriptor of the socket to read
+ * 2 : seconds_to_wait = number of seconds after which we give up.
+ *
+ * Returns : TRUE if data arrived in time,
+ * FALSE otherwise.
+ *
+ *********************************************************************/
+int data_is_available(jb_socket fd, int seconds_to_wait)
+{
+ fd_set rfds;
+ struct timeval timeout;
+ int n;
+
+ memset(&timeout, 0, sizeof(timeout));
+ timeout.tv_sec = seconds_to_wait;
+
+#ifdef __OS2__
+ /* Copy and pasted from jcc.c ... */
+ memset(&rfds, 0, sizeof(fd_set));
+#else
+ FD_ZERO(&rfds);
+#endif
+ FD_SET(fd, &rfds);
+
+ n = select(fd+1, &rfds, NULL, NULL, &timeout);
+
+ /*
+ * XXX: Do we care about the different error conditions?
+ */
+ return (n == 1);
+}
+
+
/*********************************************************************
*
* Function : close_socket
* 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.
*
#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,
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);
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))
{
"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))