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)
{
return 1;
}
}
+#endif /* USE_ALTERNATE_IS_CONNECTED */
PROXY_DECLARE(int) ap_proxy_connect_backend(const char *proxy_function,
proxy_conn_rec *conn,