############################################################################## # httpd-2.0.x backport of ap_vhost_iterate_given_conn() (r164538): # # http://svn.apache.org/viewvc?view=rev&revision=164538 # ############################################################################## diff -ur httpd-2.0.63.orig/include/ap_mmn.h httpd-2.0.63/include/ap_mmn.h --- httpd-2.0.63.orig/include/ap_mmn.h 2006-07-12 09:40:55.000000000 +0200 +++ httpd-2.0.63/include/ap_mmn.h 2007-12-20 01:19:03.000000000 +0100 @@ -87,6 +87,7 @@ * 20020903.11 (2.0.55-dev) added trace_enable to core_server_config * 20020903.12 (2.0.56-dev) added ap_get_server_revision / ap_version_t * 20020903.13 (2.0.62-dev) Add *ftp_directory_charset to proxy_dir_conf + * 20020903.14 (2.0.64-dev) added ap_vhost_iterate_given_conn */ #define MODULE_MAGIC_COOKIE 0x41503230UL /* "AP20" */ @@ -94,7 +95,7 @@ #ifndef MODULE_MAGIC_NUMBER_MAJOR #define MODULE_MAGIC_NUMBER_MAJOR 20020903 #endif -#define MODULE_MAGIC_NUMBER_MINOR 13 /* 0...n */ +#define MODULE_MAGIC_NUMBER_MINOR 14 /* 0...n */ /** * Determine if the server's current MODULE_MAGIC_NUMBER is at least a diff -ur httpd-2.0.63.orig/include/http_vhost.h httpd-2.0.63/include/http_vhost.h --- httpd-2.0.63.orig/include/http_vhost.h 2006-07-12 09:40:55.000000000 +0200 +++ httpd-2.0.63/include/http_vhost.h 2007-12-20 01:17:28.000000000 +0100 @@ -53,6 +53,30 @@ const char *arg); /** + * Callback function for every Name Based Virtual Host. + * @param baton Opaque user object + * @param conn The current Connection + * @param s The current Server + * @see ap_vhost_iterate_given_conn + * @return 0 on success, any non-zero return will stop the iteration. + */ +typedef int(*ap_vhost_iterate_conn_cb)(void* baton, conn_rec* conn, server_rec* s); + +/** + * For every virtual host on this connection, call func_cb. + * @param conn The current connection + * @param func_cb Function called for every Name Based Virtual Host for this + * connection. + * @param baton Opaque object passed to func_cb. + * @return The return value from func_cb. + * @note If func_cb returns non-zero, the function will return at this point, + * and not continue iterating the virtual hosts. + */ +AP_DECLARE(int) ap_vhost_iterate_given_conn(conn_rec *conn, + ap_vhost_iterate_conn_cb func_cb, + void* baton); + +/** * given an ip address only, give our best guess as to what vhost it is * @param conn The current connection */ diff -ur httpd-2.0.63.orig/server/vhost.c httpd-2.0.63/server/vhost.c --- httpd-2.0.63.orig/server/vhost.c 2006-07-12 09:40:55.000000000 +0200 +++ httpd-2.0.63/server/vhost.c 2007-12-20 01:17:11.000000000 +0100 @@ -984,6 +984,57 @@ } +/** + * For every virtual host on this connection, call func_cb. + */ +AP_DECLARE(int) ap_vhost_iterate_given_conn(conn_rec *conn, + ap_vhost_iterate_conn_cb func_cb, + void* baton) +{ + server_rec *s; + server_rec *last_s; + name_chain *src; + apr_port_t port; + int rv = 0; + + if (conn->vhost_lookup_data) { + last_s = NULL; + port = conn->local_addr->port; + + for (src = conn->vhost_lookup_data; src; src = src->next) { + server_addr_rec *sar; + + /* We only consider addresses on the name_chain which have a + * matching port. + */ + sar = src->sar; + if (sar->host_port != 0 && port != sar->host_port) { + continue; + } + + s = src->server; + + if (s == last_s) { + /* we've already done a callback for this vhost. */ + continue; + } + + last_s = s; + + rv = func_cb(baton, conn, s); + + if (rv != 0) { + break; + } + } + } + else { + rv = func_cb(baton, conn, conn->base_server); + } + + return rv; +} + /* Called for a new connection which has a known local_addr. Note that the * new connection is assumed to have conn->server == main server. */