Hi,

The WIN2K and WINXP logs something like :
(32557)Socket is not connected: setsockopt(SO_UPDATE_ACCEPT_CONTEXT)
failed.
For almost each connection made.

Although this is not a fatal error, the setsockopt has no sense on the
socket that hasn't been accepted.
The patch calls the getsockopt and checks whether a connection has been
accepted and then calls the setsockopt to set the
SO_UPDATE_ACCEPT_CONTEXT.

MT.
Index: mpm_winnt.c
===================================================================
RCS file: /home/cvspublic/httpd-2.0/server/mpm/winnt/mpm_winnt.c,v
retrieving revision 1.195
diff -u -r1.195 mpm_winnt.c
--- mpm_winnt.c 2001/11/17 07:54:34     1.195
+++ mpm_winnt.c 2001/11/20 10:55:06
@@ -705,6 +705,7 @@
     DWORD BytesRead;
     SOCKET nlsd;
     int lasterror;
+    apr_int32_t seconds, bytes = sizeof(seconds);
 
     nlsd = (SOCKET) listen_socket;
 
@@ -728,16 +729,23 @@
             if (pCompContext->accept_socket == INVALID_SOCKET) {
                 ap_log_error(APLOG_MARK,APLOG_ERR, apr_get_netos_error(), 
ap_server_conf,
                              "winnt_accept: socket() failed. Process will exit.");
-                // return -1;
             }
-
-            /* SO_UPDATE_ACCEPT_CONTEXT is required for shutdown() to work */
-            if (setsockopt(pCompContext->accept_socket, SOL_SOCKET,
-                           SO_UPDATE_ACCEPT_CONTEXT, (char *)&nlsd,
-                           sizeof(nlsd))) {
-                ap_log_error(APLOG_MARK, APLOG_WARNING, apr_get_netos_error(), 
ap_server_conf,
-                             "setsockopt(SO_UPDATE_ACCEPT_CONTEXT) failed.");
-                /* Not a failure condition. Keep running. */
+            
+            /*  Check whether a connection has been accepted and then
+             *  inherit the properties of the socket listening socket.
+             *  If the socket is not connected, the getsockopt returns 0xFFFFFFFF.
+             */
+            if (getsockopt(pCompContext->accept_socket, SOL_SOCKET,
+                           SO_CONNECT_TIME, (char *)&seconds,
+                           (apr_int32_t *)&bytes) != 0xFFFFFFFF) {
+                /* SO_UPDATE_ACCEPT_CONTEXT is required for shutdown() to work */
+                if (setsockopt(pCompContext->accept_socket, SOL_SOCKET,
+                               SO_UPDATE_ACCEPT_CONTEXT, (char *)&nlsd,
+                               sizeof(nlsd))) {
+                    ap_log_error(APLOG_MARK, APLOG_WARNING, apr_get_netos_error(), 
+ap_server_conf,
+                                 "setsockopt(SO_UPDATE_ACCEPT_CONTEXT) failed.");
+                    /* Not a failure condition. Keep running. */
+                }
             }
         }
 

Reply via email to