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...