20#define APR_WANT_STRFUNC
39#undef APLOG_MODULE_INDEX
40#define APLOG_MODULE_INDEX AP_CORE_MODULE_INDEX
70#ifdef AP_ENABLE_V4_MAPPED
82 "make_sock: for address %pI, apr_socket_opt_set: (SO_REUSEADDR)",
92 "make_sock: for address %pI, apr_socket_opt_set: (SO_KEEPALIVE)",
103 "make_sock: for address %pI, apr_socket_opt_set: "
135 "make_sock: failed to set SendBufferSize for "
136 "address %pI, using default",
145 "make_sock: failed to set ReceiveBufferSize for "
146 "address %pI, using default",
152#if APR_TCP_NODELAY_INHERITED
156#if defined(SO_REUSEPORT)
161 (
void *)&
one,
sizeof(
int)) < 0) {
164 "make_sock: for address %pI, apr_socket_opt_set: "
175 "make_sock: could not bind to address %pI",
183 "make_sock: unable to listen for connections "
204 "make_sock: for address %pI, apr_socket_opt_set: (SO_REUSEADDR)",
254#if APR_HAS_SO_ACCEPTFILTER
262 "Failed to enable the '%s' Accept Filter",
269 "Failed to enable APR_TCP_DEFER_ACCEPT");
289#if APR_VERSION_AT_LEAST(1,7,0)
332 from = &(*from)->
next;
349 return "Cannot define multiple Listeners on the same IP:port";
356 return "Cannot define a slave on the same IP:port as a Listener";
365 "alloc_listener: failed to set up sockaddr for %s",
367 return "Listen setup failed";
403 "alloc_listener: failed to get a socket for %s",
405 return "Listen setup failed";
408#if APR_VERSION_AT_LEAST(1,7,0)
413 "alloc_listener: failed to set scope for %pI to %s",
415 return "Listen step failed";
434#define IS_INADDR_ANY(addr) ((addr)->family == APR_INET \
435 && (addr)->sa.sin.sin_addr.s_addr == INADDR_ANY)
439#define IS_IN6ADDR_ANY(addr) ((addr)->family == APR_INET6 \
440 && IN6_IS_ADDR_UNSPECIFIED(&(addr)->sa.sin6.sin6_addr))
455#if AP_NONBLOCK_WHEN_MULTI_LISTEN
489 &&
lr->bind_addr->port ==
lr->next->bind_addr->port
512 if (
lr->bind_addr->port ==
cur->bind_addr->port
544 &&
lr->bind_addr->port ==
lr->next->bind_addr->port
576#if AP_NONBLOCK_WHEN_MULTI_LISTEN
589 "unable to control socket non-blocking status");
629 lr->bind_addr->port ==
addr->host_port) {
654 lr->bind_addr->port ==
addr->host_port) {
682#ifdef _SC_NPROCESSORS_ONLN
690 "Using %i listeners bucket(s) based on %i "
691 "online CPU cores and a ratio of %i",
699 "ListenCoresBucketsRatio ignored without "
700 "SO_REUSEPORT and _SC_NPROCESSORS_ONLN "
701 "support: using a single listeners bucket");
722 port =
lr->bind_addr->port;
730 "ap_duplicate_listeners: for address %pI, "
731 "cannot duplicate a new socket!",
736#if AP_NONBLOCK_WHEN_MULTI_LISTEN
741 "unable to control socket non-blocking status");
793 if (
lr->slave != slave) {
829#if defined(SO_REUSEPORT) && defined(__linux__)
860 return "Listen requires 1 or 2 arguments.";
865 return "Invalid address or port";
872#if !APR_VERSION_AT_LEAST(1,7,0)
875 "Scope ID in address '",
argv[0],
882 return "Port must be specified";
914 return "ListenBacklog must be > 0";
934 return "ListenCoresBucketsRatio must be > 0";
952 if (
s < 512 &&
s != 0) {
953 return "SendBufferSize must be >= 512 bytes, or 0 for system default.";
971 if (
s < 512 &&
s != 0) {
972 return "ReceiveBufferSize must be >= 512 bytes, or 0 for system default.";
Symbol export macros and hook functions.
#define AP_DECLARE_NONSTD(type)
Apache Listeners Library.
APR Versioning Interface.
#define APR_VERSION_STRING
APR Standard Headers Support.
#define ap_get_core_module_config(v)
void ap_set_server_protocol(server_rec *s, const char *proto)
const char * ap_get_server_protocol(server_rec *s)
struct ap_slave_t ap_slave_t
void ap_close_listeners(void)
const char * ap_set_listenbacklog(cmd_parms *cmd, void *dummy, const char *arg)
const char * ap_set_send_buffer_size(cmd_parms *cmd, void *dummy, const char *arg)
int ap_num_listen_buckets
const char * ap_set_listencbratio(cmd_parms *cmd, void *dummy, const char *arg)
const char * ap_set_listener(cmd_parms *cmd, void *dummy, int argc, char *const argv[])
int ap_close_selected_listeners(ap_slave_t *slave)
void ap_close_listeners_ex(ap_listen_rec *listeners)
void ap_listen_pre_config(void)
apr_status_t ap_duplicate_listeners(apr_pool_t *p, server_rec *s, ap_listen_rec ***buckets, int *num_buckets)
ap_listen_rec * ap_listeners
int ap_setup_listeners(server_rec *s)
const char * ap_set_receive_buffer_size(cmd_parms *cmd, void *dummy, const char *arg)
const char apr_port_t port
#define ap_sock_disable_nagle(s)
#define DEFAULT_LISTENBACKLOG
#define APR_STATUS_IS_ENOTIMPL(s)
apr_memcache_server_t * server
void ap_str_tolower(char *s)
const char * ap_check_cmd_context(cmd_parms *cmd, unsigned forbidden)
const char int apr_pool_t * pool
#define apr_get_netos_error()
apr_int32_t apr_int32_t on
#define apr_pcalloc(p, size)
#define APR_TCP_DEFER_ACCEPT
apr_int32_t apr_int32_t apr_int32_t err
static int find_listeners(ap_listen_rec **from, ap_listen_rec **to, const char *addr, apr_port_t port, const char *scope_id, apr_pool_t *temp_pool)
static int send_buffer_size
static apr_status_t close_listeners_on_exec(void *v)
static ap_listen_rec ** ap_listen_buckets
static int ap_listencbratio
static void ap_apply_accept_filter(apr_pool_t *p, ap_listen_rec *lis, server_rec *server)
#define IS_IN6ADDR_ANY(addr)
static apr_status_t make_sock(apr_pool_t *p, ap_listen_rec *server)
static int match_address(const apr_sockaddr_t *sa, const char *hostname, apr_port_t port, const char *scope_id, apr_pool_t *p)
static int ap_listenbacklog
#define IS_INADDR_ANY(addr)
static const char * alloc_listener(process_rec *process, const char *addr, apr_port_t port, const char *proto, const char *scope_id, void *slave, apr_pool_t *temp_pool)
static const char * find_accf_name(server_rec *s, const char *proto)
static int receive_buffer_size
static int open_listeners(apr_pool_t *pool)
static ap_listen_rec * old_listeners
static unsigned long num_buckets
Multi-Processing Modules functions.
Apache's listeners record.
apr_sockaddr_t * bind_addr
A structure that represents one process.
A structure to be used for Per-vhost config.
A structure to store information for each virtual server.
apr_status_t apr_os_sock_get(apr_os_sock_t *thesock, apr_socket_t *sock)
apr_status_t apr_socket_listen(apr_socket_t *sock, apr_int32_t backlog)
apr_status_t apr_socket_bind(apr_socket_t *sock, apr_sockaddr_t *sa)
apr_status_t apr_socket_close(apr_socket_t *thesocket)
apr_status_t apr_socket_create(apr_socket_t **new, int ofamily, int type, int protocol, apr_pool_t *cont)
apr_status_t apr_socket_opt_set(apr_socket_t *sock, apr_int32_t opt, apr_int32_t on)
apr_status_t apr_socket_opt_get(apr_socket_t *sock, apr_int32_t opt, apr_int32_t *on)