From: Colm MacCarthaigh Date: Mon, 23 Jan 2006 19:49:13 +0000 (+0000) Subject: Merge r157583 from trunk: X-Git-Tag: 2.0.56~92 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=592d60b6f4b32e6286cfe4df48ce9785833a4c71;p=thirdparty%2Fapache%2Fhttpd.git Merge r157583 from trunk: Add ReceiveBufferSize directive to control the TCP receive buffer. Submitted by: Eric Covener Reviewed by: Justin Erenkrantz (with minor formatting tweaks) git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.0.x@371640 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index 9a932f1dd0b..3f65abc6168 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,9 @@ -*- coding: utf-8 -*- Changes with Apache 2.0.56 + *) Add ReceiveBufferSize directive to control the TCP receive buffer. + [Eric Covener ] + *) mod_cache: Fix 'Vary: *' behavior to be RFC compliant. PR 16125. [Paul Querna] diff --git a/STATUS b/STATUS index b3b657f25b2..5e62acd5d6f 100644 --- a/STATUS +++ b/STATUS @@ -141,12 +141,6 @@ PATCHES ACCEPTED TO BACKPORT FROM TRUNK: +1: trawick, wrowe, colm backported 280114 to 2.2.x branch already - *) Add ReceiveBufferSize directive to control the TCP receive buffer. - code: http://svn.apache.org/viewcvs?view=rev&rev=157583 - http://svn.apache.org/viewcvs?rev=280401&view=rev - docs: http://svn.apache.org/viewcvs?rev=280384&view=rev - +1: stas, trawick, colm - *) mod_dav: Fix a null pointer dereference in an error code path during the handling of MKCOL. Trunk version of patch: diff --git a/include/ap_listen.h b/include/ap_listen.h index 0e020018015..cd622bb834f 100644 --- a/include/ap_listen.h +++ b/include/ap_listen.h @@ -102,6 +102,9 @@ const char *ap_set_listenbacklog(cmd_parms *cmd, void *dummy, const char *arg); const char *ap_set_listener(cmd_parms *cmd, void *dummy, const char *ips); const char *ap_set_send_buffer_size(cmd_parms *cmd, void *dummy, const char *arg); +AP_DECLARE_NONSTD(const char *) ap_set_receive_buffer_size(cmd_parms *cmd, + void *dummy, + const char *arg); #define LISTEN_COMMANDS \ AP_INIT_TAKE1("ListenBacklog", ap_set_listenbacklog, NULL, RSRC_CONF, \ @@ -109,6 +112,8 @@ AP_INIT_TAKE1("ListenBacklog", ap_set_listenbacklog, NULL, RSRC_CONF, \ AP_INIT_TAKE1("Listen", ap_set_listener, NULL, RSRC_CONF, \ "A port number or a numeric IP address and a port number"), \ AP_INIT_TAKE1("SendBufferSize", ap_set_send_buffer_size, NULL, RSRC_CONF, \ - "Send buffer size in bytes") + "Send buffer size in bytes"), \ +AP_INIT_TAKE1("ReceiveBufferSize", ap_set_receive_buffer_size, NULL, \ + RSRC_CONF, "Receive buffer size in bytes") #endif diff --git a/server/listen.c b/server/listen.c index 4663ba31d0d..39408a38a49 100644 --- a/server/listen.c +++ b/server/listen.c @@ -40,6 +40,7 @@ static int default_family = APR_INET; static ap_listen_rec *old_listeners; static int ap_listenbacklog; static int send_buffer_size; +static int receive_buffer_size; /* TODO: make_sock is just begging and screaming for APR abstraction */ static apr_status_t make_sock(apr_pool_t *p, ap_listen_rec *server) @@ -118,6 +119,16 @@ static apr_status_t make_sock(apr_pool_t *p, ap_listen_rec *server) /* not a fatal error */ } } + if (receive_buffer_size) { + stat = apr_socket_opt_set(s, APR_SO_RCVBUF, receive_buffer_size); + if (stat != APR_SUCCESS && stat != APR_ENOTIMPL) { + ap_log_perror(APLOG_MARK, APLOG_WARNING, stat, p, + "make_sock: failed to set ReceiveBufferSize for " + "address %pI, using default", + server->bind_addr); + /* not a fatal error */ + } + } #if APR_TCP_NODELAY_INHERITED ap_sock_disable_nagle(s); @@ -462,3 +473,22 @@ const char *ap_set_send_buffer_size(cmd_parms *cmd, void *dummy, send_buffer_size = s; return NULL; } + +AP_DECLARE_NONSTD(const char *) ap_set_receive_buffer_size(cmd_parms *cmd, + void *dummy, + const char *arg) +{ + int s = atoi(arg); + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + + if (err != NULL) { + return err; + } + + if (s < 512 && s != 0) { + return "ReceiveBufferSize must be >= 512 bytes, or 0 for system default."; + } + + receive_buffer_size = s; + return NULL; +}