> Actually, such defines might need to be a little more dynamic, but either > <IfDefine AP_MPM_THREADED> would be good, or if we absolutely > needed too, we could add <IfFeature FOO> where features could be > registered, by the core or by a loaded module.
to that end, here's a preliminary and rough patch for <IfServerIs !threaded> (substitute 'IfServerIs' for whatever you please - I'm not so good with names). I couldn't think of anything else to implement other than threadedness right now, but I guess we're discussing the concept at the moment so that's ok. I did almost start on <IfServerIs >= 2.1> but I thought that the new container semantics probably wouldn't go over well (and I wasn't entirely convinced that was a worthy thing to test at config time). --Geoff
Index: server/core.c =================================================================== RCS file: /home/cvspublic/httpd-2.0/server/core.c,v retrieving revision 1.252 diff -u -r1.252 core.c --- server/core.c 21 Nov 2003 15:02:04 -0000 1.252 +++ server/core.c 4 Dec 2003 19:57:35 -0000 @@ -90,6 +90,7 @@ #include "mod_core.h" #include "mod_proxy.h" #include "ap_listen.h" +#include "ap_mpm.h" /* LimitXMLRequestBody handling */ #define AP_LIMIT_UNSET ((long) -1) @@ -1928,6 +1929,60 @@ } } +static const char *start_ifserver(cmd_parms *cmd, void *mconfig, + const char *arg) +{ + const char *endp = ap_strrchr_c(arg, '>'); + int not = 0; + int soak = 1; + + if (endp == NULL) { + return unclosed_directive(cmd); + } + + arg = apr_pstrndup(cmd->pool, arg, endp - arg); + + if (arg[0] == '!') { + not = 1; + arg++; + } + + /* custom server properties - expand at will + * currently supports: + * "threaded" (true if MPM is threaded) + */ + + if (strcasecmp(arg, "threaded") == 0) { + int mpm_query_info; + + apr_status_t retval = ap_mpm_query(AP_MPMQ_IS_THREADED, &mpm_query_info); + + if (retval != APR_SUCCESS) { + return apr_pstrcat(cmd->pool, "<IfServerIs> could not query ", + ap_show_mpm(), " MPM for threads", NULL); + } + + if ((!not && mpm_query_info) || (not && !mpm_query_info)) { + soak = 0; + } + } + + if (soak) { + *(ap_directive_t **)mconfig = NULL; + return ap_soak_end_container(cmd, "<IfServerIs"); + } + else { + ap_directive_t *parent = NULL; + ap_directive_t *current = NULL; + const char *retval; + + retval = ap_build_cont_config(cmd->pool, cmd->temp_pool, cmd, + ¤t, &parent, "<IfServerIs"); + *(ap_directive_t **)mconfig = current; + return retval; + } +} + /* httpd.conf commands... beginning with the <VirtualHost> business */ static const char *virtualhost_section(cmd_parms *cmd, void *dummy, @@ -3073,6 +3128,8 @@ "Container for directives based on existance of specified modules"), AP_INIT_TAKE1("<IfDefine", start_ifdefine, NULL, EXEC_ON_READ | OR_ALL, "Container for directives based on existance of command line defines"), +AP_INIT_TAKE1("<IfServerIs", start_ifserver, NULL, EXEC_ON_READ | OR_ALL, + "Container for directives based on existance of a various server properties"), AP_INIT_RAW_ARGS("<DirectoryMatch", dirsection, (void*)1, RSRC_CONF, "Container for directives affecting resources located in the " "specified directories"),