config: allow to specify flags when registering modules.
First one is AP_MODULE_FLAG_ALWAYS_MERGE.
mod_ssl: follow up to r1809302.
Make use of AP_MODULE_FLAG_ALWAYS_MERGE.
config: follow up to r1809302.
We need to check that the module itself is at the right version.
config: follow up to r1809302.
Provide a convenient function to get module flags, and remove useless
AP_MODULE_HAS_FLAGS checks in the core, core's version is at current MMN.
config: follow up to r1809302.
Associate ap_get_module_flags() to MMN bump.
On the trunk:
mod_ssl: make the new module flag used.
Submitted by: ylavic, icing
Reviewed by: icing, ylavic, covener
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@
1821071 13f79535-47bb-0310-9956-
ffa450edef68
* 20120211.68 (2.4.26-dev) Add ap_get_basic_auth_components() and deprecate
* ap_get_basic_auth_pw()
* 20120211.69 (2.4.30-dev) Add ap_update_sb_handle()
+ * 20120211.70 (2.4.30-dev) Add flags field to module_struct and function
+ * ap_get_module_flags()
*/
#define MODULE_MAGIC_COOKIE 0x41503234UL /* "AP24" */
#ifndef MODULE_MAGIC_NUMBER_MAJOR
#define MODULE_MAGIC_NUMBER_MAJOR 20120211
#endif
-#define MODULE_MAGIC_NUMBER_MINOR 69 /* 0...n */
+#define MODULE_MAGIC_NUMBER_MINOR 70 /* 0...n */
/**
* Determine if the server's current MODULE_MAGIC_NUMBER is at least a
};
+/**
+ * Flags associated with a module.
+ */
+#define AP_MODULE_FLAG_NONE (0)
+#define AP_MODULE_FLAG_ALWAYS_MERGE (1 << 0)
+
/**
* Module structures. Just about everything is dispatched through
* these, directly or indirectly (through the command and handler
* @param p the pool to use for all allocations
*/
void (*register_hooks) (apr_pool_t *p);
+
+ /** A bitmask of AP_MODULE_FLAG_* */
+ int flags;
};
/**
AP_DECLARE(void) ap_set_module_config(ap_conf_vector_t *cv, const module *m,
void *val);
+/**
+ * When module flags have been introduced, and a way to check this.
+ */
+#define AP_MODULE_FLAGS_MMN_MAJOR 20120211
+#define AP_MODULE_FLAGS_MMN_MINOR 70
+#define AP_MODULE_HAS_FLAGS(m) \
+ AP_MODULE_MAGIC_AT_LEAST(AP_MODULE_FLAGS_MMN_MAJOR, \
+ AP_MODULE_FLAGS_MMN_MINOR)
+/**
+ * Generic accessor for the module's flags
+ * @param m The module to get the flags from.
+ * @return The module-specific flags
+ */
+AP_DECLARE(int) ap_get_module_flags(const module *m);
+
#if !defined(AP_DEBUG)
#define ap_get_module_config(v,m) \
ssl_config_server_merge, /* merge per-server config structures */
ssl_config_cmds, /* table of configuration directives */
ssl_register_hooks /* register hooks */
+#if defined(AP_MODULE_HAS_FLAGS)
+ ,AP_MODULE_FLAG_ALWAYS_MERGE /* flags */
+#endif
};
}
static void merge_server_configs(apr_pool_t *p, ap_conf_vector_t *base,
- ap_conf_vector_t *virt)
+ server_rec *virt)
{
/* Can reuse the 'virt' vector for the spine of it, since we don't
* have to deal with the moral equivalent of .htaccess files here...
*/
void **base_vector = (void **)base;
- void **virt_vector = (void **)virt;
+ void **virt_vector = (void **)virt->module_config;
module *modp;
for (modp = ap_top_module; modp; modp = modp->next) {
merger_func df = modp->merge_server_config;
int i = modp->module_index;
- if (!virt_vector[i])
- virt_vector[i] = base_vector[i];
- else if (df)
+ if (!virt_vector[i]) {
+ if (df && modp->create_server_config
+ && (ap_get_module_flags(modp) &
+ AP_MODULE_FLAG_ALWAYS_MERGE)) {
+ virt_vector[i] = (*modp->create_server_config)(p, virt);
+ }
+ else {
+ virt_vector[i] = base_vector[i];
+ df = NULL;
+ }
+ }
+ if (df) {
virt_vector[i] = (*df)(p, base_vector[i], virt_vector[i]);
+ }
}
}
dconf->log = &main_server->log;
for (virt = main_server->next; virt; virt = virt->next) {
- merge_server_configs(p, main_server->module_config,
- virt->module_config);
+ merge_server_configs(p, main_server->module_config, virt);
virt->lookup_defaults =
ap_merge_per_dir_configs(p, main_server->lookup_defaults,
return ((void **)cv)[m->module_index];
}
+AP_DECLARE(int) ap_get_module_flags(const module *m)
+{
+ if (m->version < AP_MODULE_FLAGS_MMN_MAJOR
+ || (m->version == AP_MODULE_FLAGS_MMN_MAJOR
+ && (m->minor_version < AP_MODULE_FLAGS_MMN_MINOR))) {
+ return 0;
+ }
+
+ return m->flags;
+}
+
#if defined(ap_get_core_module_config)
#undef ap_get_core_module_config
AP_DECLARE(void *) ap_get_core_module_config(const ap_conf_vector_t *cv);