Periodically a customer^H^H^H^H^H^H^H^Huser will call in and ask what
the heck these messages are and why are we idiots who pass bad
parameters to syscalls... 

[Thu Mar 21 10:04:08 2002] [error] (22)Invalid argument: getsockname
[Thu Mar 21 10:05:03 2002] [warn] (22)Invalid argument: setsockopt: (TCP_NODELAY)

After the meaning of this is explained, some will call back and say
they're getting a zillion of them and want to know the client.
Figuring that out involves some tcpdump hocus pocus.

With the following patch, the log messages look like this:

[Wed Jan 15 09:25:54 2003] [warn] (9)Bad file number: setsockopt: (TCP_NODELAY), 
client 9.27.32.119 probably dropped the connection
[Wed Jan 15 09:27:09 2003] [error] (9)Bad file number: getsockname, client 9.27.32.119 
probably dropped the connection

(errno is EBADF instead of EINVAL in these sample messages because the
way I drove the logging code was by inserting a temporary close() call
at an opportune point)

Index: main/http_main.c
===================================================================
RCS file: /home/cvs/apache-1.3/src/main/http_main.c,v
retrieving revision 1.599
diff -u -r1.599 http_main.c
--- main/http_main.c    9 Jan 2003 09:24:10 -0000       1.599
+++ main/http_main.c    15 Jan 2003 15:14:27 -0000
@@ -3555,7 +3555,7 @@
 }
 
 #if defined(TCP_NODELAY) && !defined(MPE) && !defined(TPF)
-static void sock_disable_nagle(int s)
+static void sock_disable_nagle(int s, struct sockaddr_in *sin_client)
 {
     /* The Nagle algorithm says that we should delay sending partial
      * packets in hopes of getting more data.  We don't want to do
@@ -3570,16 +3570,24 @@
 
     if (setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (char *) &just_say_no,
                   sizeof(int)) < 0) {
+        char buf[128];
+
+        if (sin_client) {
+            ap_snprintf(buf, sizeof(buf),
+                        ", client %pA probably dropped the connection",
+                        &sin_client->sin_addr);
+        }
 #ifdef NETWARE
         errno = WSAGetLastError();
 #endif
        ap_log_error(APLOG_MARK, APLOG_WARNING, server_conf,
-                   "setsockopt: (TCP_NODELAY)");
+                   "setsockopt: (TCP_NODELAY)%s",
+                     sin_client ? buf : "");
     }
 }
 
 #else
-#define sock_disable_nagle(s)  /* NOOP */
+#define sock_disable_nagle(s, c)       /* NOOP */
 #endif
 
 static int make_sock(pool *p, const struct sockaddr_in *server)
@@ -3663,7 +3671,7 @@
     }
 #endif
 
-    sock_disable_nagle(s);
+    sock_disable_nagle(s, NULL);
     sock_enable_linger(s);
 
     /*
@@ -4513,11 +4521,14 @@
 
        clen = sizeof(sa_server);
        if (getsockname(csd, &sa_server, &clen) < 0) {
-           ap_log_error(APLOG_MARK, APLOG_ERR, server_conf, "getsockname");
+           ap_log_error(APLOG_MARK, APLOG_ERR, server_conf, 
+                         "getsockname, client %pA probably dropped the "
+                         "connection", 
+                         &((struct sockaddr_in *)&sa_client)->sin_addr);
            continue;
        }
 
-       sock_disable_nagle(csd);
+       sock_disable_nagle(csd, (struct sockaddr_in *)&sa_client);
 
        (void) ap_update_child_status(my_child_num, SERVER_BUSY_READ,
                                   (request_rec *) NULL);
@@ -5884,7 +5895,7 @@
            memset(&sa_client, '\0', sizeof(sa_client));
        }
 
-       sock_disable_nagle(csd);
+       sock_disable_nagle(csd, (struct sockaddr_in *)&sa_client);
 
        (void) ap_update_child_status(child_num, SERVER_BUSY_READ,
                                   (request_rec *) NULL);


-- 
Jeff Trawick | [EMAIL PROTECTED]
Born in Roswell... married an alien...

Reply via email to