[prev in list] [next in list] [prev in thread] [next in thread]
List: apache-cvs
Subject: svn commit: r451580 - /httpd/httpd/trunk/modules/proxy/proxy_util.c
From: mturk () apache ! org
Date: 2006-09-30 11:04:47
Message-ID: 20060930110447.2380E1A981A () eris ! apache ! org
[Download RAW message or body]
Author: mturk
Date: Sat Sep 30 04:04:46 2006
New Revision: 451580
URL: http://svn.apache.org/viewvc?view=rev&rev=451580
Log:
Add alternative is_socket_connected implementation.
It works on win32 and linux for sure, so that's why
I put it inside the #ifdef.
Of course something like that needs APR abstraction.
Modified:
httpd/httpd/trunk/modules/proxy/proxy_util.c
Modified: httpd/httpd/trunk/modules/proxy/proxy_util.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/proxy_util.c?view=diff&rev=451580&r1=451579&r2=451580
==============================================================================
--- httpd/httpd/trunk/modules/proxy/proxy_util.c (original)
+++ httpd/httpd/trunk/modules/proxy/proxy_util.c Sat Sep 30 04:04:46 2006
@@ -2074,6 +2074,63 @@
return OK;
}
+#if defined(WIN32) || defined(LINUX)
+#define USE_ALTERNATE_IS_CONNECTED 1
+#else
+#define USE_ALTERNATE_IS_CONNECTED 0
+#endif
+
+#if USE_ALTERNATE_IS_CONNECTED
+static int is_socket_connected(apr_socket_t *socket)
+
+{
+ fd_set fd;
+ struct timeval tv;
+ int rc;
+ apr_os_sock_t sock;
+
+ if (apr_os_sock_get(&sock, socket) != APR_SUCCESS)
+ return 0;
+
+ FD_ZERO(&fd);
+ FD_SET(sock, &fd);
+
+ /* Wait one microsecond */
+ tv.tv_sec = 0;
+ tv.tv_usec = 1;
+
+ do {
+ rc = select((int)sock + 1, &fd, NULL, NULL, &tv);
+#if defined(WIN32) || (defined(NETWARE) && defined(__NOVELL_LIBC__))
+ errno = WSAGetLastError() - WSABASEERR;
+#endif
+ } while (rc == -1 && errno == EINTR);
+
+ if (rc == 0) {
+ /* If we get a timeout, then we are still connected */
+ return 1;
+ }
+ else if (rc == 1) {
+#if defined(WIN32) || (defined(NETWARE) && defined(__NOVELL_LIBC__))
+ u_long nr;
+ if (ioctlsocket(sock, FIONREAD, &nr) == 0) {
+ if (WSAGetLastError() == 0)
+ errno = 0;
+ else
+ errno = WSAGetLastError() - WSABASEERR;
+ return nr == 0 ? 0 : 1;
+ }
+ errno = WSAGetLastError() - WSABASEERR;
+#else
+ int nr;
+ if (ioctl(sock, FIONREAD, (void*)&nr) == 0) {
+ return nr == 0 ? 0 : 1;
+ }
+#endif
+ }
+ return 0;
+}
+#else
static int is_socket_connected(apr_socket_t *sock)
{
@@ -2097,6 +2154,7 @@
return 1;
}
}
+#endif /* USE_ALTERNATE_IS_CONNECTED */
PROXY_DECLARE(int) ap_proxy_connect_backend(const char *proxy_function,
proxy_conn_rec *conn,
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic