[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