You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by nd...@apache.org on 2004/04/11 18:37:43 UTC
cvs commit: httpd-2.0/modules/metadata mod_version.c mod_version.dsp mod_version.exp config.m4
nd 2004/04/11 09:37:43
Modified: . Apache.dsw CHANGES Makefile.win
modules/metadata config.m4
Added: modules/metadata mod_version.c mod_version.dsp
mod_version.exp
Log:
nobody came up with another patch or objections and it should not get lost:
add mod_version and invoke it into *x (modules = all) and win32 builds
Revision Changes Path
1.102 +24 -0 httpd-2.0/Apache.dsw
Index: Apache.dsw
===================================================================
RCS file: /home/cvs/httpd-2.0/Apache.dsw,v
retrieving revision 1.101
retrieving revision 1.102
diff -u -u -r1.101 -r1.102
--- Apache.dsw 16 May 2003 18:21:10 -0000 1.101
+++ Apache.dsw 11 Apr 2004 16:37:42 -0000 1.102
@@ -198,6 +198,9 @@
Project_Dep_Name mod_usertrack
End Project Dependency
Begin Project Dependency
+ Project_Dep_Name mod_version
+ End Project Dependency
+ Begin Project Dependency
Project_Dep_Name mod_vhost_alias
End Project Dependency
Begin Project Dependency
@@ -1738,6 +1741,27 @@
###############################################################################
Project: "mod_usertrack"=".\modules\metadata\mod_usertrack.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name libapr
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libaprutil
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libhttpd
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "mod_version"=".\modules\metadata\mod_version.dsp" - Package Owner=<4>
Package=<5>
{{{
1.1455 +3 -0 httpd-2.0/CHANGES
Index: CHANGES
===================================================================
RCS file: /home/cvs/httpd-2.0/CHANGES,v
retrieving revision 1.1454
retrieving revision 1.1455
diff -u -u -r1.1454 -r1.1455
--- CHANGES 10 Apr 2004 21:44:43 -0000 1.1454
+++ CHANGES 11 Apr 2004 16:37:43 -0000 1.1455
@@ -2,6 +2,9 @@
[Remove entries to the current 2.0 section below, when backported]
+ *) Added new module mod_version, which provides version dependent
+ configuration containers. [Andr� Malo]
+
*) Accept URLs for the ServerAdmin directive. If the supplied
argument is not recognized as an URL, assume it's a mail address.
PR 28174. [Andr� Malo]
1.139 +2 -0 httpd-2.0/Makefile.win
Index: Makefile.win
===================================================================
RCS file: /home/cvs/httpd-2.0/Makefile.win,v
retrieving revision 1.138
retrieving revision 1.139
diff -u -u -r1.138 -r1.139
--- Makefile.win 15 Mar 2004 21:20:15 -0000 1.138
+++ Makefile.win 11 Apr 2004 16:37:43 -0000 1.139
@@ -284,6 +284,7 @@
$(MAKE) $(MAKEOPT) -f mod_setenvif.mak CFG="mod_setenvif - Win32 $(LONG)" RECURSE=0 $(CTARGET)
$(MAKE) $(MAKEOPT) -f mod_unique_id.mak CFG="mod_unique_id - Win32 $(LONG)" RECURSE=0 $(CTARGET)
$(MAKE) $(MAKEOPT) -f mod_usertrack.mak CFG="mod_usertrack - Win32 $(LONG)" RECURSE=0 $(CTARGET)
+ $(MAKE) $(MAKEOPT) -f mod_version.mak CFG="mod_version - Win32 $(LONG)" RECURSE=0 $(CTARGET)
cd ..\..
cd modules\proxy
$(MAKE) $(MAKEOPT) -f mod_proxy.mak CFG="mod_proxy - Win32 $(LONG)" RECURSE=0 $(CTARGET)
@@ -420,6 +421,7 @@
copy modules\metadata\$(LONG)\mod_setenvif.$(src_so) "$(inst_so)" <.y
copy modules\metadata\$(LONG)\mod_unique_id.$(src_so) "$(inst_so)" <.y
copy modules\metadata\$(LONG)\mod_usertrack.$(src_so) "$(inst_so)" <.y
+ copy modules\metadata\$(LONG)\mod_version.$(src_so) "$(inst_so)" <.y
copy modules\proxy\$(LONG)\mod_proxy.$(src_so) "$(inst_so)" <.y
copy modules\proxy\$(LONG)\mod_proxy_connect.$(src_so) "$(inst_so)" <.y
copy modules\proxy\$(LONG)\mod_proxy_ftp.$(src_so) "$(inst_so)" <.y
1.8 +1 -0 httpd-2.0/modules/metadata/config.m4
Index: config.m4
===================================================================
RCS file: /home/cvs/httpd-2.0/modules/metadata/config.m4,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -u -r1.7 -r1.8
--- config.m4 8 Jan 2004 20:47:29 -0000 1.7
+++ config.m4 11 Apr 2004 16:37:43 -0000 1.8
@@ -18,5 +18,6 @@
APACHE_MODULE(unique_id, per-request unique ids)
APACHE_MODULE(setenvif, basing ENV vars on headers, , , yes)
+APACHE_MODULE(version, determining httpd version in config files)
APACHE_MODPATH_FINISH
1.1 httpd-2.0/modules/metadata/mod_version.c
Index: mod_version.c
===================================================================
/* Copyright 2004 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* mod_version.c
* Allow conditional configuration depending on the httpd version
*
* Andr� Malo (nd/perlig.de), January 2004
*
* Some stuff coded here is heavily based on the core <IfModule>
* containers.
*
* The module makes the following confgurations possible:
*
* <IfVersion op major.minor.patch>
* # conditional config here ...
*</IfVersion>
*
* where "op" is one of:
* = / == equal
* > greater than
* >= greater or equal
* < less than
* <= less or equal
*
* If minor version and patch level are omitted they are assumed to be 0.
*
* Alternatively you can match the whole version (including some vendor-added
* string of the CORE version, see ap_release.h) against a regular expression:
*
* <IfVersion op regex>
* # conditional config here ...
*</IfVersion>
*
* where "op" is one of:
* = / == match; regex must be surrounded by slashes
* ~ match; regex MAY NOT be surrounded by slashes
*
* Note that all operators may be preceeded by an exclamation mark
* (without spaces) in order to reverse their meaning.
*
*/
#include "apr.h"
#include "apr_strings.h"
#include "apr_lib.h"
#include "httpd.h"
#include "http_config.h"
#include "http_log.h"
/* module structure */
module AP_MODULE_DECLARE_DATA version_module;
/* queried httpd version */
static ap_version_t httpd_version;
/*
* compare the supplied version with the core one
*/
static int compare_version(char *version_string, const char **error)
{
char *p = version_string, *ep;
int version[3] = {0, 0, 0};
int c = 0;
*error = "Version appears to be invalid. It must have the format "
"major[.minor[.patch]] where major, minor and patch are "
"numbers.";
if (!apr_isdigit(*p)) {
return 0;
}
/* parse supplied version */
ep = version_string + strlen(version_string);
while (p <= ep && c < 3) {
if (*p == '.') {
*p = '\0';
}
if (!*p) {
version[c++] = atoi(version_string);
version_string = ++p;
continue;
}
if (!apr_isdigit(*p)) {
break;
}
++p;
}
if (p < ep) { /* syntax error */
return 0;
}
*error = NULL;
if (httpd_version.major > version[0]) {
return 1;
}
else if (httpd_version.major < version[0]) {
return -1;
}
else if (httpd_version.minor > version[1]) {
return 1;
}
else if (httpd_version.minor < version[1]) {
return -1;
}
else if (httpd_version.patch > version[2]) {
return 1;
}
else if (httpd_version.patch < version[2]) {
return -1;
}
/* seems to be the same */
return 0;
}
/*
* match version against a regular expression
*/
static int match_version(apr_pool_t *pool, char *version_string,
const char **error)
{
regex_t *compiled;
const char *to_match;
int rc;
compiled = ap_pregcomp(pool, version_string, REG_EXTENDED);
if (!compiled) {
*error = "Unable to compile regular expression";
return 0;
}
*error = NULL;
to_match = apr_psprintf(pool, "%d.%d.%d%s",
httpd_version.major,
httpd_version.minor,
httpd_version.patch,
httpd_version.add_string);
rc = !ap_regexec(compiled, to_match, 0, NULL, 0);
ap_pregfree(pool, compiled);
return rc;
}
/*
* Implements the <IfVersion> container
*/
static const char *start_ifversion(cmd_parms *cmd, void *mconfig,
const char *arg1, const char *arg2,
const char *arg3)
{
const char *endp;
int reverse = 0, done = 0, match = 0, compare;
const char *p, *error;
char c;
/* supplying one argument is possible, we assume an equality check then */
if (!arg2) {
arg2 = arg1;
arg1 = "=";
}
/* surrounding quotes without operator */
if (!arg3 && *arg2 == '>' && !arg2[1]) {
arg3 = ">";
arg2 = arg1;
arg1 = "=";
}
/* the third argument makes version surrounding quotes plus operator
* possible.
*/
endp = arg2 + strlen(arg2);
if ( endp == arg2
|| (!(arg3 && *arg3 == '>' && !arg3[1]) && *--endp != '>')) {
return apr_pstrcat(cmd->pool, cmd->cmd->name,
"> directive missing closing '>'", NULL);
}
p = arg1;
if (*p == '!') {
reverse = 1;
if (p[1]) {
++p;
}
}
c = *p++;
if (!*p || (*p == '=' && !p[1] && c != '~')) {
if (!httpd_version.major) {
ap_get_server_revision(&httpd_version);
}
done = 1;
switch (c) {
case '=':
/* normal comparison */
if (*arg2 != '/') {
compare = compare_version(apr_pstrmemdup(cmd->pool, arg2,
endp-arg2),
&error);
if (error) {
return error;
}
match = !compare;
break;
}
/* regexp otherwise */
if (endp == ++arg2 || *--endp != '/') {
return "Missing delimiting / of regular expression.";
}
case '~':
/* regular expression */
match = match_version(cmd->pool, apr_pstrmemdup(cmd->pool, arg2,
endp-arg2),
&error);
if (error) {
return error;
}
break;
case '<':
compare = compare_version(apr_pstrmemdup(cmd->pool, arg2,
endp-arg2),
&error);
if (error) {
return error;
}
match = ((-1 == compare) || (*p && !compare));
break;
case '>':
compare = compare_version(apr_pstrmemdup(cmd->pool, arg2,
endp-arg2),
&error);
if (error) {
return error;
}
match = ((1 == compare) || (*p && !compare));
break;
default:
done = 0;
break;
}
}
if (!done) {
return apr_pstrcat(cmd->pool, "unrecognized operator '", arg1, "'",
NULL);
}
if ((!reverse && match) || (reverse && !match)) {
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, "<IfVersion");
*(ap_directive_t **)mconfig = current;
return retval;
}
*(ap_directive_t **)mconfig = NULL;
return ap_soak_end_container(cmd, "<IfVersion");
}
static const command_rec version_cmds[] = {
AP_INIT_TAKE123("<IfVersion", start_ifversion, NULL, EXEC_ON_READ | OR_ALL,
"a comparison operator, a version (and a delimiter)"),
{ NULL }
};
module AP_MODULE_DECLARE_DATA version_module =
{
STANDARD20_MODULE_STUFF,
NULL, /* dir config creater */
NULL, /* dir merger --- default is to override */
NULL, /* server config */
NULL, /* merge server configs */
version_cmds, /* command apr_table_t */
NULL, /* register hooks */
};
1.1 httpd-2.0/modules/metadata/mod_version.dsp
Index: mod_version.dsp
===================================================================
# Microsoft Developer Studio Project File - Name="mod_version" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
CFG=mod_version - Win32 Release
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
!MESSAGE use the Export Makefile command and run
!MESSAGE
!MESSAGE NMAKE /f "mod_version.mak".
!MESSAGE
!MESSAGE You can specify a configuration when running NMAKE
!MESSAGE by defining the macro CFG on the command line. For example:
!MESSAGE
!MESSAGE NMAKE /f "mod_version.mak" CFG="mod_version - Win32 Release"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "mod_version - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "mod_version - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE
# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
MTL=midl.exe
RSC=rc.exe
!IF "$(CFG)" == "mod_version - Win32 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "Release"
# PROP BASE Intermediate_Dir "Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c
# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_version_src" /FD /c
# ADD BASE MTL /nologo /D "NDEBUG" /win32
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /d "NDEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /machine:I386 /out:"Release/mod_version.so" /base:@..\..\os\win32\BaseAddr.ref,mod_version.so
# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /machine:I386 /out:"Release/mod_version.so" /base:@..\..\os\win32\BaseAddr.ref,mod_version.so /opt:ref
!ELSEIF "$(CFG)" == "mod_version - Win32 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "Debug"
# PROP BASE Intermediate_Dir "Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MDd /W3 /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c
# ADD CPP /nologo /MDd /W3 /GX /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_version_src" /FD /c
# ADD BASE MTL /nologo /D "_DEBUG" /win32
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /d "_DEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /machine:I386 /out:"Debug/mod_version.so" /base:@..\..\os\win32\BaseAddr.ref,mod_version.so
# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /machine:I386 /out:"Debug/mod_version.so" /base:@..\..\os\win32\BaseAddr.ref,mod_version.so
!ENDIF
# Begin Target
# Name "mod_version - Win32 Release"
# Name "mod_version - Win32 Debug"
# Begin Source File
SOURCE=.\mod_version.c
# End Source File
# Begin Source File
SOURCE=.\mod_version.rc
# End Source File
# Begin Source File
SOURCE=..\..\build\win32\win32ver.awk
!IF "$(CFG)" == "mod_version - Win32 Release"
# PROP Ignore_Default_Tool 1
# Begin Custom Build - Creating Version Resource
InputPath=..\..\build\win32\win32ver.awk
".\mod_version.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
awk -f ../../build/win32/win32ver.awk mod_version.so "version_module for Apache" ../../include/ap_release.h > .\mod_version.rc
# End Custom Build
!ELSEIF "$(CFG)" == "mod_version - Win32 Debug"
# PROP Ignore_Default_Tool 1
# Begin Custom Build - Creating Version Resource
InputPath=..\..\build\win32\win32ver.awk
".\mod_version.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
awk -f ../../build/win32/win32ver.awk mod_version.so "version_module for Apache" ../../include/ap_release.h > .\mod_version.rc
# End Custom Build
!ENDIF
# End Source File
# End Target
# End Project
1.1 httpd-2.0/modules/metadata/mod_version.exp
Index: mod_version.exp
===================================================================
version_module