diff --git a/trunk/.gdbinit b/.gdbinit similarity index 100% rename from trunk/.gdbinit rename to .gdbinit diff --git a/trunk/ABOUT_APACHE b/ABOUT_APACHE similarity index 100% rename from trunk/ABOUT_APACHE rename to ABOUT_APACHE diff --git a/trunk/Apache.dsw b/Apache.dsw similarity index 100% rename from trunk/Apache.dsw rename to Apache.dsw diff --git a/trunk/BuildBin.dsp b/BuildBin.dsp similarity index 100% rename from trunk/BuildBin.dsp rename to BuildBin.dsp diff --git a/trunk/CHANGES b/CHANGES similarity index 100% rename from trunk/CHANGES rename to CHANGES diff --git a/trunk/INSTALL b/INSTALL similarity index 100% rename from trunk/INSTALL rename to INSTALL diff --git a/trunk/InstallBin.dsp b/InstallBin.dsp similarity index 100% rename from trunk/InstallBin.dsp rename to InstallBin.dsp diff --git a/trunk/LAYOUT b/LAYOUT similarity index 100% rename from trunk/LAYOUT rename to LAYOUT diff --git a/trunk/LICENSE b/LICENSE similarity index 100% rename from trunk/LICENSE rename to LICENSE diff --git a/Makefile.in b/Makefile.in index 2a64d5b380c72cadbebdaed77e5830924f556438..6d8348d9f4210e8fda8662dc6ab9d0cd5e945aa6 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1,38 +1,212 @@ -# Copyright 2001-2005 The Apache Software Foundation or its licensors, as -# applicable. -# -# 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. - -# -# standard stuff -# - -include $(top_srcdir)/build/special.mk - -# -# developer stuff -# (we really don't expect end users to use these targets!) -# - -ssl_expr_scan.c: $(top_srcdir)/modules/ssl/ssl_expr_scan.l ssl_expr_parse.h - flex -Pssl_expr_yy -s -B $(top_srcdir)/modules/ssl/ssl_expr_scan.l - sed -e '/$$Header:/d' ssl_expr_scan.c && rm -f lex.ssl_expr_yy.c - -ssl_expr_parse.c ssl_expr_parse.h: $(top_srcdir)/modules/ssl/ssl_expr_parse.y - yacc -d $(top_srcdir)/modules/ssl/ssl_expr_parse.y - sed -e 's;yy;ssl_expr_yy;g' \ - -e '/#if defined(c_plusplus) || defined(__cplusplus)/,/#endif/d' \ - ssl_expr_parse.c && rm -f y.tab.c - sed -e 's;yy;ssl_expr_yy;g' \ - ssl_expr_parse.h && rm -f y.tab.h +SUBDIRS = srclib os server modules support +CLEAN_SUBDIRS = test + +PROGRAM_NAME = $(progname) +PROGRAM_SOURCES = modules.c +PROGRAM_LDADD = buildmark.o $(HTTPD_LDFLAGS) $(PROGRAM_DEPENDENCIES) $(EXTRA_LIBS) $(AP_LIBS) $(LIBS) +PROGRAM_PRELINK = $(COMPILE) -c $(top_srcdir)/server/buildmark.c +PROGRAM_DEPENDENCIES = \ + server/libmain.la \ + $(BUILTIN_LIBS) \ + $(MPM_LIB) \ + os/$(OS_DIR)/libos.la + +PROGRAMS = $(PROGRAM_NAME) +TARGETS = $(PROGRAMS) $(shared_build) $(other_targets) +INSTALL_TARGETS = install-conf install-htdocs install-error install-icons \ + install-other install-cgi install-include install-suexec install-build \ + install-man + +DISTCLEAN_TARGETS = include/ap_config_auto.h include/ap_config_layout.h \ + modules.c config.cache config.log config.status build/config_vars.mk \ + build/rules.mk docs/conf/httpd-std.conf docs/conf/ssl-std.conf shlibtool +EXTRACLEAN_TARGETS = configure include/ap_config_auto.h.in generated_lists \ + httpd.spec + +include $(top_builddir)/build/rules.mk +include $(top_srcdir)/build/program.mk + +install-conf: + @echo Installing configuration files ; \ + if [ ! -d $(DESTDIR)$(sysconfdir) ]; then \ + $(MKINSTALLDIRS) $(DESTDIR)$(sysconfdir) ; \ + fi ; \ + if [ ! -d $(DESTDIR)$(sysconfdir)/extra ]; then \ + $(MKINSTALLDIRS) $(DESTDIR)$(sysconfdir)/extra ; \ + fi ; \ + if [ ! -d $(DESTDIR)$(sysconfdir)/original ]; then \ + $(MKINSTALLDIRS) $(DESTDIR)$(sysconfdir)/original ; \ + $(MKINSTALLDIRS) $(DESTDIR)$(sysconfdir)/original/extra ; \ + fi ; \ + cd $(top_srcdir)/docs/conf; \ + for i in mime.types magic; do \ + if test ! -f $(DESTDIR)$(sysconfdir)/$$i; then \ + $(INSTALL_DATA) $$i $(DESTDIR)$(sysconfdir); \ + fi; \ + done; \ + for j in $(top_srcdir)/docs/conf $(top_builddir)/docs/conf ; do \ + cd $$j ; \ + for i in httpd.conf extra/httpd-*.conf; do \ + ( \ + n_lm=`awk 'BEGIN {n=0} /@@LoadModule@@/ {n+=1} END {print n}' < $$i`; \ + if test $$n_lm -eq 0 -o "x$(DSO_MODULES)" = "x"; then \ + sed -e 's#@@ServerRoot@@#$(prefix)#g' \ + -e 's#@@Port@@#$(PORT)#g' \ + -e '/@@LoadModule@@/d' \ + < $$i; \ + else \ + sed -n -e '/@@LoadModule@@/q' \ + -e 's#@@ServerRoot@@#$(prefix)#g' \ + -e 's#@@Port@@#$(PORT)#g' \ + -e 'p' \ + < $$i; \ + for j in $(DSO_MODULES) "^EOL^"; do \ + if test $$j != "^EOL^"; then \ + echo "LoadModule $${j}_module $(rel_libexecdir)/mod_$${j}.so"; \ + fi; \ + done; \ + sed -e '1,/@@LoadModule@@/d' \ + -e '/@@LoadModule@@/d' \ + -e 's#@@ServerRoot@@#$(prefix)#g' \ + -e 's#@@Port@@#$(PORT)#g' \ + < $$i; \ + fi \ + ) > $(DESTDIR)$(sysconfdir)/original/$$i; \ + chmod 0644 $(DESTDIR)$(sysconfdir)/original/$$i; \ + file=$$i; \ + if [ "$$i" = "httpd.conf" ]; then \ + file=`echo $$i|sed s/.*.conf/$(PROGRAM_NAME).conf/`; \ + fi; \ + if test ! -f $(DESTDIR)$(sysconfdir)/$$file; then \ + $(INSTALL_DATA) $(DESTDIR)$(sysconfdir)/original/$$i $(DESTDIR)$(sysconfdir)/$$file; \ + fi; \ + done ; \ + done ; \ + if test -f "$(builddir)/envvars-std"; then \ + cp -p envvars-std $(DESTDIR)$(sbindir); \ + if test ! -f $(DESTDIR)$(sbindir)/envvars; then \ + cp -p envvars-std $(DESTDIR)$(sbindir)/envvars ; \ + fi ; \ + fi + +install-build: + @echo Installing build system files + @test -d $(DESTDIR)$(installbuilddir) || $(MKINSTALLDIRS) $(DESTDIR)$(installbuilddir) + @cp $(top_srcdir)/build/*.mk $(DESTDIR)$(installbuilddir); \ + cp build/*.mk $(DESTDIR)$(installbuilddir); \ + sed "/^LIBTOOL/s#/[^ ]*/libtool \(.*\)#`$(APR_CONFIG) --apr-libtool` $(LTFLAGS)#" \ + build/config_vars.mk > $(DESTDIR)$(installbuilddir)/config_vars.mk; \ + cp $(top_srcdir)/build/instdso.sh $(DESTDIR)$(installbuilddir); \ + cp $(top_builddir)/config.nice $(DESTDIR)$(installbuilddir); + +htdocs-srcdir = $(top_srcdir)/docs/docroot + +docs:: + mkdir -p ./docs/api + srclib/apr/build/scandoc.pl -i./build/default.pl -p./docs/api/ ./include/*.h + +dox:: + doxygen $(top_srcdir)/docs/doxygen.conf + +install-htdocs: + -@if [ -d $(DESTDIR)$(htdocsdir) ]; then \ + echo "[PRESERVING EXISTING HTDOCS SUBDIR: $(DESTDIR)$(htdocsdir)]"; \ + else \ + echo Installing HTML documents ; \ + $(MKINSTALLDIRS) $(DESTDIR)$(htdocsdir) ; \ + test -d $(htdocs-srcdir) && (cd $(htdocs-srcdir) && cp -rp * $(DESTDIR)$(htdocsdir)) ; \ + cd $(DESTDIR)$(htdocsdir) && find . -name ".svn" -type d -print | xargs rm -rf 2>/dev/null || true; \ + fi + +install-error: + -@if [ -d $(DESTDIR)$(errordir) ]; then \ + echo "[PRESERVING EXISTING ERROR SUBDIR: $(DESTDIR)$(errordir)]"; \ + else \ + echo Installing error documents ; \ + $(MKINSTALLDIRS) $(DESTDIR)$(errordir) ; \ + cd $(top_srcdir)/docs/error && cp -rp * $(DESTDIR)$(errordir) ; \ + test "x$(errordir)" != "x" && cd $(DESTDIR)$(errordir) && find . -name ".svn" -type d -print | xargs rm -rf 2>/dev/null || true; \ + fi + +install-icons: + -@if [ -d $(DESTDIR)$(iconsdir) ]; then \ + echo "[PRESERVING EXISTING ICONS SUBDIR: $(DESTDIR)$(iconsdir)]"; \ + else \ + echo Installing icons ; \ + $(MKINSTALLDIRS) $(DESTDIR)$(iconsdir) ; \ + cd $(top_srcdir)/docs/icons && cp -rp * $(DESTDIR)$(iconsdir) ; \ + test "x$(iconsdir)" != "x" && cd $(DESTDIR)$(iconsdir) && find . -name ".svn" -type d -print | xargs rm -rf 2>/dev/null || true; \ + fi + +install-cgi: + -@if [ -d $(DESTDIR)$(cgidir) ];then \ + echo "[PRESERVING EXISTING CGI SUBDIR: $(DESTDIR)$(cgidir)]"; \ + else \ + echo Installing CGIs ; \ + $(MKINSTALLDIRS) $(DESTDIR)$(cgidir) ; \ + cd $(top_srcdir)/docs/cgi-examples && cp -rp * $(DESTDIR)$(cgidir) ; \ + test "x$(cgidir)" != "x" && cd $(DESTDIR)$(cgidir) && find . -name ".svn" -type d -print | xargs rm -rf 2>/dev/null || true; \ + fi + +install-other: + @test -d $(DESTDIR)$(logfiledir) || $(MKINSTALLDIRS) $(DESTDIR)$(logfiledir) + @test -d $(DESTDIR)$(runtimedir) || $(MKINSTALLDIRS) $(DESTDIR)$(runtimedir) + @for ext in dll x; do \ + file=apachecore.$$ext; \ + if test -f $$file; then \ + cp -p $$file $(DESTDIR)$(libdir); \ + fi; \ + done; \ + file=httpd.dll; \ + if test -f $$file; then \ + cp -p $$file $(DESTDIR)$(bindir); \ + fi; + +install-include: + @echo Installing header files + @test -d $(DESTDIR)$(includedir) || $(MKINSTALLDIRS) $(DESTDIR)$(includedir) + @cp -p include/*.h $(DESTDIR)$(includedir) + @cp -p $(srcdir)/include/*.h $(DESTDIR)$(includedir) + @cp -p $(srcdir)/os/$(OS_DIR)/os.h $(DESTDIR)$(includedir) + @if test -f $(srcdir)/os/$(OS_DIR)/os-inline.c; then \ + cp -p $(srcdir)/os/$(OS_DIR)/os-inline.c $(DESTDIR)$(includedir); \ + fi; + @cp -p $(srcdir)/server/mpm/$(MPM_SUBDIR_NAME)/*.h $(DESTDIR)$(includedir) + @cp -p $(srcdir)/modules/aaa/mod_auth.h $(DESTDIR)$(includedir) + @cp -p $(srcdir)/modules/dav/main/mod_dav.h $(DESTDIR)$(includedir) + @cp -p $(srcdir)/modules/filters/mod_include.h $(DESTDIR)$(includedir) + @cp -p $(srcdir)/modules/generators/mod_cgi.h $(DESTDIR)$(includedir) + @cp -p $(srcdir)/modules/generators/mod_status.h $(DESTDIR)$(includedir) + @cp -p $(srcdir)/modules/loggers/mod_log_config.h $(DESTDIR)$(includedir) + @cp -p $(srcdir)/modules/http/mod_core.h $(DESTDIR)$(includedir) + @cp -p $(srcdir)/modules/proxy/mod_proxy.h $(DESTDIR)$(includedir) + @cp -p $(srcdir)/modules/ssl/mod_ssl.h $(DESTDIR)$(includedir) + @cp -p $(srcdir)/os/$(OS_DIR)/*.h $(DESTDIR)$(includedir) + @chmod 644 $(DESTDIR)$(includedir)/*.h + +install-man: + @echo Installing man pages and online manual + @test -d $(DESTDIR)$(mandir) || $(MKINSTALLDIRS) $(DESTDIR)$(mandir) + @test -d $(DESTDIR)$(mandir)/man1 || $(MKINSTALLDIRS) $(DESTDIR)$(mandir)/man1 + @test -d $(DESTDIR)$(mandir)/man8 || $(MKINSTALLDIRS) $(DESTDIR)$(mandir)/man8 + @test -d $(DESTDIR)$(manualdir) || $(MKINSTALLDIRS) $(DESTDIR)$(manualdir) + @cp -p $(top_srcdir)/docs/man/*.1 $(DESTDIR)$(mandir)/man1 + @cp -p $(top_srcdir)/docs/man/*.8 $(DESTDIR)$(mandir)/man8 + @(cd $(top_srcdir)/docs/manual && cp -rp * $(DESTDIR)$(manualdir)) + @(cd $(DESTDIR)$(manualdir) && find . -name ".svn" -type d -print | xargs rm -rf 2>/dev/null ) || true + +install-suexec: + @if test -f $(builddir)/support/suexec; then \ + test -d $(DESTDIR)$(sbindir) || $(MKINSTALLDIRS) $(DESTDIR)$(sbindir); \ + $(INSTALL_PROGRAM) $(top_builddir)/support/suexec $(DESTDIR)$(sbindir); \ + chmod 4755 $(DESTDIR)$(sbindir)/suexec; \ + fi + +suexec: + cd support && $(MAKE) suexec + +x-local-distclean: + @rm -rf autom4te.cache + +include $(top_srcdir)/os/os2/core.mk diff --git a/trunk/Makefile.win b/Makefile.win similarity index 100% rename from trunk/Makefile.win rename to Makefile.win diff --git a/trunk/NOTICE b/NOTICE similarity index 100% rename from trunk/NOTICE rename to NOTICE diff --git a/NWGNUmakefile b/NWGNUmakefile index dd62f6df62fee75c0e34e38c345d399450bcc096..a763811850bd212d8ce464443e4a0d4bd3fc917a 100644 --- a/NWGNUmakefile +++ b/NWGNUmakefile @@ -1,13 +1,12 @@ -# -# This Makefile requires the environment var OSSLSDK -# pointing to the base directory of your OpenSSL SDK. -# - # # Declare the sub-directories to be built here # SUBDIRS = \ + $(APR_WORK) \ + build \ + support \ + modules \ $(EOLIST) # @@ -19,27 +18,28 @@ include $(AP_WORK)\build\NWGNUhead.inc # # build this level's files + # # Make sure all needed macro's are defined # -OSSLINC = $(OSSLSDK)/outinc_nw_libc -OSSLLIB = $(OSSLSDK)/out_nw_libc - # # These directories will be at the beginning of the include list, followed by # INCDIRS # XINCDIRS += \ - $(OSSLINC) \ - $(OSSLINC)/openssl \ - $(AP_WORK)/include \ - $(AP_WORK)/server/mpm/NetWare \ - $(AP_WORK)/modules/arch/netware \ - $(AP_WORK)/modules/generators \ $(APR)/include \ $(APRUTIL)/include \ - $(APR) \ + $(AP_WORK)/include \ + $(AP_WORK)/modules/filters/ \ + $(AP_WORK)/modules/generators/ \ + $(AP_WORK)/modules/http/ \ + $(AP_WORK)/modules/loggers/ \ + $(AP_WORK)/modules/mappers/ \ + $(AP_WORK)/modules/proxy/ \ + $(AP_WORK)/os/NetWare \ + $(AP_WORK)/server/mpm/NetWare \ + $(AP_WORK)/srclib/pcre \ $(NWOS) \ $(EOLIST) @@ -47,21 +47,18 @@ XINCDIRS += \ # These flags will come after CFLAGS # XCFLAGS += \ - -relax_pointers \ $(EOLIST) # # These defines will come after DEFINES # XDEFINES += \ - -DHAVE_OPENSSL \ $(EOLIST) # # These flags will be added to the link.opt file # XLFLAGS += \ - -l $(OSSLLIB) \ $(EOLIST) # @@ -79,7 +76,7 @@ XDEFINES += \ $(EOLIST) XLFLAGS += \ - $(EOLIST) + $(EOLIST) endif ifeq "$(RELEASE)" "noopt" @@ -93,7 +90,7 @@ XDEFINES += \ $(EOLIST) XLFLAGS += \ - $(EOLIST) + $(EOLIST) endif ifeq "$(RELEASE)" "release" @@ -115,30 +112,37 @@ endif # This is used by the link 'name' directive to name the nlm. If left blank # TARGET_nlm (see below) will be used. # -NLM_NAME = mod_ssl +NLM_NAME = Apache2 # # This is used by the link '-desc ' directive. # If left blank, NLM_NAME will be used. # -NLM_DESCRIPTION = Apache $(VERSION_STR) SSL module +NLM_DESCRIPTION = Apache Web Server $(VERSION_STR) # # This is used by the '-threadname' directive. If left blank, # NLM_NAME Thread will be used. # -NLM_THREAD_NAME = mod_ssl +NLM_THREAD_NAME = Apache + +# +# This is used by the '-screenname' directive. If left blank, +# 'Apache for NetWare' Thread will be used. +# +NLM_SCREEN_NAME = Apache $(VERSION_STR) for NetWare + # # If this is specified, it will override VERSION value in # $(AP_WORK)\build\NWGNUenvironment.inc # -NLM_VERSION = +NLM_VERSION = # # If this is specified, it will override the default of 64K # -NLM_STACK_SIZE = 8192 +NLM_STACK_SIZE = 65536 # @@ -154,29 +158,25 @@ NLM_EXIT_SYM = _LibCPostlude # # If this is specified it will be used by the link '-check' directive # -NLM_CHECK_SYM = +NLM_CHECK_SYM = _LibCCheckUnload # -# If this is specified it will be used by the link '-flags' directive +# If these are specified it will be used by the link '-flags' directive # -NLM_FLAGS = AUTOUNLOAD, PSEUDOPREEMPTION - +NLM_FLAGS = PSEUDOPREEMPTION + # # If this is specified it will be linked in with the XDCData option in the def # file instead of the default of $(NWOS)/apache.xdc. XDCData can be disabled # by setting APACHE_UNIPROC in the environment # -XDCDATA = - -# -# Declare all target files (you must add your files here) -# +XDCDATA = # # If there is an NLM target, put it here # TARGET_nlm = \ - $(OBJDIR)/mod_ssl.nlm \ + $(OBJDIR)/Apache2.nlm \ $(EOLIST) # @@ -189,17 +189,69 @@ TARGET_lib = \ # These are the OBJ files needed to create the NLM target above. # Paths must all use the '/' character # -FILES_nlm_objs := $(patsubst %.c,$(OBJDIR)/%.o,$(wildcard *.c)) +FILES_nlm_objs = \ + $(OBJDIR)/buildmark.o \ + $(OBJDIR)/config.o \ + $(OBJDIR)/connection.o \ + $(OBJDIR)/core.o \ + $(OBJDIR)/core_filters.o \ + $(OBJDIR)/eoc_bucket.o \ + $(OBJDIR)/error_bucket.o \ + $(OBJDIR)/http_core.o \ + $(OBJDIR)/http_protocol.o \ + $(OBJDIR)/http_request.o \ + $(OBJDIR)/byterange_filter.o \ + $(OBJDIR)/chunk_filter.o \ + $(OBJDIR)/http_etag.o \ + $(OBJDIR)/http_filters.o \ + $(OBJDIR)/listen.o \ + $(OBJDIR)/log.o \ + $(OBJDIR)/main.o \ + $(OBJDIR)/mod_authz_host.o \ + $(OBJDIR)/mod_alias.o \ + $(OBJDIR)/mod_dir.o \ + $(OBJDIR)/mod_env.o \ + $(OBJDIR)/mod_include.o \ + $(OBJDIR)/mod_log_config.o \ + $(OBJDIR)/mod_mime.o \ + $(OBJDIR)/mod_negotiation.o \ + $(OBJDIR)/mod_netware.o \ + $(OBJDIR)/mod_setenvif.o \ + $(OBJDIR)/mod_so.o \ + $(OBJDIR)/modules.o \ + $(OBJDIR)/mpm_common.o \ + $(OBJDIR)/mpm_netware.o \ + $(OBJDIR)/pcre.o \ + $(OBJDIR)/protocol.o \ + $(OBJDIR)/provider.o \ + $(OBJDIR)/request.o \ + $(OBJDIR)/scoreboard.o \ + $(OBJDIR)/util.o \ + $(OBJDIR)/util_cfgtree.o \ + $(OBJDIR)/util_charset.o \ + $(OBJDIR)/util_debug.o \ + $(OBJDIR)/util_filter.o \ + $(OBJDIR)/util_md5.o \ + $(OBJDIR)/util_nw.o \ + $(OBJDIR)/util_pcre.o \ + $(OBJDIR)/util_script.o \ + $(OBJDIR)/util_time.o \ + $(OBJDIR)/util_xml.o \ + $(OBJDIR)/vhost.o \ + $(EOLIST) +# Build in mod_nw_ssl if Winsock is being used +ifndef USE_STDSOCKETS +FILES_nlm_objs += $(OBJDIR)/mod_nw_ssl.o \ + $(EOLIST) +endif # # These are the LIB files needed to create the NLM target above. # These will be added as a library command in the link.opt file. # FILES_nlm_libs = \ - libcpre.o \ - $(OSSLLIB)/crypto.lib \ - $(OSSLLIB)/ssl.lib \ + libcpre.o \ $(EOLIST) # @@ -207,7 +259,7 @@ FILES_nlm_libs = \ # These will be added as a module command in the link.opt file. # FILES_nlm_modules = \ - Apache2 \ + aprlib \ Libc \ $(EOLIST) @@ -230,14 +282,12 @@ FILE_nlm_copyright = # Any additional imports go here # FILES_nlm_Ximports = \ - @libc.imp \ + @netware.imp \ @$(APR)/aprlib.imp \ - @httpd.imp \ - GetProcessSwitchCount \ - RunningProcess \ - GetSuperHighResolutionTimer \ + @libc.imp \ + GetCurrentAddressSpace \ $(EOLIST) - + # Don't link with Winsock if standard sockets are being used ifndef USE_STDSOCKETS FILES_nlm_Ximports += @ws2nlm.imp \ @@ -248,15 +298,15 @@ endif # Any symbols exported to here # FILES_nlm_exports = \ - ssl_module \ + @$(NWOS)/httpd.imp \ $(EOLIST) - + # # These are the OBJ files needed to create the LIB target above. # Paths must all use the '/' character # FILES_lib_objs = \ - $(EOLIST) + $(EOLIST) # # implement targets and dependancies (leave this section alone) @@ -271,12 +321,72 @@ nlms :: libs $(TARGET_nlm) # correct place. (See $(AP_WORK)\build\NWGNUhead.inc for examples) # install :: nlms FORCE - copy $(OBJDIR)\mod_ssl.nlm $(INSTALL)\Apache2\modules\*.* + -copy $(OBJDIR)\Apache2.nlm $(INSTALL)\Apache2\*.* + -copy ABOUT_APACHE $(INSTALL)\Apache2\*.* + -copy README $(INSTALL)\Apache2\*.* + -copy STATUS $(INSTALL)\Apache2\*.* + -copy LICENSE $(INSTALL)\Apache2\*.* + -copy CHANGES $(INSTALL)\Apache2\*.* + -copy support\dbmmanage.in $(INSTALL)\Apache2\bin\dbmmanage.pl + -copy support\logresolve.pl.in $(INSTALL)\Apache2\bin\logresolve.pl +ifdef USE_STDSOCKETS + -awk -f build\mkconfnw.awk docs\conf\httpd.conf.in >$(INSTALL)\Apache2\conf\httpd.conf +else + -awk -v SSL=1 -f build\mkconfnw.awk docs\conf\httpd.conf.in >$(INSTALL)\Apache2\conf\httpd.conf +endif + $(CHKNOT) $(INSTALL)\Apache2\conf\extra\nul mkdir $(INSTALL)\Apache2\conf\extra + -awk -f build\mkconfnw.awk docs\conf\extra\httpd-autoindex.conf.in >$(INSTALL)\Apache2\conf\extra\httpd-autoindex.conf + -awk -f build\mkconfnw.awk docs\conf\extra\httpd-dav.conf.in >$(INSTALL)\Apache2\conf\extra\httpd-dav.conf + -awk -f build\mkconfnw.awk docs\conf\extra\httpd-default.conf.in >$(INSTALL)\Apache2\conf\extra\httpd-default.conf + -awk -f build\mkconfnw.awk docs\conf\extra\httpd-info.conf.in >$(INSTALL)\Apache2\conf\extra\httpd-info.conf + -awk -f build\mkconfnw.awk docs\conf\extra\httpd-languages.conf.in >$(INSTALL)\Apache2\conf\extra\httpd-languages.conf + -awk -f build\mkconfnw.awk docs\conf\extra\httpd-manual.conf.in >$(INSTALL)\Apache2\conf\extra\httpd-manual.conf + -awk -f build\mkconfnw.awk docs\conf\extra\httpd-mpm.conf.in >$(INSTALL)\Apache2\conf\extra\httpd-mpm.conf + -awk -f build\mkconfnw.awk docs\conf\extra\httpd-multilang-errordoc.conf.in >$(INSTALL)\Apache2\conf\extra\httpd-multilang-errordoc.conf + -awk -f build\mkconfnw.awk docs\conf\extra\httpd-ssl.conf.in >$(INSTALL)\Apache2\conf\extra\httpd-ssl.conf + -awk -f build\mkconfnw.awk docs\conf\extra\httpd-userdir.conf.in >$(INSTALL)\Apache2\conf\extra\httpd-userdir.conf + -awk -f build\mkconfnw.awk docs\conf\extra\httpd-vhosts.conf.in >$(INSTALL)\Apache2\conf\extra\httpd-vhosts.conf + -copy docs\conf\magic $(INSTALL)\Apache2\conf\magic + -copy docs\conf\mime.types $(INSTALL)\Apache2\conf\mime.types + -copy docs\conf\charset.conv $(INSTALL)\Apache2\conf\charset.conv + -copy docs\cgi-examples\printenv $(INSTALL)\Apache2\cgi-bin\printenv.pl + @echo rem copying the docs directories > xc.bat + @echo xcopy docs\error $(INSTALL)\Apache2\error $(XCOPYSW) >> xc.bat + @echo xcopy docs\docroot $(INSTALL)\Apache2\htdocs $(XCOPYSW) >> xc.bat + @echo xcopy docs\icons $(INSTALL)\Apache2\icons $(XCOPYSW) >> xc.bat + @echo xcopy docs\man $(INSTALL)\Apache2\man $(XCOPYSW) >> xc.bat + @echo xcopy docs\manual $(INSTALL)\Apache2\manual $(XCOPYSW) >> xc.bat + $(CMD) xc.bat + $(DEL) xc.bat + + +installdev :: FORCE + -copy $(subst /,\,$(AP_WORK))\include\*.h $(INSTALL)\Apache2\include\*.* + -copy $(subst /,\,$(AP_WORK))\os\netware\*.h $(INSTALL)\Apache2\include\*.* + -copy $(subst /,\,$(NWOS))\*.imp $(INSTALL)\Apache2\lib\*.* + -copy $(subst /,\,$(APR))\include\*.h $(INSTALL)\Apache2\include\*.* + -copy $(subst /,\,$(APRUTIL))\include\*.h $(INSTALL)\Apache2\include\*.* + -copy $(subst /,\,$(APR))\*.imp $(INSTALL)\Apache2\lib\*.* + -copy $(subst /,\,$(NWOS))\*.xdc $(INSTALL)\Apache2\lib\*.* + +prebuild :: FORCE + $(MAKE) -C server -f NWGNUMakefile + $(MAKE) -C srclib/pcre -f NWGNUMakefile + $(MAKE) -C $(APU_WORK)/uri -f NWGNUMakefile + $(CHKNOT) $(PREBUILD_INST)\nul mkdir $(PREBUILD_INST) + -copy $(AP_WORK)\server\$(OBJDIR)\*.nlm $(PREBUILD_INST)\*.* + -copy $(AP_WORK)\srclib\pcre\$(basename $(OBJDIR))\*.nlm $(PREBUILD_INST)\*.* + -copy $(APU_WORK)\uri\$(basename $(OBJDIR))\*.nlm $(PREBUILD_INST)\*.* + + # # Any specialized rules here # -vpath %.c $(AP_WORK)/modules/arch/netware + +vpath %.c server:modules/arch/netware:modules/http:modules/aaa:modules/mappers +vpath %.c modules/generators:modules/metadata:modules/filters:modules/loggers +vpath %.c os/netware:server/mpm/netware:srclib/pcre # # Include the 'tail' makefile that has targets that depend on variables defined @@ -285,5 +395,3 @@ vpath %.c $(AP_WORK)/modules/arch/netware include $(AP_WORK)\build\NWGNUtail.inc - - diff --git a/README b/README index 5f9421cf50895a05ddce2b7d7ea52f6375b9d7f5..59217a37d9bcd584146e92de7f6a3d5570851e01 100644 --- a/README +++ b/README @@ -1,107 +1,90 @@ -SYNOPSIS - - This Apache module provides strong cryptography for the Apache 2 webserver - via the Secure Sockets Layer (SSL v2/v3) and Transport Layer Security (TLS - v1) protocols by the help of the SSL/TLS implementation library OpenSSL which - is based on SSLeay from Eric A. Young and Tim J. Hudson. - - The mod_ssl package was created in April 1998 by Ralf S. Engelschall - and was originally derived from software developed by Ben Laurie for - use in the Apache-SSL HTTP server project. The mod_ssl implementation - for Apache 1.3 continues to be supported by the modssl project - . - -SOURCES - - See the top-level LAYOUT file in httpd-2.1 for file descriptions. - - The source files are written in clean ANSI C and pass the ``gcc -O -g - -ggdb3 -Wall -Wshadow -Wpointer-arith -Wcast-align -Wmissing-prototypes - -Wmissing-declarations -Wnested-externs -Winline'' compiler test - (assuming `gcc' is GCC 2.95.2 or newer) without any complains. When - you make changes or additions make sure the source still passes this - compiler test. - -FUNCTIONS - - Inside the source code you will be confronted with the following types of - functions which can be identified by their prefixes: - - ap_xxxx() ............... Apache API function - ssl_xxxx() .............. mod_ssl function - SSL_xxxx() .............. OpenSSL function (SSL library) - OpenSSL_xxxx() .......... OpenSSL function (SSL library) - X509_xxxx() ............. OpenSSL function (Crypto library) - PEM_xxxx() .............. OpenSSL function (Crypto library) - EVP_xxxx() .............. OpenSSL function (Crypto library) - RSA_xxxx() .............. OpenSSL function (Crypto library) - -DATA STRUCTURES - - Inside the source code you will be confronted with the following - data structures: - - server_rec .............. Apache (Virtual) Server - conn_rec ................ Apache Connection - request_rec ............. Apache Request - SSLModConfig ............ mod_ssl (Global) Module Configuration - SSLSrvConfig ............ mod_ssl (Virtual) Server Configuration - SSLDirConfig ............ mod_ssl Directory Configuration - SSLConnConfig ........... mod_ssl Connection Configuration - SSLFilterRec ............ mod_ssl Filter Context - SSL_CTX ................. OpenSSL Context - SSL_METHOD .............. OpenSSL Protocol Method - SSL_CIPHER .............. OpenSSL Cipher - SSL_SESSION ............. OpenSSL Session - SSL ..................... OpenSSL Connection - BIO ..................... OpenSSL Connection Buffer - - For an overview how these are related and chained together have a look at the - page in README.dsov.{fig,ps}. It contains overview diagrams for those data - structures. It's designed for DIN A4 paper size, but you can easily generate - a smaller version inside XFig by specifing a magnification on the Export - panel. - -INCOMPATIBILITIES - - The following intentional incompatibilities exist between mod_ssl 2.x - from Apache 1.3 and this mod_ssl version for Apache 2: - - o The complete EAPI-based SSL_VENDOR stuff was removed. - o The complete EAPI-based SSL_COMPAT stuff was removed. - o The variable MOD_SSL is no longer provided automatically - -MAJOR CHANGES - - For a complete history of changes for Apache 2 mod_ssl, see the - CHANGES file in the top-level httpd-2.1 directory. The following - is a condensed summary of the major changes were made between - mod_ssl 2.x from Apache 1.3 and this mod_ssl version for Apache 2: - - o The DBM based session cache is now based on APR's DBM API only. - o The shared memory based session cache is now based on APR's APIs. - o SSL I/O is now implemented in terms of filters rather than BUFF - o Eliminated ap_global_ctx. Storing Persistant information in - process_rec->pool->user_data. The ssl_pphrase_Handle_CB() and - ssl_config_global_* () functions have an extra parameter now - - "server_rec *" - which is used to retrieve the SSLModConfigRec. - o Properly support restarts, allowing mod_ssl to be added to a server - that is already running and to change server certs/keys on restart - o Various performance enhancements - o proxy support is no longer an "extension", much of the mod_ssl core - was re-written (ssl_engine_{init,kernel,config}.c) to be generic so - it could be re-used in proxy mode. - - the optional function ssl_proxy_enable is provide for mod_proxy - to enable proxy support - - proxy support now requires 'SSLProxyEngine on' to be configured - - proxy now supports SSLProxyCARevocation{Path,File} in addition to - the original SSLProxy* directives - o per-directory SSLCACertificate{File,Path} is now thread-safe but - requires SSL_set_cert_store patch to OpenSSL - o RSA sslc is supported via ssl_toolkit_compat.h - o the ssl_engine_{ds,ext}.c source files are obsolete and no longer - exist - -TODO - - See the top-level STATUS file in httpd-2.1 for current efforts and goals. + + Apache HTTP Server + + What is it? + ----------- + + The Apache HTTP Server is a powerful and flexible HTTP/1.1 compliant + web server. Originally designed as a replacement for the NCSA HTTP + Server, it has grown to be the most popular web server on the + Internet. As a project of the Apache Software Foundation, the + developers aim to collaboratively develop and maintain a robust, + commercial-grade, standards-based server with freely available + source code. + + The Latest Version + ------------------ + + Details of the latest version can be found on the Apache HTTP + server project page under http://httpd.apache.org/. + + Documentation + ------------- + + The documentation available as of the date of this release is + included in HTML format in the docs/manual/ directory. The most + up-to-date documentation can be found at + http://httpd.apache.org/docs-2.1/. + + Installation + ------------ + + Please see the file called INSTALL. Platform specific notes can be + found in README.platforms. + + Licensing + --------- + + Please see the file called LICENSE. + + Contacts + -------- + + o If you want to be informed about new code releases, bug fixes, + security fixes, general news and information about the Apache server + subscribe to the apache-announce mailing list as described under + http://httpd.apache.org/lists.html#http-announce + + o If you want freely available support for running Apache please join the + Apache user community by subscribing to Users Mailing List at + http://httpd.apache.org/userslist.html or one of the following USENET + newsgroups: + comp.infosystems.www.servers.unix + comp.infosystems.www.servers.ms-windows + Also available at: + http://groups.google.com/groups?group=comp.infosystems.www.servers + + o If you want commercial support for running Apache please contact + one of the companies and contractors which are listed at + http://www.apache.org/info/support.cgi + + o If you have a concrete bug report for Apache please go to the + Apache Group Bug Database and submit your report: + http://httpd.apache.org/bug_report.html + + o If you want to participate in actively developing Apache please + subscribe to the `dev@httpd.apache.org' mailing list as described at + http://www.apache.org/lists.html#http-dev + + Acknowledgments + ---------------- + + We wish to acknowledge the following copyrighted works that + make up portions of the Apache software: + + Portions of this software were developed at the National Center + for Supercomputing Applications (NCSA) at the University of + Illinois at Urbana-Champaign. + + This software contains code derived from the RSA Data Security + Inc. MD5 Message-Digest Algorithm, including various + modifications by Spyglass Inc., Carnegie Mellon University, and + Bell Communications Research, Inc (Bellcore). + + Regular expression support is provided by the PCRE library package, which + is open source software, written by Philip Hazel, and copyright by the + University of Cambridge, England. The original software is available from + ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/ + + Apache 2 relies heavily on the use of autoconf and libtool to provide + a build environment. diff --git a/trunk/README.platforms b/README.platforms similarity index 100% rename from trunk/README.platforms rename to README.platforms diff --git a/trunk/ROADMAP b/ROADMAP similarity index 100% rename from trunk/ROADMAP rename to ROADMAP diff --git a/trunk/STATUS b/STATUS similarity index 100% rename from trunk/STATUS rename to STATUS diff --git a/trunk/VERSIONING b/VERSIONING similarity index 100% rename from trunk/VERSIONING rename to VERSIONING diff --git a/trunk/acinclude.m4 b/acinclude.m4 similarity index 100% rename from trunk/acinclude.m4 rename to acinclude.m4 diff --git a/trunk/apachenw.mcp.zip b/apachenw.mcp.zip similarity index 100% rename from trunk/apachenw.mcp.zip rename to apachenw.mcp.zip diff --git a/trunk/build/NWGNUenvironment.inc b/build/NWGNUenvironment.inc similarity index 100% rename from trunk/build/NWGNUenvironment.inc rename to build/NWGNUenvironment.inc diff --git a/trunk/build/NWGNUhead.inc b/build/NWGNUhead.inc similarity index 100% rename from trunk/build/NWGNUhead.inc rename to build/NWGNUhead.inc diff --git a/trunk/build/NWGNUmakefile b/build/NWGNUmakefile similarity index 100% rename from trunk/build/NWGNUmakefile rename to build/NWGNUmakefile diff --git a/trunk/build/NWGNUtail.inc b/build/NWGNUtail.inc similarity index 100% rename from trunk/build/NWGNUtail.inc rename to build/NWGNUtail.inc diff --git a/trunk/build/binbuild.sh b/build/binbuild.sh similarity index 100% rename from trunk/build/binbuild.sh rename to build/binbuild.sh diff --git a/trunk/build/bsd_makefile b/build/bsd_makefile similarity index 100% rename from trunk/build/bsd_makefile rename to build/bsd_makefile diff --git a/trunk/build/build-modules-c.awk b/build/build-modules-c.awk similarity index 100% rename from trunk/build/build-modules-c.awk rename to build/build-modules-c.awk diff --git a/trunk/build/buildinfo.sh b/build/buildinfo.sh similarity index 100% rename from trunk/build/buildinfo.sh rename to build/buildinfo.sh diff --git a/trunk/build/config-stubs b/build/config-stubs similarity index 100% rename from trunk/build/config-stubs rename to build/config-stubs diff --git a/trunk/build/default.pl b/build/default.pl similarity index 100% rename from trunk/build/default.pl rename to build/default.pl diff --git a/trunk/build/fastgen.sh b/build/fastgen.sh similarity index 100% rename from trunk/build/fastgen.sh rename to build/fastgen.sh diff --git a/trunk/build/get-version.sh b/build/get-version.sh similarity index 100% rename from trunk/build/get-version.sh rename to build/get-version.sh diff --git a/trunk/build/httpd_roll_release b/build/httpd_roll_release similarity index 100% rename from trunk/build/httpd_roll_release rename to build/httpd_roll_release diff --git a/trunk/build/install-bindist.sh.in b/build/install-bindist.sh.in similarity index 100% rename from trunk/build/install-bindist.sh.in rename to build/install-bindist.sh.in diff --git a/trunk/build/install.sh b/build/install.sh similarity index 100% rename from trunk/build/install.sh rename to build/install.sh diff --git a/trunk/build/instdso.sh b/build/instdso.sh similarity index 100% rename from trunk/build/instdso.sh rename to build/instdso.sh diff --git a/trunk/build/library.mk b/build/library.mk similarity index 100% rename from trunk/build/library.mk rename to build/library.mk diff --git a/trunk/build/ltlib.mk b/build/ltlib.mk similarity index 100% rename from trunk/build/ltlib.mk rename to build/ltlib.mk diff --git a/trunk/build/make_exports.awk b/build/make_exports.awk similarity index 100% rename from trunk/build/make_exports.awk rename to build/make_exports.awk diff --git a/trunk/build/make_nw_export.awk b/build/make_nw_export.awk similarity index 100% rename from trunk/build/make_nw_export.awk rename to build/make_nw_export.awk diff --git a/trunk/build/make_var_export.awk b/build/make_var_export.awk similarity index 100% rename from trunk/build/make_var_export.awk rename to build/make_var_export.awk diff --git a/trunk/build/mkconfNW.awk b/build/mkconfNW.awk similarity index 100% rename from trunk/build/mkconfNW.awk rename to build/mkconfNW.awk diff --git a/trunk/build/mkdep.perl b/build/mkdep.perl similarity index 100% rename from trunk/build/mkdep.perl rename to build/mkdep.perl diff --git a/trunk/build/mkdir.sh b/build/mkdir.sh similarity index 100% rename from trunk/build/mkdir.sh rename to build/mkdir.sh diff --git a/trunk/build/nw_export.inc b/build/nw_export.inc similarity index 100% rename from trunk/build/nw_export.inc rename to build/nw_export.inc diff --git a/trunk/build/nw_ver.awk b/build/nw_ver.awk similarity index 100% rename from trunk/build/nw_ver.awk rename to build/nw_ver.awk diff --git a/trunk/build/pkg/README b/build/pkg/README similarity index 100% rename from trunk/build/pkg/README rename to build/pkg/README diff --git a/trunk/build/pkg/buildpkg.sh b/build/pkg/buildpkg.sh similarity index 100% rename from trunk/build/pkg/buildpkg.sh rename to build/pkg/buildpkg.sh diff --git a/trunk/build/pkg/pkginfo.in b/build/pkg/pkginfo.in similarity index 100% rename from trunk/build/pkg/pkginfo.in rename to build/pkg/pkginfo.in diff --git a/trunk/build/prebuildNW.bat b/build/prebuildNW.bat similarity index 100% rename from trunk/build/prebuildNW.bat rename to build/prebuildNW.bat diff --git a/trunk/build/program.mk b/build/program.mk similarity index 100% rename from trunk/build/program.mk rename to build/program.mk diff --git a/trunk/build/rpm/httpd.init b/build/rpm/httpd.init similarity index 100% rename from trunk/build/rpm/httpd.init rename to build/rpm/httpd.init diff --git a/trunk/build/rpm/httpd.logrotate b/build/rpm/httpd.logrotate similarity index 100% rename from trunk/build/rpm/httpd.logrotate rename to build/rpm/httpd.logrotate diff --git a/trunk/build/rpm/httpd.spec.in b/build/rpm/httpd.spec.in similarity index 100% rename from trunk/build/rpm/httpd.spec.in rename to build/rpm/httpd.spec.in diff --git a/trunk/build/rules.mk.in b/build/rules.mk.in similarity index 100% rename from trunk/build/rules.mk.in rename to build/rules.mk.in diff --git a/trunk/build/special.mk b/build/special.mk similarity index 100% rename from trunk/build/special.mk rename to build/special.mk diff --git a/trunk/build/sysv_makefile b/build/sysv_makefile similarity index 100% rename from trunk/build/sysv_makefile rename to build/sysv_makefile diff --git a/trunk/build/win32/apache.ico b/build/win32/apache.ico similarity index 100% rename from trunk/build/win32/apache.ico rename to build/win32/apache.ico diff --git a/trunk/build/win32/win32ver.awk b/build/win32/win32ver.awk similarity index 100% rename from trunk/build/win32/win32ver.awk rename to build/win32/win32ver.awk diff --git a/trunk/buildconf b/buildconf similarity index 100% rename from trunk/buildconf rename to buildconf diff --git a/trunk/config.layout b/config.layout similarity index 100% rename from trunk/config.layout rename to config.layout diff --git a/trunk/configure.in b/configure.in similarity index 100% rename from trunk/configure.in rename to configure.in diff --git a/trunk/docs/STATUS b/docs/STATUS similarity index 100% rename from trunk/docs/STATUS rename to docs/STATUS diff --git a/trunk/docs/cgi-examples/printenv b/docs/cgi-examples/printenv similarity index 100% rename from trunk/docs/cgi-examples/printenv rename to docs/cgi-examples/printenv diff --git a/trunk/docs/cgi-examples/test-cgi b/docs/cgi-examples/test-cgi similarity index 100% rename from trunk/docs/cgi-examples/test-cgi rename to docs/cgi-examples/test-cgi diff --git a/trunk/docs/conf/charset.conv b/docs/conf/charset.conv similarity index 100% rename from trunk/docs/conf/charset.conv rename to docs/conf/charset.conv diff --git a/trunk/docs/conf/extra/httpd-autoindex.conf.in b/docs/conf/extra/httpd-autoindex.conf.in similarity index 100% rename from trunk/docs/conf/extra/httpd-autoindex.conf.in rename to docs/conf/extra/httpd-autoindex.conf.in diff --git a/trunk/docs/conf/extra/httpd-dav.conf.in b/docs/conf/extra/httpd-dav.conf.in similarity index 100% rename from trunk/docs/conf/extra/httpd-dav.conf.in rename to docs/conf/extra/httpd-dav.conf.in diff --git a/trunk/docs/conf/extra/httpd-default.conf.in b/docs/conf/extra/httpd-default.conf.in similarity index 100% rename from trunk/docs/conf/extra/httpd-default.conf.in rename to docs/conf/extra/httpd-default.conf.in diff --git a/trunk/docs/conf/extra/httpd-info.conf.in b/docs/conf/extra/httpd-info.conf.in similarity index 100% rename from trunk/docs/conf/extra/httpd-info.conf.in rename to docs/conf/extra/httpd-info.conf.in diff --git a/trunk/docs/conf/extra/httpd-languages.conf.in b/docs/conf/extra/httpd-languages.conf.in similarity index 100% rename from trunk/docs/conf/extra/httpd-languages.conf.in rename to docs/conf/extra/httpd-languages.conf.in diff --git a/trunk/docs/conf/extra/httpd-manual.conf.in b/docs/conf/extra/httpd-manual.conf.in similarity index 100% rename from trunk/docs/conf/extra/httpd-manual.conf.in rename to docs/conf/extra/httpd-manual.conf.in diff --git a/trunk/docs/conf/extra/httpd-mpm.conf.in b/docs/conf/extra/httpd-mpm.conf.in similarity index 100% rename from trunk/docs/conf/extra/httpd-mpm.conf.in rename to docs/conf/extra/httpd-mpm.conf.in diff --git a/trunk/docs/conf/extra/httpd-multilang-errordoc.conf.in b/docs/conf/extra/httpd-multilang-errordoc.conf.in similarity index 100% rename from trunk/docs/conf/extra/httpd-multilang-errordoc.conf.in rename to docs/conf/extra/httpd-multilang-errordoc.conf.in diff --git a/trunk/docs/conf/extra/httpd-ssl.conf.in b/docs/conf/extra/httpd-ssl.conf.in similarity index 100% rename from trunk/docs/conf/extra/httpd-ssl.conf.in rename to docs/conf/extra/httpd-ssl.conf.in diff --git a/trunk/docs/conf/extra/httpd-userdir.conf.in b/docs/conf/extra/httpd-userdir.conf.in similarity index 100% rename from trunk/docs/conf/extra/httpd-userdir.conf.in rename to docs/conf/extra/httpd-userdir.conf.in diff --git a/trunk/docs/conf/extra/httpd-vhosts.conf.in b/docs/conf/extra/httpd-vhosts.conf.in similarity index 100% rename from trunk/docs/conf/extra/httpd-vhosts.conf.in rename to docs/conf/extra/httpd-vhosts.conf.in diff --git a/trunk/docs/conf/httpd-win.conf b/docs/conf/httpd-win.conf similarity index 100% rename from trunk/docs/conf/httpd-win.conf rename to docs/conf/httpd-win.conf diff --git a/trunk/docs/conf/httpd.conf.in b/docs/conf/httpd.conf.in similarity index 100% rename from trunk/docs/conf/httpd.conf.in rename to docs/conf/httpd.conf.in diff --git a/trunk/docs/conf/magic b/docs/conf/magic similarity index 100% rename from trunk/docs/conf/magic rename to docs/conf/magic diff --git a/trunk/docs/conf/mime.types b/docs/conf/mime.types similarity index 100% rename from trunk/docs/conf/mime.types rename to docs/conf/mime.types diff --git a/trunk/docs/docroot/apache_pb.gif b/docs/docroot/apache_pb.gif similarity index 100% rename from trunk/docs/docroot/apache_pb.gif rename to docs/docroot/apache_pb.gif diff --git a/trunk/docs/docroot/apache_pb.png b/docs/docroot/apache_pb.png similarity index 100% rename from trunk/docs/docroot/apache_pb.png rename to docs/docroot/apache_pb.png diff --git a/trunk/docs/docroot/apache_pb2.gif b/docs/docroot/apache_pb2.gif similarity index 100% rename from trunk/docs/docroot/apache_pb2.gif rename to docs/docroot/apache_pb2.gif diff --git a/trunk/docs/docroot/apache_pb2.png b/docs/docroot/apache_pb2.png similarity index 100% rename from trunk/docs/docroot/apache_pb2.png rename to docs/docroot/apache_pb2.png diff --git a/trunk/docs/docroot/apache_pb2_ani.gif b/docs/docroot/apache_pb2_ani.gif similarity index 100% rename from trunk/docs/docroot/apache_pb2_ani.gif rename to docs/docroot/apache_pb2_ani.gif diff --git a/trunk/docs/docroot/index.html b/docs/docroot/index.html similarity index 100% rename from trunk/docs/docroot/index.html rename to docs/docroot/index.html diff --git a/trunk/docs/doxygen.conf b/docs/doxygen.conf similarity index 100% rename from trunk/docs/doxygen.conf rename to docs/doxygen.conf diff --git a/trunk/docs/error/HTTP_BAD_GATEWAY.html.var b/docs/error/HTTP_BAD_GATEWAY.html.var similarity index 100% rename from trunk/docs/error/HTTP_BAD_GATEWAY.html.var rename to docs/error/HTTP_BAD_GATEWAY.html.var diff --git a/trunk/docs/error/HTTP_BAD_REQUEST.html.var b/docs/error/HTTP_BAD_REQUEST.html.var similarity index 100% rename from trunk/docs/error/HTTP_BAD_REQUEST.html.var rename to docs/error/HTTP_BAD_REQUEST.html.var diff --git a/trunk/docs/error/HTTP_FORBIDDEN.html.var b/docs/error/HTTP_FORBIDDEN.html.var similarity index 100% rename from trunk/docs/error/HTTP_FORBIDDEN.html.var rename to docs/error/HTTP_FORBIDDEN.html.var diff --git a/trunk/docs/error/HTTP_GONE.html.var b/docs/error/HTTP_GONE.html.var similarity index 100% rename from trunk/docs/error/HTTP_GONE.html.var rename to docs/error/HTTP_GONE.html.var diff --git a/trunk/docs/error/HTTP_INTERNAL_SERVER_ERROR.html.var b/docs/error/HTTP_INTERNAL_SERVER_ERROR.html.var similarity index 100% rename from trunk/docs/error/HTTP_INTERNAL_SERVER_ERROR.html.var rename to docs/error/HTTP_INTERNAL_SERVER_ERROR.html.var diff --git a/trunk/docs/error/HTTP_LENGTH_REQUIRED.html.var b/docs/error/HTTP_LENGTH_REQUIRED.html.var similarity index 100% rename from trunk/docs/error/HTTP_LENGTH_REQUIRED.html.var rename to docs/error/HTTP_LENGTH_REQUIRED.html.var diff --git a/trunk/docs/error/HTTP_METHOD_NOT_ALLOWED.html.var b/docs/error/HTTP_METHOD_NOT_ALLOWED.html.var similarity index 100% rename from trunk/docs/error/HTTP_METHOD_NOT_ALLOWED.html.var rename to docs/error/HTTP_METHOD_NOT_ALLOWED.html.var diff --git a/trunk/docs/error/HTTP_NOT_FOUND.html.var b/docs/error/HTTP_NOT_FOUND.html.var similarity index 100% rename from trunk/docs/error/HTTP_NOT_FOUND.html.var rename to docs/error/HTTP_NOT_FOUND.html.var diff --git a/trunk/docs/error/HTTP_NOT_IMPLEMENTED.html.var b/docs/error/HTTP_NOT_IMPLEMENTED.html.var similarity index 100% rename from trunk/docs/error/HTTP_NOT_IMPLEMENTED.html.var rename to docs/error/HTTP_NOT_IMPLEMENTED.html.var diff --git a/trunk/docs/error/HTTP_PRECONDITION_FAILED.html.var b/docs/error/HTTP_PRECONDITION_FAILED.html.var similarity index 100% rename from trunk/docs/error/HTTP_PRECONDITION_FAILED.html.var rename to docs/error/HTTP_PRECONDITION_FAILED.html.var diff --git a/trunk/docs/error/HTTP_REQUEST_ENTITY_TOO_LARGE.html.var b/docs/error/HTTP_REQUEST_ENTITY_TOO_LARGE.html.var similarity index 100% rename from trunk/docs/error/HTTP_REQUEST_ENTITY_TOO_LARGE.html.var rename to docs/error/HTTP_REQUEST_ENTITY_TOO_LARGE.html.var diff --git a/trunk/docs/error/HTTP_REQUEST_TIME_OUT.html.var b/docs/error/HTTP_REQUEST_TIME_OUT.html.var similarity index 100% rename from trunk/docs/error/HTTP_REQUEST_TIME_OUT.html.var rename to docs/error/HTTP_REQUEST_TIME_OUT.html.var diff --git a/trunk/docs/error/HTTP_REQUEST_URI_TOO_LARGE.html.var b/docs/error/HTTP_REQUEST_URI_TOO_LARGE.html.var similarity index 100% rename from trunk/docs/error/HTTP_REQUEST_URI_TOO_LARGE.html.var rename to docs/error/HTTP_REQUEST_URI_TOO_LARGE.html.var diff --git a/trunk/docs/error/HTTP_SERVICE_UNAVAILABLE.html.var b/docs/error/HTTP_SERVICE_UNAVAILABLE.html.var similarity index 100% rename from trunk/docs/error/HTTP_SERVICE_UNAVAILABLE.html.var rename to docs/error/HTTP_SERVICE_UNAVAILABLE.html.var diff --git a/trunk/docs/error/HTTP_UNAUTHORIZED.html.var b/docs/error/HTTP_UNAUTHORIZED.html.var similarity index 100% rename from trunk/docs/error/HTTP_UNAUTHORIZED.html.var rename to docs/error/HTTP_UNAUTHORIZED.html.var diff --git a/trunk/docs/error/HTTP_UNSUPPORTED_MEDIA_TYPE.html.var b/docs/error/HTTP_UNSUPPORTED_MEDIA_TYPE.html.var similarity index 100% rename from trunk/docs/error/HTTP_UNSUPPORTED_MEDIA_TYPE.html.var rename to docs/error/HTTP_UNSUPPORTED_MEDIA_TYPE.html.var diff --git a/trunk/docs/error/HTTP_VARIANT_ALSO_VARIES.html.var b/docs/error/HTTP_VARIANT_ALSO_VARIES.html.var similarity index 100% rename from trunk/docs/error/HTTP_VARIANT_ALSO_VARIES.html.var rename to docs/error/HTTP_VARIANT_ALSO_VARIES.html.var diff --git a/trunk/docs/error/README b/docs/error/README similarity index 100% rename from trunk/docs/error/README rename to docs/error/README diff --git a/trunk/docs/error/contact.html.var b/docs/error/contact.html.var similarity index 100% rename from trunk/docs/error/contact.html.var rename to docs/error/contact.html.var diff --git a/trunk/docs/error/include/bottom.html b/docs/error/include/bottom.html similarity index 100% rename from trunk/docs/error/include/bottom.html rename to docs/error/include/bottom.html diff --git a/trunk/docs/error/include/spacer.html b/docs/error/include/spacer.html similarity index 100% rename from trunk/docs/error/include/spacer.html rename to docs/error/include/spacer.html diff --git a/trunk/docs/error/include/top.html b/docs/error/include/top.html similarity index 100% rename from trunk/docs/error/include/top.html rename to docs/error/include/top.html diff --git a/trunk/docs/icons/README b/docs/icons/README similarity index 100% rename from trunk/docs/icons/README rename to docs/icons/README diff --git a/trunk/docs/icons/a.gif b/docs/icons/a.gif similarity index 100% rename from trunk/docs/icons/a.gif rename to docs/icons/a.gif diff --git a/trunk/docs/icons/a.png b/docs/icons/a.png similarity index 100% rename from trunk/docs/icons/a.png rename to docs/icons/a.png diff --git a/trunk/docs/icons/alert.black.gif b/docs/icons/alert.black.gif similarity index 100% rename from trunk/docs/icons/alert.black.gif rename to docs/icons/alert.black.gif diff --git a/trunk/docs/icons/alert.black.png b/docs/icons/alert.black.png similarity index 100% rename from trunk/docs/icons/alert.black.png rename to docs/icons/alert.black.png diff --git a/trunk/docs/icons/alert.red.gif b/docs/icons/alert.red.gif similarity index 100% rename from trunk/docs/icons/alert.red.gif rename to docs/icons/alert.red.gif diff --git a/trunk/docs/icons/alert.red.png b/docs/icons/alert.red.png similarity index 100% rename from trunk/docs/icons/alert.red.png rename to docs/icons/alert.red.png diff --git a/trunk/docs/icons/apache_pb.gif b/docs/icons/apache_pb.gif similarity index 100% rename from trunk/docs/icons/apache_pb.gif rename to docs/icons/apache_pb.gif diff --git a/trunk/docs/icons/apache_pb.png b/docs/icons/apache_pb.png similarity index 100% rename from trunk/docs/icons/apache_pb.png rename to docs/icons/apache_pb.png diff --git a/trunk/docs/icons/apache_pb2.gif b/docs/icons/apache_pb2.gif similarity index 100% rename from trunk/docs/icons/apache_pb2.gif rename to docs/icons/apache_pb2.gif diff --git a/trunk/docs/icons/apache_pb2.png b/docs/icons/apache_pb2.png similarity index 100% rename from trunk/docs/icons/apache_pb2.png rename to docs/icons/apache_pb2.png diff --git a/trunk/docs/icons/apache_pb2_ani.gif b/docs/icons/apache_pb2_ani.gif similarity index 100% rename from trunk/docs/icons/apache_pb2_ani.gif rename to docs/icons/apache_pb2_ani.gif diff --git a/trunk/docs/icons/back.gif b/docs/icons/back.gif similarity index 100% rename from trunk/docs/icons/back.gif rename to docs/icons/back.gif diff --git a/trunk/docs/icons/back.png b/docs/icons/back.png similarity index 100% rename from trunk/docs/icons/back.png rename to docs/icons/back.png diff --git a/trunk/docs/icons/ball.gray.gif b/docs/icons/ball.gray.gif similarity index 100% rename from trunk/docs/icons/ball.gray.gif rename to docs/icons/ball.gray.gif diff --git a/trunk/docs/icons/ball.gray.png b/docs/icons/ball.gray.png similarity index 100% rename from trunk/docs/icons/ball.gray.png rename to docs/icons/ball.gray.png diff --git a/trunk/docs/icons/ball.red.gif b/docs/icons/ball.red.gif similarity index 100% rename from trunk/docs/icons/ball.red.gif rename to docs/icons/ball.red.gif diff --git a/trunk/docs/icons/ball.red.png b/docs/icons/ball.red.png similarity index 100% rename from trunk/docs/icons/ball.red.png rename to docs/icons/ball.red.png diff --git a/trunk/docs/icons/binary.gif b/docs/icons/binary.gif similarity index 100% rename from trunk/docs/icons/binary.gif rename to docs/icons/binary.gif diff --git a/trunk/docs/icons/binary.png b/docs/icons/binary.png similarity index 100% rename from trunk/docs/icons/binary.png rename to docs/icons/binary.png diff --git a/trunk/docs/icons/binhex.gif b/docs/icons/binhex.gif similarity index 100% rename from trunk/docs/icons/binhex.gif rename to docs/icons/binhex.gif diff --git a/trunk/docs/icons/binhex.png b/docs/icons/binhex.png similarity index 100% rename from trunk/docs/icons/binhex.png rename to docs/icons/binhex.png diff --git a/trunk/docs/icons/blank.gif b/docs/icons/blank.gif similarity index 100% rename from trunk/docs/icons/blank.gif rename to docs/icons/blank.gif diff --git a/trunk/docs/icons/blank.png b/docs/icons/blank.png similarity index 100% rename from trunk/docs/icons/blank.png rename to docs/icons/blank.png diff --git a/trunk/docs/icons/bomb.gif b/docs/icons/bomb.gif similarity index 100% rename from trunk/docs/icons/bomb.gif rename to docs/icons/bomb.gif diff --git a/trunk/docs/icons/bomb.png b/docs/icons/bomb.png similarity index 100% rename from trunk/docs/icons/bomb.png rename to docs/icons/bomb.png diff --git a/trunk/docs/icons/box1.gif b/docs/icons/box1.gif similarity index 100% rename from trunk/docs/icons/box1.gif rename to docs/icons/box1.gif diff --git a/trunk/docs/icons/box1.png b/docs/icons/box1.png similarity index 100% rename from trunk/docs/icons/box1.png rename to docs/icons/box1.png diff --git a/trunk/docs/icons/box2.gif b/docs/icons/box2.gif similarity index 100% rename from trunk/docs/icons/box2.gif rename to docs/icons/box2.gif diff --git a/trunk/docs/icons/box2.png b/docs/icons/box2.png similarity index 100% rename from trunk/docs/icons/box2.png rename to docs/icons/box2.png diff --git a/trunk/docs/icons/broken.gif b/docs/icons/broken.gif similarity index 100% rename from trunk/docs/icons/broken.gif rename to docs/icons/broken.gif diff --git a/trunk/docs/icons/broken.png b/docs/icons/broken.png similarity index 100% rename from trunk/docs/icons/broken.png rename to docs/icons/broken.png diff --git a/trunk/docs/icons/burst.gif b/docs/icons/burst.gif similarity index 100% rename from trunk/docs/icons/burst.gif rename to docs/icons/burst.gif diff --git a/trunk/docs/icons/burst.png b/docs/icons/burst.png similarity index 100% rename from trunk/docs/icons/burst.png rename to docs/icons/burst.png diff --git a/trunk/docs/icons/c.gif b/docs/icons/c.gif similarity index 100% rename from trunk/docs/icons/c.gif rename to docs/icons/c.gif diff --git a/trunk/docs/icons/c.png b/docs/icons/c.png similarity index 100% rename from trunk/docs/icons/c.png rename to docs/icons/c.png diff --git a/trunk/docs/icons/comp.blue.gif b/docs/icons/comp.blue.gif similarity index 100% rename from trunk/docs/icons/comp.blue.gif rename to docs/icons/comp.blue.gif diff --git a/trunk/docs/icons/comp.blue.png b/docs/icons/comp.blue.png similarity index 100% rename from trunk/docs/icons/comp.blue.png rename to docs/icons/comp.blue.png diff --git a/trunk/docs/icons/comp.gray.gif b/docs/icons/comp.gray.gif similarity index 100% rename from trunk/docs/icons/comp.gray.gif rename to docs/icons/comp.gray.gif diff --git a/trunk/docs/icons/comp.gray.png b/docs/icons/comp.gray.png similarity index 100% rename from trunk/docs/icons/comp.gray.png rename to docs/icons/comp.gray.png diff --git a/trunk/docs/icons/compressed.gif b/docs/icons/compressed.gif similarity index 100% rename from trunk/docs/icons/compressed.gif rename to docs/icons/compressed.gif diff --git a/trunk/docs/icons/compressed.png b/docs/icons/compressed.png similarity index 100% rename from trunk/docs/icons/compressed.png rename to docs/icons/compressed.png diff --git a/trunk/docs/icons/continued.gif b/docs/icons/continued.gif similarity index 100% rename from trunk/docs/icons/continued.gif rename to docs/icons/continued.gif diff --git a/trunk/docs/icons/continued.png b/docs/icons/continued.png similarity index 100% rename from trunk/docs/icons/continued.png rename to docs/icons/continued.png diff --git a/trunk/docs/icons/dir.gif b/docs/icons/dir.gif similarity index 100% rename from trunk/docs/icons/dir.gif rename to docs/icons/dir.gif diff --git a/trunk/docs/icons/dir.png b/docs/icons/dir.png similarity index 100% rename from trunk/docs/icons/dir.png rename to docs/icons/dir.png diff --git a/trunk/docs/icons/diskimg.gif b/docs/icons/diskimg.gif similarity index 100% rename from trunk/docs/icons/diskimg.gif rename to docs/icons/diskimg.gif diff --git a/trunk/docs/icons/diskimg.png b/docs/icons/diskimg.png similarity index 100% rename from trunk/docs/icons/diskimg.png rename to docs/icons/diskimg.png diff --git a/trunk/docs/icons/down.gif b/docs/icons/down.gif similarity index 100% rename from trunk/docs/icons/down.gif rename to docs/icons/down.gif diff --git a/trunk/docs/icons/down.png b/docs/icons/down.png similarity index 100% rename from trunk/docs/icons/down.png rename to docs/icons/down.png diff --git a/trunk/docs/icons/dvi.gif b/docs/icons/dvi.gif similarity index 100% rename from trunk/docs/icons/dvi.gif rename to docs/icons/dvi.gif diff --git a/trunk/docs/icons/dvi.png b/docs/icons/dvi.png similarity index 100% rename from trunk/docs/icons/dvi.png rename to docs/icons/dvi.png diff --git a/trunk/docs/icons/f.gif b/docs/icons/f.gif similarity index 100% rename from trunk/docs/icons/f.gif rename to docs/icons/f.gif diff --git a/trunk/docs/icons/f.png b/docs/icons/f.png similarity index 100% rename from trunk/docs/icons/f.png rename to docs/icons/f.png diff --git a/trunk/docs/icons/folder.gif b/docs/icons/folder.gif similarity index 100% rename from trunk/docs/icons/folder.gif rename to docs/icons/folder.gif diff --git a/trunk/docs/icons/folder.open.gif b/docs/icons/folder.open.gif similarity index 100% rename from trunk/docs/icons/folder.open.gif rename to docs/icons/folder.open.gif diff --git a/trunk/docs/icons/folder.open.png b/docs/icons/folder.open.png similarity index 100% rename from trunk/docs/icons/folder.open.png rename to docs/icons/folder.open.png diff --git a/trunk/docs/icons/folder.png b/docs/icons/folder.png similarity index 100% rename from trunk/docs/icons/folder.png rename to docs/icons/folder.png diff --git a/trunk/docs/icons/folder.sec.gif b/docs/icons/folder.sec.gif similarity index 100% rename from trunk/docs/icons/folder.sec.gif rename to docs/icons/folder.sec.gif diff --git a/trunk/docs/icons/folder.sec.png b/docs/icons/folder.sec.png similarity index 100% rename from trunk/docs/icons/folder.sec.png rename to docs/icons/folder.sec.png diff --git a/trunk/docs/icons/forward.gif b/docs/icons/forward.gif similarity index 100% rename from trunk/docs/icons/forward.gif rename to docs/icons/forward.gif diff --git a/trunk/docs/icons/forward.png b/docs/icons/forward.png similarity index 100% rename from trunk/docs/icons/forward.png rename to docs/icons/forward.png diff --git a/trunk/docs/icons/generic.gif b/docs/icons/generic.gif similarity index 100% rename from trunk/docs/icons/generic.gif rename to docs/icons/generic.gif diff --git a/trunk/docs/icons/generic.png b/docs/icons/generic.png similarity index 100% rename from trunk/docs/icons/generic.png rename to docs/icons/generic.png diff --git a/trunk/docs/icons/generic.red.gif b/docs/icons/generic.red.gif similarity index 100% rename from trunk/docs/icons/generic.red.gif rename to docs/icons/generic.red.gif diff --git a/trunk/docs/icons/generic.red.png b/docs/icons/generic.red.png similarity index 100% rename from trunk/docs/icons/generic.red.png rename to docs/icons/generic.red.png diff --git a/trunk/docs/icons/generic.sec.gif b/docs/icons/generic.sec.gif similarity index 100% rename from trunk/docs/icons/generic.sec.gif rename to docs/icons/generic.sec.gif diff --git a/trunk/docs/icons/generic.sec.png b/docs/icons/generic.sec.png similarity index 100% rename from trunk/docs/icons/generic.sec.png rename to docs/icons/generic.sec.png diff --git a/trunk/docs/icons/hand.right.gif b/docs/icons/hand.right.gif similarity index 100% rename from trunk/docs/icons/hand.right.gif rename to docs/icons/hand.right.gif diff --git a/trunk/docs/icons/hand.right.png b/docs/icons/hand.right.png similarity index 100% rename from trunk/docs/icons/hand.right.png rename to docs/icons/hand.right.png diff --git a/trunk/docs/icons/hand.up.gif b/docs/icons/hand.up.gif similarity index 100% rename from trunk/docs/icons/hand.up.gif rename to docs/icons/hand.up.gif diff --git a/trunk/docs/icons/hand.up.png b/docs/icons/hand.up.png similarity index 100% rename from trunk/docs/icons/hand.up.png rename to docs/icons/hand.up.png diff --git a/trunk/docs/icons/icon.sheet.gif b/docs/icons/icon.sheet.gif similarity index 100% rename from trunk/docs/icons/icon.sheet.gif rename to docs/icons/icon.sheet.gif diff --git a/trunk/docs/icons/icon.sheet.png b/docs/icons/icon.sheet.png similarity index 100% rename from trunk/docs/icons/icon.sheet.png rename to docs/icons/icon.sheet.png diff --git a/trunk/docs/icons/image1.gif b/docs/icons/image1.gif similarity index 100% rename from trunk/docs/icons/image1.gif rename to docs/icons/image1.gif diff --git a/trunk/docs/icons/image1.png b/docs/icons/image1.png similarity index 100% rename from trunk/docs/icons/image1.png rename to docs/icons/image1.png diff --git a/trunk/docs/icons/image2.gif b/docs/icons/image2.gif similarity index 100% rename from trunk/docs/icons/image2.gif rename to docs/icons/image2.gif diff --git a/trunk/docs/icons/image2.png b/docs/icons/image2.png similarity index 100% rename from trunk/docs/icons/image2.png rename to docs/icons/image2.png diff --git a/trunk/docs/icons/image3.gif b/docs/icons/image3.gif similarity index 100% rename from trunk/docs/icons/image3.gif rename to docs/icons/image3.gif diff --git a/trunk/docs/icons/image3.png b/docs/icons/image3.png similarity index 100% rename from trunk/docs/icons/image3.png rename to docs/icons/image3.png diff --git a/trunk/docs/icons/index.gif b/docs/icons/index.gif similarity index 100% rename from trunk/docs/icons/index.gif rename to docs/icons/index.gif diff --git a/trunk/docs/icons/index.png b/docs/icons/index.png similarity index 100% rename from trunk/docs/icons/index.png rename to docs/icons/index.png diff --git a/trunk/docs/icons/layout.gif b/docs/icons/layout.gif similarity index 100% rename from trunk/docs/icons/layout.gif rename to docs/icons/layout.gif diff --git a/trunk/docs/icons/layout.png b/docs/icons/layout.png similarity index 100% rename from trunk/docs/icons/layout.png rename to docs/icons/layout.png diff --git a/trunk/docs/icons/left.gif b/docs/icons/left.gif similarity index 100% rename from trunk/docs/icons/left.gif rename to docs/icons/left.gif diff --git a/trunk/docs/icons/left.png b/docs/icons/left.png similarity index 100% rename from trunk/docs/icons/left.png rename to docs/icons/left.png diff --git a/trunk/docs/icons/link.gif b/docs/icons/link.gif similarity index 100% rename from trunk/docs/icons/link.gif rename to docs/icons/link.gif diff --git a/trunk/docs/icons/link.png b/docs/icons/link.png similarity index 100% rename from trunk/docs/icons/link.png rename to docs/icons/link.png diff --git a/trunk/docs/icons/movie.gif b/docs/icons/movie.gif similarity index 100% rename from trunk/docs/icons/movie.gif rename to docs/icons/movie.gif diff --git a/trunk/docs/icons/movie.png b/docs/icons/movie.png similarity index 100% rename from trunk/docs/icons/movie.png rename to docs/icons/movie.png diff --git a/trunk/docs/icons/p.gif b/docs/icons/p.gif similarity index 100% rename from trunk/docs/icons/p.gif rename to docs/icons/p.gif diff --git a/trunk/docs/icons/p.png b/docs/icons/p.png similarity index 100% rename from trunk/docs/icons/p.png rename to docs/icons/p.png diff --git a/trunk/docs/icons/patch.gif b/docs/icons/patch.gif similarity index 100% rename from trunk/docs/icons/patch.gif rename to docs/icons/patch.gif diff --git a/trunk/docs/icons/patch.png b/docs/icons/patch.png similarity index 100% rename from trunk/docs/icons/patch.png rename to docs/icons/patch.png diff --git a/trunk/docs/icons/pdf.gif b/docs/icons/pdf.gif similarity index 100% rename from trunk/docs/icons/pdf.gif rename to docs/icons/pdf.gif diff --git a/trunk/docs/icons/pdf.png b/docs/icons/pdf.png similarity index 100% rename from trunk/docs/icons/pdf.png rename to docs/icons/pdf.png diff --git a/trunk/docs/icons/pie0.gif b/docs/icons/pie0.gif similarity index 100% rename from trunk/docs/icons/pie0.gif rename to docs/icons/pie0.gif diff --git a/trunk/docs/icons/pie0.png b/docs/icons/pie0.png similarity index 100% rename from trunk/docs/icons/pie0.png rename to docs/icons/pie0.png diff --git a/trunk/docs/icons/pie1.gif b/docs/icons/pie1.gif similarity index 100% rename from trunk/docs/icons/pie1.gif rename to docs/icons/pie1.gif diff --git a/trunk/docs/icons/pie1.png b/docs/icons/pie1.png similarity index 100% rename from trunk/docs/icons/pie1.png rename to docs/icons/pie1.png diff --git a/trunk/docs/icons/pie2.gif b/docs/icons/pie2.gif similarity index 100% rename from trunk/docs/icons/pie2.gif rename to docs/icons/pie2.gif diff --git a/trunk/docs/icons/pie2.png b/docs/icons/pie2.png similarity index 100% rename from trunk/docs/icons/pie2.png rename to docs/icons/pie2.png diff --git a/trunk/docs/icons/pie3.gif b/docs/icons/pie3.gif similarity index 100% rename from trunk/docs/icons/pie3.gif rename to docs/icons/pie3.gif diff --git a/trunk/docs/icons/pie3.png b/docs/icons/pie3.png similarity index 100% rename from trunk/docs/icons/pie3.png rename to docs/icons/pie3.png diff --git a/trunk/docs/icons/pie4.gif b/docs/icons/pie4.gif similarity index 100% rename from trunk/docs/icons/pie4.gif rename to docs/icons/pie4.gif diff --git a/trunk/docs/icons/pie4.png b/docs/icons/pie4.png similarity index 100% rename from trunk/docs/icons/pie4.png rename to docs/icons/pie4.png diff --git a/trunk/docs/icons/pie5.gif b/docs/icons/pie5.gif similarity index 100% rename from trunk/docs/icons/pie5.gif rename to docs/icons/pie5.gif diff --git a/trunk/docs/icons/pie5.png b/docs/icons/pie5.png similarity index 100% rename from trunk/docs/icons/pie5.png rename to docs/icons/pie5.png diff --git a/trunk/docs/icons/pie6.gif b/docs/icons/pie6.gif similarity index 100% rename from trunk/docs/icons/pie6.gif rename to docs/icons/pie6.gif diff --git a/trunk/docs/icons/pie6.png b/docs/icons/pie6.png similarity index 100% rename from trunk/docs/icons/pie6.png rename to docs/icons/pie6.png diff --git a/trunk/docs/icons/pie7.gif b/docs/icons/pie7.gif similarity index 100% rename from trunk/docs/icons/pie7.gif rename to docs/icons/pie7.gif diff --git a/trunk/docs/icons/pie7.png b/docs/icons/pie7.png similarity index 100% rename from trunk/docs/icons/pie7.png rename to docs/icons/pie7.png diff --git a/trunk/docs/icons/pie8.gif b/docs/icons/pie8.gif similarity index 100% rename from trunk/docs/icons/pie8.gif rename to docs/icons/pie8.gif diff --git a/trunk/docs/icons/pie8.png b/docs/icons/pie8.png similarity index 100% rename from trunk/docs/icons/pie8.png rename to docs/icons/pie8.png diff --git a/trunk/docs/icons/portal.gif b/docs/icons/portal.gif similarity index 100% rename from trunk/docs/icons/portal.gif rename to docs/icons/portal.gif diff --git a/trunk/docs/icons/portal.png b/docs/icons/portal.png similarity index 100% rename from trunk/docs/icons/portal.png rename to docs/icons/portal.png diff --git a/trunk/docs/icons/ps.gif b/docs/icons/ps.gif similarity index 100% rename from trunk/docs/icons/ps.gif rename to docs/icons/ps.gif diff --git a/trunk/docs/icons/ps.png b/docs/icons/ps.png similarity index 100% rename from trunk/docs/icons/ps.png rename to docs/icons/ps.png diff --git a/trunk/docs/icons/quill.gif b/docs/icons/quill.gif similarity index 100% rename from trunk/docs/icons/quill.gif rename to docs/icons/quill.gif diff --git a/trunk/docs/icons/quill.png b/docs/icons/quill.png similarity index 100% rename from trunk/docs/icons/quill.png rename to docs/icons/quill.png diff --git a/trunk/docs/icons/right.gif b/docs/icons/right.gif similarity index 100% rename from trunk/docs/icons/right.gif rename to docs/icons/right.gif diff --git a/trunk/docs/icons/right.png b/docs/icons/right.png similarity index 100% rename from trunk/docs/icons/right.png rename to docs/icons/right.png diff --git a/trunk/docs/icons/screw1.gif b/docs/icons/screw1.gif similarity index 100% rename from trunk/docs/icons/screw1.gif rename to docs/icons/screw1.gif diff --git a/trunk/docs/icons/screw1.png b/docs/icons/screw1.png similarity index 100% rename from trunk/docs/icons/screw1.png rename to docs/icons/screw1.png diff --git a/trunk/docs/icons/screw2.gif b/docs/icons/screw2.gif similarity index 100% rename from trunk/docs/icons/screw2.gif rename to docs/icons/screw2.gif diff --git a/trunk/docs/icons/screw2.png b/docs/icons/screw2.png similarity index 100% rename from trunk/docs/icons/screw2.png rename to docs/icons/screw2.png diff --git a/trunk/docs/icons/script.gif b/docs/icons/script.gif similarity index 100% rename from trunk/docs/icons/script.gif rename to docs/icons/script.gif diff --git a/trunk/docs/icons/script.png b/docs/icons/script.png similarity index 100% rename from trunk/docs/icons/script.png rename to docs/icons/script.png diff --git a/trunk/docs/icons/small/README.txt b/docs/icons/small/README.txt similarity index 100% rename from trunk/docs/icons/small/README.txt rename to docs/icons/small/README.txt diff --git a/trunk/docs/icons/small/back.gif b/docs/icons/small/back.gif similarity index 100% rename from trunk/docs/icons/small/back.gif rename to docs/icons/small/back.gif diff --git a/trunk/docs/icons/small/back.png b/docs/icons/small/back.png similarity index 100% rename from trunk/docs/icons/small/back.png rename to docs/icons/small/back.png diff --git a/trunk/docs/icons/small/binary.gif b/docs/icons/small/binary.gif similarity index 100% rename from trunk/docs/icons/small/binary.gif rename to docs/icons/small/binary.gif diff --git a/trunk/docs/icons/small/binary.png b/docs/icons/small/binary.png similarity index 100% rename from trunk/docs/icons/small/binary.png rename to docs/icons/small/binary.png diff --git a/trunk/docs/icons/small/binhex.gif b/docs/icons/small/binhex.gif similarity index 100% rename from trunk/docs/icons/small/binhex.gif rename to docs/icons/small/binhex.gif diff --git a/trunk/docs/icons/small/binhex.png b/docs/icons/small/binhex.png similarity index 100% rename from trunk/docs/icons/small/binhex.png rename to docs/icons/small/binhex.png diff --git a/trunk/docs/icons/small/blank.gif b/docs/icons/small/blank.gif similarity index 100% rename from trunk/docs/icons/small/blank.gif rename to docs/icons/small/blank.gif diff --git a/trunk/docs/icons/small/blank.png b/docs/icons/small/blank.png similarity index 100% rename from trunk/docs/icons/small/blank.png rename to docs/icons/small/blank.png diff --git a/trunk/docs/icons/small/broken.gif b/docs/icons/small/broken.gif similarity index 100% rename from trunk/docs/icons/small/broken.gif rename to docs/icons/small/broken.gif diff --git a/trunk/docs/icons/small/broken.png b/docs/icons/small/broken.png similarity index 100% rename from trunk/docs/icons/small/broken.png rename to docs/icons/small/broken.png diff --git a/trunk/docs/icons/small/burst.gif b/docs/icons/small/burst.gif similarity index 100% rename from trunk/docs/icons/small/burst.gif rename to docs/icons/small/burst.gif diff --git a/trunk/docs/icons/small/burst.png b/docs/icons/small/burst.png similarity index 100% rename from trunk/docs/icons/small/burst.png rename to docs/icons/small/burst.png diff --git a/trunk/docs/icons/small/comp1.gif b/docs/icons/small/comp1.gif similarity index 100% rename from trunk/docs/icons/small/comp1.gif rename to docs/icons/small/comp1.gif diff --git a/trunk/docs/icons/small/comp1.png b/docs/icons/small/comp1.png similarity index 100% rename from trunk/docs/icons/small/comp1.png rename to docs/icons/small/comp1.png diff --git a/trunk/docs/icons/small/comp2.gif b/docs/icons/small/comp2.gif similarity index 100% rename from trunk/docs/icons/small/comp2.gif rename to docs/icons/small/comp2.gif diff --git a/trunk/docs/icons/small/comp2.png b/docs/icons/small/comp2.png similarity index 100% rename from trunk/docs/icons/small/comp2.png rename to docs/icons/small/comp2.png diff --git a/trunk/docs/icons/small/compressed.gif b/docs/icons/small/compressed.gif similarity index 100% rename from trunk/docs/icons/small/compressed.gif rename to docs/icons/small/compressed.gif diff --git a/trunk/docs/icons/small/compressed.png b/docs/icons/small/compressed.png similarity index 100% rename from trunk/docs/icons/small/compressed.png rename to docs/icons/small/compressed.png diff --git a/trunk/docs/icons/small/continued.gif b/docs/icons/small/continued.gif similarity index 100% rename from trunk/docs/icons/small/continued.gif rename to docs/icons/small/continued.gif diff --git a/trunk/docs/icons/small/continued.png b/docs/icons/small/continued.png similarity index 100% rename from trunk/docs/icons/small/continued.png rename to docs/icons/small/continued.png diff --git a/trunk/docs/icons/small/dir.gif b/docs/icons/small/dir.gif similarity index 100% rename from trunk/docs/icons/small/dir.gif rename to docs/icons/small/dir.gif diff --git a/trunk/docs/icons/small/dir.png b/docs/icons/small/dir.png similarity index 100% rename from trunk/docs/icons/small/dir.png rename to docs/icons/small/dir.png diff --git a/trunk/docs/icons/small/dir2.gif b/docs/icons/small/dir2.gif similarity index 100% rename from trunk/docs/icons/small/dir2.gif rename to docs/icons/small/dir2.gif diff --git a/trunk/docs/icons/small/dir2.png b/docs/icons/small/dir2.png similarity index 100% rename from trunk/docs/icons/small/dir2.png rename to docs/icons/small/dir2.png diff --git a/trunk/docs/icons/small/doc.gif b/docs/icons/small/doc.gif similarity index 100% rename from trunk/docs/icons/small/doc.gif rename to docs/icons/small/doc.gif diff --git a/trunk/docs/icons/small/doc.png b/docs/icons/small/doc.png similarity index 100% rename from trunk/docs/icons/small/doc.png rename to docs/icons/small/doc.png diff --git a/trunk/docs/icons/small/forward.gif b/docs/icons/small/forward.gif similarity index 100% rename from trunk/docs/icons/small/forward.gif rename to docs/icons/small/forward.gif diff --git a/trunk/docs/icons/small/forward.png b/docs/icons/small/forward.png similarity index 100% rename from trunk/docs/icons/small/forward.png rename to docs/icons/small/forward.png diff --git a/trunk/docs/icons/small/generic.gif b/docs/icons/small/generic.gif similarity index 100% rename from trunk/docs/icons/small/generic.gif rename to docs/icons/small/generic.gif diff --git a/trunk/docs/icons/small/generic.png b/docs/icons/small/generic.png similarity index 100% rename from trunk/docs/icons/small/generic.png rename to docs/icons/small/generic.png diff --git a/trunk/docs/icons/small/generic2.gif b/docs/icons/small/generic2.gif similarity index 100% rename from trunk/docs/icons/small/generic2.gif rename to docs/icons/small/generic2.gif diff --git a/trunk/docs/icons/small/generic2.png b/docs/icons/small/generic2.png similarity index 100% rename from trunk/docs/icons/small/generic2.png rename to docs/icons/small/generic2.png diff --git a/trunk/docs/icons/small/generic3.gif b/docs/icons/small/generic3.gif similarity index 100% rename from trunk/docs/icons/small/generic3.gif rename to docs/icons/small/generic3.gif diff --git a/trunk/docs/icons/small/generic3.png b/docs/icons/small/generic3.png similarity index 100% rename from trunk/docs/icons/small/generic3.png rename to docs/icons/small/generic3.png diff --git a/trunk/docs/icons/small/image.gif b/docs/icons/small/image.gif similarity index 100% rename from trunk/docs/icons/small/image.gif rename to docs/icons/small/image.gif diff --git a/trunk/docs/icons/small/image.png b/docs/icons/small/image.png similarity index 100% rename from trunk/docs/icons/small/image.png rename to docs/icons/small/image.png diff --git a/trunk/docs/icons/small/image2.gif b/docs/icons/small/image2.gif similarity index 100% rename from trunk/docs/icons/small/image2.gif rename to docs/icons/small/image2.gif diff --git a/trunk/docs/icons/small/image2.png b/docs/icons/small/image2.png similarity index 100% rename from trunk/docs/icons/small/image2.png rename to docs/icons/small/image2.png diff --git a/trunk/docs/icons/small/index.gif b/docs/icons/small/index.gif similarity index 100% rename from trunk/docs/icons/small/index.gif rename to docs/icons/small/index.gif diff --git a/trunk/docs/icons/small/index.png b/docs/icons/small/index.png similarity index 100% rename from trunk/docs/icons/small/index.png rename to docs/icons/small/index.png diff --git a/trunk/docs/icons/small/key.gif b/docs/icons/small/key.gif similarity index 100% rename from trunk/docs/icons/small/key.gif rename to docs/icons/small/key.gif diff --git a/trunk/docs/icons/small/key.png b/docs/icons/small/key.png similarity index 100% rename from trunk/docs/icons/small/key.png rename to docs/icons/small/key.png diff --git a/trunk/docs/icons/small/movie.gif b/docs/icons/small/movie.gif similarity index 100% rename from trunk/docs/icons/small/movie.gif rename to docs/icons/small/movie.gif diff --git a/trunk/docs/icons/small/movie.png b/docs/icons/small/movie.png similarity index 100% rename from trunk/docs/icons/small/movie.png rename to docs/icons/small/movie.png diff --git a/trunk/docs/icons/small/patch.gif b/docs/icons/small/patch.gif similarity index 100% rename from trunk/docs/icons/small/patch.gif rename to docs/icons/small/patch.gif diff --git a/trunk/docs/icons/small/patch.png b/docs/icons/small/patch.png similarity index 100% rename from trunk/docs/icons/small/patch.png rename to docs/icons/small/patch.png diff --git a/trunk/docs/icons/small/ps.gif b/docs/icons/small/ps.gif similarity index 100% rename from trunk/docs/icons/small/ps.gif rename to docs/icons/small/ps.gif diff --git a/trunk/docs/icons/small/ps.png b/docs/icons/small/ps.png similarity index 100% rename from trunk/docs/icons/small/ps.png rename to docs/icons/small/ps.png diff --git a/trunk/docs/icons/small/rainbow.gif b/docs/icons/small/rainbow.gif similarity index 100% rename from trunk/docs/icons/small/rainbow.gif rename to docs/icons/small/rainbow.gif diff --git a/trunk/docs/icons/small/rainbow.png b/docs/icons/small/rainbow.png similarity index 100% rename from trunk/docs/icons/small/rainbow.png rename to docs/icons/small/rainbow.png diff --git a/trunk/docs/icons/small/sound.gif b/docs/icons/small/sound.gif similarity index 100% rename from trunk/docs/icons/small/sound.gif rename to docs/icons/small/sound.gif diff --git a/trunk/docs/icons/small/sound.png b/docs/icons/small/sound.png similarity index 100% rename from trunk/docs/icons/small/sound.png rename to docs/icons/small/sound.png diff --git a/trunk/docs/icons/small/sound2.gif b/docs/icons/small/sound2.gif similarity index 100% rename from trunk/docs/icons/small/sound2.gif rename to docs/icons/small/sound2.gif diff --git a/trunk/docs/icons/small/sound2.png b/docs/icons/small/sound2.png similarity index 100% rename from trunk/docs/icons/small/sound2.png rename to docs/icons/small/sound2.png diff --git a/trunk/docs/icons/small/tar.gif b/docs/icons/small/tar.gif similarity index 100% rename from trunk/docs/icons/small/tar.gif rename to docs/icons/small/tar.gif diff --git a/trunk/docs/icons/small/tar.png b/docs/icons/small/tar.png similarity index 100% rename from trunk/docs/icons/small/tar.png rename to docs/icons/small/tar.png diff --git a/trunk/docs/icons/small/text.gif b/docs/icons/small/text.gif similarity index 100% rename from trunk/docs/icons/small/text.gif rename to docs/icons/small/text.gif diff --git a/trunk/docs/icons/small/text.png b/docs/icons/small/text.png similarity index 100% rename from trunk/docs/icons/small/text.png rename to docs/icons/small/text.png diff --git a/trunk/docs/icons/small/transfer.gif b/docs/icons/small/transfer.gif similarity index 100% rename from trunk/docs/icons/small/transfer.gif rename to docs/icons/small/transfer.gif diff --git a/trunk/docs/icons/small/transfer.png b/docs/icons/small/transfer.png similarity index 100% rename from trunk/docs/icons/small/transfer.png rename to docs/icons/small/transfer.png diff --git a/trunk/docs/icons/small/unknown.gif b/docs/icons/small/unknown.gif similarity index 100% rename from trunk/docs/icons/small/unknown.gif rename to docs/icons/small/unknown.gif diff --git a/trunk/docs/icons/small/unknown.png b/docs/icons/small/unknown.png similarity index 100% rename from trunk/docs/icons/small/unknown.png rename to docs/icons/small/unknown.png diff --git a/trunk/docs/icons/small/uu.gif b/docs/icons/small/uu.gif similarity index 100% rename from trunk/docs/icons/small/uu.gif rename to docs/icons/small/uu.gif diff --git a/trunk/docs/icons/small/uu.png b/docs/icons/small/uu.png similarity index 100% rename from trunk/docs/icons/small/uu.png rename to docs/icons/small/uu.png diff --git a/trunk/docs/icons/sound1.gif b/docs/icons/sound1.gif similarity index 100% rename from trunk/docs/icons/sound1.gif rename to docs/icons/sound1.gif diff --git a/trunk/docs/icons/sound1.png b/docs/icons/sound1.png similarity index 100% rename from trunk/docs/icons/sound1.png rename to docs/icons/sound1.png diff --git a/trunk/docs/icons/sound2.gif b/docs/icons/sound2.gif similarity index 100% rename from trunk/docs/icons/sound2.gif rename to docs/icons/sound2.gif diff --git a/trunk/docs/icons/sound2.png b/docs/icons/sound2.png similarity index 100% rename from trunk/docs/icons/sound2.png rename to docs/icons/sound2.png diff --git a/trunk/docs/icons/sphere1.gif b/docs/icons/sphere1.gif similarity index 100% rename from trunk/docs/icons/sphere1.gif rename to docs/icons/sphere1.gif diff --git a/trunk/docs/icons/sphere1.png b/docs/icons/sphere1.png similarity index 100% rename from trunk/docs/icons/sphere1.png rename to docs/icons/sphere1.png diff --git a/trunk/docs/icons/sphere2.gif b/docs/icons/sphere2.gif similarity index 100% rename from trunk/docs/icons/sphere2.gif rename to docs/icons/sphere2.gif diff --git a/trunk/docs/icons/sphere2.png b/docs/icons/sphere2.png similarity index 100% rename from trunk/docs/icons/sphere2.png rename to docs/icons/sphere2.png diff --git a/trunk/docs/icons/tar.gif b/docs/icons/tar.gif similarity index 100% rename from trunk/docs/icons/tar.gif rename to docs/icons/tar.gif diff --git a/trunk/docs/icons/tar.png b/docs/icons/tar.png similarity index 100% rename from trunk/docs/icons/tar.png rename to docs/icons/tar.png diff --git a/trunk/docs/icons/tex.gif b/docs/icons/tex.gif similarity index 100% rename from trunk/docs/icons/tex.gif rename to docs/icons/tex.gif diff --git a/trunk/docs/icons/tex.png b/docs/icons/tex.png similarity index 100% rename from trunk/docs/icons/tex.png rename to docs/icons/tex.png diff --git a/trunk/docs/icons/text.gif b/docs/icons/text.gif similarity index 100% rename from trunk/docs/icons/text.gif rename to docs/icons/text.gif diff --git a/trunk/docs/icons/text.png b/docs/icons/text.png similarity index 100% rename from trunk/docs/icons/text.png rename to docs/icons/text.png diff --git a/trunk/docs/icons/transfer.gif b/docs/icons/transfer.gif similarity index 100% rename from trunk/docs/icons/transfer.gif rename to docs/icons/transfer.gif diff --git a/trunk/docs/icons/transfer.png b/docs/icons/transfer.png similarity index 100% rename from trunk/docs/icons/transfer.png rename to docs/icons/transfer.png diff --git a/trunk/docs/icons/unknown.gif b/docs/icons/unknown.gif similarity index 100% rename from trunk/docs/icons/unknown.gif rename to docs/icons/unknown.gif diff --git a/trunk/docs/icons/unknown.png b/docs/icons/unknown.png similarity index 100% rename from trunk/docs/icons/unknown.png rename to docs/icons/unknown.png diff --git a/trunk/docs/icons/up.gif b/docs/icons/up.gif similarity index 100% rename from trunk/docs/icons/up.gif rename to docs/icons/up.gif diff --git a/trunk/docs/icons/up.png b/docs/icons/up.png similarity index 100% rename from trunk/docs/icons/up.png rename to docs/icons/up.png diff --git a/trunk/docs/icons/uu.gif b/docs/icons/uu.gif similarity index 100% rename from trunk/docs/icons/uu.gif rename to docs/icons/uu.gif diff --git a/trunk/docs/icons/uu.png b/docs/icons/uu.png similarity index 100% rename from trunk/docs/icons/uu.png rename to docs/icons/uu.png diff --git a/trunk/docs/icons/uuencoded.gif b/docs/icons/uuencoded.gif similarity index 100% rename from trunk/docs/icons/uuencoded.gif rename to docs/icons/uuencoded.gif diff --git a/trunk/docs/icons/uuencoded.png b/docs/icons/uuencoded.png similarity index 100% rename from trunk/docs/icons/uuencoded.png rename to docs/icons/uuencoded.png diff --git a/trunk/docs/icons/world1.gif b/docs/icons/world1.gif similarity index 100% rename from trunk/docs/icons/world1.gif rename to docs/icons/world1.gif diff --git a/trunk/docs/icons/world1.png b/docs/icons/world1.png similarity index 100% rename from trunk/docs/icons/world1.png rename to docs/icons/world1.png diff --git a/trunk/docs/icons/world2.gif b/docs/icons/world2.gif similarity index 100% rename from trunk/docs/icons/world2.gif rename to docs/icons/world2.gif diff --git a/trunk/docs/icons/world2.png b/docs/icons/world2.png similarity index 100% rename from trunk/docs/icons/world2.png rename to docs/icons/world2.png diff --git a/trunk/docs/man/ab.8 b/docs/man/ab.8 similarity index 100% rename from trunk/docs/man/ab.8 rename to docs/man/ab.8 diff --git a/trunk/docs/man/apachectl.8 b/docs/man/apachectl.8 similarity index 100% rename from trunk/docs/man/apachectl.8 rename to docs/man/apachectl.8 diff --git a/trunk/docs/man/apxs.8 b/docs/man/apxs.8 similarity index 100% rename from trunk/docs/man/apxs.8 rename to docs/man/apxs.8 diff --git a/trunk/docs/man/dbmmanage.1 b/docs/man/dbmmanage.1 similarity index 100% rename from trunk/docs/man/dbmmanage.1 rename to docs/man/dbmmanage.1 diff --git a/trunk/docs/man/htcacheclean.8 b/docs/man/htcacheclean.8 similarity index 100% rename from trunk/docs/man/htcacheclean.8 rename to docs/man/htcacheclean.8 diff --git a/trunk/docs/man/htdbm.1 b/docs/man/htdbm.1 similarity index 100% rename from trunk/docs/man/htdbm.1 rename to docs/man/htdbm.1 diff --git a/trunk/docs/man/htdigest.1 b/docs/man/htdigest.1 similarity index 100% rename from trunk/docs/man/htdigest.1 rename to docs/man/htdigest.1 diff --git a/trunk/docs/man/htpasswd.1 b/docs/man/htpasswd.1 similarity index 100% rename from trunk/docs/man/htpasswd.1 rename to docs/man/htpasswd.1 diff --git a/trunk/docs/man/httpd.8 b/docs/man/httpd.8 similarity index 100% rename from trunk/docs/man/httpd.8 rename to docs/man/httpd.8 diff --git a/trunk/docs/man/logresolve.8 b/docs/man/logresolve.8 similarity index 100% rename from trunk/docs/man/logresolve.8 rename to docs/man/logresolve.8 diff --git a/trunk/docs/man/rotatelogs.8 b/docs/man/rotatelogs.8 similarity index 100% rename from trunk/docs/man/rotatelogs.8 rename to docs/man/rotatelogs.8 diff --git a/trunk/docs/man/suexec.8 b/docs/man/suexec.8 similarity index 100% rename from trunk/docs/man/suexec.8 rename to docs/man/suexec.8 diff --git a/trunk/docs/manual/LICENSE b/docs/manual/LICENSE similarity index 100% rename from trunk/docs/manual/LICENSE rename to docs/manual/LICENSE diff --git a/trunk/docs/manual/bind.html b/docs/manual/bind.html similarity index 100% rename from trunk/docs/manual/bind.html rename to docs/manual/bind.html diff --git a/trunk/docs/manual/bind.html.de b/docs/manual/bind.html.de similarity index 100% rename from trunk/docs/manual/bind.html.de rename to docs/manual/bind.html.de diff --git a/trunk/docs/manual/bind.html.en b/docs/manual/bind.html.en similarity index 100% rename from trunk/docs/manual/bind.html.en rename to docs/manual/bind.html.en diff --git a/trunk/docs/manual/bind.html.fr b/docs/manual/bind.html.fr similarity index 100% rename from trunk/docs/manual/bind.html.fr rename to docs/manual/bind.html.fr diff --git a/trunk/docs/manual/bind.html.ja.euc-jp b/docs/manual/bind.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/bind.html.ja.euc-jp rename to docs/manual/bind.html.ja.euc-jp diff --git a/trunk/docs/manual/bind.html.ko.euc-kr b/docs/manual/bind.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/bind.html.ko.euc-kr rename to docs/manual/bind.html.ko.euc-kr diff --git a/trunk/docs/manual/bind.xml b/docs/manual/bind.xml similarity index 100% rename from trunk/docs/manual/bind.xml rename to docs/manual/bind.xml diff --git a/trunk/docs/manual/bind.xml.de b/docs/manual/bind.xml.de similarity index 100% rename from trunk/docs/manual/bind.xml.de rename to docs/manual/bind.xml.de diff --git a/trunk/docs/manual/bind.xml.fr b/docs/manual/bind.xml.fr similarity index 100% rename from trunk/docs/manual/bind.xml.fr rename to docs/manual/bind.xml.fr diff --git a/trunk/docs/manual/bind.xml.ja b/docs/manual/bind.xml.ja similarity index 100% rename from trunk/docs/manual/bind.xml.ja rename to docs/manual/bind.xml.ja diff --git a/trunk/docs/manual/bind.xml.ko b/docs/manual/bind.xml.ko similarity index 100% rename from trunk/docs/manual/bind.xml.ko rename to docs/manual/bind.xml.ko diff --git a/trunk/docs/manual/bind.xml.meta b/docs/manual/bind.xml.meta similarity index 100% rename from trunk/docs/manual/bind.xml.meta rename to docs/manual/bind.xml.meta diff --git a/trunk/docs/manual/configuring.html b/docs/manual/configuring.html similarity index 100% rename from trunk/docs/manual/configuring.html rename to docs/manual/configuring.html diff --git a/trunk/docs/manual/configuring.html.de b/docs/manual/configuring.html.de similarity index 100% rename from trunk/docs/manual/configuring.html.de rename to docs/manual/configuring.html.de diff --git a/trunk/docs/manual/configuring.html.en b/docs/manual/configuring.html.en similarity index 100% rename from trunk/docs/manual/configuring.html.en rename to docs/manual/configuring.html.en diff --git a/trunk/docs/manual/configuring.html.ja.euc-jp b/docs/manual/configuring.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/configuring.html.ja.euc-jp rename to docs/manual/configuring.html.ja.euc-jp diff --git a/trunk/docs/manual/configuring.html.ko.euc-kr b/docs/manual/configuring.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/configuring.html.ko.euc-kr rename to docs/manual/configuring.html.ko.euc-kr diff --git a/trunk/docs/manual/configuring.xml b/docs/manual/configuring.xml similarity index 100% rename from trunk/docs/manual/configuring.xml rename to docs/manual/configuring.xml diff --git a/trunk/docs/manual/configuring.xml.de b/docs/manual/configuring.xml.de similarity index 100% rename from trunk/docs/manual/configuring.xml.de rename to docs/manual/configuring.xml.de diff --git a/trunk/docs/manual/configuring.xml.ja b/docs/manual/configuring.xml.ja similarity index 100% rename from trunk/docs/manual/configuring.xml.ja rename to docs/manual/configuring.xml.ja diff --git a/trunk/docs/manual/configuring.xml.ko b/docs/manual/configuring.xml.ko similarity index 100% rename from trunk/docs/manual/configuring.xml.ko rename to docs/manual/configuring.xml.ko diff --git a/trunk/docs/manual/configuring.xml.meta b/docs/manual/configuring.xml.meta similarity index 100% rename from trunk/docs/manual/configuring.xml.meta rename to docs/manual/configuring.xml.meta diff --git a/trunk/docs/manual/content-negotiation.html b/docs/manual/content-negotiation.html similarity index 100% rename from trunk/docs/manual/content-negotiation.html rename to docs/manual/content-negotiation.html diff --git a/trunk/docs/manual/content-negotiation.html.en b/docs/manual/content-negotiation.html.en similarity index 100% rename from trunk/docs/manual/content-negotiation.html.en rename to docs/manual/content-negotiation.html.en diff --git a/trunk/docs/manual/content-negotiation.html.ja.euc-jp b/docs/manual/content-negotiation.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/content-negotiation.html.ja.euc-jp rename to docs/manual/content-negotiation.html.ja.euc-jp diff --git a/trunk/docs/manual/content-negotiation.html.ko.euc-kr b/docs/manual/content-negotiation.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/content-negotiation.html.ko.euc-kr rename to docs/manual/content-negotiation.html.ko.euc-kr diff --git a/trunk/docs/manual/content-negotiation.xml b/docs/manual/content-negotiation.xml similarity index 100% rename from trunk/docs/manual/content-negotiation.xml rename to docs/manual/content-negotiation.xml diff --git a/trunk/docs/manual/content-negotiation.xml.ja b/docs/manual/content-negotiation.xml.ja similarity index 100% rename from trunk/docs/manual/content-negotiation.xml.ja rename to docs/manual/content-negotiation.xml.ja diff --git a/trunk/docs/manual/content-negotiation.xml.ko b/docs/manual/content-negotiation.xml.ko similarity index 100% rename from trunk/docs/manual/content-negotiation.xml.ko rename to docs/manual/content-negotiation.xml.ko diff --git a/trunk/docs/manual/content-negotiation.xml.meta b/docs/manual/content-negotiation.xml.meta similarity index 100% rename from trunk/docs/manual/content-negotiation.xml.meta rename to docs/manual/content-negotiation.xml.meta diff --git a/trunk/docs/manual/custom-error.html b/docs/manual/custom-error.html similarity index 100% rename from trunk/docs/manual/custom-error.html rename to docs/manual/custom-error.html diff --git a/trunk/docs/manual/custom-error.html.en b/docs/manual/custom-error.html.en similarity index 100% rename from trunk/docs/manual/custom-error.html.en rename to docs/manual/custom-error.html.en diff --git a/trunk/docs/manual/custom-error.html.es b/docs/manual/custom-error.html.es similarity index 100% rename from trunk/docs/manual/custom-error.html.es rename to docs/manual/custom-error.html.es diff --git a/trunk/docs/manual/custom-error.html.ja.euc-jp b/docs/manual/custom-error.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/custom-error.html.ja.euc-jp rename to docs/manual/custom-error.html.ja.euc-jp diff --git a/trunk/docs/manual/custom-error.html.ko.euc-kr b/docs/manual/custom-error.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/custom-error.html.ko.euc-kr rename to docs/manual/custom-error.html.ko.euc-kr diff --git a/trunk/docs/manual/custom-error.xml b/docs/manual/custom-error.xml similarity index 100% rename from trunk/docs/manual/custom-error.xml rename to docs/manual/custom-error.xml diff --git a/trunk/docs/manual/custom-error.xml.es b/docs/manual/custom-error.xml.es similarity index 100% rename from trunk/docs/manual/custom-error.xml.es rename to docs/manual/custom-error.xml.es diff --git a/trunk/docs/manual/custom-error.xml.ja b/docs/manual/custom-error.xml.ja similarity index 100% rename from trunk/docs/manual/custom-error.xml.ja rename to docs/manual/custom-error.xml.ja diff --git a/trunk/docs/manual/custom-error.xml.ko b/docs/manual/custom-error.xml.ko similarity index 100% rename from trunk/docs/manual/custom-error.xml.ko rename to docs/manual/custom-error.xml.ko diff --git a/trunk/docs/manual/custom-error.xml.meta b/docs/manual/custom-error.xml.meta similarity index 100% rename from trunk/docs/manual/custom-error.xml.meta rename to docs/manual/custom-error.xml.meta diff --git a/trunk/docs/manual/developer/API.html b/docs/manual/developer/API.html similarity index 100% rename from trunk/docs/manual/developer/API.html rename to docs/manual/developer/API.html diff --git a/trunk/docs/manual/developer/API.html.en b/docs/manual/developer/API.html.en similarity index 100% rename from trunk/docs/manual/developer/API.html.en rename to docs/manual/developer/API.html.en diff --git a/trunk/docs/manual/developer/API.xml b/docs/manual/developer/API.xml similarity index 100% rename from trunk/docs/manual/developer/API.xml rename to docs/manual/developer/API.xml diff --git a/trunk/docs/manual/developer/API.xml.meta b/docs/manual/developer/API.xml.meta similarity index 100% rename from trunk/docs/manual/developer/API.xml.meta rename to docs/manual/developer/API.xml.meta diff --git a/trunk/docs/manual/developer/debugging.html b/docs/manual/developer/debugging.html similarity index 100% rename from trunk/docs/manual/developer/debugging.html rename to docs/manual/developer/debugging.html diff --git a/trunk/docs/manual/developer/debugging.html.en b/docs/manual/developer/debugging.html.en similarity index 100% rename from trunk/docs/manual/developer/debugging.html.en rename to docs/manual/developer/debugging.html.en diff --git a/trunk/docs/manual/developer/debugging.xml b/docs/manual/developer/debugging.xml similarity index 100% rename from trunk/docs/manual/developer/debugging.xml rename to docs/manual/developer/debugging.xml diff --git a/trunk/docs/manual/developer/debugging.xml.meta b/docs/manual/developer/debugging.xml.meta similarity index 100% rename from trunk/docs/manual/developer/debugging.xml.meta rename to docs/manual/developer/debugging.xml.meta diff --git a/trunk/docs/manual/developer/documenting.html b/docs/manual/developer/documenting.html similarity index 100% rename from trunk/docs/manual/developer/documenting.html rename to docs/manual/developer/documenting.html diff --git a/trunk/docs/manual/developer/documenting.html.en b/docs/manual/developer/documenting.html.en similarity index 100% rename from trunk/docs/manual/developer/documenting.html.en rename to docs/manual/developer/documenting.html.en diff --git a/trunk/docs/manual/developer/documenting.xml b/docs/manual/developer/documenting.xml similarity index 100% rename from trunk/docs/manual/developer/documenting.xml rename to docs/manual/developer/documenting.xml diff --git a/trunk/docs/manual/developer/documenting.xml.meta b/docs/manual/developer/documenting.xml.meta similarity index 100% rename from trunk/docs/manual/developer/documenting.xml.meta rename to docs/manual/developer/documenting.xml.meta diff --git a/trunk/docs/manual/developer/filters.html b/docs/manual/developer/filters.html similarity index 100% rename from trunk/docs/manual/developer/filters.html rename to docs/manual/developer/filters.html diff --git a/trunk/docs/manual/developer/filters.html.en b/docs/manual/developer/filters.html.en similarity index 100% rename from trunk/docs/manual/developer/filters.html.en rename to docs/manual/developer/filters.html.en diff --git a/trunk/docs/manual/developer/filters.xml b/docs/manual/developer/filters.xml similarity index 100% rename from trunk/docs/manual/developer/filters.xml rename to docs/manual/developer/filters.xml diff --git a/trunk/docs/manual/developer/filters.xml.meta b/docs/manual/developer/filters.xml.meta similarity index 100% rename from trunk/docs/manual/developer/filters.xml.meta rename to docs/manual/developer/filters.xml.meta diff --git a/trunk/docs/manual/developer/hooks.html b/docs/manual/developer/hooks.html similarity index 100% rename from trunk/docs/manual/developer/hooks.html rename to docs/manual/developer/hooks.html diff --git a/trunk/docs/manual/developer/hooks.html.en b/docs/manual/developer/hooks.html.en similarity index 100% rename from trunk/docs/manual/developer/hooks.html.en rename to docs/manual/developer/hooks.html.en diff --git a/trunk/docs/manual/developer/hooks.xml b/docs/manual/developer/hooks.xml similarity index 100% rename from trunk/docs/manual/developer/hooks.xml rename to docs/manual/developer/hooks.xml diff --git a/trunk/docs/manual/developer/hooks.xml.meta b/docs/manual/developer/hooks.xml.meta similarity index 100% rename from trunk/docs/manual/developer/hooks.xml.meta rename to docs/manual/developer/hooks.xml.meta diff --git a/trunk/docs/manual/developer/index.html b/docs/manual/developer/index.html similarity index 100% rename from trunk/docs/manual/developer/index.html rename to docs/manual/developer/index.html diff --git a/trunk/docs/manual/developer/index.html.en b/docs/manual/developer/index.html.en similarity index 100% rename from trunk/docs/manual/developer/index.html.en rename to docs/manual/developer/index.html.en diff --git a/trunk/docs/manual/developer/index.xml b/docs/manual/developer/index.xml similarity index 100% rename from trunk/docs/manual/developer/index.xml rename to docs/manual/developer/index.xml diff --git a/trunk/docs/manual/developer/index.xml.meta b/docs/manual/developer/index.xml.meta similarity index 100% rename from trunk/docs/manual/developer/index.xml.meta rename to docs/manual/developer/index.xml.meta diff --git a/trunk/docs/manual/developer/modules.html b/docs/manual/developer/modules.html similarity index 100% rename from trunk/docs/manual/developer/modules.html rename to docs/manual/developer/modules.html diff --git a/trunk/docs/manual/developer/modules.html.en b/docs/manual/developer/modules.html.en similarity index 100% rename from trunk/docs/manual/developer/modules.html.en rename to docs/manual/developer/modules.html.en diff --git a/trunk/docs/manual/developer/modules.html.ja.euc-jp b/docs/manual/developer/modules.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/developer/modules.html.ja.euc-jp rename to docs/manual/developer/modules.html.ja.euc-jp diff --git a/trunk/docs/manual/developer/modules.xml b/docs/manual/developer/modules.xml similarity index 100% rename from trunk/docs/manual/developer/modules.xml rename to docs/manual/developer/modules.xml diff --git a/trunk/docs/manual/developer/modules.xml.ja b/docs/manual/developer/modules.xml.ja similarity index 100% rename from trunk/docs/manual/developer/modules.xml.ja rename to docs/manual/developer/modules.xml.ja diff --git a/trunk/docs/manual/developer/modules.xml.meta b/docs/manual/developer/modules.xml.meta similarity index 100% rename from trunk/docs/manual/developer/modules.xml.meta rename to docs/manual/developer/modules.xml.meta diff --git a/trunk/docs/manual/developer/request.html b/docs/manual/developer/request.html similarity index 100% rename from trunk/docs/manual/developer/request.html rename to docs/manual/developer/request.html diff --git a/trunk/docs/manual/developer/request.html.en b/docs/manual/developer/request.html.en similarity index 100% rename from trunk/docs/manual/developer/request.html.en rename to docs/manual/developer/request.html.en diff --git a/trunk/docs/manual/developer/request.xml b/docs/manual/developer/request.xml similarity index 100% rename from trunk/docs/manual/developer/request.xml rename to docs/manual/developer/request.xml diff --git a/trunk/docs/manual/developer/request.xml.meta b/docs/manual/developer/request.xml.meta similarity index 100% rename from trunk/docs/manual/developer/request.xml.meta rename to docs/manual/developer/request.xml.meta diff --git a/trunk/docs/manual/developer/thread_safety.html b/docs/manual/developer/thread_safety.html similarity index 100% rename from trunk/docs/manual/developer/thread_safety.html rename to docs/manual/developer/thread_safety.html diff --git a/trunk/docs/manual/developer/thread_safety.html.en b/docs/manual/developer/thread_safety.html.en similarity index 100% rename from trunk/docs/manual/developer/thread_safety.html.en rename to docs/manual/developer/thread_safety.html.en diff --git a/trunk/docs/manual/developer/thread_safety.xml b/docs/manual/developer/thread_safety.xml similarity index 100% rename from trunk/docs/manual/developer/thread_safety.xml rename to docs/manual/developer/thread_safety.xml diff --git a/trunk/docs/manual/developer/thread_safety.xml.meta b/docs/manual/developer/thread_safety.xml.meta similarity index 100% rename from trunk/docs/manual/developer/thread_safety.xml.meta rename to docs/manual/developer/thread_safety.xml.meta diff --git a/trunk/docs/manual/dns-caveats.html b/docs/manual/dns-caveats.html similarity index 100% rename from trunk/docs/manual/dns-caveats.html rename to docs/manual/dns-caveats.html diff --git a/trunk/docs/manual/dns-caveats.html.en b/docs/manual/dns-caveats.html.en similarity index 100% rename from trunk/docs/manual/dns-caveats.html.en rename to docs/manual/dns-caveats.html.en diff --git a/trunk/docs/manual/dns-caveats.html.ja.euc-jp b/docs/manual/dns-caveats.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/dns-caveats.html.ja.euc-jp rename to docs/manual/dns-caveats.html.ja.euc-jp diff --git a/trunk/docs/manual/dns-caveats.html.ko.euc-kr b/docs/manual/dns-caveats.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/dns-caveats.html.ko.euc-kr rename to docs/manual/dns-caveats.html.ko.euc-kr diff --git a/trunk/docs/manual/dns-caveats.xml b/docs/manual/dns-caveats.xml similarity index 100% rename from trunk/docs/manual/dns-caveats.xml rename to docs/manual/dns-caveats.xml diff --git a/trunk/docs/manual/dns-caveats.xml.ja b/docs/manual/dns-caveats.xml.ja similarity index 100% rename from trunk/docs/manual/dns-caveats.xml.ja rename to docs/manual/dns-caveats.xml.ja diff --git a/trunk/docs/manual/dns-caveats.xml.ko b/docs/manual/dns-caveats.xml.ko similarity index 100% rename from trunk/docs/manual/dns-caveats.xml.ko rename to docs/manual/dns-caveats.xml.ko diff --git a/trunk/docs/manual/dns-caveats.xml.meta b/docs/manual/dns-caveats.xml.meta similarity index 100% rename from trunk/docs/manual/dns-caveats.xml.meta rename to docs/manual/dns-caveats.xml.meta diff --git a/trunk/docs/manual/dso.html b/docs/manual/dso.html similarity index 100% rename from trunk/docs/manual/dso.html rename to docs/manual/dso.html diff --git a/trunk/docs/manual/dso.html.en b/docs/manual/dso.html.en similarity index 100% rename from trunk/docs/manual/dso.html.en rename to docs/manual/dso.html.en diff --git a/trunk/docs/manual/dso.html.ja.euc-jp b/docs/manual/dso.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/dso.html.ja.euc-jp rename to docs/manual/dso.html.ja.euc-jp diff --git a/trunk/docs/manual/dso.html.ko.euc-kr b/docs/manual/dso.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/dso.html.ko.euc-kr rename to docs/manual/dso.html.ko.euc-kr diff --git a/trunk/docs/manual/dso.xml b/docs/manual/dso.xml similarity index 100% rename from trunk/docs/manual/dso.xml rename to docs/manual/dso.xml diff --git a/trunk/docs/manual/dso.xml.ja b/docs/manual/dso.xml.ja similarity index 100% rename from trunk/docs/manual/dso.xml.ja rename to docs/manual/dso.xml.ja diff --git a/trunk/docs/manual/dso.xml.ko b/docs/manual/dso.xml.ko similarity index 100% rename from trunk/docs/manual/dso.xml.ko rename to docs/manual/dso.xml.ko diff --git a/trunk/docs/manual/dso.xml.meta b/docs/manual/dso.xml.meta similarity index 100% rename from trunk/docs/manual/dso.xml.meta rename to docs/manual/dso.xml.meta diff --git a/trunk/docs/manual/env.html b/docs/manual/env.html similarity index 100% rename from trunk/docs/manual/env.html rename to docs/manual/env.html diff --git a/trunk/docs/manual/env.html.en b/docs/manual/env.html.en similarity index 100% rename from trunk/docs/manual/env.html.en rename to docs/manual/env.html.en diff --git a/trunk/docs/manual/env.html.ja.euc-jp b/docs/manual/env.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/env.html.ja.euc-jp rename to docs/manual/env.html.ja.euc-jp diff --git a/trunk/docs/manual/env.html.ko.euc-kr b/docs/manual/env.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/env.html.ko.euc-kr rename to docs/manual/env.html.ko.euc-kr diff --git a/trunk/docs/manual/env.xml b/docs/manual/env.xml similarity index 100% rename from trunk/docs/manual/env.xml rename to docs/manual/env.xml diff --git a/trunk/docs/manual/env.xml.ja b/docs/manual/env.xml.ja similarity index 100% rename from trunk/docs/manual/env.xml.ja rename to docs/manual/env.xml.ja diff --git a/trunk/docs/manual/env.xml.ko b/docs/manual/env.xml.ko similarity index 100% rename from trunk/docs/manual/env.xml.ko rename to docs/manual/env.xml.ko diff --git a/trunk/docs/manual/env.xml.meta b/docs/manual/env.xml.meta similarity index 100% rename from trunk/docs/manual/env.xml.meta rename to docs/manual/env.xml.meta diff --git a/trunk/docs/manual/faq/all_in_one.html b/docs/manual/faq/all_in_one.html similarity index 100% rename from trunk/docs/manual/faq/all_in_one.html rename to docs/manual/faq/all_in_one.html diff --git a/trunk/docs/manual/faq/all_in_one.html.en b/docs/manual/faq/all_in_one.html.en similarity index 100% rename from trunk/docs/manual/faq/all_in_one.html.en rename to docs/manual/faq/all_in_one.html.en diff --git a/trunk/docs/manual/faq/all_in_one.html.ja.euc-jp b/docs/manual/faq/all_in_one.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/faq/all_in_one.html.ja.euc-jp rename to docs/manual/faq/all_in_one.html.ja.euc-jp diff --git a/trunk/docs/manual/faq/all_in_one.html.ko.euc-kr b/docs/manual/faq/all_in_one.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/faq/all_in_one.html.ko.euc-kr rename to docs/manual/faq/all_in_one.html.ko.euc-kr diff --git a/trunk/docs/manual/faq/all_in_one.xml b/docs/manual/faq/all_in_one.xml similarity index 100% rename from trunk/docs/manual/faq/all_in_one.xml rename to docs/manual/faq/all_in_one.xml diff --git a/trunk/docs/manual/faq/all_in_one.xml.ja b/docs/manual/faq/all_in_one.xml.ja similarity index 100% rename from trunk/docs/manual/faq/all_in_one.xml.ja rename to docs/manual/faq/all_in_one.xml.ja diff --git a/trunk/docs/manual/faq/all_in_one.xml.ko b/docs/manual/faq/all_in_one.xml.ko similarity index 100% rename from trunk/docs/manual/faq/all_in_one.xml.ko rename to docs/manual/faq/all_in_one.xml.ko diff --git a/trunk/docs/manual/faq/all_in_one.xml.meta b/docs/manual/faq/all_in_one.xml.meta similarity index 100% rename from trunk/docs/manual/faq/all_in_one.xml.meta rename to docs/manual/faq/all_in_one.xml.meta diff --git a/trunk/docs/manual/faq/categories.xml b/docs/manual/faq/categories.xml similarity index 100% rename from trunk/docs/manual/faq/categories.xml rename to docs/manual/faq/categories.xml diff --git a/trunk/docs/manual/faq/categories.xml.ja b/docs/manual/faq/categories.xml.ja similarity index 100% rename from trunk/docs/manual/faq/categories.xml.ja rename to docs/manual/faq/categories.xml.ja diff --git a/trunk/docs/manual/faq/categories.xml.ko b/docs/manual/faq/categories.xml.ko similarity index 100% rename from trunk/docs/manual/faq/categories.xml.ko rename to docs/manual/faq/categories.xml.ko diff --git a/trunk/docs/manual/faq/error.html b/docs/manual/faq/error.html similarity index 100% rename from trunk/docs/manual/faq/error.html rename to docs/manual/faq/error.html diff --git a/trunk/docs/manual/faq/error.html.en b/docs/manual/faq/error.html.en similarity index 100% rename from trunk/docs/manual/faq/error.html.en rename to docs/manual/faq/error.html.en diff --git a/trunk/docs/manual/faq/error.html.ja.euc-jp b/docs/manual/faq/error.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/faq/error.html.ja.euc-jp rename to docs/manual/faq/error.html.ja.euc-jp diff --git a/trunk/docs/manual/faq/error.html.ko.euc-kr b/docs/manual/faq/error.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/faq/error.html.ko.euc-kr rename to docs/manual/faq/error.html.ko.euc-kr diff --git a/trunk/docs/manual/faq/error.xml b/docs/manual/faq/error.xml similarity index 100% rename from trunk/docs/manual/faq/error.xml rename to docs/manual/faq/error.xml diff --git a/trunk/docs/manual/faq/error.xml.ja b/docs/manual/faq/error.xml.ja similarity index 100% rename from trunk/docs/manual/faq/error.xml.ja rename to docs/manual/faq/error.xml.ja diff --git a/trunk/docs/manual/faq/error.xml.ko b/docs/manual/faq/error.xml.ko similarity index 100% rename from trunk/docs/manual/faq/error.xml.ko rename to docs/manual/faq/error.xml.ko diff --git a/trunk/docs/manual/faq/error.xml.meta b/docs/manual/faq/error.xml.meta similarity index 100% rename from trunk/docs/manual/faq/error.xml.meta rename to docs/manual/faq/error.xml.meta diff --git a/trunk/docs/manual/faq/index.html b/docs/manual/faq/index.html similarity index 100% rename from trunk/docs/manual/faq/index.html rename to docs/manual/faq/index.html diff --git a/trunk/docs/manual/faq/index.html.en b/docs/manual/faq/index.html.en similarity index 100% rename from trunk/docs/manual/faq/index.html.en rename to docs/manual/faq/index.html.en diff --git a/trunk/docs/manual/faq/index.html.ja.euc-jp b/docs/manual/faq/index.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/faq/index.html.ja.euc-jp rename to docs/manual/faq/index.html.ja.euc-jp diff --git a/trunk/docs/manual/faq/index.html.ko.euc-kr b/docs/manual/faq/index.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/faq/index.html.ko.euc-kr rename to docs/manual/faq/index.html.ko.euc-kr diff --git a/trunk/docs/manual/faq/index.xml b/docs/manual/faq/index.xml similarity index 100% rename from trunk/docs/manual/faq/index.xml rename to docs/manual/faq/index.xml diff --git a/trunk/docs/manual/faq/index.xml.ja b/docs/manual/faq/index.xml.ja similarity index 100% rename from trunk/docs/manual/faq/index.xml.ja rename to docs/manual/faq/index.xml.ja diff --git a/trunk/docs/manual/faq/index.xml.ko b/docs/manual/faq/index.xml.ko similarity index 100% rename from trunk/docs/manual/faq/index.xml.ko rename to docs/manual/faq/index.xml.ko diff --git a/trunk/docs/manual/faq/index.xml.meta b/docs/manual/faq/index.xml.meta similarity index 100% rename from trunk/docs/manual/faq/index.xml.meta rename to docs/manual/faq/index.xml.meta diff --git a/trunk/docs/manual/faq/support.html b/docs/manual/faq/support.html similarity index 100% rename from trunk/docs/manual/faq/support.html rename to docs/manual/faq/support.html diff --git a/trunk/docs/manual/faq/support.html.en b/docs/manual/faq/support.html.en similarity index 100% rename from trunk/docs/manual/faq/support.html.en rename to docs/manual/faq/support.html.en diff --git a/trunk/docs/manual/faq/support.html.ja.euc-jp b/docs/manual/faq/support.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/faq/support.html.ja.euc-jp rename to docs/manual/faq/support.html.ja.euc-jp diff --git a/trunk/docs/manual/faq/support.html.ko.euc-kr b/docs/manual/faq/support.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/faq/support.html.ko.euc-kr rename to docs/manual/faq/support.html.ko.euc-kr diff --git a/trunk/docs/manual/faq/support.xml b/docs/manual/faq/support.xml similarity index 100% rename from trunk/docs/manual/faq/support.xml rename to docs/manual/faq/support.xml diff --git a/trunk/docs/manual/faq/support.xml.ja b/docs/manual/faq/support.xml.ja similarity index 100% rename from trunk/docs/manual/faq/support.xml.ja rename to docs/manual/faq/support.xml.ja diff --git a/trunk/docs/manual/faq/support.xml.ko b/docs/manual/faq/support.xml.ko similarity index 100% rename from trunk/docs/manual/faq/support.xml.ko rename to docs/manual/faq/support.xml.ko diff --git a/trunk/docs/manual/faq/support.xml.meta b/docs/manual/faq/support.xml.meta similarity index 100% rename from trunk/docs/manual/faq/support.xml.meta rename to docs/manual/faq/support.xml.meta diff --git a/trunk/docs/manual/filter.html b/docs/manual/filter.html similarity index 100% rename from trunk/docs/manual/filter.html rename to docs/manual/filter.html diff --git a/trunk/docs/manual/filter.html.en b/docs/manual/filter.html.en similarity index 100% rename from trunk/docs/manual/filter.html.en rename to docs/manual/filter.html.en diff --git a/trunk/docs/manual/filter.html.es b/docs/manual/filter.html.es similarity index 100% rename from trunk/docs/manual/filter.html.es rename to docs/manual/filter.html.es diff --git a/trunk/docs/manual/filter.html.fr b/docs/manual/filter.html.fr similarity index 100% rename from trunk/docs/manual/filter.html.fr rename to docs/manual/filter.html.fr diff --git a/trunk/docs/manual/filter.html.ja.euc-jp b/docs/manual/filter.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/filter.html.ja.euc-jp rename to docs/manual/filter.html.ja.euc-jp diff --git a/trunk/docs/manual/filter.html.ko.euc-kr b/docs/manual/filter.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/filter.html.ko.euc-kr rename to docs/manual/filter.html.ko.euc-kr diff --git a/trunk/docs/manual/filter.xml b/docs/manual/filter.xml similarity index 100% rename from trunk/docs/manual/filter.xml rename to docs/manual/filter.xml diff --git a/trunk/docs/manual/filter.xml.es b/docs/manual/filter.xml.es similarity index 100% rename from trunk/docs/manual/filter.xml.es rename to docs/manual/filter.xml.es diff --git a/trunk/docs/manual/filter.xml.fr b/docs/manual/filter.xml.fr similarity index 100% rename from trunk/docs/manual/filter.xml.fr rename to docs/manual/filter.xml.fr diff --git a/trunk/docs/manual/filter.xml.ja b/docs/manual/filter.xml.ja similarity index 100% rename from trunk/docs/manual/filter.xml.ja rename to docs/manual/filter.xml.ja diff --git a/trunk/docs/manual/filter.xml.ko b/docs/manual/filter.xml.ko similarity index 100% rename from trunk/docs/manual/filter.xml.ko rename to docs/manual/filter.xml.ko diff --git a/trunk/docs/manual/filter.xml.meta b/docs/manual/filter.xml.meta similarity index 100% rename from trunk/docs/manual/filter.xml.meta rename to docs/manual/filter.xml.meta diff --git a/trunk/docs/manual/glossary.html b/docs/manual/glossary.html similarity index 100% rename from trunk/docs/manual/glossary.html rename to docs/manual/glossary.html diff --git a/trunk/docs/manual/glossary.html.de b/docs/manual/glossary.html.de similarity index 100% rename from trunk/docs/manual/glossary.html.de rename to docs/manual/glossary.html.de diff --git a/trunk/docs/manual/glossary.html.en b/docs/manual/glossary.html.en similarity index 100% rename from trunk/docs/manual/glossary.html.en rename to docs/manual/glossary.html.en diff --git a/trunk/docs/manual/glossary.html.es b/docs/manual/glossary.html.es similarity index 100% rename from trunk/docs/manual/glossary.html.es rename to docs/manual/glossary.html.es diff --git a/trunk/docs/manual/glossary.html.ko.euc-kr b/docs/manual/glossary.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/glossary.html.ko.euc-kr rename to docs/manual/glossary.html.ko.euc-kr diff --git a/trunk/docs/manual/glossary.xml b/docs/manual/glossary.xml similarity index 100% rename from trunk/docs/manual/glossary.xml rename to docs/manual/glossary.xml diff --git a/trunk/docs/manual/glossary.xml.de b/docs/manual/glossary.xml.de similarity index 100% rename from trunk/docs/manual/glossary.xml.de rename to docs/manual/glossary.xml.de diff --git a/trunk/docs/manual/glossary.xml.es b/docs/manual/glossary.xml.es similarity index 100% rename from trunk/docs/manual/glossary.xml.es rename to docs/manual/glossary.xml.es diff --git a/trunk/docs/manual/glossary.xml.ko b/docs/manual/glossary.xml.ko similarity index 100% rename from trunk/docs/manual/glossary.xml.ko rename to docs/manual/glossary.xml.ko diff --git a/trunk/docs/manual/glossary.xml.meta b/docs/manual/glossary.xml.meta similarity index 100% rename from trunk/docs/manual/glossary.xml.meta rename to docs/manual/glossary.xml.meta diff --git a/trunk/docs/manual/handler.html b/docs/manual/handler.html similarity index 100% rename from trunk/docs/manual/handler.html rename to docs/manual/handler.html diff --git a/trunk/docs/manual/handler.html.en b/docs/manual/handler.html.en similarity index 100% rename from trunk/docs/manual/handler.html.en rename to docs/manual/handler.html.en diff --git a/trunk/docs/manual/handler.html.es b/docs/manual/handler.html.es similarity index 100% rename from trunk/docs/manual/handler.html.es rename to docs/manual/handler.html.es diff --git a/trunk/docs/manual/handler.html.ja.euc-jp b/docs/manual/handler.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/handler.html.ja.euc-jp rename to docs/manual/handler.html.ja.euc-jp diff --git a/trunk/docs/manual/handler.html.ko.euc-kr b/docs/manual/handler.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/handler.html.ko.euc-kr rename to docs/manual/handler.html.ko.euc-kr diff --git a/trunk/docs/manual/handler.xml b/docs/manual/handler.xml similarity index 100% rename from trunk/docs/manual/handler.xml rename to docs/manual/handler.xml diff --git a/trunk/docs/manual/handler.xml.es b/docs/manual/handler.xml.es similarity index 100% rename from trunk/docs/manual/handler.xml.es rename to docs/manual/handler.xml.es diff --git a/trunk/docs/manual/handler.xml.ja b/docs/manual/handler.xml.ja similarity index 100% rename from trunk/docs/manual/handler.xml.ja rename to docs/manual/handler.xml.ja diff --git a/trunk/docs/manual/handler.xml.ko b/docs/manual/handler.xml.ko similarity index 100% rename from trunk/docs/manual/handler.xml.ko rename to docs/manual/handler.xml.ko diff --git a/trunk/docs/manual/handler.xml.meta b/docs/manual/handler.xml.meta similarity index 100% rename from trunk/docs/manual/handler.xml.meta rename to docs/manual/handler.xml.meta diff --git a/trunk/docs/manual/howto/auth.html b/docs/manual/howto/auth.html similarity index 100% rename from trunk/docs/manual/howto/auth.html rename to docs/manual/howto/auth.html diff --git a/trunk/docs/manual/howto/auth.html.en b/docs/manual/howto/auth.html.en similarity index 100% rename from trunk/docs/manual/howto/auth.html.en rename to docs/manual/howto/auth.html.en diff --git a/trunk/docs/manual/howto/auth.html.ja.euc-jp b/docs/manual/howto/auth.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/howto/auth.html.ja.euc-jp rename to docs/manual/howto/auth.html.ja.euc-jp diff --git a/trunk/docs/manual/howto/auth.html.ko.euc-kr b/docs/manual/howto/auth.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/howto/auth.html.ko.euc-kr rename to docs/manual/howto/auth.html.ko.euc-kr diff --git a/trunk/docs/manual/howto/auth.xml b/docs/manual/howto/auth.xml similarity index 100% rename from trunk/docs/manual/howto/auth.xml rename to docs/manual/howto/auth.xml diff --git a/trunk/docs/manual/howto/auth.xml.ja b/docs/manual/howto/auth.xml.ja similarity index 100% rename from trunk/docs/manual/howto/auth.xml.ja rename to docs/manual/howto/auth.xml.ja diff --git a/trunk/docs/manual/howto/auth.xml.ko b/docs/manual/howto/auth.xml.ko similarity index 100% rename from trunk/docs/manual/howto/auth.xml.ko rename to docs/manual/howto/auth.xml.ko diff --git a/trunk/docs/manual/howto/auth.xml.meta b/docs/manual/howto/auth.xml.meta similarity index 100% rename from trunk/docs/manual/howto/auth.xml.meta rename to docs/manual/howto/auth.xml.meta diff --git a/trunk/docs/manual/howto/cgi.html b/docs/manual/howto/cgi.html similarity index 100% rename from trunk/docs/manual/howto/cgi.html rename to docs/manual/howto/cgi.html diff --git a/trunk/docs/manual/howto/cgi.html.en b/docs/manual/howto/cgi.html.en similarity index 100% rename from trunk/docs/manual/howto/cgi.html.en rename to docs/manual/howto/cgi.html.en diff --git a/trunk/docs/manual/howto/cgi.html.ja.euc-jp b/docs/manual/howto/cgi.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/howto/cgi.html.ja.euc-jp rename to docs/manual/howto/cgi.html.ja.euc-jp diff --git a/trunk/docs/manual/howto/cgi.html.ko.euc-kr b/docs/manual/howto/cgi.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/howto/cgi.html.ko.euc-kr rename to docs/manual/howto/cgi.html.ko.euc-kr diff --git a/trunk/docs/manual/howto/cgi.xml b/docs/manual/howto/cgi.xml similarity index 100% rename from trunk/docs/manual/howto/cgi.xml rename to docs/manual/howto/cgi.xml diff --git a/trunk/docs/manual/howto/cgi.xml.ja b/docs/manual/howto/cgi.xml.ja similarity index 100% rename from trunk/docs/manual/howto/cgi.xml.ja rename to docs/manual/howto/cgi.xml.ja diff --git a/trunk/docs/manual/howto/cgi.xml.ko b/docs/manual/howto/cgi.xml.ko similarity index 100% rename from trunk/docs/manual/howto/cgi.xml.ko rename to docs/manual/howto/cgi.xml.ko diff --git a/trunk/docs/manual/howto/cgi.xml.meta b/docs/manual/howto/cgi.xml.meta similarity index 100% rename from trunk/docs/manual/howto/cgi.xml.meta rename to docs/manual/howto/cgi.xml.meta diff --git a/trunk/docs/manual/howto/htaccess.html b/docs/manual/howto/htaccess.html similarity index 100% rename from trunk/docs/manual/howto/htaccess.html rename to docs/manual/howto/htaccess.html diff --git a/trunk/docs/manual/howto/htaccess.html.en b/docs/manual/howto/htaccess.html.en similarity index 100% rename from trunk/docs/manual/howto/htaccess.html.en rename to docs/manual/howto/htaccess.html.en diff --git a/trunk/docs/manual/howto/htaccess.html.ja.euc-jp b/docs/manual/howto/htaccess.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/howto/htaccess.html.ja.euc-jp rename to docs/manual/howto/htaccess.html.ja.euc-jp diff --git a/trunk/docs/manual/howto/htaccess.html.ko.euc-kr b/docs/manual/howto/htaccess.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/howto/htaccess.html.ko.euc-kr rename to docs/manual/howto/htaccess.html.ko.euc-kr diff --git a/trunk/docs/manual/howto/htaccess.html.pt-br b/docs/manual/howto/htaccess.html.pt-br similarity index 100% rename from trunk/docs/manual/howto/htaccess.html.pt-br rename to docs/manual/howto/htaccess.html.pt-br diff --git a/trunk/docs/manual/howto/htaccess.xml b/docs/manual/howto/htaccess.xml similarity index 100% rename from trunk/docs/manual/howto/htaccess.xml rename to docs/manual/howto/htaccess.xml diff --git a/trunk/docs/manual/howto/htaccess.xml.ja b/docs/manual/howto/htaccess.xml.ja similarity index 100% rename from trunk/docs/manual/howto/htaccess.xml.ja rename to docs/manual/howto/htaccess.xml.ja diff --git a/trunk/docs/manual/howto/htaccess.xml.ko b/docs/manual/howto/htaccess.xml.ko similarity index 100% rename from trunk/docs/manual/howto/htaccess.xml.ko rename to docs/manual/howto/htaccess.xml.ko diff --git a/trunk/docs/manual/howto/htaccess.xml.meta b/docs/manual/howto/htaccess.xml.meta similarity index 100% rename from trunk/docs/manual/howto/htaccess.xml.meta rename to docs/manual/howto/htaccess.xml.meta diff --git a/trunk/docs/manual/howto/htaccess.xml.pt-br b/docs/manual/howto/htaccess.xml.pt-br similarity index 100% rename from trunk/docs/manual/howto/htaccess.xml.pt-br rename to docs/manual/howto/htaccess.xml.pt-br diff --git a/trunk/docs/manual/howto/index.html b/docs/manual/howto/index.html similarity index 100% rename from trunk/docs/manual/howto/index.html rename to docs/manual/howto/index.html diff --git a/trunk/docs/manual/howto/index.html.en b/docs/manual/howto/index.html.en similarity index 100% rename from trunk/docs/manual/howto/index.html.en rename to docs/manual/howto/index.html.en diff --git a/trunk/docs/manual/howto/index.html.ja.euc-jp b/docs/manual/howto/index.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/howto/index.html.ja.euc-jp rename to docs/manual/howto/index.html.ja.euc-jp diff --git a/trunk/docs/manual/howto/index.html.ko.euc-kr b/docs/manual/howto/index.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/howto/index.html.ko.euc-kr rename to docs/manual/howto/index.html.ko.euc-kr diff --git a/trunk/docs/manual/howto/index.xml b/docs/manual/howto/index.xml similarity index 100% rename from trunk/docs/manual/howto/index.xml rename to docs/manual/howto/index.xml diff --git a/trunk/docs/manual/howto/index.xml.ja b/docs/manual/howto/index.xml.ja similarity index 100% rename from trunk/docs/manual/howto/index.xml.ja rename to docs/manual/howto/index.xml.ja diff --git a/trunk/docs/manual/howto/index.xml.ko b/docs/manual/howto/index.xml.ko similarity index 100% rename from trunk/docs/manual/howto/index.xml.ko rename to docs/manual/howto/index.xml.ko diff --git a/trunk/docs/manual/howto/index.xml.meta b/docs/manual/howto/index.xml.meta similarity index 100% rename from trunk/docs/manual/howto/index.xml.meta rename to docs/manual/howto/index.xml.meta diff --git a/trunk/docs/manual/howto/public_html.html b/docs/manual/howto/public_html.html similarity index 100% rename from trunk/docs/manual/howto/public_html.html rename to docs/manual/howto/public_html.html diff --git a/trunk/docs/manual/howto/public_html.html.en b/docs/manual/howto/public_html.html.en similarity index 100% rename from trunk/docs/manual/howto/public_html.html.en rename to docs/manual/howto/public_html.html.en diff --git a/trunk/docs/manual/howto/public_html.html.ja.euc-jp b/docs/manual/howto/public_html.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/howto/public_html.html.ja.euc-jp rename to docs/manual/howto/public_html.html.ja.euc-jp diff --git a/trunk/docs/manual/howto/public_html.html.ko.euc-kr b/docs/manual/howto/public_html.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/howto/public_html.html.ko.euc-kr rename to docs/manual/howto/public_html.html.ko.euc-kr diff --git a/trunk/docs/manual/howto/public_html.xml b/docs/manual/howto/public_html.xml similarity index 100% rename from trunk/docs/manual/howto/public_html.xml rename to docs/manual/howto/public_html.xml diff --git a/trunk/docs/manual/howto/public_html.xml.ja b/docs/manual/howto/public_html.xml.ja similarity index 100% rename from trunk/docs/manual/howto/public_html.xml.ja rename to docs/manual/howto/public_html.xml.ja diff --git a/trunk/docs/manual/howto/public_html.xml.ko b/docs/manual/howto/public_html.xml.ko similarity index 100% rename from trunk/docs/manual/howto/public_html.xml.ko rename to docs/manual/howto/public_html.xml.ko diff --git a/trunk/docs/manual/howto/public_html.xml.meta b/docs/manual/howto/public_html.xml.meta similarity index 100% rename from trunk/docs/manual/howto/public_html.xml.meta rename to docs/manual/howto/public_html.xml.meta diff --git a/trunk/docs/manual/howto/ssi.html b/docs/manual/howto/ssi.html similarity index 100% rename from trunk/docs/manual/howto/ssi.html rename to docs/manual/howto/ssi.html diff --git a/trunk/docs/manual/howto/ssi.html.en b/docs/manual/howto/ssi.html.en similarity index 100% rename from trunk/docs/manual/howto/ssi.html.en rename to docs/manual/howto/ssi.html.en diff --git a/trunk/docs/manual/howto/ssi.html.ja.euc-jp b/docs/manual/howto/ssi.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/howto/ssi.html.ja.euc-jp rename to docs/manual/howto/ssi.html.ja.euc-jp diff --git a/trunk/docs/manual/howto/ssi.html.ko.euc-kr b/docs/manual/howto/ssi.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/howto/ssi.html.ko.euc-kr rename to docs/manual/howto/ssi.html.ko.euc-kr diff --git a/trunk/docs/manual/howto/ssi.xml b/docs/manual/howto/ssi.xml similarity index 100% rename from trunk/docs/manual/howto/ssi.xml rename to docs/manual/howto/ssi.xml diff --git a/trunk/docs/manual/howto/ssi.xml.ja b/docs/manual/howto/ssi.xml.ja similarity index 100% rename from trunk/docs/manual/howto/ssi.xml.ja rename to docs/manual/howto/ssi.xml.ja diff --git a/trunk/docs/manual/howto/ssi.xml.ko b/docs/manual/howto/ssi.xml.ko similarity index 100% rename from trunk/docs/manual/howto/ssi.xml.ko rename to docs/manual/howto/ssi.xml.ko diff --git a/trunk/docs/manual/howto/ssi.xml.meta b/docs/manual/howto/ssi.xml.meta similarity index 100% rename from trunk/docs/manual/howto/ssi.xml.meta rename to docs/manual/howto/ssi.xml.meta diff --git a/trunk/docs/manual/images/apache_header.gif b/docs/manual/images/apache_header.gif similarity index 100% rename from trunk/docs/manual/images/apache_header.gif rename to docs/manual/images/apache_header.gif diff --git a/trunk/docs/manual/images/custom_errordocs.png b/docs/manual/images/custom_errordocs.png similarity index 100% rename from trunk/docs/manual/images/custom_errordocs.png rename to docs/manual/images/custom_errordocs.png diff --git a/trunk/docs/manual/images/down.gif b/docs/manual/images/down.gif similarity index 100% rename from trunk/docs/manual/images/down.gif rename to docs/manual/images/down.gif diff --git a/trunk/docs/manual/images/favicon.ico b/docs/manual/images/favicon.ico similarity index 100% rename from trunk/docs/manual/images/favicon.ico rename to docs/manual/images/favicon.ico diff --git a/trunk/docs/manual/images/feather.gif b/docs/manual/images/feather.gif similarity index 100% rename from trunk/docs/manual/images/feather.gif rename to docs/manual/images/feather.gif diff --git a/trunk/docs/manual/images/feather.png b/docs/manual/images/feather.png similarity index 100% rename from trunk/docs/manual/images/feather.png rename to docs/manual/images/feather.png diff --git a/trunk/docs/manual/images/home.gif b/docs/manual/images/home.gif similarity index 100% rename from trunk/docs/manual/images/home.gif rename to docs/manual/images/home.gif diff --git a/trunk/docs/manual/images/index.gif b/docs/manual/images/index.gif similarity index 100% rename from trunk/docs/manual/images/index.gif rename to docs/manual/images/index.gif diff --git a/trunk/docs/manual/images/left.gif b/docs/manual/images/left.gif similarity index 100% rename from trunk/docs/manual/images/left.gif rename to docs/manual/images/left.gif diff --git a/trunk/docs/manual/images/mod_filter_new.gif b/docs/manual/images/mod_filter_new.gif similarity index 100% rename from trunk/docs/manual/images/mod_filter_new.gif rename to docs/manual/images/mod_filter_new.gif diff --git a/trunk/docs/manual/images/mod_filter_old.gif b/docs/manual/images/mod_filter_old.gif similarity index 100% rename from trunk/docs/manual/images/mod_filter_old.gif rename to docs/manual/images/mod_filter_old.gif diff --git a/trunk/docs/manual/images/mod_rewrite_fig1.gif b/docs/manual/images/mod_rewrite_fig1.gif similarity index 100% rename from trunk/docs/manual/images/mod_rewrite_fig1.gif rename to docs/manual/images/mod_rewrite_fig1.gif diff --git a/trunk/docs/manual/images/mod_rewrite_fig1.png b/docs/manual/images/mod_rewrite_fig1.png similarity index 100% rename from trunk/docs/manual/images/mod_rewrite_fig1.png rename to docs/manual/images/mod_rewrite_fig1.png diff --git a/trunk/docs/manual/images/mod_rewrite_fig2.gif b/docs/manual/images/mod_rewrite_fig2.gif similarity index 100% rename from trunk/docs/manual/images/mod_rewrite_fig2.gif rename to docs/manual/images/mod_rewrite_fig2.gif diff --git a/trunk/docs/manual/images/mod_rewrite_fig2.png b/docs/manual/images/mod_rewrite_fig2.png similarity index 100% rename from trunk/docs/manual/images/mod_rewrite_fig2.png rename to docs/manual/images/mod_rewrite_fig2.png diff --git a/trunk/docs/manual/images/pixel.gif b/docs/manual/images/pixel.gif similarity index 100% rename from trunk/docs/manual/images/pixel.gif rename to docs/manual/images/pixel.gif diff --git a/trunk/docs/manual/images/right.gif b/docs/manual/images/right.gif similarity index 100% rename from trunk/docs/manual/images/right.gif rename to docs/manual/images/right.gif diff --git a/trunk/docs/manual/images/ssl_intro_fig1.gif b/docs/manual/images/ssl_intro_fig1.gif similarity index 100% rename from trunk/docs/manual/images/ssl_intro_fig1.gif rename to docs/manual/images/ssl_intro_fig1.gif diff --git a/trunk/docs/manual/images/ssl_intro_fig1.png b/docs/manual/images/ssl_intro_fig1.png similarity index 100% rename from trunk/docs/manual/images/ssl_intro_fig1.png rename to docs/manual/images/ssl_intro_fig1.png diff --git a/trunk/docs/manual/images/ssl_intro_fig2.gif b/docs/manual/images/ssl_intro_fig2.gif similarity index 100% rename from trunk/docs/manual/images/ssl_intro_fig2.gif rename to docs/manual/images/ssl_intro_fig2.gif diff --git a/trunk/docs/manual/images/ssl_intro_fig2.png b/docs/manual/images/ssl_intro_fig2.png similarity index 100% rename from trunk/docs/manual/images/ssl_intro_fig2.png rename to docs/manual/images/ssl_intro_fig2.png diff --git a/trunk/docs/manual/images/ssl_intro_fig3.gif b/docs/manual/images/ssl_intro_fig3.gif similarity index 100% rename from trunk/docs/manual/images/ssl_intro_fig3.gif rename to docs/manual/images/ssl_intro_fig3.gif diff --git a/trunk/docs/manual/images/ssl_intro_fig3.png b/docs/manual/images/ssl_intro_fig3.png similarity index 100% rename from trunk/docs/manual/images/ssl_intro_fig3.png rename to docs/manual/images/ssl_intro_fig3.png diff --git a/trunk/docs/manual/images/sub.gif b/docs/manual/images/sub.gif similarity index 100% rename from trunk/docs/manual/images/sub.gif rename to docs/manual/images/sub.gif diff --git a/trunk/docs/manual/images/up.gif b/docs/manual/images/up.gif similarity index 100% rename from trunk/docs/manual/images/up.gif rename to docs/manual/images/up.gif diff --git a/trunk/docs/manual/index.html b/docs/manual/index.html similarity index 100% rename from trunk/docs/manual/index.html rename to docs/manual/index.html diff --git a/trunk/docs/manual/index.html.de b/docs/manual/index.html.de similarity index 100% rename from trunk/docs/manual/index.html.de rename to docs/manual/index.html.de diff --git a/trunk/docs/manual/index.html.en b/docs/manual/index.html.en similarity index 100% rename from trunk/docs/manual/index.html.en rename to docs/manual/index.html.en diff --git a/trunk/docs/manual/index.html.es b/docs/manual/index.html.es similarity index 100% rename from trunk/docs/manual/index.html.es rename to docs/manual/index.html.es diff --git a/trunk/docs/manual/index.html.fr b/docs/manual/index.html.fr similarity index 100% rename from trunk/docs/manual/index.html.fr rename to docs/manual/index.html.fr diff --git a/trunk/docs/manual/index.html.ja.euc-jp b/docs/manual/index.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/index.html.ja.euc-jp rename to docs/manual/index.html.ja.euc-jp diff --git a/trunk/docs/manual/index.html.ko.euc-kr b/docs/manual/index.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/index.html.ko.euc-kr rename to docs/manual/index.html.ko.euc-kr diff --git a/trunk/docs/manual/index.html.pt-br b/docs/manual/index.html.pt-br similarity index 100% rename from trunk/docs/manual/index.html.pt-br rename to docs/manual/index.html.pt-br diff --git a/trunk/docs/manual/index.xml b/docs/manual/index.xml similarity index 100% rename from trunk/docs/manual/index.xml rename to docs/manual/index.xml diff --git a/trunk/docs/manual/index.xml.de b/docs/manual/index.xml.de similarity index 100% rename from trunk/docs/manual/index.xml.de rename to docs/manual/index.xml.de diff --git a/trunk/docs/manual/index.xml.es b/docs/manual/index.xml.es similarity index 100% rename from trunk/docs/manual/index.xml.es rename to docs/manual/index.xml.es diff --git a/trunk/docs/manual/index.xml.fr b/docs/manual/index.xml.fr similarity index 100% rename from trunk/docs/manual/index.xml.fr rename to docs/manual/index.xml.fr diff --git a/trunk/docs/manual/index.xml.ja b/docs/manual/index.xml.ja similarity index 100% rename from trunk/docs/manual/index.xml.ja rename to docs/manual/index.xml.ja diff --git a/trunk/docs/manual/index.xml.ko b/docs/manual/index.xml.ko similarity index 100% rename from trunk/docs/manual/index.xml.ko rename to docs/manual/index.xml.ko diff --git a/trunk/docs/manual/index.xml.meta b/docs/manual/index.xml.meta similarity index 100% rename from trunk/docs/manual/index.xml.meta rename to docs/manual/index.xml.meta diff --git a/trunk/docs/manual/index.xml.pt-br b/docs/manual/index.xml.pt-br similarity index 100% rename from trunk/docs/manual/index.xml.pt-br rename to docs/manual/index.xml.pt-br diff --git a/trunk/docs/manual/install.html b/docs/manual/install.html similarity index 100% rename from trunk/docs/manual/install.html rename to docs/manual/install.html diff --git a/trunk/docs/manual/install.html.de b/docs/manual/install.html.de similarity index 100% rename from trunk/docs/manual/install.html.de rename to docs/manual/install.html.de diff --git a/trunk/docs/manual/install.html.en b/docs/manual/install.html.en similarity index 100% rename from trunk/docs/manual/install.html.en rename to docs/manual/install.html.en diff --git a/trunk/docs/manual/install.html.es b/docs/manual/install.html.es similarity index 100% rename from trunk/docs/manual/install.html.es rename to docs/manual/install.html.es diff --git a/trunk/docs/manual/install.html.fr b/docs/manual/install.html.fr similarity index 100% rename from trunk/docs/manual/install.html.fr rename to docs/manual/install.html.fr diff --git a/trunk/docs/manual/install.html.ja.euc-jp b/docs/manual/install.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/install.html.ja.euc-jp rename to docs/manual/install.html.ja.euc-jp diff --git a/trunk/docs/manual/install.html.ko.euc-kr b/docs/manual/install.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/install.html.ko.euc-kr rename to docs/manual/install.html.ko.euc-kr diff --git a/trunk/docs/manual/install.xml b/docs/manual/install.xml similarity index 100% rename from trunk/docs/manual/install.xml rename to docs/manual/install.xml diff --git a/trunk/docs/manual/install.xml.de b/docs/manual/install.xml.de similarity index 100% rename from trunk/docs/manual/install.xml.de rename to docs/manual/install.xml.de diff --git a/trunk/docs/manual/install.xml.es b/docs/manual/install.xml.es similarity index 100% rename from trunk/docs/manual/install.xml.es rename to docs/manual/install.xml.es diff --git a/trunk/docs/manual/install.xml.fr b/docs/manual/install.xml.fr similarity index 100% rename from trunk/docs/manual/install.xml.fr rename to docs/manual/install.xml.fr diff --git a/trunk/docs/manual/install.xml.ja b/docs/manual/install.xml.ja similarity index 100% rename from trunk/docs/manual/install.xml.ja rename to docs/manual/install.xml.ja diff --git a/trunk/docs/manual/install.xml.ko b/docs/manual/install.xml.ko similarity index 100% rename from trunk/docs/manual/install.xml.ko rename to docs/manual/install.xml.ko diff --git a/trunk/docs/manual/install.xml.meta b/docs/manual/install.xml.meta similarity index 100% rename from trunk/docs/manual/install.xml.meta rename to docs/manual/install.xml.meta diff --git a/trunk/docs/manual/invoking.html b/docs/manual/invoking.html similarity index 100% rename from trunk/docs/manual/invoking.html rename to docs/manual/invoking.html diff --git a/trunk/docs/manual/invoking.html.de b/docs/manual/invoking.html.de similarity index 100% rename from trunk/docs/manual/invoking.html.de rename to docs/manual/invoking.html.de diff --git a/trunk/docs/manual/invoking.html.en b/docs/manual/invoking.html.en similarity index 100% rename from trunk/docs/manual/invoking.html.en rename to docs/manual/invoking.html.en diff --git a/trunk/docs/manual/invoking.html.es b/docs/manual/invoking.html.es similarity index 100% rename from trunk/docs/manual/invoking.html.es rename to docs/manual/invoking.html.es diff --git a/trunk/docs/manual/invoking.html.ja.euc-jp b/docs/manual/invoking.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/invoking.html.ja.euc-jp rename to docs/manual/invoking.html.ja.euc-jp diff --git a/trunk/docs/manual/invoking.html.ko.euc-kr b/docs/manual/invoking.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/invoking.html.ko.euc-kr rename to docs/manual/invoking.html.ko.euc-kr diff --git a/trunk/docs/manual/invoking.xml b/docs/manual/invoking.xml similarity index 100% rename from trunk/docs/manual/invoking.xml rename to docs/manual/invoking.xml diff --git a/trunk/docs/manual/invoking.xml.de b/docs/manual/invoking.xml.de similarity index 100% rename from trunk/docs/manual/invoking.xml.de rename to docs/manual/invoking.xml.de diff --git a/trunk/docs/manual/invoking.xml.es b/docs/manual/invoking.xml.es similarity index 100% rename from trunk/docs/manual/invoking.xml.es rename to docs/manual/invoking.xml.es diff --git a/trunk/docs/manual/invoking.xml.ja b/docs/manual/invoking.xml.ja similarity index 100% rename from trunk/docs/manual/invoking.xml.ja rename to docs/manual/invoking.xml.ja diff --git a/trunk/docs/manual/invoking.xml.ko b/docs/manual/invoking.xml.ko similarity index 100% rename from trunk/docs/manual/invoking.xml.ko rename to docs/manual/invoking.xml.ko diff --git a/trunk/docs/manual/invoking.xml.meta b/docs/manual/invoking.xml.meta similarity index 100% rename from trunk/docs/manual/invoking.xml.meta rename to docs/manual/invoking.xml.meta diff --git a/trunk/docs/manual/license.html b/docs/manual/license.html similarity index 100% rename from trunk/docs/manual/license.html rename to docs/manual/license.html diff --git a/trunk/docs/manual/license.html.en b/docs/manual/license.html.en similarity index 100% rename from trunk/docs/manual/license.html.en rename to docs/manual/license.html.en diff --git a/trunk/docs/manual/license.xml b/docs/manual/license.xml similarity index 100% rename from trunk/docs/manual/license.xml rename to docs/manual/license.xml diff --git a/trunk/docs/manual/license.xml.meta b/docs/manual/license.xml.meta similarity index 100% rename from trunk/docs/manual/license.xml.meta rename to docs/manual/license.xml.meta diff --git a/trunk/docs/manual/logs.html b/docs/manual/logs.html similarity index 100% rename from trunk/docs/manual/logs.html rename to docs/manual/logs.html diff --git a/trunk/docs/manual/logs.html.en b/docs/manual/logs.html.en similarity index 100% rename from trunk/docs/manual/logs.html.en rename to docs/manual/logs.html.en diff --git a/trunk/docs/manual/logs.html.ja.euc-jp b/docs/manual/logs.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/logs.html.ja.euc-jp rename to docs/manual/logs.html.ja.euc-jp diff --git a/trunk/docs/manual/logs.html.ko.euc-kr b/docs/manual/logs.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/logs.html.ko.euc-kr rename to docs/manual/logs.html.ko.euc-kr diff --git a/trunk/docs/manual/logs.xml b/docs/manual/logs.xml similarity index 100% rename from trunk/docs/manual/logs.xml rename to docs/manual/logs.xml diff --git a/trunk/docs/manual/logs.xml.ja b/docs/manual/logs.xml.ja similarity index 100% rename from trunk/docs/manual/logs.xml.ja rename to docs/manual/logs.xml.ja diff --git a/trunk/docs/manual/logs.xml.ko b/docs/manual/logs.xml.ko similarity index 100% rename from trunk/docs/manual/logs.xml.ko rename to docs/manual/logs.xml.ko diff --git a/trunk/docs/manual/logs.xml.meta b/docs/manual/logs.xml.meta similarity index 100% rename from trunk/docs/manual/logs.xml.meta rename to docs/manual/logs.xml.meta diff --git a/trunk/docs/manual/misc/index.html b/docs/manual/misc/index.html similarity index 100% rename from trunk/docs/manual/misc/index.html rename to docs/manual/misc/index.html diff --git a/trunk/docs/manual/misc/index.html.en b/docs/manual/misc/index.html.en similarity index 100% rename from trunk/docs/manual/misc/index.html.en rename to docs/manual/misc/index.html.en diff --git a/trunk/docs/manual/misc/index.html.ko.euc-kr b/docs/manual/misc/index.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/misc/index.html.ko.euc-kr rename to docs/manual/misc/index.html.ko.euc-kr diff --git a/trunk/docs/manual/misc/index.xml b/docs/manual/misc/index.xml similarity index 100% rename from trunk/docs/manual/misc/index.xml rename to docs/manual/misc/index.xml diff --git a/trunk/docs/manual/misc/index.xml.ko b/docs/manual/misc/index.xml.ko similarity index 100% rename from trunk/docs/manual/misc/index.xml.ko rename to docs/manual/misc/index.xml.ko diff --git a/trunk/docs/manual/misc/index.xml.meta b/docs/manual/misc/index.xml.meta similarity index 100% rename from trunk/docs/manual/misc/index.xml.meta rename to docs/manual/misc/index.xml.meta diff --git a/trunk/docs/manual/misc/perf-tuning.html b/docs/manual/misc/perf-tuning.html similarity index 100% rename from trunk/docs/manual/misc/perf-tuning.html rename to docs/manual/misc/perf-tuning.html diff --git a/trunk/docs/manual/misc/perf-tuning.html.en b/docs/manual/misc/perf-tuning.html.en similarity index 100% rename from trunk/docs/manual/misc/perf-tuning.html.en rename to docs/manual/misc/perf-tuning.html.en diff --git a/trunk/docs/manual/misc/perf-tuning.html.ko.euc-kr b/docs/manual/misc/perf-tuning.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/misc/perf-tuning.html.ko.euc-kr rename to docs/manual/misc/perf-tuning.html.ko.euc-kr diff --git a/trunk/docs/manual/misc/perf-tuning.xml b/docs/manual/misc/perf-tuning.xml similarity index 100% rename from trunk/docs/manual/misc/perf-tuning.xml rename to docs/manual/misc/perf-tuning.xml diff --git a/trunk/docs/manual/misc/perf-tuning.xml.ko b/docs/manual/misc/perf-tuning.xml.ko similarity index 100% rename from trunk/docs/manual/misc/perf-tuning.xml.ko rename to docs/manual/misc/perf-tuning.xml.ko diff --git a/trunk/docs/manual/misc/perf-tuning.xml.meta b/docs/manual/misc/perf-tuning.xml.meta similarity index 100% rename from trunk/docs/manual/misc/perf-tuning.xml.meta rename to docs/manual/misc/perf-tuning.xml.meta diff --git a/trunk/docs/manual/misc/relevant_standards.html b/docs/manual/misc/relevant_standards.html similarity index 100% rename from trunk/docs/manual/misc/relevant_standards.html rename to docs/manual/misc/relevant_standards.html diff --git a/trunk/docs/manual/misc/relevant_standards.html.en b/docs/manual/misc/relevant_standards.html.en similarity index 100% rename from trunk/docs/manual/misc/relevant_standards.html.en rename to docs/manual/misc/relevant_standards.html.en diff --git a/trunk/docs/manual/misc/relevant_standards.html.ko.euc-kr b/docs/manual/misc/relevant_standards.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/misc/relevant_standards.html.ko.euc-kr rename to docs/manual/misc/relevant_standards.html.ko.euc-kr diff --git a/trunk/docs/manual/misc/relevant_standards.xml b/docs/manual/misc/relevant_standards.xml similarity index 100% rename from trunk/docs/manual/misc/relevant_standards.xml rename to docs/manual/misc/relevant_standards.xml diff --git a/trunk/docs/manual/misc/relevant_standards.xml.ko b/docs/manual/misc/relevant_standards.xml.ko similarity index 100% rename from trunk/docs/manual/misc/relevant_standards.xml.ko rename to docs/manual/misc/relevant_standards.xml.ko diff --git a/trunk/docs/manual/misc/relevant_standards.xml.meta b/docs/manual/misc/relevant_standards.xml.meta similarity index 100% rename from trunk/docs/manual/misc/relevant_standards.xml.meta rename to docs/manual/misc/relevant_standards.xml.meta diff --git a/trunk/docs/manual/misc/rewriteguide.html b/docs/manual/misc/rewriteguide.html similarity index 100% rename from trunk/docs/manual/misc/rewriteguide.html rename to docs/manual/misc/rewriteguide.html diff --git a/trunk/docs/manual/misc/rewriteguide.html.en b/docs/manual/misc/rewriteguide.html.en similarity index 100% rename from trunk/docs/manual/misc/rewriteguide.html.en rename to docs/manual/misc/rewriteguide.html.en diff --git a/trunk/docs/manual/misc/rewriteguide.html.ko.euc-kr b/docs/manual/misc/rewriteguide.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/misc/rewriteguide.html.ko.euc-kr rename to docs/manual/misc/rewriteguide.html.ko.euc-kr diff --git a/trunk/docs/manual/misc/rewriteguide.xml b/docs/manual/misc/rewriteguide.xml similarity index 100% rename from trunk/docs/manual/misc/rewriteguide.xml rename to docs/manual/misc/rewriteguide.xml diff --git a/trunk/docs/manual/misc/rewriteguide.xml.ko b/docs/manual/misc/rewriteguide.xml.ko similarity index 100% rename from trunk/docs/manual/misc/rewriteguide.xml.ko rename to docs/manual/misc/rewriteguide.xml.ko diff --git a/trunk/docs/manual/misc/rewriteguide.xml.meta b/docs/manual/misc/rewriteguide.xml.meta similarity index 100% rename from trunk/docs/manual/misc/rewriteguide.xml.meta rename to docs/manual/misc/rewriteguide.xml.meta diff --git a/trunk/docs/manual/misc/security_tips.html b/docs/manual/misc/security_tips.html similarity index 100% rename from trunk/docs/manual/misc/security_tips.html rename to docs/manual/misc/security_tips.html diff --git a/trunk/docs/manual/misc/security_tips.html.en b/docs/manual/misc/security_tips.html.en similarity index 100% rename from trunk/docs/manual/misc/security_tips.html.en rename to docs/manual/misc/security_tips.html.en diff --git a/trunk/docs/manual/misc/security_tips.html.ko.euc-kr b/docs/manual/misc/security_tips.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/misc/security_tips.html.ko.euc-kr rename to docs/manual/misc/security_tips.html.ko.euc-kr diff --git a/trunk/docs/manual/misc/security_tips.xml b/docs/manual/misc/security_tips.xml similarity index 100% rename from trunk/docs/manual/misc/security_tips.xml rename to docs/manual/misc/security_tips.xml diff --git a/trunk/docs/manual/misc/security_tips.xml.ko b/docs/manual/misc/security_tips.xml.ko similarity index 100% rename from trunk/docs/manual/misc/security_tips.xml.ko rename to docs/manual/misc/security_tips.xml.ko diff --git a/trunk/docs/manual/misc/security_tips.xml.meta b/docs/manual/misc/security_tips.xml.meta similarity index 100% rename from trunk/docs/manual/misc/security_tips.xml.meta rename to docs/manual/misc/security_tips.xml.meta diff --git a/trunk/docs/manual/mod/allmodules.xml b/docs/manual/mod/allmodules.xml similarity index 100% rename from trunk/docs/manual/mod/allmodules.xml rename to docs/manual/mod/allmodules.xml diff --git a/trunk/docs/manual/mod/allmodules.xml.de b/docs/manual/mod/allmodules.xml.de similarity index 100% rename from trunk/docs/manual/mod/allmodules.xml.de rename to docs/manual/mod/allmodules.xml.de diff --git a/trunk/docs/manual/mod/allmodules.xml.es b/docs/manual/mod/allmodules.xml.es similarity index 100% rename from trunk/docs/manual/mod/allmodules.xml.es rename to docs/manual/mod/allmodules.xml.es diff --git a/trunk/docs/manual/mod/allmodules.xml.ja b/docs/manual/mod/allmodules.xml.ja similarity index 100% rename from trunk/docs/manual/mod/allmodules.xml.ja rename to docs/manual/mod/allmodules.xml.ja diff --git a/trunk/docs/manual/mod/allmodules.xml.ko b/docs/manual/mod/allmodules.xml.ko similarity index 100% rename from trunk/docs/manual/mod/allmodules.xml.ko rename to docs/manual/mod/allmodules.xml.ko diff --git a/trunk/docs/manual/mod/beos.html b/docs/manual/mod/beos.html similarity index 100% rename from trunk/docs/manual/mod/beos.html rename to docs/manual/mod/beos.html diff --git a/trunk/docs/manual/mod/beos.html.de b/docs/manual/mod/beos.html.de similarity index 100% rename from trunk/docs/manual/mod/beos.html.de rename to docs/manual/mod/beos.html.de diff --git a/trunk/docs/manual/mod/beos.html.en b/docs/manual/mod/beos.html.en similarity index 100% rename from trunk/docs/manual/mod/beos.html.en rename to docs/manual/mod/beos.html.en diff --git a/trunk/docs/manual/mod/beos.html.es b/docs/manual/mod/beos.html.es similarity index 100% rename from trunk/docs/manual/mod/beos.html.es rename to docs/manual/mod/beos.html.es diff --git a/trunk/docs/manual/mod/beos.html.ko.euc-kr b/docs/manual/mod/beos.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mod/beos.html.ko.euc-kr rename to docs/manual/mod/beos.html.ko.euc-kr diff --git a/trunk/docs/manual/mod/beos.xml b/docs/manual/mod/beos.xml similarity index 100% rename from trunk/docs/manual/mod/beos.xml rename to docs/manual/mod/beos.xml diff --git a/trunk/docs/manual/mod/beos.xml.de b/docs/manual/mod/beos.xml.de similarity index 100% rename from trunk/docs/manual/mod/beos.xml.de rename to docs/manual/mod/beos.xml.de diff --git a/trunk/docs/manual/mod/beos.xml.es b/docs/manual/mod/beos.xml.es similarity index 100% rename from trunk/docs/manual/mod/beos.xml.es rename to docs/manual/mod/beos.xml.es diff --git a/trunk/docs/manual/mod/beos.xml.ko b/docs/manual/mod/beos.xml.ko similarity index 100% rename from trunk/docs/manual/mod/beos.xml.ko rename to docs/manual/mod/beos.xml.ko diff --git a/trunk/docs/manual/mod/beos.xml.meta b/docs/manual/mod/beos.xml.meta similarity index 100% rename from trunk/docs/manual/mod/beos.xml.meta rename to docs/manual/mod/beos.xml.meta diff --git a/trunk/docs/manual/mod/core.html b/docs/manual/mod/core.html similarity index 100% rename from trunk/docs/manual/mod/core.html rename to docs/manual/mod/core.html diff --git a/trunk/docs/manual/mod/core.html.de b/docs/manual/mod/core.html.de similarity index 100% rename from trunk/docs/manual/mod/core.html.de rename to docs/manual/mod/core.html.de diff --git a/trunk/docs/manual/mod/core.html.en b/docs/manual/mod/core.html.en similarity index 100% rename from trunk/docs/manual/mod/core.html.en rename to docs/manual/mod/core.html.en diff --git a/trunk/docs/manual/mod/core.html.ja.euc-jp b/docs/manual/mod/core.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/core.html.ja.euc-jp rename to docs/manual/mod/core.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/core.xml b/docs/manual/mod/core.xml similarity index 100% rename from trunk/docs/manual/mod/core.xml rename to docs/manual/mod/core.xml diff --git a/trunk/docs/manual/mod/core.xml.de b/docs/manual/mod/core.xml.de similarity index 100% rename from trunk/docs/manual/mod/core.xml.de rename to docs/manual/mod/core.xml.de diff --git a/trunk/docs/manual/mod/core.xml.ja b/docs/manual/mod/core.xml.ja similarity index 100% rename from trunk/docs/manual/mod/core.xml.ja rename to docs/manual/mod/core.xml.ja diff --git a/trunk/docs/manual/mod/core.xml.meta b/docs/manual/mod/core.xml.meta similarity index 100% rename from trunk/docs/manual/mod/core.xml.meta rename to docs/manual/mod/core.xml.meta diff --git a/trunk/docs/manual/mod/directive-dict.html b/docs/manual/mod/directive-dict.html similarity index 100% rename from trunk/docs/manual/mod/directive-dict.html rename to docs/manual/mod/directive-dict.html diff --git a/trunk/docs/manual/mod/directive-dict.html.en b/docs/manual/mod/directive-dict.html.en similarity index 100% rename from trunk/docs/manual/mod/directive-dict.html.en rename to docs/manual/mod/directive-dict.html.en diff --git a/trunk/docs/manual/mod/directive-dict.html.ja.euc-jp b/docs/manual/mod/directive-dict.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/directive-dict.html.ja.euc-jp rename to docs/manual/mod/directive-dict.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/directive-dict.html.ko.euc-kr b/docs/manual/mod/directive-dict.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mod/directive-dict.html.ko.euc-kr rename to docs/manual/mod/directive-dict.html.ko.euc-kr diff --git a/trunk/docs/manual/mod/directive-dict.xml b/docs/manual/mod/directive-dict.xml similarity index 100% rename from trunk/docs/manual/mod/directive-dict.xml rename to docs/manual/mod/directive-dict.xml diff --git a/trunk/docs/manual/mod/directive-dict.xml.ja b/docs/manual/mod/directive-dict.xml.ja similarity index 100% rename from trunk/docs/manual/mod/directive-dict.xml.ja rename to docs/manual/mod/directive-dict.xml.ja diff --git a/trunk/docs/manual/mod/directive-dict.xml.ko b/docs/manual/mod/directive-dict.xml.ko similarity index 100% rename from trunk/docs/manual/mod/directive-dict.xml.ko rename to docs/manual/mod/directive-dict.xml.ko diff --git a/trunk/docs/manual/mod/directive-dict.xml.meta b/docs/manual/mod/directive-dict.xml.meta similarity index 100% rename from trunk/docs/manual/mod/directive-dict.xml.meta rename to docs/manual/mod/directive-dict.xml.meta diff --git a/trunk/docs/manual/mod/directives.html b/docs/manual/mod/directives.html similarity index 100% rename from trunk/docs/manual/mod/directives.html rename to docs/manual/mod/directives.html diff --git a/trunk/docs/manual/mod/directives.html.de b/docs/manual/mod/directives.html.de similarity index 100% rename from trunk/docs/manual/mod/directives.html.de rename to docs/manual/mod/directives.html.de diff --git a/trunk/docs/manual/mod/directives.html.en b/docs/manual/mod/directives.html.en similarity index 100% rename from trunk/docs/manual/mod/directives.html.en rename to docs/manual/mod/directives.html.en diff --git a/trunk/docs/manual/mod/directives.html.es b/docs/manual/mod/directives.html.es similarity index 100% rename from trunk/docs/manual/mod/directives.html.es rename to docs/manual/mod/directives.html.es diff --git a/trunk/docs/manual/mod/directives.html.ja.euc-jp b/docs/manual/mod/directives.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/directives.html.ja.euc-jp rename to docs/manual/mod/directives.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/directives.html.ko.euc-kr b/docs/manual/mod/directives.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mod/directives.html.ko.euc-kr rename to docs/manual/mod/directives.html.ko.euc-kr diff --git a/trunk/docs/manual/mod/directives.xml b/docs/manual/mod/directives.xml similarity index 100% rename from trunk/docs/manual/mod/directives.xml rename to docs/manual/mod/directives.xml diff --git a/trunk/docs/manual/mod/directives.xml.de b/docs/manual/mod/directives.xml.de similarity index 100% rename from trunk/docs/manual/mod/directives.xml.de rename to docs/manual/mod/directives.xml.de diff --git a/trunk/docs/manual/mod/directives.xml.es b/docs/manual/mod/directives.xml.es similarity index 100% rename from trunk/docs/manual/mod/directives.xml.es rename to docs/manual/mod/directives.xml.es diff --git a/trunk/docs/manual/mod/directives.xml.ja b/docs/manual/mod/directives.xml.ja similarity index 100% rename from trunk/docs/manual/mod/directives.xml.ja rename to docs/manual/mod/directives.xml.ja diff --git a/trunk/docs/manual/mod/directives.xml.ko b/docs/manual/mod/directives.xml.ko similarity index 100% rename from trunk/docs/manual/mod/directives.xml.ko rename to docs/manual/mod/directives.xml.ko diff --git a/trunk/docs/manual/mod/directives.xml.meta b/docs/manual/mod/directives.xml.meta similarity index 100% rename from trunk/docs/manual/mod/directives.xml.meta rename to docs/manual/mod/directives.xml.meta diff --git a/trunk/docs/manual/mod/event.html b/docs/manual/mod/event.html similarity index 100% rename from trunk/docs/manual/mod/event.html rename to docs/manual/mod/event.html diff --git a/trunk/docs/manual/mod/event.html.en b/docs/manual/mod/event.html.en similarity index 100% rename from trunk/docs/manual/mod/event.html.en rename to docs/manual/mod/event.html.en diff --git a/trunk/docs/manual/mod/event.xml b/docs/manual/mod/event.xml similarity index 100% rename from trunk/docs/manual/mod/event.xml rename to docs/manual/mod/event.xml diff --git a/trunk/docs/manual/mod/event.xml.meta b/docs/manual/mod/event.xml.meta similarity index 100% rename from trunk/docs/manual/mod/event.xml.meta rename to docs/manual/mod/event.xml.meta diff --git a/trunk/docs/manual/mod/index.html b/docs/manual/mod/index.html similarity index 100% rename from trunk/docs/manual/mod/index.html rename to docs/manual/mod/index.html diff --git a/trunk/docs/manual/mod/index.html.de b/docs/manual/mod/index.html.de similarity index 100% rename from trunk/docs/manual/mod/index.html.de rename to docs/manual/mod/index.html.de diff --git a/trunk/docs/manual/mod/index.html.en b/docs/manual/mod/index.html.en similarity index 100% rename from trunk/docs/manual/mod/index.html.en rename to docs/manual/mod/index.html.en diff --git a/trunk/docs/manual/mod/index.html.es b/docs/manual/mod/index.html.es similarity index 100% rename from trunk/docs/manual/mod/index.html.es rename to docs/manual/mod/index.html.es diff --git a/trunk/docs/manual/mod/index.html.ja.euc-jp b/docs/manual/mod/index.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/index.html.ja.euc-jp rename to docs/manual/mod/index.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/index.html.ko.euc-kr b/docs/manual/mod/index.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mod/index.html.ko.euc-kr rename to docs/manual/mod/index.html.ko.euc-kr diff --git a/trunk/docs/manual/mod/index.xml b/docs/manual/mod/index.xml similarity index 100% rename from trunk/docs/manual/mod/index.xml rename to docs/manual/mod/index.xml diff --git a/trunk/docs/manual/mod/index.xml.de b/docs/manual/mod/index.xml.de similarity index 100% rename from trunk/docs/manual/mod/index.xml.de rename to docs/manual/mod/index.xml.de diff --git a/trunk/docs/manual/mod/index.xml.es b/docs/manual/mod/index.xml.es similarity index 100% rename from trunk/docs/manual/mod/index.xml.es rename to docs/manual/mod/index.xml.es diff --git a/trunk/docs/manual/mod/index.xml.ja b/docs/manual/mod/index.xml.ja similarity index 100% rename from trunk/docs/manual/mod/index.xml.ja rename to docs/manual/mod/index.xml.ja diff --git a/trunk/docs/manual/mod/index.xml.ko b/docs/manual/mod/index.xml.ko similarity index 100% rename from trunk/docs/manual/mod/index.xml.ko rename to docs/manual/mod/index.xml.ko diff --git a/trunk/docs/manual/mod/index.xml.meta b/docs/manual/mod/index.xml.meta similarity index 100% rename from trunk/docs/manual/mod/index.xml.meta rename to docs/manual/mod/index.xml.meta diff --git a/trunk/docs/manual/mod/leader.html b/docs/manual/mod/leader.html similarity index 100% rename from trunk/docs/manual/mod/leader.html rename to docs/manual/mod/leader.html diff --git a/trunk/docs/manual/mod/leader.html.de b/docs/manual/mod/leader.html.de similarity index 100% rename from trunk/docs/manual/mod/leader.html.de rename to docs/manual/mod/leader.html.de diff --git a/trunk/docs/manual/mod/leader.html.en b/docs/manual/mod/leader.html.en similarity index 100% rename from trunk/docs/manual/mod/leader.html.en rename to docs/manual/mod/leader.html.en diff --git a/trunk/docs/manual/mod/leader.html.ko.euc-kr b/docs/manual/mod/leader.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mod/leader.html.ko.euc-kr rename to docs/manual/mod/leader.html.ko.euc-kr diff --git a/trunk/docs/manual/mod/leader.xml b/docs/manual/mod/leader.xml similarity index 100% rename from trunk/docs/manual/mod/leader.xml rename to docs/manual/mod/leader.xml diff --git a/trunk/docs/manual/mod/leader.xml.de b/docs/manual/mod/leader.xml.de similarity index 100% rename from trunk/docs/manual/mod/leader.xml.de rename to docs/manual/mod/leader.xml.de diff --git a/trunk/docs/manual/mod/leader.xml.ko b/docs/manual/mod/leader.xml.ko similarity index 100% rename from trunk/docs/manual/mod/leader.xml.ko rename to docs/manual/mod/leader.xml.ko diff --git a/trunk/docs/manual/mod/leader.xml.meta b/docs/manual/mod/leader.xml.meta similarity index 100% rename from trunk/docs/manual/mod/leader.xml.meta rename to docs/manual/mod/leader.xml.meta diff --git a/trunk/docs/manual/mod/mod_actions.html b/docs/manual/mod/mod_actions.html similarity index 100% rename from trunk/docs/manual/mod/mod_actions.html rename to docs/manual/mod/mod_actions.html diff --git a/trunk/docs/manual/mod/mod_actions.html.de b/docs/manual/mod/mod_actions.html.de similarity index 100% rename from trunk/docs/manual/mod/mod_actions.html.de rename to docs/manual/mod/mod_actions.html.de diff --git a/trunk/docs/manual/mod/mod_actions.html.en b/docs/manual/mod/mod_actions.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_actions.html.en rename to docs/manual/mod/mod_actions.html.en diff --git a/trunk/docs/manual/mod/mod_actions.html.ja.euc-jp b/docs/manual/mod/mod_actions.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/mod_actions.html.ja.euc-jp rename to docs/manual/mod/mod_actions.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/mod_actions.html.ko.euc-kr b/docs/manual/mod/mod_actions.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mod/mod_actions.html.ko.euc-kr rename to docs/manual/mod/mod_actions.html.ko.euc-kr diff --git a/trunk/docs/manual/mod/mod_actions.xml b/docs/manual/mod/mod_actions.xml similarity index 100% rename from trunk/docs/manual/mod/mod_actions.xml rename to docs/manual/mod/mod_actions.xml diff --git a/trunk/docs/manual/mod/mod_actions.xml.de b/docs/manual/mod/mod_actions.xml.de similarity index 100% rename from trunk/docs/manual/mod/mod_actions.xml.de rename to docs/manual/mod/mod_actions.xml.de diff --git a/trunk/docs/manual/mod/mod_actions.xml.ja b/docs/manual/mod/mod_actions.xml.ja similarity index 100% rename from trunk/docs/manual/mod/mod_actions.xml.ja rename to docs/manual/mod/mod_actions.xml.ja diff --git a/trunk/docs/manual/mod/mod_actions.xml.ko b/docs/manual/mod/mod_actions.xml.ko similarity index 100% rename from trunk/docs/manual/mod/mod_actions.xml.ko rename to docs/manual/mod/mod_actions.xml.ko diff --git a/trunk/docs/manual/mod/mod_actions.xml.meta b/docs/manual/mod/mod_actions.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_actions.xml.meta rename to docs/manual/mod/mod_actions.xml.meta diff --git a/trunk/docs/manual/mod/mod_alias.html b/docs/manual/mod/mod_alias.html similarity index 100% rename from trunk/docs/manual/mod/mod_alias.html rename to docs/manual/mod/mod_alias.html diff --git a/trunk/docs/manual/mod/mod_alias.html.en b/docs/manual/mod/mod_alias.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_alias.html.en rename to docs/manual/mod/mod_alias.html.en diff --git a/trunk/docs/manual/mod/mod_alias.html.ja.euc-jp b/docs/manual/mod/mod_alias.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/mod_alias.html.ja.euc-jp rename to docs/manual/mod/mod_alias.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/mod_alias.html.ko.euc-kr b/docs/manual/mod/mod_alias.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mod/mod_alias.html.ko.euc-kr rename to docs/manual/mod/mod_alias.html.ko.euc-kr diff --git a/trunk/docs/manual/mod/mod_alias.xml b/docs/manual/mod/mod_alias.xml similarity index 100% rename from trunk/docs/manual/mod/mod_alias.xml rename to docs/manual/mod/mod_alias.xml diff --git a/trunk/docs/manual/mod/mod_alias.xml.ja b/docs/manual/mod/mod_alias.xml.ja similarity index 100% rename from trunk/docs/manual/mod/mod_alias.xml.ja rename to docs/manual/mod/mod_alias.xml.ja diff --git a/trunk/docs/manual/mod/mod_alias.xml.ko b/docs/manual/mod/mod_alias.xml.ko similarity index 100% rename from trunk/docs/manual/mod/mod_alias.xml.ko rename to docs/manual/mod/mod_alias.xml.ko diff --git a/trunk/docs/manual/mod/mod_alias.xml.meta b/docs/manual/mod/mod_alias.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_alias.xml.meta rename to docs/manual/mod/mod_alias.xml.meta diff --git a/trunk/docs/manual/mod/mod_asis.html b/docs/manual/mod/mod_asis.html similarity index 100% rename from trunk/docs/manual/mod/mod_asis.html rename to docs/manual/mod/mod_asis.html diff --git a/trunk/docs/manual/mod/mod_asis.html.en b/docs/manual/mod/mod_asis.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_asis.html.en rename to docs/manual/mod/mod_asis.html.en diff --git a/trunk/docs/manual/mod/mod_asis.html.ja.euc-jp b/docs/manual/mod/mod_asis.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/mod_asis.html.ja.euc-jp rename to docs/manual/mod/mod_asis.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/mod_asis.html.ko.euc-kr b/docs/manual/mod/mod_asis.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mod/mod_asis.html.ko.euc-kr rename to docs/manual/mod/mod_asis.html.ko.euc-kr diff --git a/trunk/docs/manual/mod/mod_asis.xml b/docs/manual/mod/mod_asis.xml similarity index 100% rename from trunk/docs/manual/mod/mod_asis.xml rename to docs/manual/mod/mod_asis.xml diff --git a/trunk/docs/manual/mod/mod_asis.xml.ja b/docs/manual/mod/mod_asis.xml.ja similarity index 100% rename from trunk/docs/manual/mod/mod_asis.xml.ja rename to docs/manual/mod/mod_asis.xml.ja diff --git a/trunk/docs/manual/mod/mod_asis.xml.ko b/docs/manual/mod/mod_asis.xml.ko similarity index 100% rename from trunk/docs/manual/mod/mod_asis.xml.ko rename to docs/manual/mod/mod_asis.xml.ko diff --git a/trunk/docs/manual/mod/mod_asis.xml.meta b/docs/manual/mod/mod_asis.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_asis.xml.meta rename to docs/manual/mod/mod_asis.xml.meta diff --git a/trunk/docs/manual/mod/mod_auth_basic.html b/docs/manual/mod/mod_auth_basic.html similarity index 100% rename from trunk/docs/manual/mod/mod_auth_basic.html rename to docs/manual/mod/mod_auth_basic.html diff --git a/trunk/docs/manual/mod/mod_auth_basic.html.en b/docs/manual/mod/mod_auth_basic.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_auth_basic.html.en rename to docs/manual/mod/mod_auth_basic.html.en diff --git a/trunk/docs/manual/mod/mod_auth_basic.html.ja.euc-jp b/docs/manual/mod/mod_auth_basic.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/mod_auth_basic.html.ja.euc-jp rename to docs/manual/mod/mod_auth_basic.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/mod_auth_basic.html.ko.euc-kr b/docs/manual/mod/mod_auth_basic.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mod/mod_auth_basic.html.ko.euc-kr rename to docs/manual/mod/mod_auth_basic.html.ko.euc-kr diff --git a/trunk/docs/manual/mod/mod_auth_basic.xml b/docs/manual/mod/mod_auth_basic.xml similarity index 100% rename from trunk/docs/manual/mod/mod_auth_basic.xml rename to docs/manual/mod/mod_auth_basic.xml diff --git a/trunk/docs/manual/mod/mod_auth_basic.xml.ja b/docs/manual/mod/mod_auth_basic.xml.ja similarity index 100% rename from trunk/docs/manual/mod/mod_auth_basic.xml.ja rename to docs/manual/mod/mod_auth_basic.xml.ja diff --git a/trunk/docs/manual/mod/mod_auth_basic.xml.ko b/docs/manual/mod/mod_auth_basic.xml.ko similarity index 100% rename from trunk/docs/manual/mod/mod_auth_basic.xml.ko rename to docs/manual/mod/mod_auth_basic.xml.ko diff --git a/trunk/docs/manual/mod/mod_auth_basic.xml.meta b/docs/manual/mod/mod_auth_basic.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_auth_basic.xml.meta rename to docs/manual/mod/mod_auth_basic.xml.meta diff --git a/trunk/docs/manual/mod/mod_auth_digest.html b/docs/manual/mod/mod_auth_digest.html similarity index 100% rename from trunk/docs/manual/mod/mod_auth_digest.html rename to docs/manual/mod/mod_auth_digest.html diff --git a/trunk/docs/manual/mod/mod_auth_digest.html.en b/docs/manual/mod/mod_auth_digest.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_auth_digest.html.en rename to docs/manual/mod/mod_auth_digest.html.en diff --git a/trunk/docs/manual/mod/mod_auth_digest.html.ko.euc-kr b/docs/manual/mod/mod_auth_digest.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mod/mod_auth_digest.html.ko.euc-kr rename to docs/manual/mod/mod_auth_digest.html.ko.euc-kr diff --git a/trunk/docs/manual/mod/mod_auth_digest.xml b/docs/manual/mod/mod_auth_digest.xml similarity index 100% rename from trunk/docs/manual/mod/mod_auth_digest.xml rename to docs/manual/mod/mod_auth_digest.xml diff --git a/trunk/docs/manual/mod/mod_auth_digest.xml.ko b/docs/manual/mod/mod_auth_digest.xml.ko similarity index 100% rename from trunk/docs/manual/mod/mod_auth_digest.xml.ko rename to docs/manual/mod/mod_auth_digest.xml.ko diff --git a/trunk/docs/manual/mod/mod_auth_digest.xml.meta b/docs/manual/mod/mod_auth_digest.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_auth_digest.xml.meta rename to docs/manual/mod/mod_auth_digest.xml.meta diff --git a/trunk/docs/manual/mod/mod_authn_alias.html b/docs/manual/mod/mod_authn_alias.html similarity index 100% rename from trunk/docs/manual/mod/mod_authn_alias.html rename to docs/manual/mod/mod_authn_alias.html diff --git a/trunk/docs/manual/mod/mod_authn_alias.html.en b/docs/manual/mod/mod_authn_alias.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_authn_alias.html.en rename to docs/manual/mod/mod_authn_alias.html.en diff --git a/trunk/docs/manual/mod/mod_authn_alias.xml b/docs/manual/mod/mod_authn_alias.xml similarity index 100% rename from trunk/docs/manual/mod/mod_authn_alias.xml rename to docs/manual/mod/mod_authn_alias.xml diff --git a/trunk/docs/manual/mod/mod_authn_alias.xml.meta b/docs/manual/mod/mod_authn_alias.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_authn_alias.xml.meta rename to docs/manual/mod/mod_authn_alias.xml.meta diff --git a/trunk/docs/manual/mod/mod_authn_anon.html b/docs/manual/mod/mod_authn_anon.html similarity index 100% rename from trunk/docs/manual/mod/mod_authn_anon.html rename to docs/manual/mod/mod_authn_anon.html diff --git a/trunk/docs/manual/mod/mod_authn_anon.html.en b/docs/manual/mod/mod_authn_anon.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_authn_anon.html.en rename to docs/manual/mod/mod_authn_anon.html.en diff --git a/trunk/docs/manual/mod/mod_authn_anon.html.ja.euc-jp b/docs/manual/mod/mod_authn_anon.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/mod_authn_anon.html.ja.euc-jp rename to docs/manual/mod/mod_authn_anon.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/mod_authn_anon.html.ko.euc-kr b/docs/manual/mod/mod_authn_anon.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mod/mod_authn_anon.html.ko.euc-kr rename to docs/manual/mod/mod_authn_anon.html.ko.euc-kr diff --git a/trunk/docs/manual/mod/mod_authn_anon.xml b/docs/manual/mod/mod_authn_anon.xml similarity index 100% rename from trunk/docs/manual/mod/mod_authn_anon.xml rename to docs/manual/mod/mod_authn_anon.xml diff --git a/trunk/docs/manual/mod/mod_authn_anon.xml.ja b/docs/manual/mod/mod_authn_anon.xml.ja similarity index 100% rename from trunk/docs/manual/mod/mod_authn_anon.xml.ja rename to docs/manual/mod/mod_authn_anon.xml.ja diff --git a/trunk/docs/manual/mod/mod_authn_anon.xml.ko b/docs/manual/mod/mod_authn_anon.xml.ko similarity index 100% rename from trunk/docs/manual/mod/mod_authn_anon.xml.ko rename to docs/manual/mod/mod_authn_anon.xml.ko diff --git a/trunk/docs/manual/mod/mod_authn_anon.xml.meta b/docs/manual/mod/mod_authn_anon.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_authn_anon.xml.meta rename to docs/manual/mod/mod_authn_anon.xml.meta diff --git a/trunk/docs/manual/mod/mod_authn_dbm.html b/docs/manual/mod/mod_authn_dbm.html similarity index 100% rename from trunk/docs/manual/mod/mod_authn_dbm.html rename to docs/manual/mod/mod_authn_dbm.html diff --git a/trunk/docs/manual/mod/mod_authn_dbm.html.en b/docs/manual/mod/mod_authn_dbm.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_authn_dbm.html.en rename to docs/manual/mod/mod_authn_dbm.html.en diff --git a/trunk/docs/manual/mod/mod_authn_dbm.html.ja.euc-jp b/docs/manual/mod/mod_authn_dbm.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/mod_authn_dbm.html.ja.euc-jp rename to docs/manual/mod/mod_authn_dbm.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/mod_authn_dbm.html.ko.euc-kr b/docs/manual/mod/mod_authn_dbm.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mod/mod_authn_dbm.html.ko.euc-kr rename to docs/manual/mod/mod_authn_dbm.html.ko.euc-kr diff --git a/trunk/docs/manual/mod/mod_authn_dbm.xml b/docs/manual/mod/mod_authn_dbm.xml similarity index 100% rename from trunk/docs/manual/mod/mod_authn_dbm.xml rename to docs/manual/mod/mod_authn_dbm.xml diff --git a/trunk/docs/manual/mod/mod_authn_dbm.xml.ja b/docs/manual/mod/mod_authn_dbm.xml.ja similarity index 100% rename from trunk/docs/manual/mod/mod_authn_dbm.xml.ja rename to docs/manual/mod/mod_authn_dbm.xml.ja diff --git a/trunk/docs/manual/mod/mod_authn_dbm.xml.ko b/docs/manual/mod/mod_authn_dbm.xml.ko similarity index 100% rename from trunk/docs/manual/mod/mod_authn_dbm.xml.ko rename to docs/manual/mod/mod_authn_dbm.xml.ko diff --git a/trunk/docs/manual/mod/mod_authn_dbm.xml.meta b/docs/manual/mod/mod_authn_dbm.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_authn_dbm.xml.meta rename to docs/manual/mod/mod_authn_dbm.xml.meta diff --git a/trunk/docs/manual/mod/mod_authn_default.html b/docs/manual/mod/mod_authn_default.html similarity index 100% rename from trunk/docs/manual/mod/mod_authn_default.html rename to docs/manual/mod/mod_authn_default.html diff --git a/trunk/docs/manual/mod/mod_authn_default.html.en b/docs/manual/mod/mod_authn_default.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_authn_default.html.en rename to docs/manual/mod/mod_authn_default.html.en diff --git a/trunk/docs/manual/mod/mod_authn_default.html.ja.euc-jp b/docs/manual/mod/mod_authn_default.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/mod_authn_default.html.ja.euc-jp rename to docs/manual/mod/mod_authn_default.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/mod_authn_default.html.ko.euc-kr b/docs/manual/mod/mod_authn_default.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mod/mod_authn_default.html.ko.euc-kr rename to docs/manual/mod/mod_authn_default.html.ko.euc-kr diff --git a/trunk/docs/manual/mod/mod_authn_default.xml b/docs/manual/mod/mod_authn_default.xml similarity index 100% rename from trunk/docs/manual/mod/mod_authn_default.xml rename to docs/manual/mod/mod_authn_default.xml diff --git a/trunk/docs/manual/mod/mod_authn_default.xml.ja b/docs/manual/mod/mod_authn_default.xml.ja similarity index 100% rename from trunk/docs/manual/mod/mod_authn_default.xml.ja rename to docs/manual/mod/mod_authn_default.xml.ja diff --git a/trunk/docs/manual/mod/mod_authn_default.xml.ko b/docs/manual/mod/mod_authn_default.xml.ko similarity index 100% rename from trunk/docs/manual/mod/mod_authn_default.xml.ko rename to docs/manual/mod/mod_authn_default.xml.ko diff --git a/trunk/docs/manual/mod/mod_authn_default.xml.meta b/docs/manual/mod/mod_authn_default.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_authn_default.xml.meta rename to docs/manual/mod/mod_authn_default.xml.meta diff --git a/trunk/docs/manual/mod/mod_authn_file.html b/docs/manual/mod/mod_authn_file.html similarity index 100% rename from trunk/docs/manual/mod/mod_authn_file.html rename to docs/manual/mod/mod_authn_file.html diff --git a/trunk/docs/manual/mod/mod_authn_file.html.en b/docs/manual/mod/mod_authn_file.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_authn_file.html.en rename to docs/manual/mod/mod_authn_file.html.en diff --git a/trunk/docs/manual/mod/mod_authn_file.html.ja.euc-jp b/docs/manual/mod/mod_authn_file.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/mod_authn_file.html.ja.euc-jp rename to docs/manual/mod/mod_authn_file.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/mod_authn_file.html.ko.euc-kr b/docs/manual/mod/mod_authn_file.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mod/mod_authn_file.html.ko.euc-kr rename to docs/manual/mod/mod_authn_file.html.ko.euc-kr diff --git a/trunk/docs/manual/mod/mod_authn_file.xml b/docs/manual/mod/mod_authn_file.xml similarity index 100% rename from trunk/docs/manual/mod/mod_authn_file.xml rename to docs/manual/mod/mod_authn_file.xml diff --git a/trunk/docs/manual/mod/mod_authn_file.xml.ja b/docs/manual/mod/mod_authn_file.xml.ja similarity index 100% rename from trunk/docs/manual/mod/mod_authn_file.xml.ja rename to docs/manual/mod/mod_authn_file.xml.ja diff --git a/trunk/docs/manual/mod/mod_authn_file.xml.ko b/docs/manual/mod/mod_authn_file.xml.ko similarity index 100% rename from trunk/docs/manual/mod/mod_authn_file.xml.ko rename to docs/manual/mod/mod_authn_file.xml.ko diff --git a/trunk/docs/manual/mod/mod_authn_file.xml.meta b/docs/manual/mod/mod_authn_file.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_authn_file.xml.meta rename to docs/manual/mod/mod_authn_file.xml.meta diff --git a/trunk/docs/manual/mod/mod_authnz_ldap.html b/docs/manual/mod/mod_authnz_ldap.html similarity index 100% rename from trunk/docs/manual/mod/mod_authnz_ldap.html rename to docs/manual/mod/mod_authnz_ldap.html diff --git a/trunk/docs/manual/mod/mod_authnz_ldap.html.en b/docs/manual/mod/mod_authnz_ldap.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_authnz_ldap.html.en rename to docs/manual/mod/mod_authnz_ldap.html.en diff --git a/trunk/docs/manual/mod/mod_authnz_ldap.xml b/docs/manual/mod/mod_authnz_ldap.xml similarity index 100% rename from trunk/docs/manual/mod/mod_authnz_ldap.xml rename to docs/manual/mod/mod_authnz_ldap.xml diff --git a/trunk/docs/manual/mod/mod_authnz_ldap.xml.meta b/docs/manual/mod/mod_authnz_ldap.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_authnz_ldap.xml.meta rename to docs/manual/mod/mod_authnz_ldap.xml.meta diff --git a/trunk/docs/manual/mod/mod_authz_dbm.html b/docs/manual/mod/mod_authz_dbm.html similarity index 100% rename from trunk/docs/manual/mod/mod_authz_dbm.html rename to docs/manual/mod/mod_authz_dbm.html diff --git a/trunk/docs/manual/mod/mod_authz_dbm.html.en b/docs/manual/mod/mod_authz_dbm.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_authz_dbm.html.en rename to docs/manual/mod/mod_authz_dbm.html.en diff --git a/trunk/docs/manual/mod/mod_authz_dbm.html.ko.euc-kr b/docs/manual/mod/mod_authz_dbm.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mod/mod_authz_dbm.html.ko.euc-kr rename to docs/manual/mod/mod_authz_dbm.html.ko.euc-kr diff --git a/trunk/docs/manual/mod/mod_authz_dbm.xml b/docs/manual/mod/mod_authz_dbm.xml similarity index 100% rename from trunk/docs/manual/mod/mod_authz_dbm.xml rename to docs/manual/mod/mod_authz_dbm.xml diff --git a/trunk/docs/manual/mod/mod_authz_dbm.xml.ko b/docs/manual/mod/mod_authz_dbm.xml.ko similarity index 100% rename from trunk/docs/manual/mod/mod_authz_dbm.xml.ko rename to docs/manual/mod/mod_authz_dbm.xml.ko diff --git a/trunk/docs/manual/mod/mod_authz_dbm.xml.meta b/docs/manual/mod/mod_authz_dbm.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_authz_dbm.xml.meta rename to docs/manual/mod/mod_authz_dbm.xml.meta diff --git a/trunk/docs/manual/mod/mod_authz_default.html b/docs/manual/mod/mod_authz_default.html similarity index 100% rename from trunk/docs/manual/mod/mod_authz_default.html rename to docs/manual/mod/mod_authz_default.html diff --git a/trunk/docs/manual/mod/mod_authz_default.html.en b/docs/manual/mod/mod_authz_default.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_authz_default.html.en rename to docs/manual/mod/mod_authz_default.html.en diff --git a/trunk/docs/manual/mod/mod_authz_default.html.ja.euc-jp b/docs/manual/mod/mod_authz_default.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/mod_authz_default.html.ja.euc-jp rename to docs/manual/mod/mod_authz_default.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/mod_authz_default.html.ko.euc-kr b/docs/manual/mod/mod_authz_default.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mod/mod_authz_default.html.ko.euc-kr rename to docs/manual/mod/mod_authz_default.html.ko.euc-kr diff --git a/trunk/docs/manual/mod/mod_authz_default.xml b/docs/manual/mod/mod_authz_default.xml similarity index 100% rename from trunk/docs/manual/mod/mod_authz_default.xml rename to docs/manual/mod/mod_authz_default.xml diff --git a/trunk/docs/manual/mod/mod_authz_default.xml.ja b/docs/manual/mod/mod_authz_default.xml.ja similarity index 100% rename from trunk/docs/manual/mod/mod_authz_default.xml.ja rename to docs/manual/mod/mod_authz_default.xml.ja diff --git a/trunk/docs/manual/mod/mod_authz_default.xml.ko b/docs/manual/mod/mod_authz_default.xml.ko similarity index 100% rename from trunk/docs/manual/mod/mod_authz_default.xml.ko rename to docs/manual/mod/mod_authz_default.xml.ko diff --git a/trunk/docs/manual/mod/mod_authz_default.xml.meta b/docs/manual/mod/mod_authz_default.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_authz_default.xml.meta rename to docs/manual/mod/mod_authz_default.xml.meta diff --git a/trunk/docs/manual/mod/mod_authz_groupfile.html b/docs/manual/mod/mod_authz_groupfile.html similarity index 100% rename from trunk/docs/manual/mod/mod_authz_groupfile.html rename to docs/manual/mod/mod_authz_groupfile.html diff --git a/trunk/docs/manual/mod/mod_authz_groupfile.html.en b/docs/manual/mod/mod_authz_groupfile.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_authz_groupfile.html.en rename to docs/manual/mod/mod_authz_groupfile.html.en diff --git a/trunk/docs/manual/mod/mod_authz_groupfile.html.ja.euc-jp b/docs/manual/mod/mod_authz_groupfile.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/mod_authz_groupfile.html.ja.euc-jp rename to docs/manual/mod/mod_authz_groupfile.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/mod_authz_groupfile.html.ko.euc-kr b/docs/manual/mod/mod_authz_groupfile.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mod/mod_authz_groupfile.html.ko.euc-kr rename to docs/manual/mod/mod_authz_groupfile.html.ko.euc-kr diff --git a/trunk/docs/manual/mod/mod_authz_groupfile.xml b/docs/manual/mod/mod_authz_groupfile.xml similarity index 100% rename from trunk/docs/manual/mod/mod_authz_groupfile.xml rename to docs/manual/mod/mod_authz_groupfile.xml diff --git a/trunk/docs/manual/mod/mod_authz_groupfile.xml.ja b/docs/manual/mod/mod_authz_groupfile.xml.ja similarity index 100% rename from trunk/docs/manual/mod/mod_authz_groupfile.xml.ja rename to docs/manual/mod/mod_authz_groupfile.xml.ja diff --git a/trunk/docs/manual/mod/mod_authz_groupfile.xml.ko b/docs/manual/mod/mod_authz_groupfile.xml.ko similarity index 100% rename from trunk/docs/manual/mod/mod_authz_groupfile.xml.ko rename to docs/manual/mod/mod_authz_groupfile.xml.ko diff --git a/trunk/docs/manual/mod/mod_authz_groupfile.xml.meta b/docs/manual/mod/mod_authz_groupfile.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_authz_groupfile.xml.meta rename to docs/manual/mod/mod_authz_groupfile.xml.meta diff --git a/trunk/docs/manual/mod/mod_authz_host.html b/docs/manual/mod/mod_authz_host.html similarity index 100% rename from trunk/docs/manual/mod/mod_authz_host.html rename to docs/manual/mod/mod_authz_host.html diff --git a/trunk/docs/manual/mod/mod_authz_host.html.en b/docs/manual/mod/mod_authz_host.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_authz_host.html.en rename to docs/manual/mod/mod_authz_host.html.en diff --git a/trunk/docs/manual/mod/mod_authz_host.html.ja.euc-jp b/docs/manual/mod/mod_authz_host.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/mod_authz_host.html.ja.euc-jp rename to docs/manual/mod/mod_authz_host.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/mod_authz_host.html.ko.euc-kr b/docs/manual/mod/mod_authz_host.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mod/mod_authz_host.html.ko.euc-kr rename to docs/manual/mod/mod_authz_host.html.ko.euc-kr diff --git a/trunk/docs/manual/mod/mod_authz_host.xml b/docs/manual/mod/mod_authz_host.xml similarity index 100% rename from trunk/docs/manual/mod/mod_authz_host.xml rename to docs/manual/mod/mod_authz_host.xml diff --git a/trunk/docs/manual/mod/mod_authz_host.xml.ja b/docs/manual/mod/mod_authz_host.xml.ja similarity index 100% rename from trunk/docs/manual/mod/mod_authz_host.xml.ja rename to docs/manual/mod/mod_authz_host.xml.ja diff --git a/trunk/docs/manual/mod/mod_authz_host.xml.ko b/docs/manual/mod/mod_authz_host.xml.ko similarity index 100% rename from trunk/docs/manual/mod/mod_authz_host.xml.ko rename to docs/manual/mod/mod_authz_host.xml.ko diff --git a/trunk/docs/manual/mod/mod_authz_host.xml.meta b/docs/manual/mod/mod_authz_host.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_authz_host.xml.meta rename to docs/manual/mod/mod_authz_host.xml.meta diff --git a/trunk/docs/manual/mod/mod_authz_owner.html b/docs/manual/mod/mod_authz_owner.html similarity index 100% rename from trunk/docs/manual/mod/mod_authz_owner.html rename to docs/manual/mod/mod_authz_owner.html diff --git a/trunk/docs/manual/mod/mod_authz_owner.html.en b/docs/manual/mod/mod_authz_owner.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_authz_owner.html.en rename to docs/manual/mod/mod_authz_owner.html.en diff --git a/trunk/docs/manual/mod/mod_authz_owner.html.ja.euc-jp b/docs/manual/mod/mod_authz_owner.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/mod_authz_owner.html.ja.euc-jp rename to docs/manual/mod/mod_authz_owner.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/mod_authz_owner.html.ko.euc-kr b/docs/manual/mod/mod_authz_owner.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mod/mod_authz_owner.html.ko.euc-kr rename to docs/manual/mod/mod_authz_owner.html.ko.euc-kr diff --git a/trunk/docs/manual/mod/mod_authz_owner.xml b/docs/manual/mod/mod_authz_owner.xml similarity index 100% rename from trunk/docs/manual/mod/mod_authz_owner.xml rename to docs/manual/mod/mod_authz_owner.xml diff --git a/trunk/docs/manual/mod/mod_authz_owner.xml.ja b/docs/manual/mod/mod_authz_owner.xml.ja similarity index 100% rename from trunk/docs/manual/mod/mod_authz_owner.xml.ja rename to docs/manual/mod/mod_authz_owner.xml.ja diff --git a/trunk/docs/manual/mod/mod_authz_owner.xml.ko b/docs/manual/mod/mod_authz_owner.xml.ko similarity index 100% rename from trunk/docs/manual/mod/mod_authz_owner.xml.ko rename to docs/manual/mod/mod_authz_owner.xml.ko diff --git a/trunk/docs/manual/mod/mod_authz_owner.xml.meta b/docs/manual/mod/mod_authz_owner.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_authz_owner.xml.meta rename to docs/manual/mod/mod_authz_owner.xml.meta diff --git a/trunk/docs/manual/mod/mod_authz_user.html b/docs/manual/mod/mod_authz_user.html similarity index 100% rename from trunk/docs/manual/mod/mod_authz_user.html rename to docs/manual/mod/mod_authz_user.html diff --git a/trunk/docs/manual/mod/mod_authz_user.html.en b/docs/manual/mod/mod_authz_user.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_authz_user.html.en rename to docs/manual/mod/mod_authz_user.html.en diff --git a/trunk/docs/manual/mod/mod_authz_user.html.ja.euc-jp b/docs/manual/mod/mod_authz_user.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/mod_authz_user.html.ja.euc-jp rename to docs/manual/mod/mod_authz_user.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/mod_authz_user.html.ko.euc-kr b/docs/manual/mod/mod_authz_user.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mod/mod_authz_user.html.ko.euc-kr rename to docs/manual/mod/mod_authz_user.html.ko.euc-kr diff --git a/trunk/docs/manual/mod/mod_authz_user.xml b/docs/manual/mod/mod_authz_user.xml similarity index 100% rename from trunk/docs/manual/mod/mod_authz_user.xml rename to docs/manual/mod/mod_authz_user.xml diff --git a/trunk/docs/manual/mod/mod_authz_user.xml.ja b/docs/manual/mod/mod_authz_user.xml.ja similarity index 100% rename from trunk/docs/manual/mod/mod_authz_user.xml.ja rename to docs/manual/mod/mod_authz_user.xml.ja diff --git a/trunk/docs/manual/mod/mod_authz_user.xml.ko b/docs/manual/mod/mod_authz_user.xml.ko similarity index 100% rename from trunk/docs/manual/mod/mod_authz_user.xml.ko rename to docs/manual/mod/mod_authz_user.xml.ko diff --git a/trunk/docs/manual/mod/mod_authz_user.xml.meta b/docs/manual/mod/mod_authz_user.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_authz_user.xml.meta rename to docs/manual/mod/mod_authz_user.xml.meta diff --git a/trunk/docs/manual/mod/mod_autoindex.html b/docs/manual/mod/mod_autoindex.html similarity index 100% rename from trunk/docs/manual/mod/mod_autoindex.html rename to docs/manual/mod/mod_autoindex.html diff --git a/trunk/docs/manual/mod/mod_autoindex.html.en b/docs/manual/mod/mod_autoindex.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_autoindex.html.en rename to docs/manual/mod/mod_autoindex.html.en diff --git a/trunk/docs/manual/mod/mod_autoindex.html.ja.euc-jp b/docs/manual/mod/mod_autoindex.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/mod_autoindex.html.ja.euc-jp rename to docs/manual/mod/mod_autoindex.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/mod_autoindex.html.ko.euc-kr b/docs/manual/mod/mod_autoindex.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mod/mod_autoindex.html.ko.euc-kr rename to docs/manual/mod/mod_autoindex.html.ko.euc-kr diff --git a/trunk/docs/manual/mod/mod_autoindex.xml b/docs/manual/mod/mod_autoindex.xml similarity index 100% rename from trunk/docs/manual/mod/mod_autoindex.xml rename to docs/manual/mod/mod_autoindex.xml diff --git a/trunk/docs/manual/mod/mod_autoindex.xml.ja b/docs/manual/mod/mod_autoindex.xml.ja similarity index 100% rename from trunk/docs/manual/mod/mod_autoindex.xml.ja rename to docs/manual/mod/mod_autoindex.xml.ja diff --git a/trunk/docs/manual/mod/mod_autoindex.xml.ko b/docs/manual/mod/mod_autoindex.xml.ko similarity index 100% rename from trunk/docs/manual/mod/mod_autoindex.xml.ko rename to docs/manual/mod/mod_autoindex.xml.ko diff --git a/trunk/docs/manual/mod/mod_autoindex.xml.meta b/docs/manual/mod/mod_autoindex.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_autoindex.xml.meta rename to docs/manual/mod/mod_autoindex.xml.meta diff --git a/trunk/docs/manual/mod/mod_cache.html b/docs/manual/mod/mod_cache.html similarity index 100% rename from trunk/docs/manual/mod/mod_cache.html rename to docs/manual/mod/mod_cache.html diff --git a/trunk/docs/manual/mod/mod_cache.html.en b/docs/manual/mod/mod_cache.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_cache.html.en rename to docs/manual/mod/mod_cache.html.en diff --git a/trunk/docs/manual/mod/mod_cache.html.ja.euc-jp b/docs/manual/mod/mod_cache.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/mod_cache.html.ja.euc-jp rename to docs/manual/mod/mod_cache.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/mod_cache.html.ko.euc-kr b/docs/manual/mod/mod_cache.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mod/mod_cache.html.ko.euc-kr rename to docs/manual/mod/mod_cache.html.ko.euc-kr diff --git a/trunk/docs/manual/mod/mod_cache.xml b/docs/manual/mod/mod_cache.xml similarity index 100% rename from trunk/docs/manual/mod/mod_cache.xml rename to docs/manual/mod/mod_cache.xml diff --git a/trunk/docs/manual/mod/mod_cache.xml.ja b/docs/manual/mod/mod_cache.xml.ja similarity index 100% rename from trunk/docs/manual/mod/mod_cache.xml.ja rename to docs/manual/mod/mod_cache.xml.ja diff --git a/trunk/docs/manual/mod/mod_cache.xml.ko b/docs/manual/mod/mod_cache.xml.ko similarity index 100% rename from trunk/docs/manual/mod/mod_cache.xml.ko rename to docs/manual/mod/mod_cache.xml.ko diff --git a/trunk/docs/manual/mod/mod_cache.xml.meta b/docs/manual/mod/mod_cache.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_cache.xml.meta rename to docs/manual/mod/mod_cache.xml.meta diff --git a/trunk/docs/manual/mod/mod_cern_meta.html b/docs/manual/mod/mod_cern_meta.html similarity index 100% rename from trunk/docs/manual/mod/mod_cern_meta.html rename to docs/manual/mod/mod_cern_meta.html diff --git a/trunk/docs/manual/mod/mod_cern_meta.html.en b/docs/manual/mod/mod_cern_meta.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_cern_meta.html.en rename to docs/manual/mod/mod_cern_meta.html.en diff --git a/trunk/docs/manual/mod/mod_cern_meta.html.ko.euc-kr b/docs/manual/mod/mod_cern_meta.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mod/mod_cern_meta.html.ko.euc-kr rename to docs/manual/mod/mod_cern_meta.html.ko.euc-kr diff --git a/trunk/docs/manual/mod/mod_cern_meta.xml b/docs/manual/mod/mod_cern_meta.xml similarity index 100% rename from trunk/docs/manual/mod/mod_cern_meta.xml rename to docs/manual/mod/mod_cern_meta.xml diff --git a/trunk/docs/manual/mod/mod_cern_meta.xml.ko b/docs/manual/mod/mod_cern_meta.xml.ko similarity index 100% rename from trunk/docs/manual/mod/mod_cern_meta.xml.ko rename to docs/manual/mod/mod_cern_meta.xml.ko diff --git a/trunk/docs/manual/mod/mod_cern_meta.xml.meta b/docs/manual/mod/mod_cern_meta.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_cern_meta.xml.meta rename to docs/manual/mod/mod_cern_meta.xml.meta diff --git a/trunk/docs/manual/mod/mod_cgi.html b/docs/manual/mod/mod_cgi.html similarity index 100% rename from trunk/docs/manual/mod/mod_cgi.html rename to docs/manual/mod/mod_cgi.html diff --git a/trunk/docs/manual/mod/mod_cgi.html.en b/docs/manual/mod/mod_cgi.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_cgi.html.en rename to docs/manual/mod/mod_cgi.html.en diff --git a/trunk/docs/manual/mod/mod_cgi.html.ja.euc-jp b/docs/manual/mod/mod_cgi.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/mod_cgi.html.ja.euc-jp rename to docs/manual/mod/mod_cgi.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/mod_cgi.html.ko.euc-kr b/docs/manual/mod/mod_cgi.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mod/mod_cgi.html.ko.euc-kr rename to docs/manual/mod/mod_cgi.html.ko.euc-kr diff --git a/trunk/docs/manual/mod/mod_cgi.xml b/docs/manual/mod/mod_cgi.xml similarity index 100% rename from trunk/docs/manual/mod/mod_cgi.xml rename to docs/manual/mod/mod_cgi.xml diff --git a/trunk/docs/manual/mod/mod_cgi.xml.ja b/docs/manual/mod/mod_cgi.xml.ja similarity index 100% rename from trunk/docs/manual/mod/mod_cgi.xml.ja rename to docs/manual/mod/mod_cgi.xml.ja diff --git a/trunk/docs/manual/mod/mod_cgi.xml.ko b/docs/manual/mod/mod_cgi.xml.ko similarity index 100% rename from trunk/docs/manual/mod/mod_cgi.xml.ko rename to docs/manual/mod/mod_cgi.xml.ko diff --git a/trunk/docs/manual/mod/mod_cgi.xml.meta b/docs/manual/mod/mod_cgi.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_cgi.xml.meta rename to docs/manual/mod/mod_cgi.xml.meta diff --git a/trunk/docs/manual/mod/mod_cgid.html b/docs/manual/mod/mod_cgid.html similarity index 100% rename from trunk/docs/manual/mod/mod_cgid.html rename to docs/manual/mod/mod_cgid.html diff --git a/trunk/docs/manual/mod/mod_cgid.html.en b/docs/manual/mod/mod_cgid.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_cgid.html.en rename to docs/manual/mod/mod_cgid.html.en diff --git a/trunk/docs/manual/mod/mod_cgid.html.ja.euc-jp b/docs/manual/mod/mod_cgid.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/mod_cgid.html.ja.euc-jp rename to docs/manual/mod/mod_cgid.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/mod_cgid.html.ko.euc-kr b/docs/manual/mod/mod_cgid.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mod/mod_cgid.html.ko.euc-kr rename to docs/manual/mod/mod_cgid.html.ko.euc-kr diff --git a/trunk/docs/manual/mod/mod_cgid.xml b/docs/manual/mod/mod_cgid.xml similarity index 100% rename from trunk/docs/manual/mod/mod_cgid.xml rename to docs/manual/mod/mod_cgid.xml diff --git a/trunk/docs/manual/mod/mod_cgid.xml.ja b/docs/manual/mod/mod_cgid.xml.ja similarity index 100% rename from trunk/docs/manual/mod/mod_cgid.xml.ja rename to docs/manual/mod/mod_cgid.xml.ja diff --git a/trunk/docs/manual/mod/mod_cgid.xml.ko b/docs/manual/mod/mod_cgid.xml.ko similarity index 100% rename from trunk/docs/manual/mod/mod_cgid.xml.ko rename to docs/manual/mod/mod_cgid.xml.ko diff --git a/trunk/docs/manual/mod/mod_cgid.xml.meta b/docs/manual/mod/mod_cgid.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_cgid.xml.meta rename to docs/manual/mod/mod_cgid.xml.meta diff --git a/trunk/docs/manual/mod/mod_charset_lite.html b/docs/manual/mod/mod_charset_lite.html similarity index 100% rename from trunk/docs/manual/mod/mod_charset_lite.html rename to docs/manual/mod/mod_charset_lite.html diff --git a/trunk/docs/manual/mod/mod_charset_lite.html.en b/docs/manual/mod/mod_charset_lite.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_charset_lite.html.en rename to docs/manual/mod/mod_charset_lite.html.en diff --git a/trunk/docs/manual/mod/mod_charset_lite.html.ko.euc-kr b/docs/manual/mod/mod_charset_lite.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mod/mod_charset_lite.html.ko.euc-kr rename to docs/manual/mod/mod_charset_lite.html.ko.euc-kr diff --git a/trunk/docs/manual/mod/mod_charset_lite.xml b/docs/manual/mod/mod_charset_lite.xml similarity index 100% rename from trunk/docs/manual/mod/mod_charset_lite.xml rename to docs/manual/mod/mod_charset_lite.xml diff --git a/trunk/docs/manual/mod/mod_charset_lite.xml.ko b/docs/manual/mod/mod_charset_lite.xml.ko similarity index 100% rename from trunk/docs/manual/mod/mod_charset_lite.xml.ko rename to docs/manual/mod/mod_charset_lite.xml.ko diff --git a/trunk/docs/manual/mod/mod_charset_lite.xml.meta b/docs/manual/mod/mod_charset_lite.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_charset_lite.xml.meta rename to docs/manual/mod/mod_charset_lite.xml.meta diff --git a/trunk/docs/manual/mod/mod_dav.html b/docs/manual/mod/mod_dav.html similarity index 100% rename from trunk/docs/manual/mod/mod_dav.html rename to docs/manual/mod/mod_dav.html diff --git a/trunk/docs/manual/mod/mod_dav.html.en b/docs/manual/mod/mod_dav.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_dav.html.en rename to docs/manual/mod/mod_dav.html.en diff --git a/trunk/docs/manual/mod/mod_dav.html.ja.euc-jp b/docs/manual/mod/mod_dav.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/mod_dav.html.ja.euc-jp rename to docs/manual/mod/mod_dav.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/mod_dav.html.ko.euc-kr b/docs/manual/mod/mod_dav.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mod/mod_dav.html.ko.euc-kr rename to docs/manual/mod/mod_dav.html.ko.euc-kr diff --git a/trunk/docs/manual/mod/mod_dav.xml b/docs/manual/mod/mod_dav.xml similarity index 100% rename from trunk/docs/manual/mod/mod_dav.xml rename to docs/manual/mod/mod_dav.xml diff --git a/trunk/docs/manual/mod/mod_dav.xml.ja b/docs/manual/mod/mod_dav.xml.ja similarity index 100% rename from trunk/docs/manual/mod/mod_dav.xml.ja rename to docs/manual/mod/mod_dav.xml.ja diff --git a/trunk/docs/manual/mod/mod_dav.xml.ko b/docs/manual/mod/mod_dav.xml.ko similarity index 100% rename from trunk/docs/manual/mod/mod_dav.xml.ko rename to docs/manual/mod/mod_dav.xml.ko diff --git a/trunk/docs/manual/mod/mod_dav.xml.meta b/docs/manual/mod/mod_dav.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_dav.xml.meta rename to docs/manual/mod/mod_dav.xml.meta diff --git a/trunk/docs/manual/mod/mod_dav_fs.html b/docs/manual/mod/mod_dav_fs.html similarity index 100% rename from trunk/docs/manual/mod/mod_dav_fs.html rename to docs/manual/mod/mod_dav_fs.html diff --git a/trunk/docs/manual/mod/mod_dav_fs.html.en b/docs/manual/mod/mod_dav_fs.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_dav_fs.html.en rename to docs/manual/mod/mod_dav_fs.html.en diff --git a/trunk/docs/manual/mod/mod_dav_fs.html.ja.euc-jp b/docs/manual/mod/mod_dav_fs.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/mod_dav_fs.html.ja.euc-jp rename to docs/manual/mod/mod_dav_fs.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/mod_dav_fs.html.ko.euc-kr b/docs/manual/mod/mod_dav_fs.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mod/mod_dav_fs.html.ko.euc-kr rename to docs/manual/mod/mod_dav_fs.html.ko.euc-kr diff --git a/trunk/docs/manual/mod/mod_dav_fs.xml b/docs/manual/mod/mod_dav_fs.xml similarity index 100% rename from trunk/docs/manual/mod/mod_dav_fs.xml rename to docs/manual/mod/mod_dav_fs.xml diff --git a/trunk/docs/manual/mod/mod_dav_fs.xml.ja b/docs/manual/mod/mod_dav_fs.xml.ja similarity index 100% rename from trunk/docs/manual/mod/mod_dav_fs.xml.ja rename to docs/manual/mod/mod_dav_fs.xml.ja diff --git a/trunk/docs/manual/mod/mod_dav_fs.xml.ko b/docs/manual/mod/mod_dav_fs.xml.ko similarity index 100% rename from trunk/docs/manual/mod/mod_dav_fs.xml.ko rename to docs/manual/mod/mod_dav_fs.xml.ko diff --git a/trunk/docs/manual/mod/mod_dav_fs.xml.meta b/docs/manual/mod/mod_dav_fs.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_dav_fs.xml.meta rename to docs/manual/mod/mod_dav_fs.xml.meta diff --git a/trunk/docs/manual/mod/mod_dav_lock.html b/docs/manual/mod/mod_dav_lock.html similarity index 100% rename from trunk/docs/manual/mod/mod_dav_lock.html rename to docs/manual/mod/mod_dav_lock.html diff --git a/trunk/docs/manual/mod/mod_dav_lock.html.en b/docs/manual/mod/mod_dav_lock.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_dav_lock.html.en rename to docs/manual/mod/mod_dav_lock.html.en diff --git a/trunk/docs/manual/mod/mod_dav_lock.html.ja.euc-jp b/docs/manual/mod/mod_dav_lock.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/mod_dav_lock.html.ja.euc-jp rename to docs/manual/mod/mod_dav_lock.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/mod_dav_lock.xml b/docs/manual/mod/mod_dav_lock.xml similarity index 100% rename from trunk/docs/manual/mod/mod_dav_lock.xml rename to docs/manual/mod/mod_dav_lock.xml diff --git a/trunk/docs/manual/mod/mod_dav_lock.xml.ja b/docs/manual/mod/mod_dav_lock.xml.ja similarity index 100% rename from trunk/docs/manual/mod/mod_dav_lock.xml.ja rename to docs/manual/mod/mod_dav_lock.xml.ja diff --git a/trunk/docs/manual/mod/mod_dav_lock.xml.meta b/docs/manual/mod/mod_dav_lock.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_dav_lock.xml.meta rename to docs/manual/mod/mod_dav_lock.xml.meta diff --git a/trunk/docs/manual/mod/mod_dbd.html b/docs/manual/mod/mod_dbd.html similarity index 100% rename from trunk/docs/manual/mod/mod_dbd.html rename to docs/manual/mod/mod_dbd.html diff --git a/trunk/docs/manual/mod/mod_dbd.html.en b/docs/manual/mod/mod_dbd.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_dbd.html.en rename to docs/manual/mod/mod_dbd.html.en diff --git a/trunk/docs/manual/mod/mod_dbd.xml b/docs/manual/mod/mod_dbd.xml similarity index 100% rename from trunk/docs/manual/mod/mod_dbd.xml rename to docs/manual/mod/mod_dbd.xml diff --git a/trunk/docs/manual/mod/mod_dbd.xml.meta b/docs/manual/mod/mod_dbd.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_dbd.xml.meta rename to docs/manual/mod/mod_dbd.xml.meta diff --git a/trunk/docs/manual/mod/mod_deflate.html b/docs/manual/mod/mod_deflate.html similarity index 100% rename from trunk/docs/manual/mod/mod_deflate.html rename to docs/manual/mod/mod_deflate.html diff --git a/trunk/docs/manual/mod/mod_deflate.html.en b/docs/manual/mod/mod_deflate.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_deflate.html.en rename to docs/manual/mod/mod_deflate.html.en diff --git a/trunk/docs/manual/mod/mod_deflate.html.ja.euc-jp b/docs/manual/mod/mod_deflate.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/mod_deflate.html.ja.euc-jp rename to docs/manual/mod/mod_deflate.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/mod_deflate.html.ko.euc-kr b/docs/manual/mod/mod_deflate.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mod/mod_deflate.html.ko.euc-kr rename to docs/manual/mod/mod_deflate.html.ko.euc-kr diff --git a/trunk/docs/manual/mod/mod_deflate.xml b/docs/manual/mod/mod_deflate.xml similarity index 100% rename from trunk/docs/manual/mod/mod_deflate.xml rename to docs/manual/mod/mod_deflate.xml diff --git a/trunk/docs/manual/mod/mod_deflate.xml.ja b/docs/manual/mod/mod_deflate.xml.ja similarity index 100% rename from trunk/docs/manual/mod/mod_deflate.xml.ja rename to docs/manual/mod/mod_deflate.xml.ja diff --git a/trunk/docs/manual/mod/mod_deflate.xml.ko b/docs/manual/mod/mod_deflate.xml.ko similarity index 100% rename from trunk/docs/manual/mod/mod_deflate.xml.ko rename to docs/manual/mod/mod_deflate.xml.ko diff --git a/trunk/docs/manual/mod/mod_deflate.xml.meta b/docs/manual/mod/mod_deflate.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_deflate.xml.meta rename to docs/manual/mod/mod_deflate.xml.meta diff --git a/trunk/docs/manual/mod/mod_dir.html b/docs/manual/mod/mod_dir.html similarity index 100% rename from trunk/docs/manual/mod/mod_dir.html rename to docs/manual/mod/mod_dir.html diff --git a/trunk/docs/manual/mod/mod_dir.html.en b/docs/manual/mod/mod_dir.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_dir.html.en rename to docs/manual/mod/mod_dir.html.en diff --git a/trunk/docs/manual/mod/mod_dir.html.ja.euc-jp b/docs/manual/mod/mod_dir.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/mod_dir.html.ja.euc-jp rename to docs/manual/mod/mod_dir.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/mod_dir.html.ko.euc-kr b/docs/manual/mod/mod_dir.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mod/mod_dir.html.ko.euc-kr rename to docs/manual/mod/mod_dir.html.ko.euc-kr diff --git a/trunk/docs/manual/mod/mod_dir.xml b/docs/manual/mod/mod_dir.xml similarity index 100% rename from trunk/docs/manual/mod/mod_dir.xml rename to docs/manual/mod/mod_dir.xml diff --git a/trunk/docs/manual/mod/mod_dir.xml.ja b/docs/manual/mod/mod_dir.xml.ja similarity index 100% rename from trunk/docs/manual/mod/mod_dir.xml.ja rename to docs/manual/mod/mod_dir.xml.ja diff --git a/trunk/docs/manual/mod/mod_dir.xml.ko b/docs/manual/mod/mod_dir.xml.ko similarity index 100% rename from trunk/docs/manual/mod/mod_dir.xml.ko rename to docs/manual/mod/mod_dir.xml.ko diff --git a/trunk/docs/manual/mod/mod_dir.xml.meta b/docs/manual/mod/mod_dir.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_dir.xml.meta rename to docs/manual/mod/mod_dir.xml.meta diff --git a/trunk/docs/manual/mod/mod_disk_cache.html b/docs/manual/mod/mod_disk_cache.html similarity index 100% rename from trunk/docs/manual/mod/mod_disk_cache.html rename to docs/manual/mod/mod_disk_cache.html diff --git a/trunk/docs/manual/mod/mod_disk_cache.html.en b/docs/manual/mod/mod_disk_cache.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_disk_cache.html.en rename to docs/manual/mod/mod_disk_cache.html.en diff --git a/trunk/docs/manual/mod/mod_disk_cache.html.ja.euc-jp b/docs/manual/mod/mod_disk_cache.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/mod_disk_cache.html.ja.euc-jp rename to docs/manual/mod/mod_disk_cache.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/mod_disk_cache.html.ko.euc-kr b/docs/manual/mod/mod_disk_cache.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mod/mod_disk_cache.html.ko.euc-kr rename to docs/manual/mod/mod_disk_cache.html.ko.euc-kr diff --git a/trunk/docs/manual/mod/mod_disk_cache.xml b/docs/manual/mod/mod_disk_cache.xml similarity index 100% rename from trunk/docs/manual/mod/mod_disk_cache.xml rename to docs/manual/mod/mod_disk_cache.xml diff --git a/trunk/docs/manual/mod/mod_disk_cache.xml.ja b/docs/manual/mod/mod_disk_cache.xml.ja similarity index 100% rename from trunk/docs/manual/mod/mod_disk_cache.xml.ja rename to docs/manual/mod/mod_disk_cache.xml.ja diff --git a/trunk/docs/manual/mod/mod_disk_cache.xml.ko b/docs/manual/mod/mod_disk_cache.xml.ko similarity index 100% rename from trunk/docs/manual/mod/mod_disk_cache.xml.ko rename to docs/manual/mod/mod_disk_cache.xml.ko diff --git a/trunk/docs/manual/mod/mod_disk_cache.xml.meta b/docs/manual/mod/mod_disk_cache.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_disk_cache.xml.meta rename to docs/manual/mod/mod_disk_cache.xml.meta diff --git a/trunk/docs/manual/mod/mod_dumpio.html b/docs/manual/mod/mod_dumpio.html similarity index 100% rename from trunk/docs/manual/mod/mod_dumpio.html rename to docs/manual/mod/mod_dumpio.html diff --git a/trunk/docs/manual/mod/mod_dumpio.html.en b/docs/manual/mod/mod_dumpio.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_dumpio.html.en rename to docs/manual/mod/mod_dumpio.html.en diff --git a/trunk/docs/manual/mod/mod_dumpio.html.ja.euc-jp b/docs/manual/mod/mod_dumpio.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/mod_dumpio.html.ja.euc-jp rename to docs/manual/mod/mod_dumpio.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/mod_dumpio.xml b/docs/manual/mod/mod_dumpio.xml similarity index 100% rename from trunk/docs/manual/mod/mod_dumpio.xml rename to docs/manual/mod/mod_dumpio.xml diff --git a/trunk/docs/manual/mod/mod_dumpio.xml.ja b/docs/manual/mod/mod_dumpio.xml.ja similarity index 100% rename from trunk/docs/manual/mod/mod_dumpio.xml.ja rename to docs/manual/mod/mod_dumpio.xml.ja diff --git a/trunk/docs/manual/mod/mod_dumpio.xml.meta b/docs/manual/mod/mod_dumpio.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_dumpio.xml.meta rename to docs/manual/mod/mod_dumpio.xml.meta diff --git a/trunk/docs/manual/mod/mod_echo.html b/docs/manual/mod/mod_echo.html similarity index 100% rename from trunk/docs/manual/mod/mod_echo.html rename to docs/manual/mod/mod_echo.html diff --git a/trunk/docs/manual/mod/mod_echo.html.en b/docs/manual/mod/mod_echo.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_echo.html.en rename to docs/manual/mod/mod_echo.html.en diff --git a/trunk/docs/manual/mod/mod_echo.html.ja.euc-jp b/docs/manual/mod/mod_echo.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/mod_echo.html.ja.euc-jp rename to docs/manual/mod/mod_echo.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/mod_echo.html.ko.euc-kr b/docs/manual/mod/mod_echo.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mod/mod_echo.html.ko.euc-kr rename to docs/manual/mod/mod_echo.html.ko.euc-kr diff --git a/trunk/docs/manual/mod/mod_echo.xml b/docs/manual/mod/mod_echo.xml similarity index 100% rename from trunk/docs/manual/mod/mod_echo.xml rename to docs/manual/mod/mod_echo.xml diff --git a/trunk/docs/manual/mod/mod_echo.xml.ja b/docs/manual/mod/mod_echo.xml.ja similarity index 100% rename from trunk/docs/manual/mod/mod_echo.xml.ja rename to docs/manual/mod/mod_echo.xml.ja diff --git a/trunk/docs/manual/mod/mod_echo.xml.ko b/docs/manual/mod/mod_echo.xml.ko similarity index 100% rename from trunk/docs/manual/mod/mod_echo.xml.ko rename to docs/manual/mod/mod_echo.xml.ko diff --git a/trunk/docs/manual/mod/mod_echo.xml.meta b/docs/manual/mod/mod_echo.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_echo.xml.meta rename to docs/manual/mod/mod_echo.xml.meta diff --git a/trunk/docs/manual/mod/mod_env.html b/docs/manual/mod/mod_env.html similarity index 100% rename from trunk/docs/manual/mod/mod_env.html rename to docs/manual/mod/mod_env.html diff --git a/trunk/docs/manual/mod/mod_env.html.en b/docs/manual/mod/mod_env.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_env.html.en rename to docs/manual/mod/mod_env.html.en diff --git a/trunk/docs/manual/mod/mod_env.html.ja.euc-jp b/docs/manual/mod/mod_env.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/mod_env.html.ja.euc-jp rename to docs/manual/mod/mod_env.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/mod_env.html.ko.euc-kr b/docs/manual/mod/mod_env.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mod/mod_env.html.ko.euc-kr rename to docs/manual/mod/mod_env.html.ko.euc-kr diff --git a/trunk/docs/manual/mod/mod_env.xml b/docs/manual/mod/mod_env.xml similarity index 100% rename from trunk/docs/manual/mod/mod_env.xml rename to docs/manual/mod/mod_env.xml diff --git a/trunk/docs/manual/mod/mod_env.xml.ja b/docs/manual/mod/mod_env.xml.ja similarity index 100% rename from trunk/docs/manual/mod/mod_env.xml.ja rename to docs/manual/mod/mod_env.xml.ja diff --git a/trunk/docs/manual/mod/mod_env.xml.ko b/docs/manual/mod/mod_env.xml.ko similarity index 100% rename from trunk/docs/manual/mod/mod_env.xml.ko rename to docs/manual/mod/mod_env.xml.ko diff --git a/trunk/docs/manual/mod/mod_env.xml.meta b/docs/manual/mod/mod_env.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_env.xml.meta rename to docs/manual/mod/mod_env.xml.meta diff --git a/trunk/docs/manual/mod/mod_example.html b/docs/manual/mod/mod_example.html similarity index 100% rename from trunk/docs/manual/mod/mod_example.html rename to docs/manual/mod/mod_example.html diff --git a/trunk/docs/manual/mod/mod_example.html.en b/docs/manual/mod/mod_example.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_example.html.en rename to docs/manual/mod/mod_example.html.en diff --git a/trunk/docs/manual/mod/mod_example.html.ko.euc-kr b/docs/manual/mod/mod_example.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mod/mod_example.html.ko.euc-kr rename to docs/manual/mod/mod_example.html.ko.euc-kr diff --git a/trunk/docs/manual/mod/mod_example.xml b/docs/manual/mod/mod_example.xml similarity index 100% rename from trunk/docs/manual/mod/mod_example.xml rename to docs/manual/mod/mod_example.xml diff --git a/trunk/docs/manual/mod/mod_example.xml.ko b/docs/manual/mod/mod_example.xml.ko similarity index 100% rename from trunk/docs/manual/mod/mod_example.xml.ko rename to docs/manual/mod/mod_example.xml.ko diff --git a/trunk/docs/manual/mod/mod_example.xml.meta b/docs/manual/mod/mod_example.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_example.xml.meta rename to docs/manual/mod/mod_example.xml.meta diff --git a/trunk/docs/manual/mod/mod_expires.html b/docs/manual/mod/mod_expires.html similarity index 100% rename from trunk/docs/manual/mod/mod_expires.html rename to docs/manual/mod/mod_expires.html diff --git a/trunk/docs/manual/mod/mod_expires.html.en b/docs/manual/mod/mod_expires.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_expires.html.en rename to docs/manual/mod/mod_expires.html.en diff --git a/trunk/docs/manual/mod/mod_expires.html.ja.euc-jp b/docs/manual/mod/mod_expires.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/mod_expires.html.ja.euc-jp rename to docs/manual/mod/mod_expires.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/mod_expires.html.ko.euc-kr b/docs/manual/mod/mod_expires.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mod/mod_expires.html.ko.euc-kr rename to docs/manual/mod/mod_expires.html.ko.euc-kr diff --git a/trunk/docs/manual/mod/mod_expires.xml b/docs/manual/mod/mod_expires.xml similarity index 100% rename from trunk/docs/manual/mod/mod_expires.xml rename to docs/manual/mod/mod_expires.xml diff --git a/trunk/docs/manual/mod/mod_expires.xml.ja b/docs/manual/mod/mod_expires.xml.ja similarity index 100% rename from trunk/docs/manual/mod/mod_expires.xml.ja rename to docs/manual/mod/mod_expires.xml.ja diff --git a/trunk/docs/manual/mod/mod_expires.xml.ko b/docs/manual/mod/mod_expires.xml.ko similarity index 100% rename from trunk/docs/manual/mod/mod_expires.xml.ko rename to docs/manual/mod/mod_expires.xml.ko diff --git a/trunk/docs/manual/mod/mod_expires.xml.meta b/docs/manual/mod/mod_expires.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_expires.xml.meta rename to docs/manual/mod/mod_expires.xml.meta diff --git a/trunk/docs/manual/mod/mod_ext_filter.html b/docs/manual/mod/mod_ext_filter.html similarity index 100% rename from trunk/docs/manual/mod/mod_ext_filter.html rename to docs/manual/mod/mod_ext_filter.html diff --git a/trunk/docs/manual/mod/mod_ext_filter.html.en b/docs/manual/mod/mod_ext_filter.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_ext_filter.html.en rename to docs/manual/mod/mod_ext_filter.html.en diff --git a/trunk/docs/manual/mod/mod_ext_filter.html.ja.euc-jp b/docs/manual/mod/mod_ext_filter.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/mod_ext_filter.html.ja.euc-jp rename to docs/manual/mod/mod_ext_filter.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/mod_ext_filter.html.ko.euc-kr b/docs/manual/mod/mod_ext_filter.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mod/mod_ext_filter.html.ko.euc-kr rename to docs/manual/mod/mod_ext_filter.html.ko.euc-kr diff --git a/trunk/docs/manual/mod/mod_ext_filter.xml b/docs/manual/mod/mod_ext_filter.xml similarity index 100% rename from trunk/docs/manual/mod/mod_ext_filter.xml rename to docs/manual/mod/mod_ext_filter.xml diff --git a/trunk/docs/manual/mod/mod_ext_filter.xml.ja b/docs/manual/mod/mod_ext_filter.xml.ja similarity index 100% rename from trunk/docs/manual/mod/mod_ext_filter.xml.ja rename to docs/manual/mod/mod_ext_filter.xml.ja diff --git a/trunk/docs/manual/mod/mod_ext_filter.xml.ko b/docs/manual/mod/mod_ext_filter.xml.ko similarity index 100% rename from trunk/docs/manual/mod/mod_ext_filter.xml.ko rename to docs/manual/mod/mod_ext_filter.xml.ko diff --git a/trunk/docs/manual/mod/mod_ext_filter.xml.meta b/docs/manual/mod/mod_ext_filter.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_ext_filter.xml.meta rename to docs/manual/mod/mod_ext_filter.xml.meta diff --git a/trunk/docs/manual/mod/mod_file_cache.html b/docs/manual/mod/mod_file_cache.html similarity index 100% rename from trunk/docs/manual/mod/mod_file_cache.html rename to docs/manual/mod/mod_file_cache.html diff --git a/trunk/docs/manual/mod/mod_file_cache.html.en b/docs/manual/mod/mod_file_cache.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_file_cache.html.en rename to docs/manual/mod/mod_file_cache.html.en diff --git a/trunk/docs/manual/mod/mod_file_cache.html.ko.euc-kr b/docs/manual/mod/mod_file_cache.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mod/mod_file_cache.html.ko.euc-kr rename to docs/manual/mod/mod_file_cache.html.ko.euc-kr diff --git a/trunk/docs/manual/mod/mod_file_cache.xml b/docs/manual/mod/mod_file_cache.xml similarity index 100% rename from trunk/docs/manual/mod/mod_file_cache.xml rename to docs/manual/mod/mod_file_cache.xml diff --git a/trunk/docs/manual/mod/mod_file_cache.xml.ko b/docs/manual/mod/mod_file_cache.xml.ko similarity index 100% rename from trunk/docs/manual/mod/mod_file_cache.xml.ko rename to docs/manual/mod/mod_file_cache.xml.ko diff --git a/trunk/docs/manual/mod/mod_file_cache.xml.meta b/docs/manual/mod/mod_file_cache.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_file_cache.xml.meta rename to docs/manual/mod/mod_file_cache.xml.meta diff --git a/trunk/docs/manual/mod/mod_filter.html b/docs/manual/mod/mod_filter.html similarity index 100% rename from trunk/docs/manual/mod/mod_filter.html rename to docs/manual/mod/mod_filter.html diff --git a/trunk/docs/manual/mod/mod_filter.html.en b/docs/manual/mod/mod_filter.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_filter.html.en rename to docs/manual/mod/mod_filter.html.en diff --git a/trunk/docs/manual/mod/mod_filter.xml b/docs/manual/mod/mod_filter.xml similarity index 100% rename from trunk/docs/manual/mod/mod_filter.xml rename to docs/manual/mod/mod_filter.xml diff --git a/trunk/docs/manual/mod/mod_filter.xml.meta b/docs/manual/mod/mod_filter.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_filter.xml.meta rename to docs/manual/mod/mod_filter.xml.meta diff --git a/trunk/docs/manual/mod/mod_headers.html b/docs/manual/mod/mod_headers.html similarity index 100% rename from trunk/docs/manual/mod/mod_headers.html rename to docs/manual/mod/mod_headers.html diff --git a/trunk/docs/manual/mod/mod_headers.html.en b/docs/manual/mod/mod_headers.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_headers.html.en rename to docs/manual/mod/mod_headers.html.en diff --git a/trunk/docs/manual/mod/mod_headers.html.ja.euc-jp b/docs/manual/mod/mod_headers.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/mod_headers.html.ja.euc-jp rename to docs/manual/mod/mod_headers.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/mod_headers.html.ko.euc-kr b/docs/manual/mod/mod_headers.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mod/mod_headers.html.ko.euc-kr rename to docs/manual/mod/mod_headers.html.ko.euc-kr diff --git a/trunk/docs/manual/mod/mod_headers.xml b/docs/manual/mod/mod_headers.xml similarity index 100% rename from trunk/docs/manual/mod/mod_headers.xml rename to docs/manual/mod/mod_headers.xml diff --git a/trunk/docs/manual/mod/mod_headers.xml.ja b/docs/manual/mod/mod_headers.xml.ja similarity index 100% rename from trunk/docs/manual/mod/mod_headers.xml.ja rename to docs/manual/mod/mod_headers.xml.ja diff --git a/trunk/docs/manual/mod/mod_headers.xml.ko b/docs/manual/mod/mod_headers.xml.ko similarity index 100% rename from trunk/docs/manual/mod/mod_headers.xml.ko rename to docs/manual/mod/mod_headers.xml.ko diff --git a/trunk/docs/manual/mod/mod_headers.xml.meta b/docs/manual/mod/mod_headers.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_headers.xml.meta rename to docs/manual/mod/mod_headers.xml.meta diff --git a/trunk/docs/manual/mod/mod_ident.html b/docs/manual/mod/mod_ident.html similarity index 100% rename from trunk/docs/manual/mod/mod_ident.html rename to docs/manual/mod/mod_ident.html diff --git a/trunk/docs/manual/mod/mod_ident.html.en b/docs/manual/mod/mod_ident.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_ident.html.en rename to docs/manual/mod/mod_ident.html.en diff --git a/trunk/docs/manual/mod/mod_ident.html.ko.euc-kr b/docs/manual/mod/mod_ident.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mod/mod_ident.html.ko.euc-kr rename to docs/manual/mod/mod_ident.html.ko.euc-kr diff --git a/trunk/docs/manual/mod/mod_ident.xml b/docs/manual/mod/mod_ident.xml similarity index 100% rename from trunk/docs/manual/mod/mod_ident.xml rename to docs/manual/mod/mod_ident.xml diff --git a/trunk/docs/manual/mod/mod_ident.xml.ko b/docs/manual/mod/mod_ident.xml.ko similarity index 100% rename from trunk/docs/manual/mod/mod_ident.xml.ko rename to docs/manual/mod/mod_ident.xml.ko diff --git a/trunk/docs/manual/mod/mod_ident.xml.meta b/docs/manual/mod/mod_ident.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_ident.xml.meta rename to docs/manual/mod/mod_ident.xml.meta diff --git a/trunk/docs/manual/mod/mod_imagemap.html b/docs/manual/mod/mod_imagemap.html similarity index 100% rename from trunk/docs/manual/mod/mod_imagemap.html rename to docs/manual/mod/mod_imagemap.html diff --git a/trunk/docs/manual/mod/mod_imagemap.html.en b/docs/manual/mod/mod_imagemap.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_imagemap.html.en rename to docs/manual/mod/mod_imagemap.html.en diff --git a/trunk/docs/manual/mod/mod_imagemap.html.ko.euc-kr b/docs/manual/mod/mod_imagemap.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mod/mod_imagemap.html.ko.euc-kr rename to docs/manual/mod/mod_imagemap.html.ko.euc-kr diff --git a/trunk/docs/manual/mod/mod_imagemap.xml b/docs/manual/mod/mod_imagemap.xml similarity index 100% rename from trunk/docs/manual/mod/mod_imagemap.xml rename to docs/manual/mod/mod_imagemap.xml diff --git a/trunk/docs/manual/mod/mod_imagemap.xml.ko b/docs/manual/mod/mod_imagemap.xml.ko similarity index 100% rename from trunk/docs/manual/mod/mod_imagemap.xml.ko rename to docs/manual/mod/mod_imagemap.xml.ko diff --git a/trunk/docs/manual/mod/mod_imagemap.xml.meta b/docs/manual/mod/mod_imagemap.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_imagemap.xml.meta rename to docs/manual/mod/mod_imagemap.xml.meta diff --git a/trunk/docs/manual/mod/mod_include.html b/docs/manual/mod/mod_include.html similarity index 100% rename from trunk/docs/manual/mod/mod_include.html rename to docs/manual/mod/mod_include.html diff --git a/trunk/docs/manual/mod/mod_include.html.en b/docs/manual/mod/mod_include.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_include.html.en rename to docs/manual/mod/mod_include.html.en diff --git a/trunk/docs/manual/mod/mod_include.html.ja.euc-jp b/docs/manual/mod/mod_include.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/mod_include.html.ja.euc-jp rename to docs/manual/mod/mod_include.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/mod_include.xml b/docs/manual/mod/mod_include.xml similarity index 100% rename from trunk/docs/manual/mod/mod_include.xml rename to docs/manual/mod/mod_include.xml diff --git a/trunk/docs/manual/mod/mod_include.xml.ja b/docs/manual/mod/mod_include.xml.ja similarity index 100% rename from trunk/docs/manual/mod/mod_include.xml.ja rename to docs/manual/mod/mod_include.xml.ja diff --git a/trunk/docs/manual/mod/mod_include.xml.meta b/docs/manual/mod/mod_include.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_include.xml.meta rename to docs/manual/mod/mod_include.xml.meta diff --git a/trunk/docs/manual/mod/mod_info.html b/docs/manual/mod/mod_info.html similarity index 100% rename from trunk/docs/manual/mod/mod_info.html rename to docs/manual/mod/mod_info.html diff --git a/trunk/docs/manual/mod/mod_info.html.en b/docs/manual/mod/mod_info.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_info.html.en rename to docs/manual/mod/mod_info.html.en diff --git a/trunk/docs/manual/mod/mod_info.html.ja.euc-jp b/docs/manual/mod/mod_info.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/mod_info.html.ja.euc-jp rename to docs/manual/mod/mod_info.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/mod_info.html.ko.euc-kr b/docs/manual/mod/mod_info.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mod/mod_info.html.ko.euc-kr rename to docs/manual/mod/mod_info.html.ko.euc-kr diff --git a/trunk/docs/manual/mod/mod_info.xml b/docs/manual/mod/mod_info.xml similarity index 100% rename from trunk/docs/manual/mod/mod_info.xml rename to docs/manual/mod/mod_info.xml diff --git a/trunk/docs/manual/mod/mod_info.xml.ja b/docs/manual/mod/mod_info.xml.ja similarity index 100% rename from trunk/docs/manual/mod/mod_info.xml.ja rename to docs/manual/mod/mod_info.xml.ja diff --git a/trunk/docs/manual/mod/mod_info.xml.ko b/docs/manual/mod/mod_info.xml.ko similarity index 100% rename from trunk/docs/manual/mod/mod_info.xml.ko rename to docs/manual/mod/mod_info.xml.ko diff --git a/trunk/docs/manual/mod/mod_info.xml.meta b/docs/manual/mod/mod_info.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_info.xml.meta rename to docs/manual/mod/mod_info.xml.meta diff --git a/trunk/docs/manual/mod/mod_isapi.html b/docs/manual/mod/mod_isapi.html similarity index 100% rename from trunk/docs/manual/mod/mod_isapi.html rename to docs/manual/mod/mod_isapi.html diff --git a/trunk/docs/manual/mod/mod_isapi.html.en b/docs/manual/mod/mod_isapi.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_isapi.html.en rename to docs/manual/mod/mod_isapi.html.en diff --git a/trunk/docs/manual/mod/mod_isapi.html.ko.euc-kr b/docs/manual/mod/mod_isapi.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mod/mod_isapi.html.ko.euc-kr rename to docs/manual/mod/mod_isapi.html.ko.euc-kr diff --git a/trunk/docs/manual/mod/mod_isapi.xml b/docs/manual/mod/mod_isapi.xml similarity index 100% rename from trunk/docs/manual/mod/mod_isapi.xml rename to docs/manual/mod/mod_isapi.xml diff --git a/trunk/docs/manual/mod/mod_isapi.xml.ko b/docs/manual/mod/mod_isapi.xml.ko similarity index 100% rename from trunk/docs/manual/mod/mod_isapi.xml.ko rename to docs/manual/mod/mod_isapi.xml.ko diff --git a/trunk/docs/manual/mod/mod_isapi.xml.meta b/docs/manual/mod/mod_isapi.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_isapi.xml.meta rename to docs/manual/mod/mod_isapi.xml.meta diff --git a/trunk/docs/manual/mod/mod_ldap.html b/docs/manual/mod/mod_ldap.html similarity index 100% rename from trunk/docs/manual/mod/mod_ldap.html rename to docs/manual/mod/mod_ldap.html diff --git a/trunk/docs/manual/mod/mod_ldap.html.en b/docs/manual/mod/mod_ldap.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_ldap.html.en rename to docs/manual/mod/mod_ldap.html.en diff --git a/trunk/docs/manual/mod/mod_ldap.xml b/docs/manual/mod/mod_ldap.xml similarity index 100% rename from trunk/docs/manual/mod/mod_ldap.xml rename to docs/manual/mod/mod_ldap.xml diff --git a/trunk/docs/manual/mod/mod_ldap.xml.meta b/docs/manual/mod/mod_ldap.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_ldap.xml.meta rename to docs/manual/mod/mod_ldap.xml.meta diff --git a/trunk/docs/manual/mod/mod_log_config.html b/docs/manual/mod/mod_log_config.html similarity index 100% rename from trunk/docs/manual/mod/mod_log_config.html rename to docs/manual/mod/mod_log_config.html diff --git a/trunk/docs/manual/mod/mod_log_config.html.en b/docs/manual/mod/mod_log_config.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_log_config.html.en rename to docs/manual/mod/mod_log_config.html.en diff --git a/trunk/docs/manual/mod/mod_log_config.html.ja.euc-jp b/docs/manual/mod/mod_log_config.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/mod_log_config.html.ja.euc-jp rename to docs/manual/mod/mod_log_config.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/mod_log_config.html.ko.euc-kr b/docs/manual/mod/mod_log_config.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mod/mod_log_config.html.ko.euc-kr rename to docs/manual/mod/mod_log_config.html.ko.euc-kr diff --git a/trunk/docs/manual/mod/mod_log_config.xml b/docs/manual/mod/mod_log_config.xml similarity index 100% rename from trunk/docs/manual/mod/mod_log_config.xml rename to docs/manual/mod/mod_log_config.xml diff --git a/trunk/docs/manual/mod/mod_log_config.xml.ja b/docs/manual/mod/mod_log_config.xml.ja similarity index 100% rename from trunk/docs/manual/mod/mod_log_config.xml.ja rename to docs/manual/mod/mod_log_config.xml.ja diff --git a/trunk/docs/manual/mod/mod_log_config.xml.ko b/docs/manual/mod/mod_log_config.xml.ko similarity index 100% rename from trunk/docs/manual/mod/mod_log_config.xml.ko rename to docs/manual/mod/mod_log_config.xml.ko diff --git a/trunk/docs/manual/mod/mod_log_config.xml.meta b/docs/manual/mod/mod_log_config.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_log_config.xml.meta rename to docs/manual/mod/mod_log_config.xml.meta diff --git a/trunk/docs/manual/mod/mod_log_forensic.html b/docs/manual/mod/mod_log_forensic.html similarity index 100% rename from trunk/docs/manual/mod/mod_log_forensic.html rename to docs/manual/mod/mod_log_forensic.html diff --git a/trunk/docs/manual/mod/mod_log_forensic.html.en b/docs/manual/mod/mod_log_forensic.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_log_forensic.html.en rename to docs/manual/mod/mod_log_forensic.html.en diff --git a/trunk/docs/manual/mod/mod_log_forensic.html.ja.euc-jp b/docs/manual/mod/mod_log_forensic.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/mod_log_forensic.html.ja.euc-jp rename to docs/manual/mod/mod_log_forensic.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/mod_log_forensic.xml b/docs/manual/mod/mod_log_forensic.xml similarity index 100% rename from trunk/docs/manual/mod/mod_log_forensic.xml rename to docs/manual/mod/mod_log_forensic.xml diff --git a/trunk/docs/manual/mod/mod_log_forensic.xml.ja b/docs/manual/mod/mod_log_forensic.xml.ja similarity index 100% rename from trunk/docs/manual/mod/mod_log_forensic.xml.ja rename to docs/manual/mod/mod_log_forensic.xml.ja diff --git a/trunk/docs/manual/mod/mod_log_forensic.xml.meta b/docs/manual/mod/mod_log_forensic.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_log_forensic.xml.meta rename to docs/manual/mod/mod_log_forensic.xml.meta diff --git a/trunk/docs/manual/mod/mod_logio.html b/docs/manual/mod/mod_logio.html similarity index 100% rename from trunk/docs/manual/mod/mod_logio.html rename to docs/manual/mod/mod_logio.html diff --git a/trunk/docs/manual/mod/mod_logio.html.en b/docs/manual/mod/mod_logio.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_logio.html.en rename to docs/manual/mod/mod_logio.html.en diff --git a/trunk/docs/manual/mod/mod_logio.html.ja.euc-jp b/docs/manual/mod/mod_logio.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/mod_logio.html.ja.euc-jp rename to docs/manual/mod/mod_logio.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/mod_logio.html.ko.euc-kr b/docs/manual/mod/mod_logio.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mod/mod_logio.html.ko.euc-kr rename to docs/manual/mod/mod_logio.html.ko.euc-kr diff --git a/trunk/docs/manual/mod/mod_logio.xml b/docs/manual/mod/mod_logio.xml similarity index 100% rename from trunk/docs/manual/mod/mod_logio.xml rename to docs/manual/mod/mod_logio.xml diff --git a/trunk/docs/manual/mod/mod_logio.xml.ja b/docs/manual/mod/mod_logio.xml.ja similarity index 100% rename from trunk/docs/manual/mod/mod_logio.xml.ja rename to docs/manual/mod/mod_logio.xml.ja diff --git a/trunk/docs/manual/mod/mod_logio.xml.ko b/docs/manual/mod/mod_logio.xml.ko similarity index 100% rename from trunk/docs/manual/mod/mod_logio.xml.ko rename to docs/manual/mod/mod_logio.xml.ko diff --git a/trunk/docs/manual/mod/mod_logio.xml.meta b/docs/manual/mod/mod_logio.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_logio.xml.meta rename to docs/manual/mod/mod_logio.xml.meta diff --git a/trunk/docs/manual/mod/mod_mem_cache.html b/docs/manual/mod/mod_mem_cache.html similarity index 100% rename from trunk/docs/manual/mod/mod_mem_cache.html rename to docs/manual/mod/mod_mem_cache.html diff --git a/trunk/docs/manual/mod/mod_mem_cache.html.en b/docs/manual/mod/mod_mem_cache.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_mem_cache.html.en rename to docs/manual/mod/mod_mem_cache.html.en diff --git a/trunk/docs/manual/mod/mod_mem_cache.html.ja.euc-jp b/docs/manual/mod/mod_mem_cache.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/mod_mem_cache.html.ja.euc-jp rename to docs/manual/mod/mod_mem_cache.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/mod_mem_cache.html.ko.euc-kr b/docs/manual/mod/mod_mem_cache.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mod/mod_mem_cache.html.ko.euc-kr rename to docs/manual/mod/mod_mem_cache.html.ko.euc-kr diff --git a/trunk/docs/manual/mod/mod_mem_cache.xml b/docs/manual/mod/mod_mem_cache.xml similarity index 100% rename from trunk/docs/manual/mod/mod_mem_cache.xml rename to docs/manual/mod/mod_mem_cache.xml diff --git a/trunk/docs/manual/mod/mod_mem_cache.xml.ja b/docs/manual/mod/mod_mem_cache.xml.ja similarity index 100% rename from trunk/docs/manual/mod/mod_mem_cache.xml.ja rename to docs/manual/mod/mod_mem_cache.xml.ja diff --git a/trunk/docs/manual/mod/mod_mem_cache.xml.ko b/docs/manual/mod/mod_mem_cache.xml.ko similarity index 100% rename from trunk/docs/manual/mod/mod_mem_cache.xml.ko rename to docs/manual/mod/mod_mem_cache.xml.ko diff --git a/trunk/docs/manual/mod/mod_mem_cache.xml.meta b/docs/manual/mod/mod_mem_cache.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_mem_cache.xml.meta rename to docs/manual/mod/mod_mem_cache.xml.meta diff --git a/trunk/docs/manual/mod/mod_mime.html b/docs/manual/mod/mod_mime.html similarity index 100% rename from trunk/docs/manual/mod/mod_mime.html rename to docs/manual/mod/mod_mime.html diff --git a/trunk/docs/manual/mod/mod_mime.html.en b/docs/manual/mod/mod_mime.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_mime.html.en rename to docs/manual/mod/mod_mime.html.en diff --git a/trunk/docs/manual/mod/mod_mime.html.ja.euc-jp b/docs/manual/mod/mod_mime.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/mod_mime.html.ja.euc-jp rename to docs/manual/mod/mod_mime.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/mod_mime.xml b/docs/manual/mod/mod_mime.xml similarity index 100% rename from trunk/docs/manual/mod/mod_mime.xml rename to docs/manual/mod/mod_mime.xml diff --git a/trunk/docs/manual/mod/mod_mime.xml.ja b/docs/manual/mod/mod_mime.xml.ja similarity index 100% rename from trunk/docs/manual/mod/mod_mime.xml.ja rename to docs/manual/mod/mod_mime.xml.ja diff --git a/trunk/docs/manual/mod/mod_mime.xml.meta b/docs/manual/mod/mod_mime.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_mime.xml.meta rename to docs/manual/mod/mod_mime.xml.meta diff --git a/trunk/docs/manual/mod/mod_mime_magic.html b/docs/manual/mod/mod_mime_magic.html similarity index 100% rename from trunk/docs/manual/mod/mod_mime_magic.html rename to docs/manual/mod/mod_mime_magic.html diff --git a/trunk/docs/manual/mod/mod_mime_magic.html.en b/docs/manual/mod/mod_mime_magic.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_mime_magic.html.en rename to docs/manual/mod/mod_mime_magic.html.en diff --git a/trunk/docs/manual/mod/mod_mime_magic.xml b/docs/manual/mod/mod_mime_magic.xml similarity index 100% rename from trunk/docs/manual/mod/mod_mime_magic.xml rename to docs/manual/mod/mod_mime_magic.xml diff --git a/trunk/docs/manual/mod/mod_mime_magic.xml.meta b/docs/manual/mod/mod_mime_magic.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_mime_magic.xml.meta rename to docs/manual/mod/mod_mime_magic.xml.meta diff --git a/trunk/docs/manual/mod/mod_negotiation.html b/docs/manual/mod/mod_negotiation.html similarity index 100% rename from trunk/docs/manual/mod/mod_negotiation.html rename to docs/manual/mod/mod_negotiation.html diff --git a/trunk/docs/manual/mod/mod_negotiation.html.en b/docs/manual/mod/mod_negotiation.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_negotiation.html.en rename to docs/manual/mod/mod_negotiation.html.en diff --git a/trunk/docs/manual/mod/mod_negotiation.html.ja.euc-jp b/docs/manual/mod/mod_negotiation.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/mod_negotiation.html.ja.euc-jp rename to docs/manual/mod/mod_negotiation.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/mod_negotiation.xml b/docs/manual/mod/mod_negotiation.xml similarity index 100% rename from trunk/docs/manual/mod/mod_negotiation.xml rename to docs/manual/mod/mod_negotiation.xml diff --git a/trunk/docs/manual/mod/mod_negotiation.xml.ja b/docs/manual/mod/mod_negotiation.xml.ja similarity index 100% rename from trunk/docs/manual/mod/mod_negotiation.xml.ja rename to docs/manual/mod/mod_negotiation.xml.ja diff --git a/trunk/docs/manual/mod/mod_negotiation.xml.meta b/docs/manual/mod/mod_negotiation.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_negotiation.xml.meta rename to docs/manual/mod/mod_negotiation.xml.meta diff --git a/trunk/docs/manual/mod/mod_nw_ssl.html b/docs/manual/mod/mod_nw_ssl.html similarity index 100% rename from trunk/docs/manual/mod/mod_nw_ssl.html rename to docs/manual/mod/mod_nw_ssl.html diff --git a/trunk/docs/manual/mod/mod_nw_ssl.html.en b/docs/manual/mod/mod_nw_ssl.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_nw_ssl.html.en rename to docs/manual/mod/mod_nw_ssl.html.en diff --git a/trunk/docs/manual/mod/mod_nw_ssl.xml b/docs/manual/mod/mod_nw_ssl.xml similarity index 100% rename from trunk/docs/manual/mod/mod_nw_ssl.xml rename to docs/manual/mod/mod_nw_ssl.xml diff --git a/trunk/docs/manual/mod/mod_nw_ssl.xml.meta b/docs/manual/mod/mod_nw_ssl.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_nw_ssl.xml.meta rename to docs/manual/mod/mod_nw_ssl.xml.meta diff --git a/trunk/docs/manual/mod/mod_proxy.html b/docs/manual/mod/mod_proxy.html similarity index 100% rename from trunk/docs/manual/mod/mod_proxy.html rename to docs/manual/mod/mod_proxy.html diff --git a/trunk/docs/manual/mod/mod_proxy.html.en b/docs/manual/mod/mod_proxy.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_proxy.html.en rename to docs/manual/mod/mod_proxy.html.en diff --git a/trunk/docs/manual/mod/mod_proxy.html.ja.euc-jp b/docs/manual/mod/mod_proxy.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/mod_proxy.html.ja.euc-jp rename to docs/manual/mod/mod_proxy.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/mod_proxy.xml b/docs/manual/mod/mod_proxy.xml similarity index 100% rename from trunk/docs/manual/mod/mod_proxy.xml rename to docs/manual/mod/mod_proxy.xml diff --git a/trunk/docs/manual/mod/mod_proxy.xml.ja b/docs/manual/mod/mod_proxy.xml.ja similarity index 100% rename from trunk/docs/manual/mod/mod_proxy.xml.ja rename to docs/manual/mod/mod_proxy.xml.ja diff --git a/trunk/docs/manual/mod/mod_proxy.xml.meta b/docs/manual/mod/mod_proxy.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_proxy.xml.meta rename to docs/manual/mod/mod_proxy.xml.meta diff --git a/trunk/docs/manual/mod/mod_proxy_ajp.html b/docs/manual/mod/mod_proxy_ajp.html similarity index 100% rename from trunk/docs/manual/mod/mod_proxy_ajp.html rename to docs/manual/mod/mod_proxy_ajp.html diff --git a/trunk/docs/manual/mod/mod_proxy_ajp.html.en b/docs/manual/mod/mod_proxy_ajp.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_proxy_ajp.html.en rename to docs/manual/mod/mod_proxy_ajp.html.en diff --git a/trunk/docs/manual/mod/mod_proxy_ajp.html.ja.euc-jp b/docs/manual/mod/mod_proxy_ajp.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/mod_proxy_ajp.html.ja.euc-jp rename to docs/manual/mod/mod_proxy_ajp.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/mod_proxy_ajp.xml b/docs/manual/mod/mod_proxy_ajp.xml similarity index 100% rename from trunk/docs/manual/mod/mod_proxy_ajp.xml rename to docs/manual/mod/mod_proxy_ajp.xml diff --git a/trunk/docs/manual/mod/mod_proxy_ajp.xml.ja b/docs/manual/mod/mod_proxy_ajp.xml.ja similarity index 100% rename from trunk/docs/manual/mod/mod_proxy_ajp.xml.ja rename to docs/manual/mod/mod_proxy_ajp.xml.ja diff --git a/trunk/docs/manual/mod/mod_proxy_ajp.xml.meta b/docs/manual/mod/mod_proxy_ajp.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_proxy_ajp.xml.meta rename to docs/manual/mod/mod_proxy_ajp.xml.meta diff --git a/trunk/docs/manual/mod/mod_proxy_balancer.html b/docs/manual/mod/mod_proxy_balancer.html similarity index 100% rename from trunk/docs/manual/mod/mod_proxy_balancer.html rename to docs/manual/mod/mod_proxy_balancer.html diff --git a/trunk/docs/manual/mod/mod_proxy_balancer.html.en b/docs/manual/mod/mod_proxy_balancer.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_proxy_balancer.html.en rename to docs/manual/mod/mod_proxy_balancer.html.en diff --git a/trunk/docs/manual/mod/mod_proxy_balancer.html.ja.euc-jp b/docs/manual/mod/mod_proxy_balancer.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/mod_proxy_balancer.html.ja.euc-jp rename to docs/manual/mod/mod_proxy_balancer.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/mod_proxy_balancer.xml b/docs/manual/mod/mod_proxy_balancer.xml similarity index 100% rename from trunk/docs/manual/mod/mod_proxy_balancer.xml rename to docs/manual/mod/mod_proxy_balancer.xml diff --git a/trunk/docs/manual/mod/mod_proxy_balancer.xml.ja b/docs/manual/mod/mod_proxy_balancer.xml.ja similarity index 100% rename from trunk/docs/manual/mod/mod_proxy_balancer.xml.ja rename to docs/manual/mod/mod_proxy_balancer.xml.ja diff --git a/trunk/docs/manual/mod/mod_proxy_balancer.xml.meta b/docs/manual/mod/mod_proxy_balancer.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_proxy_balancer.xml.meta rename to docs/manual/mod/mod_proxy_balancer.xml.meta diff --git a/trunk/docs/manual/mod/mod_proxy_connect.html b/docs/manual/mod/mod_proxy_connect.html similarity index 100% rename from trunk/docs/manual/mod/mod_proxy_connect.html rename to docs/manual/mod/mod_proxy_connect.html diff --git a/trunk/docs/manual/mod/mod_proxy_connect.html.en b/docs/manual/mod/mod_proxy_connect.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_proxy_connect.html.en rename to docs/manual/mod/mod_proxy_connect.html.en diff --git a/trunk/docs/manual/mod/mod_proxy_connect.xml b/docs/manual/mod/mod_proxy_connect.xml similarity index 100% rename from trunk/docs/manual/mod/mod_proxy_connect.xml rename to docs/manual/mod/mod_proxy_connect.xml diff --git a/trunk/docs/manual/mod/mod_proxy_connect.xml.meta b/docs/manual/mod/mod_proxy_connect.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_proxy_connect.xml.meta rename to docs/manual/mod/mod_proxy_connect.xml.meta diff --git a/trunk/docs/manual/mod/mod_proxy_ftp.html b/docs/manual/mod/mod_proxy_ftp.html similarity index 100% rename from trunk/docs/manual/mod/mod_proxy_ftp.html rename to docs/manual/mod/mod_proxy_ftp.html diff --git a/trunk/docs/manual/mod/mod_proxy_ftp.html.en b/docs/manual/mod/mod_proxy_ftp.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_proxy_ftp.html.en rename to docs/manual/mod/mod_proxy_ftp.html.en diff --git a/trunk/docs/manual/mod/mod_proxy_ftp.xml b/docs/manual/mod/mod_proxy_ftp.xml similarity index 100% rename from trunk/docs/manual/mod/mod_proxy_ftp.xml rename to docs/manual/mod/mod_proxy_ftp.xml diff --git a/trunk/docs/manual/mod/mod_proxy_ftp.xml.meta b/docs/manual/mod/mod_proxy_ftp.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_proxy_ftp.xml.meta rename to docs/manual/mod/mod_proxy_ftp.xml.meta diff --git a/trunk/docs/manual/mod/mod_proxy_http.html b/docs/manual/mod/mod_proxy_http.html similarity index 100% rename from trunk/docs/manual/mod/mod_proxy_http.html rename to docs/manual/mod/mod_proxy_http.html diff --git a/trunk/docs/manual/mod/mod_proxy_http.html.en b/docs/manual/mod/mod_proxy_http.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_proxy_http.html.en rename to docs/manual/mod/mod_proxy_http.html.en diff --git a/trunk/docs/manual/mod/mod_proxy_http.xml b/docs/manual/mod/mod_proxy_http.xml similarity index 100% rename from trunk/docs/manual/mod/mod_proxy_http.xml rename to docs/manual/mod/mod_proxy_http.xml diff --git a/trunk/docs/manual/mod/mod_proxy_http.xml.meta b/docs/manual/mod/mod_proxy_http.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_proxy_http.xml.meta rename to docs/manual/mod/mod_proxy_http.xml.meta diff --git a/trunk/docs/manual/mod/mod_rewrite.html b/docs/manual/mod/mod_rewrite.html similarity index 100% rename from trunk/docs/manual/mod/mod_rewrite.html rename to docs/manual/mod/mod_rewrite.html diff --git a/trunk/docs/manual/mod/mod_rewrite.html.en b/docs/manual/mod/mod_rewrite.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_rewrite.html.en rename to docs/manual/mod/mod_rewrite.html.en diff --git a/trunk/docs/manual/mod/mod_rewrite.xml b/docs/manual/mod/mod_rewrite.xml similarity index 100% rename from trunk/docs/manual/mod/mod_rewrite.xml rename to docs/manual/mod/mod_rewrite.xml diff --git a/trunk/docs/manual/mod/mod_rewrite.xml.meta b/docs/manual/mod/mod_rewrite.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_rewrite.xml.meta rename to docs/manual/mod/mod_rewrite.xml.meta diff --git a/trunk/docs/manual/mod/mod_setenvif.html b/docs/manual/mod/mod_setenvif.html similarity index 100% rename from trunk/docs/manual/mod/mod_setenvif.html rename to docs/manual/mod/mod_setenvif.html diff --git a/trunk/docs/manual/mod/mod_setenvif.html.en b/docs/manual/mod/mod_setenvif.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_setenvif.html.en rename to docs/manual/mod/mod_setenvif.html.en diff --git a/trunk/docs/manual/mod/mod_setenvif.html.ja.euc-jp b/docs/manual/mod/mod_setenvif.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/mod_setenvif.html.ja.euc-jp rename to docs/manual/mod/mod_setenvif.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/mod_setenvif.html.ko.euc-kr b/docs/manual/mod/mod_setenvif.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mod/mod_setenvif.html.ko.euc-kr rename to docs/manual/mod/mod_setenvif.html.ko.euc-kr diff --git a/trunk/docs/manual/mod/mod_setenvif.xml b/docs/manual/mod/mod_setenvif.xml similarity index 100% rename from trunk/docs/manual/mod/mod_setenvif.xml rename to docs/manual/mod/mod_setenvif.xml diff --git a/trunk/docs/manual/mod/mod_setenvif.xml.ja b/docs/manual/mod/mod_setenvif.xml.ja similarity index 100% rename from trunk/docs/manual/mod/mod_setenvif.xml.ja rename to docs/manual/mod/mod_setenvif.xml.ja diff --git a/trunk/docs/manual/mod/mod_setenvif.xml.ko b/docs/manual/mod/mod_setenvif.xml.ko similarity index 100% rename from trunk/docs/manual/mod/mod_setenvif.xml.ko rename to docs/manual/mod/mod_setenvif.xml.ko diff --git a/trunk/docs/manual/mod/mod_setenvif.xml.meta b/docs/manual/mod/mod_setenvif.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_setenvif.xml.meta rename to docs/manual/mod/mod_setenvif.xml.meta diff --git a/trunk/docs/manual/mod/mod_so.html b/docs/manual/mod/mod_so.html similarity index 100% rename from trunk/docs/manual/mod/mod_so.html rename to docs/manual/mod/mod_so.html diff --git a/trunk/docs/manual/mod/mod_so.html.en b/docs/manual/mod/mod_so.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_so.html.en rename to docs/manual/mod/mod_so.html.en diff --git a/trunk/docs/manual/mod/mod_so.html.ja.euc-jp b/docs/manual/mod/mod_so.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/mod_so.html.ja.euc-jp rename to docs/manual/mod/mod_so.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/mod_so.html.ko.euc-kr b/docs/manual/mod/mod_so.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mod/mod_so.html.ko.euc-kr rename to docs/manual/mod/mod_so.html.ko.euc-kr diff --git a/trunk/docs/manual/mod/mod_so.xml b/docs/manual/mod/mod_so.xml similarity index 100% rename from trunk/docs/manual/mod/mod_so.xml rename to docs/manual/mod/mod_so.xml diff --git a/trunk/docs/manual/mod/mod_so.xml.ja b/docs/manual/mod/mod_so.xml.ja similarity index 100% rename from trunk/docs/manual/mod/mod_so.xml.ja rename to docs/manual/mod/mod_so.xml.ja diff --git a/trunk/docs/manual/mod/mod_so.xml.ko b/docs/manual/mod/mod_so.xml.ko similarity index 100% rename from trunk/docs/manual/mod/mod_so.xml.ko rename to docs/manual/mod/mod_so.xml.ko diff --git a/trunk/docs/manual/mod/mod_so.xml.meta b/docs/manual/mod/mod_so.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_so.xml.meta rename to docs/manual/mod/mod_so.xml.meta diff --git a/trunk/docs/manual/mod/mod_speling.html b/docs/manual/mod/mod_speling.html similarity index 100% rename from trunk/docs/manual/mod/mod_speling.html rename to docs/manual/mod/mod_speling.html diff --git a/trunk/docs/manual/mod/mod_speling.html.en b/docs/manual/mod/mod_speling.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_speling.html.en rename to docs/manual/mod/mod_speling.html.en diff --git a/trunk/docs/manual/mod/mod_speling.html.ja.euc-jp b/docs/manual/mod/mod_speling.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/mod_speling.html.ja.euc-jp rename to docs/manual/mod/mod_speling.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/mod_speling.html.ko.euc-kr b/docs/manual/mod/mod_speling.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mod/mod_speling.html.ko.euc-kr rename to docs/manual/mod/mod_speling.html.ko.euc-kr diff --git a/trunk/docs/manual/mod/mod_speling.xml b/docs/manual/mod/mod_speling.xml similarity index 100% rename from trunk/docs/manual/mod/mod_speling.xml rename to docs/manual/mod/mod_speling.xml diff --git a/trunk/docs/manual/mod/mod_speling.xml.ja b/docs/manual/mod/mod_speling.xml.ja similarity index 100% rename from trunk/docs/manual/mod/mod_speling.xml.ja rename to docs/manual/mod/mod_speling.xml.ja diff --git a/trunk/docs/manual/mod/mod_speling.xml.ko b/docs/manual/mod/mod_speling.xml.ko similarity index 100% rename from trunk/docs/manual/mod/mod_speling.xml.ko rename to docs/manual/mod/mod_speling.xml.ko diff --git a/trunk/docs/manual/mod/mod_speling.xml.meta b/docs/manual/mod/mod_speling.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_speling.xml.meta rename to docs/manual/mod/mod_speling.xml.meta diff --git a/trunk/docs/manual/mod/mod_ssl.html b/docs/manual/mod/mod_ssl.html similarity index 100% rename from trunk/docs/manual/mod/mod_ssl.html rename to docs/manual/mod/mod_ssl.html diff --git a/trunk/docs/manual/mod/mod_ssl.html.en b/docs/manual/mod/mod_ssl.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_ssl.html.en rename to docs/manual/mod/mod_ssl.html.en diff --git a/trunk/docs/manual/mod/mod_ssl.xml b/docs/manual/mod/mod_ssl.xml similarity index 100% rename from trunk/docs/manual/mod/mod_ssl.xml rename to docs/manual/mod/mod_ssl.xml diff --git a/trunk/docs/manual/mod/mod_ssl.xml.meta b/docs/manual/mod/mod_ssl.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_ssl.xml.meta rename to docs/manual/mod/mod_ssl.xml.meta diff --git a/trunk/docs/manual/mod/mod_status.html b/docs/manual/mod/mod_status.html similarity index 100% rename from trunk/docs/manual/mod/mod_status.html rename to docs/manual/mod/mod_status.html diff --git a/trunk/docs/manual/mod/mod_status.html.en b/docs/manual/mod/mod_status.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_status.html.en rename to docs/manual/mod/mod_status.html.en diff --git a/trunk/docs/manual/mod/mod_status.html.ja.euc-jp b/docs/manual/mod/mod_status.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/mod_status.html.ja.euc-jp rename to docs/manual/mod/mod_status.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/mod_status.html.ko.euc-kr b/docs/manual/mod/mod_status.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mod/mod_status.html.ko.euc-kr rename to docs/manual/mod/mod_status.html.ko.euc-kr diff --git a/trunk/docs/manual/mod/mod_status.xml b/docs/manual/mod/mod_status.xml similarity index 100% rename from trunk/docs/manual/mod/mod_status.xml rename to docs/manual/mod/mod_status.xml diff --git a/trunk/docs/manual/mod/mod_status.xml.ja b/docs/manual/mod/mod_status.xml.ja similarity index 100% rename from trunk/docs/manual/mod/mod_status.xml.ja rename to docs/manual/mod/mod_status.xml.ja diff --git a/trunk/docs/manual/mod/mod_status.xml.ko b/docs/manual/mod/mod_status.xml.ko similarity index 100% rename from trunk/docs/manual/mod/mod_status.xml.ko rename to docs/manual/mod/mod_status.xml.ko diff --git a/trunk/docs/manual/mod/mod_status.xml.meta b/docs/manual/mod/mod_status.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_status.xml.meta rename to docs/manual/mod/mod_status.xml.meta diff --git a/trunk/docs/manual/mod/mod_suexec.html b/docs/manual/mod/mod_suexec.html similarity index 100% rename from trunk/docs/manual/mod/mod_suexec.html rename to docs/manual/mod/mod_suexec.html diff --git a/trunk/docs/manual/mod/mod_suexec.html.en b/docs/manual/mod/mod_suexec.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_suexec.html.en rename to docs/manual/mod/mod_suexec.html.en diff --git a/trunk/docs/manual/mod/mod_suexec.html.ja.euc-jp b/docs/manual/mod/mod_suexec.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/mod_suexec.html.ja.euc-jp rename to docs/manual/mod/mod_suexec.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/mod_suexec.html.ko.euc-kr b/docs/manual/mod/mod_suexec.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mod/mod_suexec.html.ko.euc-kr rename to docs/manual/mod/mod_suexec.html.ko.euc-kr diff --git a/trunk/docs/manual/mod/mod_suexec.xml b/docs/manual/mod/mod_suexec.xml similarity index 100% rename from trunk/docs/manual/mod/mod_suexec.xml rename to docs/manual/mod/mod_suexec.xml diff --git a/trunk/docs/manual/mod/mod_suexec.xml.ja b/docs/manual/mod/mod_suexec.xml.ja similarity index 100% rename from trunk/docs/manual/mod/mod_suexec.xml.ja rename to docs/manual/mod/mod_suexec.xml.ja diff --git a/trunk/docs/manual/mod/mod_suexec.xml.ko b/docs/manual/mod/mod_suexec.xml.ko similarity index 100% rename from trunk/docs/manual/mod/mod_suexec.xml.ko rename to docs/manual/mod/mod_suexec.xml.ko diff --git a/trunk/docs/manual/mod/mod_suexec.xml.meta b/docs/manual/mod/mod_suexec.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_suexec.xml.meta rename to docs/manual/mod/mod_suexec.xml.meta diff --git a/trunk/docs/manual/mod/mod_unique_id.html b/docs/manual/mod/mod_unique_id.html similarity index 100% rename from trunk/docs/manual/mod/mod_unique_id.html rename to docs/manual/mod/mod_unique_id.html diff --git a/trunk/docs/manual/mod/mod_unique_id.html.en b/docs/manual/mod/mod_unique_id.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_unique_id.html.en rename to docs/manual/mod/mod_unique_id.html.en diff --git a/trunk/docs/manual/mod/mod_unique_id.html.ja.euc-jp b/docs/manual/mod/mod_unique_id.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/mod_unique_id.html.ja.euc-jp rename to docs/manual/mod/mod_unique_id.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/mod_unique_id.html.ko.euc-kr b/docs/manual/mod/mod_unique_id.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mod/mod_unique_id.html.ko.euc-kr rename to docs/manual/mod/mod_unique_id.html.ko.euc-kr diff --git a/trunk/docs/manual/mod/mod_unique_id.xml b/docs/manual/mod/mod_unique_id.xml similarity index 100% rename from trunk/docs/manual/mod/mod_unique_id.xml rename to docs/manual/mod/mod_unique_id.xml diff --git a/trunk/docs/manual/mod/mod_unique_id.xml.ja b/docs/manual/mod/mod_unique_id.xml.ja similarity index 100% rename from trunk/docs/manual/mod/mod_unique_id.xml.ja rename to docs/manual/mod/mod_unique_id.xml.ja diff --git a/trunk/docs/manual/mod/mod_unique_id.xml.ko b/docs/manual/mod/mod_unique_id.xml.ko similarity index 100% rename from trunk/docs/manual/mod/mod_unique_id.xml.ko rename to docs/manual/mod/mod_unique_id.xml.ko diff --git a/trunk/docs/manual/mod/mod_unique_id.xml.meta b/docs/manual/mod/mod_unique_id.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_unique_id.xml.meta rename to docs/manual/mod/mod_unique_id.xml.meta diff --git a/trunk/docs/manual/mod/mod_userdir.html b/docs/manual/mod/mod_userdir.html similarity index 100% rename from trunk/docs/manual/mod/mod_userdir.html rename to docs/manual/mod/mod_userdir.html diff --git a/trunk/docs/manual/mod/mod_userdir.html.en b/docs/manual/mod/mod_userdir.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_userdir.html.en rename to docs/manual/mod/mod_userdir.html.en diff --git a/trunk/docs/manual/mod/mod_userdir.html.ja.euc-jp b/docs/manual/mod/mod_userdir.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/mod_userdir.html.ja.euc-jp rename to docs/manual/mod/mod_userdir.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/mod_userdir.html.ko.euc-kr b/docs/manual/mod/mod_userdir.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mod/mod_userdir.html.ko.euc-kr rename to docs/manual/mod/mod_userdir.html.ko.euc-kr diff --git a/trunk/docs/manual/mod/mod_userdir.xml b/docs/manual/mod/mod_userdir.xml similarity index 100% rename from trunk/docs/manual/mod/mod_userdir.xml rename to docs/manual/mod/mod_userdir.xml diff --git a/trunk/docs/manual/mod/mod_userdir.xml.ja b/docs/manual/mod/mod_userdir.xml.ja similarity index 100% rename from trunk/docs/manual/mod/mod_userdir.xml.ja rename to docs/manual/mod/mod_userdir.xml.ja diff --git a/trunk/docs/manual/mod/mod_userdir.xml.ko b/docs/manual/mod/mod_userdir.xml.ko similarity index 100% rename from trunk/docs/manual/mod/mod_userdir.xml.ko rename to docs/manual/mod/mod_userdir.xml.ko diff --git a/trunk/docs/manual/mod/mod_userdir.xml.meta b/docs/manual/mod/mod_userdir.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_userdir.xml.meta rename to docs/manual/mod/mod_userdir.xml.meta diff --git a/trunk/docs/manual/mod/mod_usertrack.html b/docs/manual/mod/mod_usertrack.html similarity index 100% rename from trunk/docs/manual/mod/mod_usertrack.html rename to docs/manual/mod/mod_usertrack.html diff --git a/trunk/docs/manual/mod/mod_usertrack.html.en b/docs/manual/mod/mod_usertrack.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_usertrack.html.en rename to docs/manual/mod/mod_usertrack.html.en diff --git a/trunk/docs/manual/mod/mod_usertrack.xml b/docs/manual/mod/mod_usertrack.xml similarity index 100% rename from trunk/docs/manual/mod/mod_usertrack.xml rename to docs/manual/mod/mod_usertrack.xml diff --git a/trunk/docs/manual/mod/mod_usertrack.xml.meta b/docs/manual/mod/mod_usertrack.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_usertrack.xml.meta rename to docs/manual/mod/mod_usertrack.xml.meta diff --git a/trunk/docs/manual/mod/mod_version.html b/docs/manual/mod/mod_version.html similarity index 100% rename from trunk/docs/manual/mod/mod_version.html rename to docs/manual/mod/mod_version.html diff --git a/trunk/docs/manual/mod/mod_version.html.en b/docs/manual/mod/mod_version.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_version.html.en rename to docs/manual/mod/mod_version.html.en diff --git a/trunk/docs/manual/mod/mod_version.html.ja.euc-jp b/docs/manual/mod/mod_version.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/mod_version.html.ja.euc-jp rename to docs/manual/mod/mod_version.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/mod_version.html.ko.euc-kr b/docs/manual/mod/mod_version.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mod/mod_version.html.ko.euc-kr rename to docs/manual/mod/mod_version.html.ko.euc-kr diff --git a/trunk/docs/manual/mod/mod_version.xml b/docs/manual/mod/mod_version.xml similarity index 100% rename from trunk/docs/manual/mod/mod_version.xml rename to docs/manual/mod/mod_version.xml diff --git a/trunk/docs/manual/mod/mod_version.xml.ja b/docs/manual/mod/mod_version.xml.ja similarity index 100% rename from trunk/docs/manual/mod/mod_version.xml.ja rename to docs/manual/mod/mod_version.xml.ja diff --git a/trunk/docs/manual/mod/mod_version.xml.ko b/docs/manual/mod/mod_version.xml.ko similarity index 100% rename from trunk/docs/manual/mod/mod_version.xml.ko rename to docs/manual/mod/mod_version.xml.ko diff --git a/trunk/docs/manual/mod/mod_version.xml.meta b/docs/manual/mod/mod_version.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_version.xml.meta rename to docs/manual/mod/mod_version.xml.meta diff --git a/trunk/docs/manual/mod/mod_vhost_alias.html b/docs/manual/mod/mod_vhost_alias.html similarity index 100% rename from trunk/docs/manual/mod/mod_vhost_alias.html rename to docs/manual/mod/mod_vhost_alias.html diff --git a/trunk/docs/manual/mod/mod_vhost_alias.html.en b/docs/manual/mod/mod_vhost_alias.html.en similarity index 100% rename from trunk/docs/manual/mod/mod_vhost_alias.html.en rename to docs/manual/mod/mod_vhost_alias.html.en diff --git a/trunk/docs/manual/mod/mod_vhost_alias.xml b/docs/manual/mod/mod_vhost_alias.xml similarity index 100% rename from trunk/docs/manual/mod/mod_vhost_alias.xml rename to docs/manual/mod/mod_vhost_alias.xml diff --git a/trunk/docs/manual/mod/mod_vhost_alias.xml.meta b/docs/manual/mod/mod_vhost_alias.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mod_vhost_alias.xml.meta rename to docs/manual/mod/mod_vhost_alias.xml.meta diff --git a/trunk/docs/manual/mod/module-dict.html b/docs/manual/mod/module-dict.html similarity index 100% rename from trunk/docs/manual/mod/module-dict.html rename to docs/manual/mod/module-dict.html diff --git a/trunk/docs/manual/mod/module-dict.html.en b/docs/manual/mod/module-dict.html.en similarity index 100% rename from trunk/docs/manual/mod/module-dict.html.en rename to docs/manual/mod/module-dict.html.en diff --git a/trunk/docs/manual/mod/module-dict.html.ja.euc-jp b/docs/manual/mod/module-dict.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/module-dict.html.ja.euc-jp rename to docs/manual/mod/module-dict.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/module-dict.html.ko.euc-kr b/docs/manual/mod/module-dict.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mod/module-dict.html.ko.euc-kr rename to docs/manual/mod/module-dict.html.ko.euc-kr diff --git a/trunk/docs/manual/mod/module-dict.xml b/docs/manual/mod/module-dict.xml similarity index 100% rename from trunk/docs/manual/mod/module-dict.xml rename to docs/manual/mod/module-dict.xml diff --git a/trunk/docs/manual/mod/module-dict.xml.ja b/docs/manual/mod/module-dict.xml.ja similarity index 100% rename from trunk/docs/manual/mod/module-dict.xml.ja rename to docs/manual/mod/module-dict.xml.ja diff --git a/trunk/docs/manual/mod/module-dict.xml.ko b/docs/manual/mod/module-dict.xml.ko similarity index 100% rename from trunk/docs/manual/mod/module-dict.xml.ko rename to docs/manual/mod/module-dict.xml.ko diff --git a/trunk/docs/manual/mod/module-dict.xml.meta b/docs/manual/mod/module-dict.xml.meta similarity index 100% rename from trunk/docs/manual/mod/module-dict.xml.meta rename to docs/manual/mod/module-dict.xml.meta diff --git a/trunk/docs/manual/mod/mpm_common.html b/docs/manual/mod/mpm_common.html similarity index 100% rename from trunk/docs/manual/mod/mpm_common.html rename to docs/manual/mod/mpm_common.html diff --git a/trunk/docs/manual/mod/mpm_common.html.de b/docs/manual/mod/mpm_common.html.de similarity index 100% rename from trunk/docs/manual/mod/mpm_common.html.de rename to docs/manual/mod/mpm_common.html.de diff --git a/trunk/docs/manual/mod/mpm_common.html.en b/docs/manual/mod/mpm_common.html.en similarity index 100% rename from trunk/docs/manual/mod/mpm_common.html.en rename to docs/manual/mod/mpm_common.html.en diff --git a/trunk/docs/manual/mod/mpm_common.html.ja.euc-jp b/docs/manual/mod/mpm_common.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/mpm_common.html.ja.euc-jp rename to docs/manual/mod/mpm_common.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/mpm_common.xml b/docs/manual/mod/mpm_common.xml similarity index 100% rename from trunk/docs/manual/mod/mpm_common.xml rename to docs/manual/mod/mpm_common.xml diff --git a/trunk/docs/manual/mod/mpm_common.xml.de b/docs/manual/mod/mpm_common.xml.de similarity index 100% rename from trunk/docs/manual/mod/mpm_common.xml.de rename to docs/manual/mod/mpm_common.xml.de diff --git a/trunk/docs/manual/mod/mpm_common.xml.ja b/docs/manual/mod/mpm_common.xml.ja similarity index 100% rename from trunk/docs/manual/mod/mpm_common.xml.ja rename to docs/manual/mod/mpm_common.xml.ja diff --git a/trunk/docs/manual/mod/mpm_common.xml.meta b/docs/manual/mod/mpm_common.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mpm_common.xml.meta rename to docs/manual/mod/mpm_common.xml.meta diff --git a/trunk/docs/manual/mod/mpm_netware.html b/docs/manual/mod/mpm_netware.html similarity index 100% rename from trunk/docs/manual/mod/mpm_netware.html rename to docs/manual/mod/mpm_netware.html diff --git a/trunk/docs/manual/mod/mpm_netware.html.en b/docs/manual/mod/mpm_netware.html.en similarity index 100% rename from trunk/docs/manual/mod/mpm_netware.html.en rename to docs/manual/mod/mpm_netware.html.en diff --git a/trunk/docs/manual/mod/mpm_netware.xml b/docs/manual/mod/mpm_netware.xml similarity index 100% rename from trunk/docs/manual/mod/mpm_netware.xml rename to docs/manual/mod/mpm_netware.xml diff --git a/trunk/docs/manual/mod/mpm_netware.xml.meta b/docs/manual/mod/mpm_netware.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mpm_netware.xml.meta rename to docs/manual/mod/mpm_netware.xml.meta diff --git a/trunk/docs/manual/mod/mpm_winnt.html b/docs/manual/mod/mpm_winnt.html similarity index 100% rename from trunk/docs/manual/mod/mpm_winnt.html rename to docs/manual/mod/mpm_winnt.html diff --git a/trunk/docs/manual/mod/mpm_winnt.html.de b/docs/manual/mod/mpm_winnt.html.de similarity index 100% rename from trunk/docs/manual/mod/mpm_winnt.html.de rename to docs/manual/mod/mpm_winnt.html.de diff --git a/trunk/docs/manual/mod/mpm_winnt.html.en b/docs/manual/mod/mpm_winnt.html.en similarity index 100% rename from trunk/docs/manual/mod/mpm_winnt.html.en rename to docs/manual/mod/mpm_winnt.html.en diff --git a/trunk/docs/manual/mod/mpm_winnt.html.ja.euc-jp b/docs/manual/mod/mpm_winnt.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/mpm_winnt.html.ja.euc-jp rename to docs/manual/mod/mpm_winnt.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/mpm_winnt.xml b/docs/manual/mod/mpm_winnt.xml similarity index 100% rename from trunk/docs/manual/mod/mpm_winnt.xml rename to docs/manual/mod/mpm_winnt.xml diff --git a/trunk/docs/manual/mod/mpm_winnt.xml.de b/docs/manual/mod/mpm_winnt.xml.de similarity index 100% rename from trunk/docs/manual/mod/mpm_winnt.xml.de rename to docs/manual/mod/mpm_winnt.xml.de diff --git a/trunk/docs/manual/mod/mpm_winnt.xml.ja b/docs/manual/mod/mpm_winnt.xml.ja similarity index 100% rename from trunk/docs/manual/mod/mpm_winnt.xml.ja rename to docs/manual/mod/mpm_winnt.xml.ja diff --git a/trunk/docs/manual/mod/mpm_winnt.xml.meta b/docs/manual/mod/mpm_winnt.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mpm_winnt.xml.meta rename to docs/manual/mod/mpm_winnt.xml.meta diff --git a/trunk/docs/manual/mod/mpmt_os2.html b/docs/manual/mod/mpmt_os2.html similarity index 100% rename from trunk/docs/manual/mod/mpmt_os2.html rename to docs/manual/mod/mpmt_os2.html diff --git a/trunk/docs/manual/mod/mpmt_os2.html.en b/docs/manual/mod/mpmt_os2.html.en similarity index 100% rename from trunk/docs/manual/mod/mpmt_os2.html.en rename to docs/manual/mod/mpmt_os2.html.en diff --git a/trunk/docs/manual/mod/mpmt_os2.xml b/docs/manual/mod/mpmt_os2.xml similarity index 100% rename from trunk/docs/manual/mod/mpmt_os2.xml rename to docs/manual/mod/mpmt_os2.xml diff --git a/trunk/docs/manual/mod/mpmt_os2.xml.meta b/docs/manual/mod/mpmt_os2.xml.meta similarity index 100% rename from trunk/docs/manual/mod/mpmt_os2.xml.meta rename to docs/manual/mod/mpmt_os2.xml.meta diff --git a/trunk/docs/manual/mod/perchild.html b/docs/manual/mod/perchild.html similarity index 100% rename from trunk/docs/manual/mod/perchild.html rename to docs/manual/mod/perchild.html diff --git a/trunk/docs/manual/mod/perchild.html.en b/docs/manual/mod/perchild.html.en similarity index 100% rename from trunk/docs/manual/mod/perchild.html.en rename to docs/manual/mod/perchild.html.en diff --git a/trunk/docs/manual/mod/perchild.xml b/docs/manual/mod/perchild.xml similarity index 100% rename from trunk/docs/manual/mod/perchild.xml rename to docs/manual/mod/perchild.xml diff --git a/trunk/docs/manual/mod/perchild.xml.meta b/docs/manual/mod/perchild.xml.meta similarity index 100% rename from trunk/docs/manual/mod/perchild.xml.meta rename to docs/manual/mod/perchild.xml.meta diff --git a/trunk/docs/manual/mod/prefork.html b/docs/manual/mod/prefork.html similarity index 100% rename from trunk/docs/manual/mod/prefork.html rename to docs/manual/mod/prefork.html diff --git a/trunk/docs/manual/mod/prefork.html.de b/docs/manual/mod/prefork.html.de similarity index 100% rename from trunk/docs/manual/mod/prefork.html.de rename to docs/manual/mod/prefork.html.de diff --git a/trunk/docs/manual/mod/prefork.html.en b/docs/manual/mod/prefork.html.en similarity index 100% rename from trunk/docs/manual/mod/prefork.html.en rename to docs/manual/mod/prefork.html.en diff --git a/trunk/docs/manual/mod/prefork.html.ja.euc-jp b/docs/manual/mod/prefork.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/prefork.html.ja.euc-jp rename to docs/manual/mod/prefork.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/prefork.xml b/docs/manual/mod/prefork.xml similarity index 100% rename from trunk/docs/manual/mod/prefork.xml rename to docs/manual/mod/prefork.xml diff --git a/trunk/docs/manual/mod/prefork.xml.de b/docs/manual/mod/prefork.xml.de similarity index 100% rename from trunk/docs/manual/mod/prefork.xml.de rename to docs/manual/mod/prefork.xml.de diff --git a/trunk/docs/manual/mod/prefork.xml.ja b/docs/manual/mod/prefork.xml.ja similarity index 100% rename from trunk/docs/manual/mod/prefork.xml.ja rename to docs/manual/mod/prefork.xml.ja diff --git a/trunk/docs/manual/mod/prefork.xml.meta b/docs/manual/mod/prefork.xml.meta similarity index 100% rename from trunk/docs/manual/mod/prefork.xml.meta rename to docs/manual/mod/prefork.xml.meta diff --git a/trunk/docs/manual/mod/quickreference.html b/docs/manual/mod/quickreference.html similarity index 100% rename from trunk/docs/manual/mod/quickreference.html rename to docs/manual/mod/quickreference.html diff --git a/trunk/docs/manual/mod/quickreference.html.de b/docs/manual/mod/quickreference.html.de similarity index 100% rename from trunk/docs/manual/mod/quickreference.html.de rename to docs/manual/mod/quickreference.html.de diff --git a/trunk/docs/manual/mod/quickreference.html.en b/docs/manual/mod/quickreference.html.en similarity index 100% rename from trunk/docs/manual/mod/quickreference.html.en rename to docs/manual/mod/quickreference.html.en diff --git a/trunk/docs/manual/mod/quickreference.html.es b/docs/manual/mod/quickreference.html.es similarity index 100% rename from trunk/docs/manual/mod/quickreference.html.es rename to docs/manual/mod/quickreference.html.es diff --git a/trunk/docs/manual/mod/quickreference.html.ja.euc-jp b/docs/manual/mod/quickreference.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/quickreference.html.ja.euc-jp rename to docs/manual/mod/quickreference.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/quickreference.html.ko.euc-kr b/docs/manual/mod/quickreference.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mod/quickreference.html.ko.euc-kr rename to docs/manual/mod/quickreference.html.ko.euc-kr diff --git a/trunk/docs/manual/mod/quickreference.xml b/docs/manual/mod/quickreference.xml similarity index 100% rename from trunk/docs/manual/mod/quickreference.xml rename to docs/manual/mod/quickreference.xml diff --git a/trunk/docs/manual/mod/quickreference.xml.de b/docs/manual/mod/quickreference.xml.de similarity index 100% rename from trunk/docs/manual/mod/quickreference.xml.de rename to docs/manual/mod/quickreference.xml.de diff --git a/trunk/docs/manual/mod/quickreference.xml.es b/docs/manual/mod/quickreference.xml.es similarity index 100% rename from trunk/docs/manual/mod/quickreference.xml.es rename to docs/manual/mod/quickreference.xml.es diff --git a/trunk/docs/manual/mod/quickreference.xml.ja b/docs/manual/mod/quickreference.xml.ja similarity index 100% rename from trunk/docs/manual/mod/quickreference.xml.ja rename to docs/manual/mod/quickreference.xml.ja diff --git a/trunk/docs/manual/mod/quickreference.xml.ko b/docs/manual/mod/quickreference.xml.ko similarity index 100% rename from trunk/docs/manual/mod/quickreference.xml.ko rename to docs/manual/mod/quickreference.xml.ko diff --git a/trunk/docs/manual/mod/quickreference.xml.meta b/docs/manual/mod/quickreference.xml.meta similarity index 100% rename from trunk/docs/manual/mod/quickreference.xml.meta rename to docs/manual/mod/quickreference.xml.meta diff --git a/trunk/docs/manual/mod/threadpool.html b/docs/manual/mod/threadpool.html similarity index 100% rename from trunk/docs/manual/mod/threadpool.html rename to docs/manual/mod/threadpool.html diff --git a/trunk/docs/manual/mod/threadpool.html.en b/docs/manual/mod/threadpool.html.en similarity index 100% rename from trunk/docs/manual/mod/threadpool.html.en rename to docs/manual/mod/threadpool.html.en diff --git a/trunk/docs/manual/mod/threadpool.xml b/docs/manual/mod/threadpool.xml similarity index 100% rename from trunk/docs/manual/mod/threadpool.xml rename to docs/manual/mod/threadpool.xml diff --git a/trunk/docs/manual/mod/threadpool.xml.meta b/docs/manual/mod/threadpool.xml.meta similarity index 100% rename from trunk/docs/manual/mod/threadpool.xml.meta rename to docs/manual/mod/threadpool.xml.meta diff --git a/trunk/docs/manual/mod/worker.html b/docs/manual/mod/worker.html similarity index 100% rename from trunk/docs/manual/mod/worker.html rename to docs/manual/mod/worker.html diff --git a/trunk/docs/manual/mod/worker.html.de b/docs/manual/mod/worker.html.de similarity index 100% rename from trunk/docs/manual/mod/worker.html.de rename to docs/manual/mod/worker.html.de diff --git a/trunk/docs/manual/mod/worker.html.en b/docs/manual/mod/worker.html.en similarity index 100% rename from trunk/docs/manual/mod/worker.html.en rename to docs/manual/mod/worker.html.en diff --git a/trunk/docs/manual/mod/worker.html.ja.euc-jp b/docs/manual/mod/worker.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mod/worker.html.ja.euc-jp rename to docs/manual/mod/worker.html.ja.euc-jp diff --git a/trunk/docs/manual/mod/worker.xml b/docs/manual/mod/worker.xml similarity index 100% rename from trunk/docs/manual/mod/worker.xml rename to docs/manual/mod/worker.xml diff --git a/trunk/docs/manual/mod/worker.xml.de b/docs/manual/mod/worker.xml.de similarity index 100% rename from trunk/docs/manual/mod/worker.xml.de rename to docs/manual/mod/worker.xml.de diff --git a/trunk/docs/manual/mod/worker.xml.ja b/docs/manual/mod/worker.xml.ja similarity index 100% rename from trunk/docs/manual/mod/worker.xml.ja rename to docs/manual/mod/worker.xml.ja diff --git a/trunk/docs/manual/mod/worker.xml.meta b/docs/manual/mod/worker.xml.meta similarity index 100% rename from trunk/docs/manual/mod/worker.xml.meta rename to docs/manual/mod/worker.xml.meta diff --git a/trunk/docs/manual/mpm.html b/docs/manual/mpm.html similarity index 100% rename from trunk/docs/manual/mpm.html rename to docs/manual/mpm.html diff --git a/trunk/docs/manual/mpm.html.de b/docs/manual/mpm.html.de similarity index 100% rename from trunk/docs/manual/mpm.html.de rename to docs/manual/mpm.html.de diff --git a/trunk/docs/manual/mpm.html.en b/docs/manual/mpm.html.en similarity index 100% rename from trunk/docs/manual/mpm.html.en rename to docs/manual/mpm.html.en diff --git a/trunk/docs/manual/mpm.html.es b/docs/manual/mpm.html.es similarity index 100% rename from trunk/docs/manual/mpm.html.es rename to docs/manual/mpm.html.es diff --git a/trunk/docs/manual/mpm.html.ja.euc-jp b/docs/manual/mpm.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/mpm.html.ja.euc-jp rename to docs/manual/mpm.html.ja.euc-jp diff --git a/trunk/docs/manual/mpm.html.ko.euc-kr b/docs/manual/mpm.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/mpm.html.ko.euc-kr rename to docs/manual/mpm.html.ko.euc-kr diff --git a/trunk/docs/manual/mpm.xml b/docs/manual/mpm.xml similarity index 100% rename from trunk/docs/manual/mpm.xml rename to docs/manual/mpm.xml diff --git a/trunk/docs/manual/mpm.xml.de b/docs/manual/mpm.xml.de similarity index 100% rename from trunk/docs/manual/mpm.xml.de rename to docs/manual/mpm.xml.de diff --git a/trunk/docs/manual/mpm.xml.es b/docs/manual/mpm.xml.es similarity index 100% rename from trunk/docs/manual/mpm.xml.es rename to docs/manual/mpm.xml.es diff --git a/trunk/docs/manual/mpm.xml.ja b/docs/manual/mpm.xml.ja similarity index 100% rename from trunk/docs/manual/mpm.xml.ja rename to docs/manual/mpm.xml.ja diff --git a/trunk/docs/manual/mpm.xml.ko b/docs/manual/mpm.xml.ko similarity index 100% rename from trunk/docs/manual/mpm.xml.ko rename to docs/manual/mpm.xml.ko diff --git a/trunk/docs/manual/mpm.xml.meta b/docs/manual/mpm.xml.meta similarity index 100% rename from trunk/docs/manual/mpm.xml.meta rename to docs/manual/mpm.xml.meta diff --git a/trunk/docs/manual/new_features_2_0.html b/docs/manual/new_features_2_0.html similarity index 100% rename from trunk/docs/manual/new_features_2_0.html rename to docs/manual/new_features_2_0.html diff --git a/trunk/docs/manual/new_features_2_0.html.de b/docs/manual/new_features_2_0.html.de similarity index 100% rename from trunk/docs/manual/new_features_2_0.html.de rename to docs/manual/new_features_2_0.html.de diff --git a/trunk/docs/manual/new_features_2_0.html.en b/docs/manual/new_features_2_0.html.en similarity index 100% rename from trunk/docs/manual/new_features_2_0.html.en rename to docs/manual/new_features_2_0.html.en diff --git a/trunk/docs/manual/new_features_2_0.html.fr b/docs/manual/new_features_2_0.html.fr similarity index 100% rename from trunk/docs/manual/new_features_2_0.html.fr rename to docs/manual/new_features_2_0.html.fr diff --git a/trunk/docs/manual/new_features_2_0.html.ja.euc-jp b/docs/manual/new_features_2_0.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/new_features_2_0.html.ja.euc-jp rename to docs/manual/new_features_2_0.html.ja.euc-jp diff --git a/trunk/docs/manual/new_features_2_0.html.ko.euc-kr b/docs/manual/new_features_2_0.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/new_features_2_0.html.ko.euc-kr rename to docs/manual/new_features_2_0.html.ko.euc-kr diff --git a/trunk/docs/manual/new_features_2_0.html.pt-br b/docs/manual/new_features_2_0.html.pt-br similarity index 100% rename from trunk/docs/manual/new_features_2_0.html.pt-br rename to docs/manual/new_features_2_0.html.pt-br diff --git a/trunk/docs/manual/new_features_2_0.html.ru.koi8-r b/docs/manual/new_features_2_0.html.ru.koi8-r similarity index 100% rename from trunk/docs/manual/new_features_2_0.html.ru.koi8-r rename to docs/manual/new_features_2_0.html.ru.koi8-r diff --git a/trunk/docs/manual/new_features_2_0.xml b/docs/manual/new_features_2_0.xml similarity index 100% rename from trunk/docs/manual/new_features_2_0.xml rename to docs/manual/new_features_2_0.xml diff --git a/trunk/docs/manual/new_features_2_0.xml.de b/docs/manual/new_features_2_0.xml.de similarity index 100% rename from trunk/docs/manual/new_features_2_0.xml.de rename to docs/manual/new_features_2_0.xml.de diff --git a/trunk/docs/manual/new_features_2_0.xml.fr b/docs/manual/new_features_2_0.xml.fr similarity index 100% rename from trunk/docs/manual/new_features_2_0.xml.fr rename to docs/manual/new_features_2_0.xml.fr diff --git a/trunk/docs/manual/new_features_2_0.xml.ja b/docs/manual/new_features_2_0.xml.ja similarity index 100% rename from trunk/docs/manual/new_features_2_0.xml.ja rename to docs/manual/new_features_2_0.xml.ja diff --git a/trunk/docs/manual/new_features_2_0.xml.ko b/docs/manual/new_features_2_0.xml.ko similarity index 100% rename from trunk/docs/manual/new_features_2_0.xml.ko rename to docs/manual/new_features_2_0.xml.ko diff --git a/trunk/docs/manual/new_features_2_0.xml.meta b/docs/manual/new_features_2_0.xml.meta similarity index 100% rename from trunk/docs/manual/new_features_2_0.xml.meta rename to docs/manual/new_features_2_0.xml.meta diff --git a/trunk/docs/manual/new_features_2_0.xml.pt-br b/docs/manual/new_features_2_0.xml.pt-br similarity index 100% rename from trunk/docs/manual/new_features_2_0.xml.pt-br rename to docs/manual/new_features_2_0.xml.pt-br diff --git a/trunk/docs/manual/new_features_2_0.xml.ru b/docs/manual/new_features_2_0.xml.ru similarity index 100% rename from trunk/docs/manual/new_features_2_0.xml.ru rename to docs/manual/new_features_2_0.xml.ru diff --git a/trunk/docs/manual/new_features_2_2.html b/docs/manual/new_features_2_2.html similarity index 100% rename from trunk/docs/manual/new_features_2_2.html rename to docs/manual/new_features_2_2.html diff --git a/trunk/docs/manual/new_features_2_2.html.en b/docs/manual/new_features_2_2.html.en similarity index 100% rename from trunk/docs/manual/new_features_2_2.html.en rename to docs/manual/new_features_2_2.html.en diff --git a/trunk/docs/manual/new_features_2_2.html.ko.euc-kr b/docs/manual/new_features_2_2.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/new_features_2_2.html.ko.euc-kr rename to docs/manual/new_features_2_2.html.ko.euc-kr diff --git a/trunk/docs/manual/new_features_2_2.html.pt-br b/docs/manual/new_features_2_2.html.pt-br similarity index 100% rename from trunk/docs/manual/new_features_2_2.html.pt-br rename to docs/manual/new_features_2_2.html.pt-br diff --git a/trunk/docs/manual/new_features_2_2.xml b/docs/manual/new_features_2_2.xml similarity index 100% rename from trunk/docs/manual/new_features_2_2.xml rename to docs/manual/new_features_2_2.xml diff --git a/trunk/docs/manual/new_features_2_2.xml.ko b/docs/manual/new_features_2_2.xml.ko similarity index 100% rename from trunk/docs/manual/new_features_2_2.xml.ko rename to docs/manual/new_features_2_2.xml.ko diff --git a/trunk/docs/manual/new_features_2_2.xml.meta b/docs/manual/new_features_2_2.xml.meta similarity index 100% rename from trunk/docs/manual/new_features_2_2.xml.meta rename to docs/manual/new_features_2_2.xml.meta diff --git a/trunk/docs/manual/new_features_2_2.xml.pt-br b/docs/manual/new_features_2_2.xml.pt-br similarity index 100% rename from trunk/docs/manual/new_features_2_2.xml.pt-br rename to docs/manual/new_features_2_2.xml.pt-br diff --git a/trunk/docs/manual/platform/ebcdic.html b/docs/manual/platform/ebcdic.html similarity index 100% rename from trunk/docs/manual/platform/ebcdic.html rename to docs/manual/platform/ebcdic.html diff --git a/trunk/docs/manual/platform/ebcdic.html.en b/docs/manual/platform/ebcdic.html.en similarity index 100% rename from trunk/docs/manual/platform/ebcdic.html.en rename to docs/manual/platform/ebcdic.html.en diff --git a/trunk/docs/manual/platform/ebcdic.html.ko.euc-kr b/docs/manual/platform/ebcdic.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/platform/ebcdic.html.ko.euc-kr rename to docs/manual/platform/ebcdic.html.ko.euc-kr diff --git a/trunk/docs/manual/platform/ebcdic.xml b/docs/manual/platform/ebcdic.xml similarity index 100% rename from trunk/docs/manual/platform/ebcdic.xml rename to docs/manual/platform/ebcdic.xml diff --git a/trunk/docs/manual/platform/ebcdic.xml.ko b/docs/manual/platform/ebcdic.xml.ko similarity index 100% rename from trunk/docs/manual/platform/ebcdic.xml.ko rename to docs/manual/platform/ebcdic.xml.ko diff --git a/trunk/docs/manual/platform/ebcdic.xml.meta b/docs/manual/platform/ebcdic.xml.meta similarity index 100% rename from trunk/docs/manual/platform/ebcdic.xml.meta rename to docs/manual/platform/ebcdic.xml.meta diff --git a/trunk/docs/manual/platform/index.html b/docs/manual/platform/index.html similarity index 100% rename from trunk/docs/manual/platform/index.html rename to docs/manual/platform/index.html diff --git a/trunk/docs/manual/platform/index.html.en b/docs/manual/platform/index.html.en similarity index 100% rename from trunk/docs/manual/platform/index.html.en rename to docs/manual/platform/index.html.en diff --git a/trunk/docs/manual/platform/index.html.ko.euc-kr b/docs/manual/platform/index.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/platform/index.html.ko.euc-kr rename to docs/manual/platform/index.html.ko.euc-kr diff --git a/trunk/docs/manual/platform/index.xml b/docs/manual/platform/index.xml similarity index 100% rename from trunk/docs/manual/platform/index.xml rename to docs/manual/platform/index.xml diff --git a/trunk/docs/manual/platform/index.xml.ko b/docs/manual/platform/index.xml.ko similarity index 100% rename from trunk/docs/manual/platform/index.xml.ko rename to docs/manual/platform/index.xml.ko diff --git a/trunk/docs/manual/platform/index.xml.meta b/docs/manual/platform/index.xml.meta similarity index 100% rename from trunk/docs/manual/platform/index.xml.meta rename to docs/manual/platform/index.xml.meta diff --git a/trunk/docs/manual/platform/netware.html b/docs/manual/platform/netware.html similarity index 100% rename from trunk/docs/manual/platform/netware.html rename to docs/manual/platform/netware.html diff --git a/trunk/docs/manual/platform/netware.html.en b/docs/manual/platform/netware.html.en similarity index 100% rename from trunk/docs/manual/platform/netware.html.en rename to docs/manual/platform/netware.html.en diff --git a/trunk/docs/manual/platform/netware.html.ko.euc-kr b/docs/manual/platform/netware.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/platform/netware.html.ko.euc-kr rename to docs/manual/platform/netware.html.ko.euc-kr diff --git a/trunk/docs/manual/platform/netware.xml b/docs/manual/platform/netware.xml similarity index 100% rename from trunk/docs/manual/platform/netware.xml rename to docs/manual/platform/netware.xml diff --git a/trunk/docs/manual/platform/netware.xml.ko b/docs/manual/platform/netware.xml.ko similarity index 100% rename from trunk/docs/manual/platform/netware.xml.ko rename to docs/manual/platform/netware.xml.ko diff --git a/trunk/docs/manual/platform/netware.xml.meta b/docs/manual/platform/netware.xml.meta similarity index 100% rename from trunk/docs/manual/platform/netware.xml.meta rename to docs/manual/platform/netware.xml.meta diff --git a/trunk/docs/manual/platform/perf-hp.html b/docs/manual/platform/perf-hp.html similarity index 100% rename from trunk/docs/manual/platform/perf-hp.html rename to docs/manual/platform/perf-hp.html diff --git a/trunk/docs/manual/platform/perf-hp.html.en b/docs/manual/platform/perf-hp.html.en similarity index 100% rename from trunk/docs/manual/platform/perf-hp.html.en rename to docs/manual/platform/perf-hp.html.en diff --git a/trunk/docs/manual/platform/perf-hp.html.ko.euc-kr b/docs/manual/platform/perf-hp.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/platform/perf-hp.html.ko.euc-kr rename to docs/manual/platform/perf-hp.html.ko.euc-kr diff --git a/trunk/docs/manual/platform/perf-hp.xml b/docs/manual/platform/perf-hp.xml similarity index 100% rename from trunk/docs/manual/platform/perf-hp.xml rename to docs/manual/platform/perf-hp.xml diff --git a/trunk/docs/manual/platform/perf-hp.xml.ko b/docs/manual/platform/perf-hp.xml.ko similarity index 100% rename from trunk/docs/manual/platform/perf-hp.xml.ko rename to docs/manual/platform/perf-hp.xml.ko diff --git a/trunk/docs/manual/platform/perf-hp.xml.meta b/docs/manual/platform/perf-hp.xml.meta similarity index 100% rename from trunk/docs/manual/platform/perf-hp.xml.meta rename to docs/manual/platform/perf-hp.xml.meta diff --git a/trunk/docs/manual/platform/win_compiling.html b/docs/manual/platform/win_compiling.html similarity index 100% rename from trunk/docs/manual/platform/win_compiling.html rename to docs/manual/platform/win_compiling.html diff --git a/trunk/docs/manual/platform/win_compiling.html.en b/docs/manual/platform/win_compiling.html.en similarity index 100% rename from trunk/docs/manual/platform/win_compiling.html.en rename to docs/manual/platform/win_compiling.html.en diff --git a/trunk/docs/manual/platform/win_compiling.html.ko.euc-kr b/docs/manual/platform/win_compiling.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/platform/win_compiling.html.ko.euc-kr rename to docs/manual/platform/win_compiling.html.ko.euc-kr diff --git a/trunk/docs/manual/platform/win_compiling.xml b/docs/manual/platform/win_compiling.xml similarity index 100% rename from trunk/docs/manual/platform/win_compiling.xml rename to docs/manual/platform/win_compiling.xml diff --git a/trunk/docs/manual/platform/win_compiling.xml.ko b/docs/manual/platform/win_compiling.xml.ko similarity index 100% rename from trunk/docs/manual/platform/win_compiling.xml.ko rename to docs/manual/platform/win_compiling.xml.ko diff --git a/trunk/docs/manual/platform/win_compiling.xml.meta b/docs/manual/platform/win_compiling.xml.meta similarity index 100% rename from trunk/docs/manual/platform/win_compiling.xml.meta rename to docs/manual/platform/win_compiling.xml.meta diff --git a/trunk/docs/manual/platform/windows.html b/docs/manual/platform/windows.html similarity index 100% rename from trunk/docs/manual/platform/windows.html rename to docs/manual/platform/windows.html diff --git a/trunk/docs/manual/platform/windows.html.en b/docs/manual/platform/windows.html.en similarity index 100% rename from trunk/docs/manual/platform/windows.html.en rename to docs/manual/platform/windows.html.en diff --git a/trunk/docs/manual/platform/windows.html.ko.euc-kr b/docs/manual/platform/windows.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/platform/windows.html.ko.euc-kr rename to docs/manual/platform/windows.html.ko.euc-kr diff --git a/trunk/docs/manual/platform/windows.xml b/docs/manual/platform/windows.xml similarity index 100% rename from trunk/docs/manual/platform/windows.xml rename to docs/manual/platform/windows.xml diff --git a/trunk/docs/manual/platform/windows.xml.ko b/docs/manual/platform/windows.xml.ko similarity index 100% rename from trunk/docs/manual/platform/windows.xml.ko rename to docs/manual/platform/windows.xml.ko diff --git a/trunk/docs/manual/platform/windows.xml.meta b/docs/manual/platform/windows.xml.meta similarity index 100% rename from trunk/docs/manual/platform/windows.xml.meta rename to docs/manual/platform/windows.xml.meta diff --git a/trunk/docs/manual/programs/ab.html b/docs/manual/programs/ab.html similarity index 100% rename from trunk/docs/manual/programs/ab.html rename to docs/manual/programs/ab.html diff --git a/trunk/docs/manual/programs/ab.html.en b/docs/manual/programs/ab.html.en similarity index 100% rename from trunk/docs/manual/programs/ab.html.en rename to docs/manual/programs/ab.html.en diff --git a/trunk/docs/manual/programs/ab.html.ko.euc-kr b/docs/manual/programs/ab.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/programs/ab.html.ko.euc-kr rename to docs/manual/programs/ab.html.ko.euc-kr diff --git a/trunk/docs/manual/programs/ab.xml b/docs/manual/programs/ab.xml similarity index 100% rename from trunk/docs/manual/programs/ab.xml rename to docs/manual/programs/ab.xml diff --git a/trunk/docs/manual/programs/ab.xml.ko b/docs/manual/programs/ab.xml.ko similarity index 100% rename from trunk/docs/manual/programs/ab.xml.ko rename to docs/manual/programs/ab.xml.ko diff --git a/trunk/docs/manual/programs/ab.xml.meta b/docs/manual/programs/ab.xml.meta similarity index 100% rename from trunk/docs/manual/programs/ab.xml.meta rename to docs/manual/programs/ab.xml.meta diff --git a/trunk/docs/manual/programs/apachectl.html b/docs/manual/programs/apachectl.html similarity index 100% rename from trunk/docs/manual/programs/apachectl.html rename to docs/manual/programs/apachectl.html diff --git a/trunk/docs/manual/programs/apachectl.html.en b/docs/manual/programs/apachectl.html.en similarity index 100% rename from trunk/docs/manual/programs/apachectl.html.en rename to docs/manual/programs/apachectl.html.en diff --git a/trunk/docs/manual/programs/apachectl.html.ko.euc-kr b/docs/manual/programs/apachectl.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/programs/apachectl.html.ko.euc-kr rename to docs/manual/programs/apachectl.html.ko.euc-kr diff --git a/trunk/docs/manual/programs/apachectl.xml b/docs/manual/programs/apachectl.xml similarity index 100% rename from trunk/docs/manual/programs/apachectl.xml rename to docs/manual/programs/apachectl.xml diff --git a/trunk/docs/manual/programs/apachectl.xml.ko b/docs/manual/programs/apachectl.xml.ko similarity index 100% rename from trunk/docs/manual/programs/apachectl.xml.ko rename to docs/manual/programs/apachectl.xml.ko diff --git a/trunk/docs/manual/programs/apachectl.xml.meta b/docs/manual/programs/apachectl.xml.meta similarity index 100% rename from trunk/docs/manual/programs/apachectl.xml.meta rename to docs/manual/programs/apachectl.xml.meta diff --git a/trunk/docs/manual/programs/apxs.html b/docs/manual/programs/apxs.html similarity index 100% rename from trunk/docs/manual/programs/apxs.html rename to docs/manual/programs/apxs.html diff --git a/trunk/docs/manual/programs/apxs.html.en b/docs/manual/programs/apxs.html.en similarity index 100% rename from trunk/docs/manual/programs/apxs.html.en rename to docs/manual/programs/apxs.html.en diff --git a/trunk/docs/manual/programs/apxs.html.ko.euc-kr b/docs/manual/programs/apxs.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/programs/apxs.html.ko.euc-kr rename to docs/manual/programs/apxs.html.ko.euc-kr diff --git a/trunk/docs/manual/programs/apxs.xml b/docs/manual/programs/apxs.xml similarity index 100% rename from trunk/docs/manual/programs/apxs.xml rename to docs/manual/programs/apxs.xml diff --git a/trunk/docs/manual/programs/apxs.xml.ko b/docs/manual/programs/apxs.xml.ko similarity index 100% rename from trunk/docs/manual/programs/apxs.xml.ko rename to docs/manual/programs/apxs.xml.ko diff --git a/trunk/docs/manual/programs/apxs.xml.meta b/docs/manual/programs/apxs.xml.meta similarity index 100% rename from trunk/docs/manual/programs/apxs.xml.meta rename to docs/manual/programs/apxs.xml.meta diff --git a/trunk/docs/manual/programs/configure.html b/docs/manual/programs/configure.html similarity index 100% rename from trunk/docs/manual/programs/configure.html rename to docs/manual/programs/configure.html diff --git a/trunk/docs/manual/programs/configure.html.en b/docs/manual/programs/configure.html.en similarity index 100% rename from trunk/docs/manual/programs/configure.html.en rename to docs/manual/programs/configure.html.en diff --git a/trunk/docs/manual/programs/configure.html.ko.euc-kr b/docs/manual/programs/configure.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/programs/configure.html.ko.euc-kr rename to docs/manual/programs/configure.html.ko.euc-kr diff --git a/trunk/docs/manual/programs/configure.xml b/docs/manual/programs/configure.xml similarity index 100% rename from trunk/docs/manual/programs/configure.xml rename to docs/manual/programs/configure.xml diff --git a/trunk/docs/manual/programs/configure.xml.ko b/docs/manual/programs/configure.xml.ko similarity index 100% rename from trunk/docs/manual/programs/configure.xml.ko rename to docs/manual/programs/configure.xml.ko diff --git a/trunk/docs/manual/programs/configure.xml.meta b/docs/manual/programs/configure.xml.meta similarity index 100% rename from trunk/docs/manual/programs/configure.xml.meta rename to docs/manual/programs/configure.xml.meta diff --git a/trunk/docs/manual/programs/dbmmanage.html b/docs/manual/programs/dbmmanage.html similarity index 100% rename from trunk/docs/manual/programs/dbmmanage.html rename to docs/manual/programs/dbmmanage.html diff --git a/trunk/docs/manual/programs/dbmmanage.html.en b/docs/manual/programs/dbmmanage.html.en similarity index 100% rename from trunk/docs/manual/programs/dbmmanage.html.en rename to docs/manual/programs/dbmmanage.html.en diff --git a/trunk/docs/manual/programs/dbmmanage.html.ko.euc-kr b/docs/manual/programs/dbmmanage.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/programs/dbmmanage.html.ko.euc-kr rename to docs/manual/programs/dbmmanage.html.ko.euc-kr diff --git a/trunk/docs/manual/programs/dbmmanage.xml b/docs/manual/programs/dbmmanage.xml similarity index 100% rename from trunk/docs/manual/programs/dbmmanage.xml rename to docs/manual/programs/dbmmanage.xml diff --git a/trunk/docs/manual/programs/dbmmanage.xml.ko b/docs/manual/programs/dbmmanage.xml.ko similarity index 100% rename from trunk/docs/manual/programs/dbmmanage.xml.ko rename to docs/manual/programs/dbmmanage.xml.ko diff --git a/trunk/docs/manual/programs/dbmmanage.xml.meta b/docs/manual/programs/dbmmanage.xml.meta similarity index 100% rename from trunk/docs/manual/programs/dbmmanage.xml.meta rename to docs/manual/programs/dbmmanage.xml.meta diff --git a/trunk/docs/manual/programs/htcacheclean.html b/docs/manual/programs/htcacheclean.html similarity index 100% rename from trunk/docs/manual/programs/htcacheclean.html rename to docs/manual/programs/htcacheclean.html diff --git a/trunk/docs/manual/programs/htcacheclean.html.en b/docs/manual/programs/htcacheclean.html.en similarity index 100% rename from trunk/docs/manual/programs/htcacheclean.html.en rename to docs/manual/programs/htcacheclean.html.en diff --git a/trunk/docs/manual/programs/htcacheclean.html.ko.euc-kr b/docs/manual/programs/htcacheclean.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/programs/htcacheclean.html.ko.euc-kr rename to docs/manual/programs/htcacheclean.html.ko.euc-kr diff --git a/trunk/docs/manual/programs/htcacheclean.xml b/docs/manual/programs/htcacheclean.xml similarity index 100% rename from trunk/docs/manual/programs/htcacheclean.xml rename to docs/manual/programs/htcacheclean.xml diff --git a/trunk/docs/manual/programs/htcacheclean.xml.ko b/docs/manual/programs/htcacheclean.xml.ko similarity index 100% rename from trunk/docs/manual/programs/htcacheclean.xml.ko rename to docs/manual/programs/htcacheclean.xml.ko diff --git a/trunk/docs/manual/programs/htcacheclean.xml.meta b/docs/manual/programs/htcacheclean.xml.meta similarity index 100% rename from trunk/docs/manual/programs/htcacheclean.xml.meta rename to docs/manual/programs/htcacheclean.xml.meta diff --git a/trunk/docs/manual/programs/htdbm.html b/docs/manual/programs/htdbm.html similarity index 100% rename from trunk/docs/manual/programs/htdbm.html rename to docs/manual/programs/htdbm.html diff --git a/trunk/docs/manual/programs/htdbm.html.en b/docs/manual/programs/htdbm.html.en similarity index 100% rename from trunk/docs/manual/programs/htdbm.html.en rename to docs/manual/programs/htdbm.html.en diff --git a/trunk/docs/manual/programs/htdbm.xml b/docs/manual/programs/htdbm.xml similarity index 100% rename from trunk/docs/manual/programs/htdbm.xml rename to docs/manual/programs/htdbm.xml diff --git a/trunk/docs/manual/programs/htdbm.xml.meta b/docs/manual/programs/htdbm.xml.meta similarity index 100% rename from trunk/docs/manual/programs/htdbm.xml.meta rename to docs/manual/programs/htdbm.xml.meta diff --git a/trunk/docs/manual/programs/htdigest.html b/docs/manual/programs/htdigest.html similarity index 100% rename from trunk/docs/manual/programs/htdigest.html rename to docs/manual/programs/htdigest.html diff --git a/trunk/docs/manual/programs/htdigest.html.en b/docs/manual/programs/htdigest.html.en similarity index 100% rename from trunk/docs/manual/programs/htdigest.html.en rename to docs/manual/programs/htdigest.html.en diff --git a/trunk/docs/manual/programs/htdigest.html.ko.euc-kr b/docs/manual/programs/htdigest.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/programs/htdigest.html.ko.euc-kr rename to docs/manual/programs/htdigest.html.ko.euc-kr diff --git a/trunk/docs/manual/programs/htdigest.xml b/docs/manual/programs/htdigest.xml similarity index 100% rename from trunk/docs/manual/programs/htdigest.xml rename to docs/manual/programs/htdigest.xml diff --git a/trunk/docs/manual/programs/htdigest.xml.ko b/docs/manual/programs/htdigest.xml.ko similarity index 100% rename from trunk/docs/manual/programs/htdigest.xml.ko rename to docs/manual/programs/htdigest.xml.ko diff --git a/trunk/docs/manual/programs/htdigest.xml.meta b/docs/manual/programs/htdigest.xml.meta similarity index 100% rename from trunk/docs/manual/programs/htdigest.xml.meta rename to docs/manual/programs/htdigest.xml.meta diff --git a/trunk/docs/manual/programs/htpasswd.html b/docs/manual/programs/htpasswd.html similarity index 100% rename from trunk/docs/manual/programs/htpasswd.html rename to docs/manual/programs/htpasswd.html diff --git a/trunk/docs/manual/programs/htpasswd.html.en b/docs/manual/programs/htpasswd.html.en similarity index 100% rename from trunk/docs/manual/programs/htpasswd.html.en rename to docs/manual/programs/htpasswd.html.en diff --git a/trunk/docs/manual/programs/htpasswd.html.ko.euc-kr b/docs/manual/programs/htpasswd.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/programs/htpasswd.html.ko.euc-kr rename to docs/manual/programs/htpasswd.html.ko.euc-kr diff --git a/trunk/docs/manual/programs/htpasswd.xml b/docs/manual/programs/htpasswd.xml similarity index 100% rename from trunk/docs/manual/programs/htpasswd.xml rename to docs/manual/programs/htpasswd.xml diff --git a/trunk/docs/manual/programs/htpasswd.xml.ko b/docs/manual/programs/htpasswd.xml.ko similarity index 100% rename from trunk/docs/manual/programs/htpasswd.xml.ko rename to docs/manual/programs/htpasswd.xml.ko diff --git a/trunk/docs/manual/programs/htpasswd.xml.meta b/docs/manual/programs/htpasswd.xml.meta similarity index 100% rename from trunk/docs/manual/programs/htpasswd.xml.meta rename to docs/manual/programs/htpasswd.xml.meta diff --git a/trunk/docs/manual/programs/httpd.html b/docs/manual/programs/httpd.html similarity index 100% rename from trunk/docs/manual/programs/httpd.html rename to docs/manual/programs/httpd.html diff --git a/trunk/docs/manual/programs/httpd.html.en b/docs/manual/programs/httpd.html.en similarity index 100% rename from trunk/docs/manual/programs/httpd.html.en rename to docs/manual/programs/httpd.html.en diff --git a/trunk/docs/manual/programs/httpd.html.ko.euc-kr b/docs/manual/programs/httpd.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/programs/httpd.html.ko.euc-kr rename to docs/manual/programs/httpd.html.ko.euc-kr diff --git a/trunk/docs/manual/programs/httpd.xml b/docs/manual/programs/httpd.xml similarity index 100% rename from trunk/docs/manual/programs/httpd.xml rename to docs/manual/programs/httpd.xml diff --git a/trunk/docs/manual/programs/httpd.xml.ko b/docs/manual/programs/httpd.xml.ko similarity index 100% rename from trunk/docs/manual/programs/httpd.xml.ko rename to docs/manual/programs/httpd.xml.ko diff --git a/trunk/docs/manual/programs/httpd.xml.meta b/docs/manual/programs/httpd.xml.meta similarity index 100% rename from trunk/docs/manual/programs/httpd.xml.meta rename to docs/manual/programs/httpd.xml.meta diff --git a/trunk/docs/manual/programs/index.html b/docs/manual/programs/index.html similarity index 100% rename from trunk/docs/manual/programs/index.html rename to docs/manual/programs/index.html diff --git a/trunk/docs/manual/programs/index.html.en b/docs/manual/programs/index.html.en similarity index 100% rename from trunk/docs/manual/programs/index.html.en rename to docs/manual/programs/index.html.en diff --git a/trunk/docs/manual/programs/index.html.es b/docs/manual/programs/index.html.es similarity index 100% rename from trunk/docs/manual/programs/index.html.es rename to docs/manual/programs/index.html.es diff --git a/trunk/docs/manual/programs/index.html.ko.euc-kr b/docs/manual/programs/index.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/programs/index.html.ko.euc-kr rename to docs/manual/programs/index.html.ko.euc-kr diff --git a/trunk/docs/manual/programs/index.xml b/docs/manual/programs/index.xml similarity index 100% rename from trunk/docs/manual/programs/index.xml rename to docs/manual/programs/index.xml diff --git a/trunk/docs/manual/programs/index.xml.es b/docs/manual/programs/index.xml.es similarity index 100% rename from trunk/docs/manual/programs/index.xml.es rename to docs/manual/programs/index.xml.es diff --git a/trunk/docs/manual/programs/index.xml.ko b/docs/manual/programs/index.xml.ko similarity index 100% rename from trunk/docs/manual/programs/index.xml.ko rename to docs/manual/programs/index.xml.ko diff --git a/trunk/docs/manual/programs/index.xml.meta b/docs/manual/programs/index.xml.meta similarity index 100% rename from trunk/docs/manual/programs/index.xml.meta rename to docs/manual/programs/index.xml.meta diff --git a/trunk/docs/manual/programs/logresolve.html b/docs/manual/programs/logresolve.html similarity index 100% rename from trunk/docs/manual/programs/logresolve.html rename to docs/manual/programs/logresolve.html diff --git a/trunk/docs/manual/programs/logresolve.html.en b/docs/manual/programs/logresolve.html.en similarity index 100% rename from trunk/docs/manual/programs/logresolve.html.en rename to docs/manual/programs/logresolve.html.en diff --git a/trunk/docs/manual/programs/logresolve.html.ko.euc-kr b/docs/manual/programs/logresolve.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/programs/logresolve.html.ko.euc-kr rename to docs/manual/programs/logresolve.html.ko.euc-kr diff --git a/trunk/docs/manual/programs/logresolve.xml b/docs/manual/programs/logresolve.xml similarity index 100% rename from trunk/docs/manual/programs/logresolve.xml rename to docs/manual/programs/logresolve.xml diff --git a/trunk/docs/manual/programs/logresolve.xml.ko b/docs/manual/programs/logresolve.xml.ko similarity index 100% rename from trunk/docs/manual/programs/logresolve.xml.ko rename to docs/manual/programs/logresolve.xml.ko diff --git a/trunk/docs/manual/programs/logresolve.xml.meta b/docs/manual/programs/logresolve.xml.meta similarity index 100% rename from trunk/docs/manual/programs/logresolve.xml.meta rename to docs/manual/programs/logresolve.xml.meta diff --git a/trunk/docs/manual/programs/other.html b/docs/manual/programs/other.html similarity index 100% rename from trunk/docs/manual/programs/other.html rename to docs/manual/programs/other.html diff --git a/trunk/docs/manual/programs/other.html.en b/docs/manual/programs/other.html.en similarity index 100% rename from trunk/docs/manual/programs/other.html.en rename to docs/manual/programs/other.html.en diff --git a/trunk/docs/manual/programs/other.html.ko.euc-kr b/docs/manual/programs/other.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/programs/other.html.ko.euc-kr rename to docs/manual/programs/other.html.ko.euc-kr diff --git a/trunk/docs/manual/programs/other.xml b/docs/manual/programs/other.xml similarity index 100% rename from trunk/docs/manual/programs/other.xml rename to docs/manual/programs/other.xml diff --git a/trunk/docs/manual/programs/other.xml.ko b/docs/manual/programs/other.xml.ko similarity index 100% rename from trunk/docs/manual/programs/other.xml.ko rename to docs/manual/programs/other.xml.ko diff --git a/trunk/docs/manual/programs/other.xml.meta b/docs/manual/programs/other.xml.meta similarity index 100% rename from trunk/docs/manual/programs/other.xml.meta rename to docs/manual/programs/other.xml.meta diff --git a/trunk/docs/manual/programs/rotatelogs.html b/docs/manual/programs/rotatelogs.html similarity index 100% rename from trunk/docs/manual/programs/rotatelogs.html rename to docs/manual/programs/rotatelogs.html diff --git a/trunk/docs/manual/programs/rotatelogs.html.en b/docs/manual/programs/rotatelogs.html.en similarity index 100% rename from trunk/docs/manual/programs/rotatelogs.html.en rename to docs/manual/programs/rotatelogs.html.en diff --git a/trunk/docs/manual/programs/rotatelogs.html.ko.euc-kr b/docs/manual/programs/rotatelogs.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/programs/rotatelogs.html.ko.euc-kr rename to docs/manual/programs/rotatelogs.html.ko.euc-kr diff --git a/trunk/docs/manual/programs/rotatelogs.xml b/docs/manual/programs/rotatelogs.xml similarity index 100% rename from trunk/docs/manual/programs/rotatelogs.xml rename to docs/manual/programs/rotatelogs.xml diff --git a/trunk/docs/manual/programs/rotatelogs.xml.ko b/docs/manual/programs/rotatelogs.xml.ko similarity index 100% rename from trunk/docs/manual/programs/rotatelogs.xml.ko rename to docs/manual/programs/rotatelogs.xml.ko diff --git a/trunk/docs/manual/programs/rotatelogs.xml.meta b/docs/manual/programs/rotatelogs.xml.meta similarity index 100% rename from trunk/docs/manual/programs/rotatelogs.xml.meta rename to docs/manual/programs/rotatelogs.xml.meta diff --git a/trunk/docs/manual/programs/suexec.html b/docs/manual/programs/suexec.html similarity index 100% rename from trunk/docs/manual/programs/suexec.html rename to docs/manual/programs/suexec.html diff --git a/trunk/docs/manual/programs/suexec.html.en b/docs/manual/programs/suexec.html.en similarity index 100% rename from trunk/docs/manual/programs/suexec.html.en rename to docs/manual/programs/suexec.html.en diff --git a/trunk/docs/manual/programs/suexec.html.ko.euc-kr b/docs/manual/programs/suexec.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/programs/suexec.html.ko.euc-kr rename to docs/manual/programs/suexec.html.ko.euc-kr diff --git a/trunk/docs/manual/programs/suexec.xml b/docs/manual/programs/suexec.xml similarity index 100% rename from trunk/docs/manual/programs/suexec.xml rename to docs/manual/programs/suexec.xml diff --git a/trunk/docs/manual/programs/suexec.xml.ko b/docs/manual/programs/suexec.xml.ko similarity index 100% rename from trunk/docs/manual/programs/suexec.xml.ko rename to docs/manual/programs/suexec.xml.ko diff --git a/trunk/docs/manual/programs/suexec.xml.meta b/docs/manual/programs/suexec.xml.meta similarity index 100% rename from trunk/docs/manual/programs/suexec.xml.meta rename to docs/manual/programs/suexec.xml.meta diff --git a/trunk/docs/manual/rewrite/index.html b/docs/manual/rewrite/index.html similarity index 100% rename from trunk/docs/manual/rewrite/index.html rename to docs/manual/rewrite/index.html diff --git a/trunk/docs/manual/rewrite/index.html.en b/docs/manual/rewrite/index.html.en similarity index 100% rename from trunk/docs/manual/rewrite/index.html.en rename to docs/manual/rewrite/index.html.en diff --git a/trunk/docs/manual/rewrite/index.xml b/docs/manual/rewrite/index.xml similarity index 100% rename from trunk/docs/manual/rewrite/index.xml rename to docs/manual/rewrite/index.xml diff --git a/trunk/docs/manual/rewrite/index.xml.meta b/docs/manual/rewrite/index.xml.meta similarity index 100% rename from trunk/docs/manual/rewrite/index.xml.meta rename to docs/manual/rewrite/index.xml.meta diff --git a/trunk/docs/manual/rewrite/rewrite_guide.html b/docs/manual/rewrite/rewrite_guide.html similarity index 100% rename from trunk/docs/manual/rewrite/rewrite_guide.html rename to docs/manual/rewrite/rewrite_guide.html diff --git a/trunk/docs/manual/rewrite/rewrite_guide.html.en b/docs/manual/rewrite/rewrite_guide.html.en similarity index 100% rename from trunk/docs/manual/rewrite/rewrite_guide.html.en rename to docs/manual/rewrite/rewrite_guide.html.en diff --git a/trunk/docs/manual/rewrite/rewrite_guide.xml b/docs/manual/rewrite/rewrite_guide.xml similarity index 100% rename from trunk/docs/manual/rewrite/rewrite_guide.xml rename to docs/manual/rewrite/rewrite_guide.xml diff --git a/trunk/docs/manual/rewrite/rewrite_guide.xml.meta b/docs/manual/rewrite/rewrite_guide.xml.meta similarity index 100% rename from trunk/docs/manual/rewrite/rewrite_guide.xml.meta rename to docs/manual/rewrite/rewrite_guide.xml.meta diff --git a/trunk/docs/manual/rewrite/rewrite_guide_advanced.html b/docs/manual/rewrite/rewrite_guide_advanced.html similarity index 100% rename from trunk/docs/manual/rewrite/rewrite_guide_advanced.html rename to docs/manual/rewrite/rewrite_guide_advanced.html diff --git a/trunk/docs/manual/rewrite/rewrite_guide_advanced.html.en b/docs/manual/rewrite/rewrite_guide_advanced.html.en similarity index 100% rename from trunk/docs/manual/rewrite/rewrite_guide_advanced.html.en rename to docs/manual/rewrite/rewrite_guide_advanced.html.en diff --git a/trunk/docs/manual/rewrite/rewrite_guide_advanced.xml b/docs/manual/rewrite/rewrite_guide_advanced.xml similarity index 100% rename from trunk/docs/manual/rewrite/rewrite_guide_advanced.xml rename to docs/manual/rewrite/rewrite_guide_advanced.xml diff --git a/trunk/docs/manual/rewrite/rewrite_guide_advanced.xml.meta b/docs/manual/rewrite/rewrite_guide_advanced.xml.meta similarity index 100% rename from trunk/docs/manual/rewrite/rewrite_guide_advanced.xml.meta rename to docs/manual/rewrite/rewrite_guide_advanced.xml.meta diff --git a/trunk/docs/manual/rewrite/rewrite_intro.html b/docs/manual/rewrite/rewrite_intro.html similarity index 100% rename from trunk/docs/manual/rewrite/rewrite_intro.html rename to docs/manual/rewrite/rewrite_intro.html diff --git a/trunk/docs/manual/rewrite/rewrite_intro.html.en b/docs/manual/rewrite/rewrite_intro.html.en similarity index 100% rename from trunk/docs/manual/rewrite/rewrite_intro.html.en rename to docs/manual/rewrite/rewrite_intro.html.en diff --git a/trunk/docs/manual/rewrite/rewrite_intro.xml b/docs/manual/rewrite/rewrite_intro.xml similarity index 100% rename from trunk/docs/manual/rewrite/rewrite_intro.xml rename to docs/manual/rewrite/rewrite_intro.xml diff --git a/trunk/docs/manual/rewrite/rewrite_intro.xml.meta b/docs/manual/rewrite/rewrite_intro.xml.meta similarity index 100% rename from trunk/docs/manual/rewrite/rewrite_intro.xml.meta rename to docs/manual/rewrite/rewrite_intro.xml.meta diff --git a/trunk/docs/manual/rewrite/rewrite_tech.html b/docs/manual/rewrite/rewrite_tech.html similarity index 100% rename from trunk/docs/manual/rewrite/rewrite_tech.html rename to docs/manual/rewrite/rewrite_tech.html diff --git a/trunk/docs/manual/rewrite/rewrite_tech.html.en b/docs/manual/rewrite/rewrite_tech.html.en similarity index 100% rename from trunk/docs/manual/rewrite/rewrite_tech.html.en rename to docs/manual/rewrite/rewrite_tech.html.en diff --git a/trunk/docs/manual/rewrite/rewrite_tech.xml b/docs/manual/rewrite/rewrite_tech.xml similarity index 100% rename from trunk/docs/manual/rewrite/rewrite_tech.xml rename to docs/manual/rewrite/rewrite_tech.xml diff --git a/trunk/docs/manual/rewrite/rewrite_tech.xml.meta b/docs/manual/rewrite/rewrite_tech.xml.meta similarity index 100% rename from trunk/docs/manual/rewrite/rewrite_tech.xml.meta rename to docs/manual/rewrite/rewrite_tech.xml.meta diff --git a/trunk/docs/manual/sections.html b/docs/manual/sections.html similarity index 100% rename from trunk/docs/manual/sections.html rename to docs/manual/sections.html diff --git a/trunk/docs/manual/sections.html.en b/docs/manual/sections.html.en similarity index 100% rename from trunk/docs/manual/sections.html.en rename to docs/manual/sections.html.en diff --git a/trunk/docs/manual/sections.html.ja.euc-jp b/docs/manual/sections.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/sections.html.ja.euc-jp rename to docs/manual/sections.html.ja.euc-jp diff --git a/trunk/docs/manual/sections.html.ko.euc-kr b/docs/manual/sections.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/sections.html.ko.euc-kr rename to docs/manual/sections.html.ko.euc-kr diff --git a/trunk/docs/manual/sections.xml b/docs/manual/sections.xml similarity index 100% rename from trunk/docs/manual/sections.xml rename to docs/manual/sections.xml diff --git a/trunk/docs/manual/sections.xml.ja b/docs/manual/sections.xml.ja similarity index 100% rename from trunk/docs/manual/sections.xml.ja rename to docs/manual/sections.xml.ja diff --git a/trunk/docs/manual/sections.xml.ko b/docs/manual/sections.xml.ko similarity index 100% rename from trunk/docs/manual/sections.xml.ko rename to docs/manual/sections.xml.ko diff --git a/trunk/docs/manual/sections.xml.meta b/docs/manual/sections.xml.meta similarity index 100% rename from trunk/docs/manual/sections.xml.meta rename to docs/manual/sections.xml.meta diff --git a/trunk/docs/manual/server-wide.html b/docs/manual/server-wide.html similarity index 100% rename from trunk/docs/manual/server-wide.html rename to docs/manual/server-wide.html diff --git a/trunk/docs/manual/server-wide.html.en b/docs/manual/server-wide.html.en similarity index 100% rename from trunk/docs/manual/server-wide.html.en rename to docs/manual/server-wide.html.en diff --git a/trunk/docs/manual/server-wide.html.ja.euc-jp b/docs/manual/server-wide.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/server-wide.html.ja.euc-jp rename to docs/manual/server-wide.html.ja.euc-jp diff --git a/trunk/docs/manual/server-wide.html.ko.euc-kr b/docs/manual/server-wide.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/server-wide.html.ko.euc-kr rename to docs/manual/server-wide.html.ko.euc-kr diff --git a/trunk/docs/manual/server-wide.xml b/docs/manual/server-wide.xml similarity index 100% rename from trunk/docs/manual/server-wide.xml rename to docs/manual/server-wide.xml diff --git a/trunk/docs/manual/server-wide.xml.ja b/docs/manual/server-wide.xml.ja similarity index 100% rename from trunk/docs/manual/server-wide.xml.ja rename to docs/manual/server-wide.xml.ja diff --git a/trunk/docs/manual/server-wide.xml.ko b/docs/manual/server-wide.xml.ko similarity index 100% rename from trunk/docs/manual/server-wide.xml.ko rename to docs/manual/server-wide.xml.ko diff --git a/trunk/docs/manual/server-wide.xml.meta b/docs/manual/server-wide.xml.meta similarity index 100% rename from trunk/docs/manual/server-wide.xml.meta rename to docs/manual/server-wide.xml.meta diff --git a/trunk/docs/manual/sitemap.html b/docs/manual/sitemap.html similarity index 100% rename from trunk/docs/manual/sitemap.html rename to docs/manual/sitemap.html diff --git a/trunk/docs/manual/sitemap.html.de b/docs/manual/sitemap.html.de similarity index 100% rename from trunk/docs/manual/sitemap.html.de rename to docs/manual/sitemap.html.de diff --git a/trunk/docs/manual/sitemap.html.en b/docs/manual/sitemap.html.en similarity index 100% rename from trunk/docs/manual/sitemap.html.en rename to docs/manual/sitemap.html.en diff --git a/trunk/docs/manual/sitemap.html.es b/docs/manual/sitemap.html.es similarity index 100% rename from trunk/docs/manual/sitemap.html.es rename to docs/manual/sitemap.html.es diff --git a/trunk/docs/manual/sitemap.html.ja.euc-jp b/docs/manual/sitemap.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/sitemap.html.ja.euc-jp rename to docs/manual/sitemap.html.ja.euc-jp diff --git a/trunk/docs/manual/sitemap.html.ko.euc-kr b/docs/manual/sitemap.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/sitemap.html.ko.euc-kr rename to docs/manual/sitemap.html.ko.euc-kr diff --git a/trunk/docs/manual/sitemap.xml b/docs/manual/sitemap.xml similarity index 100% rename from trunk/docs/manual/sitemap.xml rename to docs/manual/sitemap.xml diff --git a/trunk/docs/manual/sitemap.xml.de b/docs/manual/sitemap.xml.de similarity index 100% rename from trunk/docs/manual/sitemap.xml.de rename to docs/manual/sitemap.xml.de diff --git a/trunk/docs/manual/sitemap.xml.es b/docs/manual/sitemap.xml.es similarity index 100% rename from trunk/docs/manual/sitemap.xml.es rename to docs/manual/sitemap.xml.es diff --git a/trunk/docs/manual/sitemap.xml.ja b/docs/manual/sitemap.xml.ja similarity index 100% rename from trunk/docs/manual/sitemap.xml.ja rename to docs/manual/sitemap.xml.ja diff --git a/trunk/docs/manual/sitemap.xml.ko b/docs/manual/sitemap.xml.ko similarity index 100% rename from trunk/docs/manual/sitemap.xml.ko rename to docs/manual/sitemap.xml.ko diff --git a/trunk/docs/manual/sitemap.xml.meta b/docs/manual/sitemap.xml.meta similarity index 100% rename from trunk/docs/manual/sitemap.xml.meta rename to docs/manual/sitemap.xml.meta diff --git a/trunk/docs/manual/ssl/index.html b/docs/manual/ssl/index.html similarity index 100% rename from trunk/docs/manual/ssl/index.html rename to docs/manual/ssl/index.html diff --git a/trunk/docs/manual/ssl/index.html.en b/docs/manual/ssl/index.html.en similarity index 100% rename from trunk/docs/manual/ssl/index.html.en rename to docs/manual/ssl/index.html.en diff --git a/trunk/docs/manual/ssl/index.html.ja.euc-jp b/docs/manual/ssl/index.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/ssl/index.html.ja.euc-jp rename to docs/manual/ssl/index.html.ja.euc-jp diff --git a/trunk/docs/manual/ssl/index.xml b/docs/manual/ssl/index.xml similarity index 100% rename from trunk/docs/manual/ssl/index.xml rename to docs/manual/ssl/index.xml diff --git a/trunk/docs/manual/ssl/index.xml.ja b/docs/manual/ssl/index.xml.ja similarity index 100% rename from trunk/docs/manual/ssl/index.xml.ja rename to docs/manual/ssl/index.xml.ja diff --git a/trunk/docs/manual/ssl/index.xml.meta b/docs/manual/ssl/index.xml.meta similarity index 100% rename from trunk/docs/manual/ssl/index.xml.meta rename to docs/manual/ssl/index.xml.meta diff --git a/trunk/docs/manual/ssl/ssl_compat.html b/docs/manual/ssl/ssl_compat.html similarity index 100% rename from trunk/docs/manual/ssl/ssl_compat.html rename to docs/manual/ssl/ssl_compat.html diff --git a/trunk/docs/manual/ssl/ssl_compat.html.en b/docs/manual/ssl/ssl_compat.html.en similarity index 100% rename from trunk/docs/manual/ssl/ssl_compat.html.en rename to docs/manual/ssl/ssl_compat.html.en diff --git a/trunk/docs/manual/ssl/ssl_compat.xml b/docs/manual/ssl/ssl_compat.xml similarity index 100% rename from trunk/docs/manual/ssl/ssl_compat.xml rename to docs/manual/ssl/ssl_compat.xml diff --git a/trunk/docs/manual/ssl/ssl_compat.xml.meta b/docs/manual/ssl/ssl_compat.xml.meta similarity index 100% rename from trunk/docs/manual/ssl/ssl_compat.xml.meta rename to docs/manual/ssl/ssl_compat.xml.meta diff --git a/trunk/docs/manual/ssl/ssl_faq.html b/docs/manual/ssl/ssl_faq.html similarity index 100% rename from trunk/docs/manual/ssl/ssl_faq.html rename to docs/manual/ssl/ssl_faq.html diff --git a/trunk/docs/manual/ssl/ssl_faq.html.en b/docs/manual/ssl/ssl_faq.html.en similarity index 100% rename from trunk/docs/manual/ssl/ssl_faq.html.en rename to docs/manual/ssl/ssl_faq.html.en diff --git a/trunk/docs/manual/ssl/ssl_faq.xml b/docs/manual/ssl/ssl_faq.xml similarity index 100% rename from trunk/docs/manual/ssl/ssl_faq.xml rename to docs/manual/ssl/ssl_faq.xml diff --git a/trunk/docs/manual/ssl/ssl_faq.xml.meta b/docs/manual/ssl/ssl_faq.xml.meta similarity index 100% rename from trunk/docs/manual/ssl/ssl_faq.xml.meta rename to docs/manual/ssl/ssl_faq.xml.meta diff --git a/trunk/docs/manual/ssl/ssl_howto.html b/docs/manual/ssl/ssl_howto.html similarity index 100% rename from trunk/docs/manual/ssl/ssl_howto.html rename to docs/manual/ssl/ssl_howto.html diff --git a/trunk/docs/manual/ssl/ssl_howto.html.en b/docs/manual/ssl/ssl_howto.html.en similarity index 100% rename from trunk/docs/manual/ssl/ssl_howto.html.en rename to docs/manual/ssl/ssl_howto.html.en diff --git a/trunk/docs/manual/ssl/ssl_howto.xml b/docs/manual/ssl/ssl_howto.xml similarity index 100% rename from trunk/docs/manual/ssl/ssl_howto.xml rename to docs/manual/ssl/ssl_howto.xml diff --git a/trunk/docs/manual/ssl/ssl_howto.xml.meta b/docs/manual/ssl/ssl_howto.xml.meta similarity index 100% rename from trunk/docs/manual/ssl/ssl_howto.xml.meta rename to docs/manual/ssl/ssl_howto.xml.meta diff --git a/trunk/docs/manual/ssl/ssl_intro.html b/docs/manual/ssl/ssl_intro.html similarity index 100% rename from trunk/docs/manual/ssl/ssl_intro.html rename to docs/manual/ssl/ssl_intro.html diff --git a/trunk/docs/manual/ssl/ssl_intro.html.en b/docs/manual/ssl/ssl_intro.html.en similarity index 100% rename from trunk/docs/manual/ssl/ssl_intro.html.en rename to docs/manual/ssl/ssl_intro.html.en diff --git a/trunk/docs/manual/ssl/ssl_intro.html.ja.euc-jp b/docs/manual/ssl/ssl_intro.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/ssl/ssl_intro.html.ja.euc-jp rename to docs/manual/ssl/ssl_intro.html.ja.euc-jp diff --git a/trunk/docs/manual/ssl/ssl_intro.xml b/docs/manual/ssl/ssl_intro.xml similarity index 100% rename from trunk/docs/manual/ssl/ssl_intro.xml rename to docs/manual/ssl/ssl_intro.xml diff --git a/trunk/docs/manual/ssl/ssl_intro.xml.ja b/docs/manual/ssl/ssl_intro.xml.ja similarity index 100% rename from trunk/docs/manual/ssl/ssl_intro.xml.ja rename to docs/manual/ssl/ssl_intro.xml.ja diff --git a/trunk/docs/manual/ssl/ssl_intro.xml.meta b/docs/manual/ssl/ssl_intro.xml.meta similarity index 100% rename from trunk/docs/manual/ssl/ssl_intro.xml.meta rename to docs/manual/ssl/ssl_intro.xml.meta diff --git a/trunk/docs/manual/stopping.html b/docs/manual/stopping.html similarity index 100% rename from trunk/docs/manual/stopping.html rename to docs/manual/stopping.html diff --git a/trunk/docs/manual/stopping.html.de b/docs/manual/stopping.html.de similarity index 100% rename from trunk/docs/manual/stopping.html.de rename to docs/manual/stopping.html.de diff --git a/trunk/docs/manual/stopping.html.en b/docs/manual/stopping.html.en similarity index 100% rename from trunk/docs/manual/stopping.html.en rename to docs/manual/stopping.html.en diff --git a/trunk/docs/manual/stopping.html.es b/docs/manual/stopping.html.es similarity index 100% rename from trunk/docs/manual/stopping.html.es rename to docs/manual/stopping.html.es diff --git a/trunk/docs/manual/stopping.html.ja.euc-jp b/docs/manual/stopping.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/stopping.html.ja.euc-jp rename to docs/manual/stopping.html.ja.euc-jp diff --git a/trunk/docs/manual/stopping.html.ko.euc-kr b/docs/manual/stopping.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/stopping.html.ko.euc-kr rename to docs/manual/stopping.html.ko.euc-kr diff --git a/trunk/docs/manual/stopping.xml b/docs/manual/stopping.xml similarity index 100% rename from trunk/docs/manual/stopping.xml rename to docs/manual/stopping.xml diff --git a/trunk/docs/manual/stopping.xml.de b/docs/manual/stopping.xml.de similarity index 100% rename from trunk/docs/manual/stopping.xml.de rename to docs/manual/stopping.xml.de diff --git a/trunk/docs/manual/stopping.xml.es b/docs/manual/stopping.xml.es similarity index 100% rename from trunk/docs/manual/stopping.xml.es rename to docs/manual/stopping.xml.es diff --git a/trunk/docs/manual/stopping.xml.ja b/docs/manual/stopping.xml.ja similarity index 100% rename from trunk/docs/manual/stopping.xml.ja rename to docs/manual/stopping.xml.ja diff --git a/trunk/docs/manual/stopping.xml.ko b/docs/manual/stopping.xml.ko similarity index 100% rename from trunk/docs/manual/stopping.xml.ko rename to docs/manual/stopping.xml.ko diff --git a/trunk/docs/manual/stopping.xml.meta b/docs/manual/stopping.xml.meta similarity index 100% rename from trunk/docs/manual/stopping.xml.meta rename to docs/manual/stopping.xml.meta diff --git a/trunk/docs/manual/style/build.properties b/docs/manual/style/build.properties similarity index 100% rename from trunk/docs/manual/style/build.properties rename to docs/manual/style/build.properties diff --git a/trunk/docs/manual/style/common.dtd b/docs/manual/style/common.dtd similarity index 100% rename from trunk/docs/manual/style/common.dtd rename to docs/manual/style/common.dtd diff --git a/trunk/docs/manual/style/css/manual-chm.css b/docs/manual/style/css/manual-chm.css similarity index 100% rename from trunk/docs/manual/style/css/manual-chm.css rename to docs/manual/style/css/manual-chm.css diff --git a/trunk/docs/manual/style/css/manual-loose-100pc.css b/docs/manual/style/css/manual-loose-100pc.css similarity index 100% rename from trunk/docs/manual/style/css/manual-loose-100pc.css rename to docs/manual/style/css/manual-loose-100pc.css diff --git a/trunk/docs/manual/style/css/manual-print.css b/docs/manual/style/css/manual-print.css similarity index 100% rename from trunk/docs/manual/style/css/manual-print.css rename to docs/manual/style/css/manual-print.css diff --git a/trunk/docs/manual/style/css/manual-zip-100pc.css b/docs/manual/style/css/manual-zip-100pc.css similarity index 100% rename from trunk/docs/manual/style/css/manual-zip-100pc.css rename to docs/manual/style/css/manual-zip-100pc.css diff --git a/trunk/docs/manual/style/css/manual-zip.css b/docs/manual/style/css/manual-zip.css similarity index 100% rename from trunk/docs/manual/style/css/manual-zip.css rename to docs/manual/style/css/manual-zip.css diff --git a/trunk/docs/manual/style/css/manual.css b/docs/manual/style/css/manual.css similarity index 100% rename from trunk/docs/manual/style/css/manual.css rename to docs/manual/style/css/manual.css diff --git a/trunk/docs/manual/style/description.xml b/docs/manual/style/description.xml similarity index 100% rename from trunk/docs/manual/style/description.xml rename to docs/manual/style/description.xml diff --git a/trunk/docs/manual/style/faq.dtd b/docs/manual/style/faq.dtd similarity index 100% rename from trunk/docs/manual/style/faq.dtd rename to docs/manual/style/faq.dtd diff --git a/trunk/docs/manual/style/lang-targets.xml b/docs/manual/style/lang-targets.xml similarity index 100% rename from trunk/docs/manual/style/lang-targets.xml rename to docs/manual/style/lang-targets.xml diff --git a/trunk/docs/manual/style/lang/de.xml b/docs/manual/style/lang/de.xml similarity index 100% rename from trunk/docs/manual/style/lang/de.xml rename to docs/manual/style/lang/de.xml diff --git a/trunk/docs/manual/style/lang/en.xml b/docs/manual/style/lang/en.xml similarity index 100% rename from trunk/docs/manual/style/lang/en.xml rename to docs/manual/style/lang/en.xml diff --git a/trunk/docs/manual/style/lang/es.xml b/docs/manual/style/lang/es.xml similarity index 100% rename from trunk/docs/manual/style/lang/es.xml rename to docs/manual/style/lang/es.xml diff --git a/trunk/docs/manual/style/lang/fr.xml b/docs/manual/style/lang/fr.xml similarity index 100% rename from trunk/docs/manual/style/lang/fr.xml rename to docs/manual/style/lang/fr.xml diff --git a/trunk/docs/manual/style/lang/ja.xml b/docs/manual/style/lang/ja.xml similarity index 100% rename from trunk/docs/manual/style/lang/ja.xml rename to docs/manual/style/lang/ja.xml diff --git a/trunk/docs/manual/style/lang/ko.xml b/docs/manual/style/lang/ko.xml similarity index 100% rename from trunk/docs/manual/style/lang/ko.xml rename to docs/manual/style/lang/ko.xml diff --git a/trunk/docs/manual/style/lang/pt-br.xml b/docs/manual/style/lang/pt-br.xml similarity index 100% rename from trunk/docs/manual/style/lang/pt-br.xml rename to docs/manual/style/lang/pt-br.xml diff --git a/trunk/docs/manual/style/lang/ru.xml b/docs/manual/style/lang/ru.xml similarity index 100% rename from trunk/docs/manual/style/lang/ru.xml rename to docs/manual/style/lang/ru.xml diff --git a/trunk/docs/manual/style/latex/atbeginend.sty b/docs/manual/style/latex/atbeginend.sty similarity index 100% rename from trunk/docs/manual/style/latex/atbeginend.sty rename to docs/manual/style/latex/atbeginend.sty diff --git a/trunk/docs/manual/style/latex/common.xsl b/docs/manual/style/latex/common.xsl similarity index 100% rename from trunk/docs/manual/style/latex/common.xsl rename to docs/manual/style/latex/common.xsl diff --git a/trunk/docs/manual/style/latex/directiveindex.xsl b/docs/manual/style/latex/directiveindex.xsl similarity index 100% rename from trunk/docs/manual/style/latex/directiveindex.xsl rename to docs/manual/style/latex/directiveindex.xsl diff --git a/trunk/docs/manual/style/latex/faq.xsl b/docs/manual/style/latex/faq.xsl similarity index 100% rename from trunk/docs/manual/style/latex/faq.xsl rename to docs/manual/style/latex/faq.xsl diff --git a/trunk/docs/manual/style/latex/html.xsl b/docs/manual/style/latex/html.xsl similarity index 100% rename from trunk/docs/manual/style/latex/html.xsl rename to docs/manual/style/latex/html.xsl diff --git a/trunk/docs/manual/style/latex/latex.xsl b/docs/manual/style/latex/latex.xsl similarity index 100% rename from trunk/docs/manual/style/latex/latex.xsl rename to docs/manual/style/latex/latex.xsl diff --git a/trunk/docs/manual/style/latex/manualpage.xsl b/docs/manual/style/latex/manualpage.xsl similarity index 100% rename from trunk/docs/manual/style/latex/manualpage.xsl rename to docs/manual/style/latex/manualpage.xsl diff --git a/trunk/docs/manual/style/latex/moduleindex.xsl b/docs/manual/style/latex/moduleindex.xsl similarity index 100% rename from trunk/docs/manual/style/latex/moduleindex.xsl rename to docs/manual/style/latex/moduleindex.xsl diff --git a/trunk/docs/manual/style/latex/quickreference.xsl b/docs/manual/style/latex/quickreference.xsl similarity index 100% rename from trunk/docs/manual/style/latex/quickreference.xsl rename to docs/manual/style/latex/quickreference.xsl diff --git a/trunk/docs/manual/style/latex/synopsis.xsl b/docs/manual/style/latex/synopsis.xsl similarity index 100% rename from trunk/docs/manual/style/latex/synopsis.xsl rename to docs/manual/style/latex/synopsis.xsl diff --git a/trunk/docs/manual/style/manual.de.xsl b/docs/manual/style/manual.de.xsl similarity index 100% rename from trunk/docs/manual/style/manual.de.xsl rename to docs/manual/style/manual.de.xsl diff --git a/trunk/docs/manual/style/manual.en.xsl b/docs/manual/style/manual.en.xsl similarity index 100% rename from trunk/docs/manual/style/manual.en.xsl rename to docs/manual/style/manual.en.xsl diff --git a/trunk/docs/manual/style/manual.es.xsl b/docs/manual/style/manual.es.xsl similarity index 100% rename from trunk/docs/manual/style/manual.es.xsl rename to docs/manual/style/manual.es.xsl diff --git a/trunk/docs/manual/style/manual.fr.xsl b/docs/manual/style/manual.fr.xsl similarity index 100% rename from trunk/docs/manual/style/manual.fr.xsl rename to docs/manual/style/manual.fr.xsl diff --git a/trunk/docs/manual/style/manual.ja.xsl b/docs/manual/style/manual.ja.xsl similarity index 100% rename from trunk/docs/manual/style/manual.ja.xsl rename to docs/manual/style/manual.ja.xsl diff --git a/trunk/docs/manual/style/manual.ko.xsl b/docs/manual/style/manual.ko.xsl similarity index 100% rename from trunk/docs/manual/style/manual.ko.xsl rename to docs/manual/style/manual.ko.xsl diff --git a/trunk/docs/manual/style/manual.pt-br.xsl b/docs/manual/style/manual.pt-br.xsl similarity index 100% rename from trunk/docs/manual/style/manual.pt-br.xsl rename to docs/manual/style/manual.pt-br.xsl diff --git a/trunk/docs/manual/style/manual.ru.xsl b/docs/manual/style/manual.ru.xsl similarity index 100% rename from trunk/docs/manual/style/manual.ru.xsl rename to docs/manual/style/manual.ru.xsl diff --git a/trunk/docs/manual/style/manualpage.dtd b/docs/manual/style/manualpage.dtd similarity index 100% rename from trunk/docs/manual/style/manualpage.dtd rename to docs/manual/style/manualpage.dtd diff --git a/trunk/docs/manual/style/modulesynopsis.dtd b/docs/manual/style/modulesynopsis.dtd similarity index 100% rename from trunk/docs/manual/style/modulesynopsis.dtd rename to docs/manual/style/modulesynopsis.dtd diff --git a/trunk/docs/manual/style/sitemap.dtd b/docs/manual/style/sitemap.dtd similarity index 100% rename from trunk/docs/manual/style/sitemap.dtd rename to docs/manual/style/sitemap.dtd diff --git a/trunk/docs/manual/style/xsl/common.xsl b/docs/manual/style/xsl/common.xsl similarity index 100% rename from trunk/docs/manual/style/xsl/common.xsl rename to docs/manual/style/xsl/common.xsl diff --git a/trunk/docs/manual/style/xsl/directiveindex.xsl b/docs/manual/style/xsl/directiveindex.xsl similarity index 100% rename from trunk/docs/manual/style/xsl/directiveindex.xsl rename to docs/manual/style/xsl/directiveindex.xsl diff --git a/trunk/docs/manual/style/xsl/faq.xsl b/docs/manual/style/xsl/faq.xsl similarity index 100% rename from trunk/docs/manual/style/xsl/faq.xsl rename to docs/manual/style/xsl/faq.xsl diff --git a/trunk/docs/manual/style/xsl/hhc.xsl b/docs/manual/style/xsl/hhc.xsl similarity index 100% rename from trunk/docs/manual/style/xsl/hhc.xsl rename to docs/manual/style/xsl/hhc.xsl diff --git a/trunk/docs/manual/style/xsl/hhp.xsl b/docs/manual/style/xsl/hhp.xsl similarity index 100% rename from trunk/docs/manual/style/xsl/hhp.xsl rename to docs/manual/style/xsl/hhp.xsl diff --git a/trunk/docs/manual/style/xsl/indexpage.xsl b/docs/manual/style/xsl/indexpage.xsl similarity index 100% rename from trunk/docs/manual/style/xsl/indexpage.xsl rename to docs/manual/style/xsl/indexpage.xsl diff --git a/trunk/docs/manual/style/xsl/language.xsl b/docs/manual/style/xsl/language.xsl similarity index 100% rename from trunk/docs/manual/style/xsl/language.xsl rename to docs/manual/style/xsl/language.xsl diff --git a/trunk/docs/manual/style/xsl/maf.xsl b/docs/manual/style/xsl/maf.xsl similarity index 100% rename from trunk/docs/manual/style/xsl/maf.xsl rename to docs/manual/style/xsl/maf.xsl diff --git a/trunk/docs/manual/style/xsl/manualpage.xsl b/docs/manual/style/xsl/manualpage.xsl similarity index 100% rename from trunk/docs/manual/style/xsl/manualpage.xsl rename to docs/manual/style/xsl/manualpage.xsl diff --git a/trunk/docs/manual/style/xsl/moduleindex.xsl b/docs/manual/style/xsl/moduleindex.xsl similarity index 100% rename from trunk/docs/manual/style/xsl/moduleindex.xsl rename to docs/manual/style/xsl/moduleindex.xsl diff --git a/trunk/docs/manual/style/xsl/nroff.xsl b/docs/manual/style/xsl/nroff.xsl similarity index 100% rename from trunk/docs/manual/style/xsl/nroff.xsl rename to docs/manual/style/xsl/nroff.xsl diff --git a/trunk/docs/manual/style/xsl/quickreference.xsl b/docs/manual/style/xsl/quickreference.xsl similarity index 100% rename from trunk/docs/manual/style/xsl/quickreference.xsl rename to docs/manual/style/xsl/quickreference.xsl diff --git a/trunk/docs/manual/style/xsl/sitemap.xsl b/docs/manual/style/xsl/sitemap.xsl similarity index 100% rename from trunk/docs/manual/style/xsl/sitemap.xsl rename to docs/manual/style/xsl/sitemap.xsl diff --git a/trunk/docs/manual/style/xsl/synopsis.xsl b/docs/manual/style/xsl/synopsis.xsl similarity index 100% rename from trunk/docs/manual/style/xsl/synopsis.xsl rename to docs/manual/style/xsl/synopsis.xsl diff --git a/trunk/docs/manual/style/xsl/typemap.xsl b/docs/manual/style/xsl/typemap.xsl similarity index 100% rename from trunk/docs/manual/style/xsl/typemap.xsl rename to docs/manual/style/xsl/typemap.xsl diff --git a/trunk/docs/manual/style/xsl/util/allmodules.xml b/docs/manual/style/xsl/util/allmodules.xml similarity index 100% rename from trunk/docs/manual/style/xsl/util/allmodules.xml rename to docs/manual/style/xsl/util/allmodules.xml diff --git a/trunk/docs/manual/style/xsl/util/designations.xml b/docs/manual/style/xsl/util/designations.xml similarity index 100% rename from trunk/docs/manual/style/xsl/util/designations.xml rename to docs/manual/style/xsl/util/designations.xml diff --git a/trunk/docs/manual/style/xsl/util/lf.xml b/docs/manual/style/xsl/util/lf.xml similarity index 100% rename from trunk/docs/manual/style/xsl/util/lf.xml rename to docs/manual/style/xsl/util/lf.xml diff --git a/trunk/docs/manual/style/xsl/util/li-end.xml b/docs/manual/style/xsl/util/li-end.xml similarity index 100% rename from trunk/docs/manual/style/xsl/util/li-end.xml rename to docs/manual/style/xsl/util/li-end.xml diff --git a/trunk/docs/manual/style/xsl/util/li-start.xml b/docs/manual/style/xsl/util/li-start.xml similarity index 100% rename from trunk/docs/manual/style/xsl/util/li-start.xml rename to docs/manual/style/xsl/util/li-start.xml diff --git a/trunk/docs/manual/style/xsl/util/modtrans.xsl b/docs/manual/style/xsl/util/modtrans.xsl similarity index 100% rename from trunk/docs/manual/style/xsl/util/modtrans.xsl rename to docs/manual/style/xsl/util/modtrans.xsl diff --git a/trunk/docs/manual/style/xsl/util/nbsp.xml b/docs/manual/style/xsl/util/nbsp.xml similarity index 100% rename from trunk/docs/manual/style/xsl/util/nbsp.xml rename to docs/manual/style/xsl/util/nbsp.xml diff --git a/trunk/docs/manual/style/xsl/util/tab.xml b/docs/manual/style/xsl/util/tab.xml similarity index 100% rename from trunk/docs/manual/style/xsl/util/tab.xml rename to docs/manual/style/xsl/util/tab.xml diff --git a/trunk/docs/manual/style/xsl/util/ul-end.xml b/docs/manual/style/xsl/util/ul-end.xml similarity index 100% rename from trunk/docs/manual/style/xsl/util/ul-end.xml rename to docs/manual/style/xsl/util/ul-end.xml diff --git a/trunk/docs/manual/style/xsl/util/ul-start.xml b/docs/manual/style/xsl/util/ul-start.xml similarity index 100% rename from trunk/docs/manual/style/xsl/util/ul-start.xml rename to docs/manual/style/xsl/util/ul-start.xml diff --git a/trunk/docs/manual/suexec.html b/docs/manual/suexec.html similarity index 100% rename from trunk/docs/manual/suexec.html rename to docs/manual/suexec.html diff --git a/trunk/docs/manual/suexec.html.en b/docs/manual/suexec.html.en similarity index 100% rename from trunk/docs/manual/suexec.html.en rename to docs/manual/suexec.html.en diff --git a/trunk/docs/manual/suexec.html.ja.euc-jp b/docs/manual/suexec.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/suexec.html.ja.euc-jp rename to docs/manual/suexec.html.ja.euc-jp diff --git a/trunk/docs/manual/suexec.html.ko.euc-kr b/docs/manual/suexec.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/suexec.html.ko.euc-kr rename to docs/manual/suexec.html.ko.euc-kr diff --git a/trunk/docs/manual/suexec.xml b/docs/manual/suexec.xml similarity index 100% rename from trunk/docs/manual/suexec.xml rename to docs/manual/suexec.xml diff --git a/trunk/docs/manual/suexec.xml.ja b/docs/manual/suexec.xml.ja similarity index 100% rename from trunk/docs/manual/suexec.xml.ja rename to docs/manual/suexec.xml.ja diff --git a/trunk/docs/manual/suexec.xml.ko b/docs/manual/suexec.xml.ko similarity index 100% rename from trunk/docs/manual/suexec.xml.ko rename to docs/manual/suexec.xml.ko diff --git a/trunk/docs/manual/suexec.xml.meta b/docs/manual/suexec.xml.meta similarity index 100% rename from trunk/docs/manual/suexec.xml.meta rename to docs/manual/suexec.xml.meta diff --git a/trunk/docs/manual/upgrading.html b/docs/manual/upgrading.html similarity index 100% rename from trunk/docs/manual/upgrading.html rename to docs/manual/upgrading.html diff --git a/trunk/docs/manual/upgrading.html.de b/docs/manual/upgrading.html.de similarity index 100% rename from trunk/docs/manual/upgrading.html.de rename to docs/manual/upgrading.html.de diff --git a/trunk/docs/manual/upgrading.html.en b/docs/manual/upgrading.html.en similarity index 100% rename from trunk/docs/manual/upgrading.html.en rename to docs/manual/upgrading.html.en diff --git a/trunk/docs/manual/upgrading.html.fr b/docs/manual/upgrading.html.fr similarity index 100% rename from trunk/docs/manual/upgrading.html.fr rename to docs/manual/upgrading.html.fr diff --git a/trunk/docs/manual/upgrading.html.ja.euc-jp b/docs/manual/upgrading.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/upgrading.html.ja.euc-jp rename to docs/manual/upgrading.html.ja.euc-jp diff --git a/trunk/docs/manual/upgrading.html.ko.euc-kr b/docs/manual/upgrading.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/upgrading.html.ko.euc-kr rename to docs/manual/upgrading.html.ko.euc-kr diff --git a/trunk/docs/manual/upgrading.html.pt-br b/docs/manual/upgrading.html.pt-br similarity index 100% rename from trunk/docs/manual/upgrading.html.pt-br rename to docs/manual/upgrading.html.pt-br diff --git a/trunk/docs/manual/upgrading.html.ru.koi8-r b/docs/manual/upgrading.html.ru.koi8-r similarity index 100% rename from trunk/docs/manual/upgrading.html.ru.koi8-r rename to docs/manual/upgrading.html.ru.koi8-r diff --git a/trunk/docs/manual/upgrading.xml b/docs/manual/upgrading.xml similarity index 100% rename from trunk/docs/manual/upgrading.xml rename to docs/manual/upgrading.xml diff --git a/trunk/docs/manual/upgrading.xml.de b/docs/manual/upgrading.xml.de similarity index 100% rename from trunk/docs/manual/upgrading.xml.de rename to docs/manual/upgrading.xml.de diff --git a/trunk/docs/manual/upgrading.xml.ja b/docs/manual/upgrading.xml.ja similarity index 100% rename from trunk/docs/manual/upgrading.xml.ja rename to docs/manual/upgrading.xml.ja diff --git a/trunk/docs/manual/upgrading.xml.ko b/docs/manual/upgrading.xml.ko similarity index 100% rename from trunk/docs/manual/upgrading.xml.ko rename to docs/manual/upgrading.xml.ko diff --git a/trunk/docs/manual/upgrading.xml.meta b/docs/manual/upgrading.xml.meta similarity index 100% rename from trunk/docs/manual/upgrading.xml.meta rename to docs/manual/upgrading.xml.meta diff --git a/trunk/docs/manual/upgrading.xml.pt-br b/docs/manual/upgrading.xml.pt-br similarity index 100% rename from trunk/docs/manual/upgrading.xml.pt-br rename to docs/manual/upgrading.xml.pt-br diff --git a/trunk/docs/manual/upgrading.xml.ru b/docs/manual/upgrading.xml.ru similarity index 100% rename from trunk/docs/manual/upgrading.xml.ru rename to docs/manual/upgrading.xml.ru diff --git a/trunk/docs/manual/urlmapping.html b/docs/manual/urlmapping.html similarity index 100% rename from trunk/docs/manual/urlmapping.html rename to docs/manual/urlmapping.html diff --git a/trunk/docs/manual/urlmapping.html.en b/docs/manual/urlmapping.html.en similarity index 100% rename from trunk/docs/manual/urlmapping.html.en rename to docs/manual/urlmapping.html.en diff --git a/trunk/docs/manual/urlmapping.html.ja.euc-jp b/docs/manual/urlmapping.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/urlmapping.html.ja.euc-jp rename to docs/manual/urlmapping.html.ja.euc-jp diff --git a/trunk/docs/manual/urlmapping.html.ko.euc-kr b/docs/manual/urlmapping.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/urlmapping.html.ko.euc-kr rename to docs/manual/urlmapping.html.ko.euc-kr diff --git a/trunk/docs/manual/urlmapping.xml b/docs/manual/urlmapping.xml similarity index 100% rename from trunk/docs/manual/urlmapping.xml rename to docs/manual/urlmapping.xml diff --git a/trunk/docs/manual/urlmapping.xml.ja b/docs/manual/urlmapping.xml.ja similarity index 100% rename from trunk/docs/manual/urlmapping.xml.ja rename to docs/manual/urlmapping.xml.ja diff --git a/trunk/docs/manual/urlmapping.xml.ko b/docs/manual/urlmapping.xml.ko similarity index 100% rename from trunk/docs/manual/urlmapping.xml.ko rename to docs/manual/urlmapping.xml.ko diff --git a/trunk/docs/manual/urlmapping.xml.meta b/docs/manual/urlmapping.xml.meta similarity index 100% rename from trunk/docs/manual/urlmapping.xml.meta rename to docs/manual/urlmapping.xml.meta diff --git a/trunk/docs/manual/vhosts/details.html b/docs/manual/vhosts/details.html similarity index 100% rename from trunk/docs/manual/vhosts/details.html rename to docs/manual/vhosts/details.html diff --git a/trunk/docs/manual/vhosts/details.html.en b/docs/manual/vhosts/details.html.en similarity index 100% rename from trunk/docs/manual/vhosts/details.html.en rename to docs/manual/vhosts/details.html.en diff --git a/trunk/docs/manual/vhosts/details.html.ko.euc-kr b/docs/manual/vhosts/details.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/vhosts/details.html.ko.euc-kr rename to docs/manual/vhosts/details.html.ko.euc-kr diff --git a/trunk/docs/manual/vhosts/details.xml b/docs/manual/vhosts/details.xml similarity index 100% rename from trunk/docs/manual/vhosts/details.xml rename to docs/manual/vhosts/details.xml diff --git a/trunk/docs/manual/vhosts/details.xml.ko b/docs/manual/vhosts/details.xml.ko similarity index 100% rename from trunk/docs/manual/vhosts/details.xml.ko rename to docs/manual/vhosts/details.xml.ko diff --git a/trunk/docs/manual/vhosts/details.xml.meta b/docs/manual/vhosts/details.xml.meta similarity index 100% rename from trunk/docs/manual/vhosts/details.xml.meta rename to docs/manual/vhosts/details.xml.meta diff --git a/trunk/docs/manual/vhosts/examples.html b/docs/manual/vhosts/examples.html similarity index 100% rename from trunk/docs/manual/vhosts/examples.html rename to docs/manual/vhosts/examples.html diff --git a/trunk/docs/manual/vhosts/examples.html.en b/docs/manual/vhosts/examples.html.en similarity index 100% rename from trunk/docs/manual/vhosts/examples.html.en rename to docs/manual/vhosts/examples.html.en diff --git a/trunk/docs/manual/vhosts/examples.html.ja.euc-jp b/docs/manual/vhosts/examples.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/vhosts/examples.html.ja.euc-jp rename to docs/manual/vhosts/examples.html.ja.euc-jp diff --git a/trunk/docs/manual/vhosts/examples.html.ko.euc-kr b/docs/manual/vhosts/examples.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/vhosts/examples.html.ko.euc-kr rename to docs/manual/vhosts/examples.html.ko.euc-kr diff --git a/trunk/docs/manual/vhosts/examples.xml b/docs/manual/vhosts/examples.xml similarity index 100% rename from trunk/docs/manual/vhosts/examples.xml rename to docs/manual/vhosts/examples.xml diff --git a/trunk/docs/manual/vhosts/examples.xml.ja b/docs/manual/vhosts/examples.xml.ja similarity index 100% rename from trunk/docs/manual/vhosts/examples.xml.ja rename to docs/manual/vhosts/examples.xml.ja diff --git a/trunk/docs/manual/vhosts/examples.xml.ko b/docs/manual/vhosts/examples.xml.ko similarity index 100% rename from trunk/docs/manual/vhosts/examples.xml.ko rename to docs/manual/vhosts/examples.xml.ko diff --git a/trunk/docs/manual/vhosts/examples.xml.meta b/docs/manual/vhosts/examples.xml.meta similarity index 100% rename from trunk/docs/manual/vhosts/examples.xml.meta rename to docs/manual/vhosts/examples.xml.meta diff --git a/trunk/docs/manual/vhosts/fd-limits.html b/docs/manual/vhosts/fd-limits.html similarity index 100% rename from trunk/docs/manual/vhosts/fd-limits.html rename to docs/manual/vhosts/fd-limits.html diff --git a/trunk/docs/manual/vhosts/fd-limits.html.en b/docs/manual/vhosts/fd-limits.html.en similarity index 100% rename from trunk/docs/manual/vhosts/fd-limits.html.en rename to docs/manual/vhosts/fd-limits.html.en diff --git a/trunk/docs/manual/vhosts/fd-limits.html.ja.euc-jp b/docs/manual/vhosts/fd-limits.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/vhosts/fd-limits.html.ja.euc-jp rename to docs/manual/vhosts/fd-limits.html.ja.euc-jp diff --git a/trunk/docs/manual/vhosts/fd-limits.html.ko.euc-kr b/docs/manual/vhosts/fd-limits.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/vhosts/fd-limits.html.ko.euc-kr rename to docs/manual/vhosts/fd-limits.html.ko.euc-kr diff --git a/trunk/docs/manual/vhosts/fd-limits.xml b/docs/manual/vhosts/fd-limits.xml similarity index 100% rename from trunk/docs/manual/vhosts/fd-limits.xml rename to docs/manual/vhosts/fd-limits.xml diff --git a/trunk/docs/manual/vhosts/fd-limits.xml.ja b/docs/manual/vhosts/fd-limits.xml.ja similarity index 100% rename from trunk/docs/manual/vhosts/fd-limits.xml.ja rename to docs/manual/vhosts/fd-limits.xml.ja diff --git a/trunk/docs/manual/vhosts/fd-limits.xml.ko b/docs/manual/vhosts/fd-limits.xml.ko similarity index 100% rename from trunk/docs/manual/vhosts/fd-limits.xml.ko rename to docs/manual/vhosts/fd-limits.xml.ko diff --git a/trunk/docs/manual/vhosts/fd-limits.xml.meta b/docs/manual/vhosts/fd-limits.xml.meta similarity index 100% rename from trunk/docs/manual/vhosts/fd-limits.xml.meta rename to docs/manual/vhosts/fd-limits.xml.meta diff --git a/trunk/docs/manual/vhosts/index.html b/docs/manual/vhosts/index.html similarity index 100% rename from trunk/docs/manual/vhosts/index.html rename to docs/manual/vhosts/index.html diff --git a/trunk/docs/manual/vhosts/index.html.de b/docs/manual/vhosts/index.html.de similarity index 100% rename from trunk/docs/manual/vhosts/index.html.de rename to docs/manual/vhosts/index.html.de diff --git a/trunk/docs/manual/vhosts/index.html.en b/docs/manual/vhosts/index.html.en similarity index 100% rename from trunk/docs/manual/vhosts/index.html.en rename to docs/manual/vhosts/index.html.en diff --git a/trunk/docs/manual/vhosts/index.html.ja.euc-jp b/docs/manual/vhosts/index.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/vhosts/index.html.ja.euc-jp rename to docs/manual/vhosts/index.html.ja.euc-jp diff --git a/trunk/docs/manual/vhosts/index.html.ko.euc-kr b/docs/manual/vhosts/index.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/vhosts/index.html.ko.euc-kr rename to docs/manual/vhosts/index.html.ko.euc-kr diff --git a/trunk/docs/manual/vhosts/index.xml b/docs/manual/vhosts/index.xml similarity index 100% rename from trunk/docs/manual/vhosts/index.xml rename to docs/manual/vhosts/index.xml diff --git a/trunk/docs/manual/vhosts/index.xml.de b/docs/manual/vhosts/index.xml.de similarity index 100% rename from trunk/docs/manual/vhosts/index.xml.de rename to docs/manual/vhosts/index.xml.de diff --git a/trunk/docs/manual/vhosts/index.xml.ja b/docs/manual/vhosts/index.xml.ja similarity index 100% rename from trunk/docs/manual/vhosts/index.xml.ja rename to docs/manual/vhosts/index.xml.ja diff --git a/trunk/docs/manual/vhosts/index.xml.ko b/docs/manual/vhosts/index.xml.ko similarity index 100% rename from trunk/docs/manual/vhosts/index.xml.ko rename to docs/manual/vhosts/index.xml.ko diff --git a/trunk/docs/manual/vhosts/index.xml.meta b/docs/manual/vhosts/index.xml.meta similarity index 100% rename from trunk/docs/manual/vhosts/index.xml.meta rename to docs/manual/vhosts/index.xml.meta diff --git a/trunk/docs/manual/vhosts/ip-based.html b/docs/manual/vhosts/ip-based.html similarity index 100% rename from trunk/docs/manual/vhosts/ip-based.html rename to docs/manual/vhosts/ip-based.html diff --git a/trunk/docs/manual/vhosts/ip-based.html.en b/docs/manual/vhosts/ip-based.html.en similarity index 100% rename from trunk/docs/manual/vhosts/ip-based.html.en rename to docs/manual/vhosts/ip-based.html.en diff --git a/trunk/docs/manual/vhosts/ip-based.html.ja.euc-jp b/docs/manual/vhosts/ip-based.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/vhosts/ip-based.html.ja.euc-jp rename to docs/manual/vhosts/ip-based.html.ja.euc-jp diff --git a/trunk/docs/manual/vhosts/ip-based.html.ko.euc-kr b/docs/manual/vhosts/ip-based.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/vhosts/ip-based.html.ko.euc-kr rename to docs/manual/vhosts/ip-based.html.ko.euc-kr diff --git a/trunk/docs/manual/vhosts/ip-based.xml b/docs/manual/vhosts/ip-based.xml similarity index 100% rename from trunk/docs/manual/vhosts/ip-based.xml rename to docs/manual/vhosts/ip-based.xml diff --git a/trunk/docs/manual/vhosts/ip-based.xml.ja b/docs/manual/vhosts/ip-based.xml.ja similarity index 100% rename from trunk/docs/manual/vhosts/ip-based.xml.ja rename to docs/manual/vhosts/ip-based.xml.ja diff --git a/trunk/docs/manual/vhosts/ip-based.xml.ko b/docs/manual/vhosts/ip-based.xml.ko similarity index 100% rename from trunk/docs/manual/vhosts/ip-based.xml.ko rename to docs/manual/vhosts/ip-based.xml.ko diff --git a/trunk/docs/manual/vhosts/ip-based.xml.meta b/docs/manual/vhosts/ip-based.xml.meta similarity index 100% rename from trunk/docs/manual/vhosts/ip-based.xml.meta rename to docs/manual/vhosts/ip-based.xml.meta diff --git a/trunk/docs/manual/vhosts/mass.html b/docs/manual/vhosts/mass.html similarity index 100% rename from trunk/docs/manual/vhosts/mass.html rename to docs/manual/vhosts/mass.html diff --git a/trunk/docs/manual/vhosts/mass.html.en b/docs/manual/vhosts/mass.html.en similarity index 100% rename from trunk/docs/manual/vhosts/mass.html.en rename to docs/manual/vhosts/mass.html.en diff --git a/trunk/docs/manual/vhosts/mass.html.ko.euc-kr b/docs/manual/vhosts/mass.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/vhosts/mass.html.ko.euc-kr rename to docs/manual/vhosts/mass.html.ko.euc-kr diff --git a/trunk/docs/manual/vhosts/mass.xml b/docs/manual/vhosts/mass.xml similarity index 100% rename from trunk/docs/manual/vhosts/mass.xml rename to docs/manual/vhosts/mass.xml diff --git a/trunk/docs/manual/vhosts/mass.xml.ko b/docs/manual/vhosts/mass.xml.ko similarity index 100% rename from trunk/docs/manual/vhosts/mass.xml.ko rename to docs/manual/vhosts/mass.xml.ko diff --git a/trunk/docs/manual/vhosts/mass.xml.meta b/docs/manual/vhosts/mass.xml.meta similarity index 100% rename from trunk/docs/manual/vhosts/mass.xml.meta rename to docs/manual/vhosts/mass.xml.meta diff --git a/trunk/docs/manual/vhosts/name-based.html b/docs/manual/vhosts/name-based.html similarity index 100% rename from trunk/docs/manual/vhosts/name-based.html rename to docs/manual/vhosts/name-based.html diff --git a/trunk/docs/manual/vhosts/name-based.html.de b/docs/manual/vhosts/name-based.html.de similarity index 100% rename from trunk/docs/manual/vhosts/name-based.html.de rename to docs/manual/vhosts/name-based.html.de diff --git a/trunk/docs/manual/vhosts/name-based.html.en b/docs/manual/vhosts/name-based.html.en similarity index 100% rename from trunk/docs/manual/vhosts/name-based.html.en rename to docs/manual/vhosts/name-based.html.en diff --git a/trunk/docs/manual/vhosts/name-based.html.ja.euc-jp b/docs/manual/vhosts/name-based.html.ja.euc-jp similarity index 100% rename from trunk/docs/manual/vhosts/name-based.html.ja.euc-jp rename to docs/manual/vhosts/name-based.html.ja.euc-jp diff --git a/trunk/docs/manual/vhosts/name-based.html.ko.euc-kr b/docs/manual/vhosts/name-based.html.ko.euc-kr similarity index 100% rename from trunk/docs/manual/vhosts/name-based.html.ko.euc-kr rename to docs/manual/vhosts/name-based.html.ko.euc-kr diff --git a/trunk/docs/manual/vhosts/name-based.xml b/docs/manual/vhosts/name-based.xml similarity index 100% rename from trunk/docs/manual/vhosts/name-based.xml rename to docs/manual/vhosts/name-based.xml diff --git a/trunk/docs/manual/vhosts/name-based.xml.de b/docs/manual/vhosts/name-based.xml.de similarity index 100% rename from trunk/docs/manual/vhosts/name-based.xml.de rename to docs/manual/vhosts/name-based.xml.de diff --git a/trunk/docs/manual/vhosts/name-based.xml.ja b/docs/manual/vhosts/name-based.xml.ja similarity index 100% rename from trunk/docs/manual/vhosts/name-based.xml.ja rename to docs/manual/vhosts/name-based.xml.ja diff --git a/trunk/docs/manual/vhosts/name-based.xml.ko b/docs/manual/vhosts/name-based.xml.ko similarity index 100% rename from trunk/docs/manual/vhosts/name-based.xml.ko rename to docs/manual/vhosts/name-based.xml.ko diff --git a/trunk/docs/manual/vhosts/name-based.xml.meta b/docs/manual/vhosts/name-based.xml.meta similarity index 100% rename from trunk/docs/manual/vhosts/name-based.xml.meta rename to docs/manual/vhosts/name-based.xml.meta diff --git a/trunk/emacs-style b/emacs-style similarity index 100% rename from trunk/emacs-style rename to emacs-style diff --git a/trunk/httpd.dsp b/httpd.dsp similarity index 100% rename from trunk/httpd.dsp rename to httpd.dsp diff --git a/trunk/include/.indent.pro b/include/.indent.pro similarity index 100% rename from trunk/include/.indent.pro rename to include/.indent.pro diff --git a/trunk/include/ap_compat.h b/include/ap_compat.h similarity index 100% rename from trunk/include/ap_compat.h rename to include/ap_compat.h diff --git a/trunk/include/ap_config.h b/include/ap_config.h similarity index 100% rename from trunk/include/ap_config.h rename to include/ap_config.h diff --git a/trunk/include/ap_config_layout.h.in b/include/ap_config_layout.h.in similarity index 100% rename from trunk/include/ap_config_layout.h.in rename to include/ap_config_layout.h.in diff --git a/trunk/include/ap_listen.h b/include/ap_listen.h similarity index 100% rename from trunk/include/ap_listen.h rename to include/ap_listen.h diff --git a/trunk/include/ap_mmn.h b/include/ap_mmn.h similarity index 100% rename from trunk/include/ap_mmn.h rename to include/ap_mmn.h diff --git a/trunk/include/ap_mpm.h b/include/ap_mpm.h similarity index 100% rename from trunk/include/ap_mpm.h rename to include/ap_mpm.h diff --git a/trunk/include/ap_provider.h b/include/ap_provider.h similarity index 100% rename from trunk/include/ap_provider.h rename to include/ap_provider.h diff --git a/trunk/include/ap_regex.h b/include/ap_regex.h similarity index 100% rename from trunk/include/ap_regex.h rename to include/ap_regex.h diff --git a/trunk/include/ap_regkey.h b/include/ap_regkey.h similarity index 100% rename from trunk/include/ap_regkey.h rename to include/ap_regkey.h diff --git a/trunk/include/ap_release.h b/include/ap_release.h similarity index 100% rename from trunk/include/ap_release.h rename to include/ap_release.h diff --git a/trunk/include/http_config.h b/include/http_config.h similarity index 100% rename from trunk/include/http_config.h rename to include/http_config.h diff --git a/trunk/include/http_connection.h b/include/http_connection.h similarity index 100% rename from trunk/include/http_connection.h rename to include/http_connection.h diff --git a/trunk/include/http_core.h b/include/http_core.h similarity index 100% rename from trunk/include/http_core.h rename to include/http_core.h diff --git a/trunk/include/http_log.h b/include/http_log.h similarity index 100% rename from trunk/include/http_log.h rename to include/http_log.h diff --git a/trunk/include/http_main.h b/include/http_main.h similarity index 100% rename from trunk/include/http_main.h rename to include/http_main.h diff --git a/trunk/include/http_protocol.h b/include/http_protocol.h similarity index 100% rename from trunk/include/http_protocol.h rename to include/http_protocol.h diff --git a/trunk/include/http_request.h b/include/http_request.h similarity index 100% rename from trunk/include/http_request.h rename to include/http_request.h diff --git a/trunk/include/http_vhost.h b/include/http_vhost.h similarity index 100% rename from trunk/include/http_vhost.h rename to include/http_vhost.h diff --git a/trunk/include/httpd.h b/include/httpd.h similarity index 100% rename from trunk/include/httpd.h rename to include/httpd.h diff --git a/trunk/include/mpm_common.h b/include/mpm_common.h similarity index 100% rename from trunk/include/mpm_common.h rename to include/mpm_common.h diff --git a/trunk/include/scoreboard.h b/include/scoreboard.h similarity index 100% rename from trunk/include/scoreboard.h rename to include/scoreboard.h diff --git a/trunk/include/util_cfgtree.h b/include/util_cfgtree.h similarity index 100% rename from trunk/include/util_cfgtree.h rename to include/util_cfgtree.h diff --git a/trunk/include/util_charset.h b/include/util_charset.h similarity index 100% rename from trunk/include/util_charset.h rename to include/util_charset.h diff --git a/trunk/include/util_ebcdic.h b/include/util_ebcdic.h similarity index 100% rename from trunk/include/util_ebcdic.h rename to include/util_ebcdic.h diff --git a/trunk/include/util_filter.h b/include/util_filter.h similarity index 100% rename from trunk/include/util_filter.h rename to include/util_filter.h diff --git a/trunk/include/util_ldap.h b/include/util_ldap.h similarity index 100% rename from trunk/include/util_ldap.h rename to include/util_ldap.h diff --git a/trunk/include/util_md5.h b/include/util_md5.h similarity index 100% rename from trunk/include/util_md5.h rename to include/util_md5.h diff --git a/trunk/include/util_script.h b/include/util_script.h similarity index 100% rename from trunk/include/util_script.h rename to include/util_script.h diff --git a/trunk/include/util_time.h b/include/util_time.h similarity index 100% rename from trunk/include/util_time.h rename to include/util_time.h diff --git a/trunk/include/util_xml.h b/include/util_xml.h similarity index 100% rename from trunk/include/util_xml.h rename to include/util_xml.h diff --git a/trunk/libhttpd.dsp b/libhttpd.dsp similarity index 100% rename from trunk/libhttpd.dsp rename to libhttpd.dsp diff --git a/trunk/modules/Makefile.in b/modules/Makefile.in similarity index 100% rename from trunk/modules/Makefile.in rename to modules/Makefile.in diff --git a/trunk/modules/NWGNUmakefile b/modules/NWGNUmakefile similarity index 100% rename from trunk/modules/NWGNUmakefile rename to modules/NWGNUmakefile diff --git a/trunk/modules/README b/modules/README similarity index 100% rename from trunk/modules/README rename to modules/README diff --git a/trunk/modules/aaa/.indent.pro b/modules/aaa/.indent.pro similarity index 100% rename from trunk/modules/aaa/.indent.pro rename to modules/aaa/.indent.pro diff --git a/trunk/modules/aaa/Makefile.in b/modules/aaa/Makefile.in similarity index 100% rename from trunk/modules/aaa/Makefile.in rename to modules/aaa/Makefile.in diff --git a/trunk/modules/aaa/NWGNUauthbasc b/modules/aaa/NWGNUauthbasc similarity index 100% rename from trunk/modules/aaa/NWGNUauthbasc rename to modules/aaa/NWGNUauthbasc diff --git a/trunk/modules/aaa/NWGNUauthdigt b/modules/aaa/NWGNUauthdigt similarity index 100% rename from trunk/modules/aaa/NWGNUauthdigt rename to modules/aaa/NWGNUauthdigt diff --git a/trunk/modules/aaa/NWGNUauthnalias b/modules/aaa/NWGNUauthnalias similarity index 100% rename from trunk/modules/aaa/NWGNUauthnalias rename to modules/aaa/NWGNUauthnalias diff --git a/trunk/modules/aaa/NWGNUauthnano b/modules/aaa/NWGNUauthnano similarity index 100% rename from trunk/modules/aaa/NWGNUauthnano rename to modules/aaa/NWGNUauthnano diff --git a/trunk/modules/aaa/NWGNUauthndbm b/modules/aaa/NWGNUauthndbm similarity index 100% rename from trunk/modules/aaa/NWGNUauthndbm rename to modules/aaa/NWGNUauthndbm diff --git a/trunk/modules/aaa/NWGNUauthndef b/modules/aaa/NWGNUauthndef similarity index 100% rename from trunk/modules/aaa/NWGNUauthndef rename to modules/aaa/NWGNUauthndef diff --git a/trunk/modules/aaa/NWGNUauthnfil b/modules/aaa/NWGNUauthnfil similarity index 100% rename from trunk/modules/aaa/NWGNUauthnfil rename to modules/aaa/NWGNUauthnfil diff --git a/trunk/modules/aaa/NWGNUauthnzldap b/modules/aaa/NWGNUauthnzldap similarity index 100% rename from trunk/modules/aaa/NWGNUauthnzldap rename to modules/aaa/NWGNUauthnzldap diff --git a/trunk/modules/aaa/NWGNUauthzdbm b/modules/aaa/NWGNUauthzdbm similarity index 100% rename from trunk/modules/aaa/NWGNUauthzdbm rename to modules/aaa/NWGNUauthzdbm diff --git a/trunk/modules/aaa/NWGNUauthzdef b/modules/aaa/NWGNUauthzdef similarity index 100% rename from trunk/modules/aaa/NWGNUauthzdef rename to modules/aaa/NWGNUauthzdef diff --git a/trunk/modules/aaa/NWGNUauthzgrp b/modules/aaa/NWGNUauthzgrp similarity index 100% rename from trunk/modules/aaa/NWGNUauthzgrp rename to modules/aaa/NWGNUauthzgrp diff --git a/trunk/modules/aaa/NWGNUauthzusr b/modules/aaa/NWGNUauthzusr similarity index 100% rename from trunk/modules/aaa/NWGNUauthzusr rename to modules/aaa/NWGNUauthzusr diff --git a/trunk/modules/aaa/NWGNUmakefile b/modules/aaa/NWGNUmakefile similarity index 100% rename from trunk/modules/aaa/NWGNUmakefile rename to modules/aaa/NWGNUmakefile diff --git a/trunk/modules/aaa/config.m4 b/modules/aaa/config.m4 similarity index 100% rename from trunk/modules/aaa/config.m4 rename to modules/aaa/config.m4 diff --git a/trunk/modules/aaa/mod_auth.h b/modules/aaa/mod_auth.h similarity index 100% rename from trunk/modules/aaa/mod_auth.h rename to modules/aaa/mod_auth.h diff --git a/trunk/modules/aaa/mod_auth_basic.c b/modules/aaa/mod_auth_basic.c similarity index 100% rename from trunk/modules/aaa/mod_auth_basic.c rename to modules/aaa/mod_auth_basic.c diff --git a/trunk/modules/aaa/mod_auth_basic.dsp b/modules/aaa/mod_auth_basic.dsp similarity index 100% rename from trunk/modules/aaa/mod_auth_basic.dsp rename to modules/aaa/mod_auth_basic.dsp diff --git a/trunk/modules/aaa/mod_auth_digest.c b/modules/aaa/mod_auth_digest.c similarity index 100% rename from trunk/modules/aaa/mod_auth_digest.c rename to modules/aaa/mod_auth_digest.c diff --git a/trunk/modules/aaa/mod_auth_digest.dsp b/modules/aaa/mod_auth_digest.dsp similarity index 100% rename from trunk/modules/aaa/mod_auth_digest.dsp rename to modules/aaa/mod_auth_digest.dsp diff --git a/trunk/modules/aaa/mod_authn_alias.c b/modules/aaa/mod_authn_alias.c similarity index 100% rename from trunk/modules/aaa/mod_authn_alias.c rename to modules/aaa/mod_authn_alias.c diff --git a/trunk/modules/aaa/mod_authn_anon.c b/modules/aaa/mod_authn_anon.c similarity index 100% rename from trunk/modules/aaa/mod_authn_anon.c rename to modules/aaa/mod_authn_anon.c diff --git a/trunk/modules/aaa/mod_authn_anon.dsp b/modules/aaa/mod_authn_anon.dsp similarity index 100% rename from trunk/modules/aaa/mod_authn_anon.dsp rename to modules/aaa/mod_authn_anon.dsp diff --git a/trunk/modules/aaa/mod_authn_dbm.c b/modules/aaa/mod_authn_dbm.c similarity index 100% rename from trunk/modules/aaa/mod_authn_dbm.c rename to modules/aaa/mod_authn_dbm.c diff --git a/trunk/modules/aaa/mod_authn_dbm.dsp b/modules/aaa/mod_authn_dbm.dsp similarity index 100% rename from trunk/modules/aaa/mod_authn_dbm.dsp rename to modules/aaa/mod_authn_dbm.dsp diff --git a/trunk/modules/aaa/mod_authn_default.c b/modules/aaa/mod_authn_default.c similarity index 100% rename from trunk/modules/aaa/mod_authn_default.c rename to modules/aaa/mod_authn_default.c diff --git a/trunk/modules/aaa/mod_authn_default.dsp b/modules/aaa/mod_authn_default.dsp similarity index 100% rename from trunk/modules/aaa/mod_authn_default.dsp rename to modules/aaa/mod_authn_default.dsp diff --git a/trunk/modules/aaa/mod_authn_file.c b/modules/aaa/mod_authn_file.c similarity index 100% rename from trunk/modules/aaa/mod_authn_file.c rename to modules/aaa/mod_authn_file.c diff --git a/trunk/modules/aaa/mod_authn_file.dsp b/modules/aaa/mod_authn_file.dsp similarity index 100% rename from trunk/modules/aaa/mod_authn_file.dsp rename to modules/aaa/mod_authn_file.dsp diff --git a/trunk/modules/aaa/mod_authnz_ldap.c b/modules/aaa/mod_authnz_ldap.c similarity index 100% rename from trunk/modules/aaa/mod_authnz_ldap.c rename to modules/aaa/mod_authnz_ldap.c diff --git a/trunk/modules/aaa/mod_authnz_ldap.dsp b/modules/aaa/mod_authnz_ldap.dsp similarity index 100% rename from trunk/modules/aaa/mod_authnz_ldap.dsp rename to modules/aaa/mod_authnz_ldap.dsp diff --git a/trunk/modules/aaa/mod_authz_dbm.c b/modules/aaa/mod_authz_dbm.c similarity index 100% rename from trunk/modules/aaa/mod_authz_dbm.c rename to modules/aaa/mod_authz_dbm.c diff --git a/trunk/modules/aaa/mod_authz_dbm.dsp b/modules/aaa/mod_authz_dbm.dsp similarity index 100% rename from trunk/modules/aaa/mod_authz_dbm.dsp rename to modules/aaa/mod_authz_dbm.dsp diff --git a/trunk/modules/aaa/mod_authz_default.c b/modules/aaa/mod_authz_default.c similarity index 100% rename from trunk/modules/aaa/mod_authz_default.c rename to modules/aaa/mod_authz_default.c diff --git a/trunk/modules/aaa/mod_authz_default.dsp b/modules/aaa/mod_authz_default.dsp similarity index 100% rename from trunk/modules/aaa/mod_authz_default.dsp rename to modules/aaa/mod_authz_default.dsp diff --git a/trunk/modules/aaa/mod_authz_groupfile.c b/modules/aaa/mod_authz_groupfile.c similarity index 100% rename from trunk/modules/aaa/mod_authz_groupfile.c rename to modules/aaa/mod_authz_groupfile.c diff --git a/trunk/modules/aaa/mod_authz_groupfile.dsp b/modules/aaa/mod_authz_groupfile.dsp similarity index 100% rename from trunk/modules/aaa/mod_authz_groupfile.dsp rename to modules/aaa/mod_authz_groupfile.dsp diff --git a/trunk/modules/aaa/mod_authz_host.c b/modules/aaa/mod_authz_host.c similarity index 100% rename from trunk/modules/aaa/mod_authz_host.c rename to modules/aaa/mod_authz_host.c diff --git a/trunk/modules/aaa/mod_authz_host.dsp b/modules/aaa/mod_authz_host.dsp similarity index 100% rename from trunk/modules/aaa/mod_authz_host.dsp rename to modules/aaa/mod_authz_host.dsp diff --git a/trunk/modules/aaa/mod_authz_owner.c b/modules/aaa/mod_authz_owner.c similarity index 100% rename from trunk/modules/aaa/mod_authz_owner.c rename to modules/aaa/mod_authz_owner.c diff --git a/trunk/modules/aaa/mod_authz_user.c b/modules/aaa/mod_authz_user.c similarity index 100% rename from trunk/modules/aaa/mod_authz_user.c rename to modules/aaa/mod_authz_user.c diff --git a/trunk/modules/aaa/mod_authz_user.dsp b/modules/aaa/mod_authz_user.dsp similarity index 100% rename from trunk/modules/aaa/mod_authz_user.dsp rename to modules/aaa/mod_authz_user.dsp diff --git a/trunk/modules/arch/netware/libprews.c b/modules/arch/netware/libprews.c similarity index 100% rename from trunk/modules/arch/netware/libprews.c rename to modules/arch/netware/libprews.c diff --git a/trunk/modules/arch/netware/mod_auth_basic.def b/modules/arch/netware/mod_auth_basic.def similarity index 100% rename from trunk/modules/arch/netware/mod_auth_basic.def rename to modules/arch/netware/mod_auth_basic.def diff --git a/trunk/modules/arch/netware/mod_auth_digest.def b/modules/arch/netware/mod_auth_digest.def similarity index 100% rename from trunk/modules/arch/netware/mod_auth_digest.def rename to modules/arch/netware/mod_auth_digest.def diff --git a/trunk/modules/arch/netware/mod_authn_anon.def b/modules/arch/netware/mod_authn_anon.def similarity index 100% rename from trunk/modules/arch/netware/mod_authn_anon.def rename to modules/arch/netware/mod_authn_anon.def diff --git a/trunk/modules/arch/netware/mod_authn_dbm.def b/modules/arch/netware/mod_authn_dbm.def similarity index 100% rename from trunk/modules/arch/netware/mod_authn_dbm.def rename to modules/arch/netware/mod_authn_dbm.def diff --git a/trunk/modules/arch/netware/mod_authn_default.def b/modules/arch/netware/mod_authn_default.def similarity index 100% rename from trunk/modules/arch/netware/mod_authn_default.def rename to modules/arch/netware/mod_authn_default.def diff --git a/trunk/modules/arch/netware/mod_authn_file.def b/modules/arch/netware/mod_authn_file.def similarity index 100% rename from trunk/modules/arch/netware/mod_authn_file.def rename to modules/arch/netware/mod_authn_file.def diff --git a/trunk/modules/arch/netware/mod_authz_dbm.def b/modules/arch/netware/mod_authz_dbm.def similarity index 100% rename from trunk/modules/arch/netware/mod_authz_dbm.def rename to modules/arch/netware/mod_authz_dbm.def diff --git a/trunk/modules/arch/netware/mod_authz_default.def b/modules/arch/netware/mod_authz_default.def similarity index 100% rename from trunk/modules/arch/netware/mod_authz_default.def rename to modules/arch/netware/mod_authz_default.def diff --git a/trunk/modules/arch/netware/mod_authz_groupfile.def b/modules/arch/netware/mod_authz_groupfile.def similarity index 100% rename from trunk/modules/arch/netware/mod_authz_groupfile.def rename to modules/arch/netware/mod_authz_groupfile.def diff --git a/trunk/modules/arch/netware/mod_authz_user.def b/modules/arch/netware/mod_authz_user.def similarity index 100% rename from trunk/modules/arch/netware/mod_authz_user.def rename to modules/arch/netware/mod_authz_user.def diff --git a/trunk/modules/arch/netware/mod_cache.def b/modules/arch/netware/mod_cache.def similarity index 100% rename from trunk/modules/arch/netware/mod_cache.def rename to modules/arch/netware/mod_cache.def diff --git a/trunk/modules/arch/netware/mod_cern_meta.def b/modules/arch/netware/mod_cern_meta.def similarity index 100% rename from trunk/modules/arch/netware/mod_cern_meta.def rename to modules/arch/netware/mod_cern_meta.def diff --git a/trunk/modules/arch/netware/mod_dav.def b/modules/arch/netware/mod_dav.def similarity index 100% rename from trunk/modules/arch/netware/mod_dav.def rename to modules/arch/netware/mod_dav.def diff --git a/trunk/modules/arch/netware/mod_disk_cache.def b/modules/arch/netware/mod_disk_cache.def similarity index 100% rename from trunk/modules/arch/netware/mod_disk_cache.def rename to modules/arch/netware/mod_disk_cache.def diff --git a/trunk/modules/arch/netware/mod_echo.def b/modules/arch/netware/mod_echo.def similarity index 100% rename from trunk/modules/arch/netware/mod_echo.def rename to modules/arch/netware/mod_echo.def diff --git a/trunk/modules/arch/netware/mod_expires.def b/modules/arch/netware/mod_expires.def similarity index 100% rename from trunk/modules/arch/netware/mod_expires.def rename to modules/arch/netware/mod_expires.def diff --git a/trunk/modules/arch/netware/mod_file_cache.def b/modules/arch/netware/mod_file_cache.def similarity index 100% rename from trunk/modules/arch/netware/mod_file_cache.def rename to modules/arch/netware/mod_file_cache.def diff --git a/trunk/modules/arch/netware/mod_headers.def b/modules/arch/netware/mod_headers.def similarity index 100% rename from trunk/modules/arch/netware/mod_headers.def rename to modules/arch/netware/mod_headers.def diff --git a/trunk/modules/arch/netware/mod_info.def b/modules/arch/netware/mod_info.def similarity index 100% rename from trunk/modules/arch/netware/mod_info.def rename to modules/arch/netware/mod_info.def diff --git a/trunk/modules/arch/netware/mod_logio.def b/modules/arch/netware/mod_logio.def similarity index 100% rename from trunk/modules/arch/netware/mod_logio.def rename to modules/arch/netware/mod_logio.def diff --git a/trunk/modules/arch/netware/mod_mem_cache.def b/modules/arch/netware/mod_mem_cache.def similarity index 100% rename from trunk/modules/arch/netware/mod_mem_cache.def rename to modules/arch/netware/mod_mem_cache.def diff --git a/trunk/modules/arch/netware/mod_mime_magic.def b/modules/arch/netware/mod_mime_magic.def similarity index 100% rename from trunk/modules/arch/netware/mod_mime_magic.def rename to modules/arch/netware/mod_mime_magic.def diff --git a/trunk/modules/arch/netware/mod_netware.c b/modules/arch/netware/mod_netware.c similarity index 100% rename from trunk/modules/arch/netware/mod_netware.c rename to modules/arch/netware/mod_netware.c diff --git a/trunk/modules/arch/netware/mod_nw_ssl.c b/modules/arch/netware/mod_nw_ssl.c similarity index 100% rename from trunk/modules/arch/netware/mod_nw_ssl.c rename to modules/arch/netware/mod_nw_ssl.c diff --git a/trunk/modules/arch/netware/mod_proxy.def b/modules/arch/netware/mod_proxy.def similarity index 100% rename from trunk/modules/arch/netware/mod_proxy.def rename to modules/arch/netware/mod_proxy.def diff --git a/trunk/modules/arch/netware/mod_proxy_connect.def b/modules/arch/netware/mod_proxy_connect.def similarity index 100% rename from trunk/modules/arch/netware/mod_proxy_connect.def rename to modules/arch/netware/mod_proxy_connect.def diff --git a/trunk/modules/arch/netware/mod_proxy_ftp.def b/modules/arch/netware/mod_proxy_ftp.def similarity index 100% rename from trunk/modules/arch/netware/mod_proxy_ftp.def rename to modules/arch/netware/mod_proxy_ftp.def diff --git a/trunk/modules/arch/netware/mod_proxy_http.def b/modules/arch/netware/mod_proxy_http.def similarity index 100% rename from trunk/modules/arch/netware/mod_proxy_http.def rename to modules/arch/netware/mod_proxy_http.def diff --git a/trunk/modules/arch/netware/mod_rewrite.def b/modules/arch/netware/mod_rewrite.def similarity index 100% rename from trunk/modules/arch/netware/mod_rewrite.def rename to modules/arch/netware/mod_rewrite.def diff --git a/trunk/modules/arch/netware/mod_speling.def b/modules/arch/netware/mod_speling.def similarity index 100% rename from trunk/modules/arch/netware/mod_speling.def rename to modules/arch/netware/mod_speling.def diff --git a/trunk/modules/arch/netware/mod_status.def b/modules/arch/netware/mod_status.def similarity index 100% rename from trunk/modules/arch/netware/mod_status.def rename to modules/arch/netware/mod_status.def diff --git a/trunk/modules/arch/netware/mod_unique_id.def b/modules/arch/netware/mod_unique_id.def similarity index 100% rename from trunk/modules/arch/netware/mod_unique_id.def rename to modules/arch/netware/mod_unique_id.def diff --git a/trunk/modules/arch/netware/mod_usertrack.def b/modules/arch/netware/mod_usertrack.def similarity index 100% rename from trunk/modules/arch/netware/mod_usertrack.def rename to modules/arch/netware/mod_usertrack.def diff --git a/trunk/modules/arch/netware/mod_vhost_alias.def b/modules/arch/netware/mod_vhost_alias.def similarity index 100% rename from trunk/modules/arch/netware/mod_vhost_alias.def rename to modules/arch/netware/mod_vhost_alias.def diff --git a/trunk/modules/arch/netware/moddavfs.def b/modules/arch/netware/moddavfs.def similarity index 100% rename from trunk/modules/arch/netware/moddavfs.def rename to modules/arch/netware/moddavfs.def diff --git a/trunk/modules/arch/win32/Makefile.in b/modules/arch/win32/Makefile.in similarity index 100% rename from trunk/modules/arch/win32/Makefile.in rename to modules/arch/win32/Makefile.in diff --git a/trunk/modules/arch/win32/config.m4 b/modules/arch/win32/config.m4 similarity index 100% rename from trunk/modules/arch/win32/config.m4 rename to modules/arch/win32/config.m4 diff --git a/trunk/modules/arch/win32/mod_isapi.c b/modules/arch/win32/mod_isapi.c similarity index 100% rename from trunk/modules/arch/win32/mod_isapi.c rename to modules/arch/win32/mod_isapi.c diff --git a/trunk/modules/arch/win32/mod_isapi.dsp b/modules/arch/win32/mod_isapi.dsp similarity index 100% rename from trunk/modules/arch/win32/mod_isapi.dsp rename to modules/arch/win32/mod_isapi.dsp diff --git a/trunk/modules/arch/win32/mod_isapi.h b/modules/arch/win32/mod_isapi.h similarity index 100% rename from trunk/modules/arch/win32/mod_isapi.h rename to modules/arch/win32/mod_isapi.h diff --git a/trunk/modules/arch/win32/mod_win32.c b/modules/arch/win32/mod_win32.c similarity index 100% rename from trunk/modules/arch/win32/mod_win32.c rename to modules/arch/win32/mod_win32.c diff --git a/trunk/modules/cache/.indent.pro b/modules/cache/.indent.pro similarity index 100% rename from trunk/modules/cache/.indent.pro rename to modules/cache/.indent.pro diff --git a/trunk/modules/cache/Makefile.in b/modules/cache/Makefile.in similarity index 100% rename from trunk/modules/cache/Makefile.in rename to modules/cache/Makefile.in diff --git a/trunk/modules/cache/NWGNUdsk_cach b/modules/cache/NWGNUdsk_cach similarity index 100% rename from trunk/modules/cache/NWGNUdsk_cach rename to modules/cache/NWGNUdsk_cach diff --git a/trunk/modules/cache/NWGNUmakefile b/modules/cache/NWGNUmakefile similarity index 100% rename from trunk/modules/cache/NWGNUmakefile rename to modules/cache/NWGNUmakefile diff --git a/trunk/modules/cache/NWGNUmem_cach b/modules/cache/NWGNUmem_cach similarity index 100% rename from trunk/modules/cache/NWGNUmem_cach rename to modules/cache/NWGNUmem_cach diff --git a/trunk/modules/cache/NWGNUmod_cach b/modules/cache/NWGNUmod_cach similarity index 100% rename from trunk/modules/cache/NWGNUmod_cach rename to modules/cache/NWGNUmod_cach diff --git a/trunk/modules/cache/cache_cache.c b/modules/cache/cache_cache.c similarity index 100% rename from trunk/modules/cache/cache_cache.c rename to modules/cache/cache_cache.c diff --git a/trunk/modules/cache/cache_cache.h b/modules/cache/cache_cache.h similarity index 100% rename from trunk/modules/cache/cache_cache.h rename to modules/cache/cache_cache.h diff --git a/trunk/modules/cache/cache_hash.c b/modules/cache/cache_hash.c similarity index 100% rename from trunk/modules/cache/cache_hash.c rename to modules/cache/cache_hash.c diff --git a/trunk/modules/cache/cache_hash.h b/modules/cache/cache_hash.h similarity index 100% rename from trunk/modules/cache/cache_hash.h rename to modules/cache/cache_hash.h diff --git a/trunk/modules/cache/cache_pqueue.c b/modules/cache/cache_pqueue.c similarity index 100% rename from trunk/modules/cache/cache_pqueue.c rename to modules/cache/cache_pqueue.c diff --git a/trunk/modules/cache/cache_pqueue.h b/modules/cache/cache_pqueue.h similarity index 100% rename from trunk/modules/cache/cache_pqueue.h rename to modules/cache/cache_pqueue.h diff --git a/trunk/modules/cache/cache_storage.c b/modules/cache/cache_storage.c similarity index 100% rename from trunk/modules/cache/cache_storage.c rename to modules/cache/cache_storage.c diff --git a/trunk/modules/cache/cache_util.c b/modules/cache/cache_util.c similarity index 100% rename from trunk/modules/cache/cache_util.c rename to modules/cache/cache_util.c diff --git a/trunk/modules/cache/config.m4 b/modules/cache/config.m4 similarity index 100% rename from trunk/modules/cache/config.m4 rename to modules/cache/config.m4 diff --git a/trunk/modules/cache/mod_cache.c b/modules/cache/mod_cache.c similarity index 100% rename from trunk/modules/cache/mod_cache.c rename to modules/cache/mod_cache.c diff --git a/trunk/modules/cache/mod_cache.dsp b/modules/cache/mod_cache.dsp similarity index 100% rename from trunk/modules/cache/mod_cache.dsp rename to modules/cache/mod_cache.dsp diff --git a/trunk/modules/cache/mod_cache.h b/modules/cache/mod_cache.h similarity index 100% rename from trunk/modules/cache/mod_cache.h rename to modules/cache/mod_cache.h diff --git a/trunk/modules/cache/mod_cache.imp b/modules/cache/mod_cache.imp similarity index 100% rename from trunk/modules/cache/mod_cache.imp rename to modules/cache/mod_cache.imp diff --git a/trunk/modules/cache/mod_disk_cache.c b/modules/cache/mod_disk_cache.c similarity index 100% rename from trunk/modules/cache/mod_disk_cache.c rename to modules/cache/mod_disk_cache.c diff --git a/trunk/modules/cache/mod_disk_cache.dsp b/modules/cache/mod_disk_cache.dsp similarity index 100% rename from trunk/modules/cache/mod_disk_cache.dsp rename to modules/cache/mod_disk_cache.dsp diff --git a/trunk/modules/cache/mod_file_cache.c b/modules/cache/mod_file_cache.c similarity index 100% rename from trunk/modules/cache/mod_file_cache.c rename to modules/cache/mod_file_cache.c diff --git a/trunk/modules/cache/mod_file_cache.dsp b/modules/cache/mod_file_cache.dsp similarity index 100% rename from trunk/modules/cache/mod_file_cache.dsp rename to modules/cache/mod_file_cache.dsp diff --git a/trunk/modules/cache/mod_file_cache.exp b/modules/cache/mod_file_cache.exp similarity index 100% rename from trunk/modules/cache/mod_file_cache.exp rename to modules/cache/mod_file_cache.exp diff --git a/trunk/modules/cache/mod_mem_cache.c b/modules/cache/mod_mem_cache.c similarity index 100% rename from trunk/modules/cache/mod_mem_cache.c rename to modules/cache/mod_mem_cache.c diff --git a/trunk/modules/cache/mod_mem_cache.dsp b/modules/cache/mod_mem_cache.dsp similarity index 100% rename from trunk/modules/cache/mod_mem_cache.dsp rename to modules/cache/mod_mem_cache.dsp diff --git a/trunk/modules/config5.m4 b/modules/config5.m4 similarity index 100% rename from trunk/modules/config5.m4 rename to modules/config5.m4 diff --git a/trunk/modules/dav/fs/Makefile.in b/modules/dav/fs/Makefile.in similarity index 100% rename from trunk/modules/dav/fs/Makefile.in rename to modules/dav/fs/Makefile.in diff --git a/trunk/modules/dav/fs/NWGNUmakefile b/modules/dav/fs/NWGNUmakefile similarity index 100% rename from trunk/modules/dav/fs/NWGNUmakefile rename to modules/dav/fs/NWGNUmakefile diff --git a/trunk/modules/dav/fs/config6.m4 b/modules/dav/fs/config6.m4 similarity index 100% rename from trunk/modules/dav/fs/config6.m4 rename to modules/dav/fs/config6.m4 diff --git a/trunk/modules/dav/fs/dbm.c b/modules/dav/fs/dbm.c similarity index 100% rename from trunk/modules/dav/fs/dbm.c rename to modules/dav/fs/dbm.c diff --git a/trunk/modules/dav/fs/lock.c b/modules/dav/fs/lock.c similarity index 100% rename from trunk/modules/dav/fs/lock.c rename to modules/dav/fs/lock.c diff --git a/trunk/modules/dav/fs/mod_dav_fs.c b/modules/dav/fs/mod_dav_fs.c similarity index 100% rename from trunk/modules/dav/fs/mod_dav_fs.c rename to modules/dav/fs/mod_dav_fs.c diff --git a/trunk/modules/dav/fs/mod_dav_fs.dsp b/modules/dav/fs/mod_dav_fs.dsp similarity index 100% rename from trunk/modules/dav/fs/mod_dav_fs.dsp rename to modules/dav/fs/mod_dav_fs.dsp diff --git a/trunk/modules/dav/fs/repos.c b/modules/dav/fs/repos.c similarity index 100% rename from trunk/modules/dav/fs/repos.c rename to modules/dav/fs/repos.c diff --git a/trunk/modules/dav/fs/repos.h b/modules/dav/fs/repos.h similarity index 100% rename from trunk/modules/dav/fs/repos.h rename to modules/dav/fs/repos.h diff --git a/trunk/modules/dav/lock/Makefile.in b/modules/dav/lock/Makefile.in similarity index 100% rename from trunk/modules/dav/lock/Makefile.in rename to modules/dav/lock/Makefile.in diff --git a/trunk/modules/dav/lock/NWGNUmakefile b/modules/dav/lock/NWGNUmakefile similarity index 100% rename from trunk/modules/dav/lock/NWGNUmakefile rename to modules/dav/lock/NWGNUmakefile diff --git a/trunk/modules/dav/lock/config6.m4 b/modules/dav/lock/config6.m4 similarity index 100% rename from trunk/modules/dav/lock/config6.m4 rename to modules/dav/lock/config6.m4 diff --git a/trunk/modules/dav/lock/locks.c b/modules/dav/lock/locks.c similarity index 100% rename from trunk/modules/dav/lock/locks.c rename to modules/dav/lock/locks.c diff --git a/trunk/modules/dav/lock/locks.h b/modules/dav/lock/locks.h similarity index 100% rename from trunk/modules/dav/lock/locks.h rename to modules/dav/lock/locks.h diff --git a/trunk/modules/dav/lock/mod_dav_lock.c b/modules/dav/lock/mod_dav_lock.c similarity index 100% rename from trunk/modules/dav/lock/mod_dav_lock.c rename to modules/dav/lock/mod_dav_lock.c diff --git a/trunk/modules/dav/main/Makefile.in b/modules/dav/main/Makefile.in similarity index 100% rename from trunk/modules/dav/main/Makefile.in rename to modules/dav/main/Makefile.in diff --git a/trunk/modules/dav/main/NWGNUmakefile b/modules/dav/main/NWGNUmakefile similarity index 100% rename from trunk/modules/dav/main/NWGNUmakefile rename to modules/dav/main/NWGNUmakefile diff --git a/trunk/modules/dav/main/config5.m4 b/modules/dav/main/config5.m4 similarity index 100% rename from trunk/modules/dav/main/config5.m4 rename to modules/dav/main/config5.m4 diff --git a/trunk/modules/dav/main/dav.imp b/modules/dav/main/dav.imp similarity index 100% rename from trunk/modules/dav/main/dav.imp rename to modules/dav/main/dav.imp diff --git a/trunk/modules/dav/main/liveprop.c b/modules/dav/main/liveprop.c similarity index 100% rename from trunk/modules/dav/main/liveprop.c rename to modules/dav/main/liveprop.c diff --git a/trunk/modules/dav/main/mod_dav.c b/modules/dav/main/mod_dav.c similarity index 100% rename from trunk/modules/dav/main/mod_dav.c rename to modules/dav/main/mod_dav.c diff --git a/trunk/modules/dav/main/mod_dav.dsp b/modules/dav/main/mod_dav.dsp similarity index 100% rename from trunk/modules/dav/main/mod_dav.dsp rename to modules/dav/main/mod_dav.dsp diff --git a/trunk/modules/dav/main/mod_dav.h b/modules/dav/main/mod_dav.h similarity index 100% rename from trunk/modules/dav/main/mod_dav.h rename to modules/dav/main/mod_dav.h diff --git a/trunk/modules/dav/main/props.c b/modules/dav/main/props.c similarity index 100% rename from trunk/modules/dav/main/props.c rename to modules/dav/main/props.c diff --git a/trunk/modules/dav/main/providers.c b/modules/dav/main/providers.c similarity index 100% rename from trunk/modules/dav/main/providers.c rename to modules/dav/main/providers.c diff --git a/trunk/modules/dav/main/std_liveprop.c b/modules/dav/main/std_liveprop.c similarity index 100% rename from trunk/modules/dav/main/std_liveprop.c rename to modules/dav/main/std_liveprop.c diff --git a/trunk/modules/dav/main/util.c b/modules/dav/main/util.c similarity index 100% rename from trunk/modules/dav/main/util.c rename to modules/dav/main/util.c diff --git a/trunk/modules/dav/main/util_lock.c b/modules/dav/main/util_lock.c similarity index 100% rename from trunk/modules/dav/main/util_lock.c rename to modules/dav/main/util_lock.c diff --git a/trunk/modules/debug/Makefile.in b/modules/debug/Makefile.in similarity index 100% rename from trunk/modules/debug/Makefile.in rename to modules/debug/Makefile.in diff --git a/trunk/modules/debug/NWGNUmakefile b/modules/debug/NWGNUmakefile similarity index 100% rename from trunk/modules/debug/NWGNUmakefile rename to modules/debug/NWGNUmakefile diff --git a/trunk/modules/debug/NWGNUmodbucketeer b/modules/debug/NWGNUmodbucketeer similarity index 100% rename from trunk/modules/debug/NWGNUmodbucketeer rename to modules/debug/NWGNUmodbucketeer diff --git a/trunk/modules/debug/NWGNUmoddumpio b/modules/debug/NWGNUmoddumpio similarity index 100% rename from trunk/modules/debug/NWGNUmoddumpio rename to modules/debug/NWGNUmoddumpio diff --git a/trunk/modules/debug/README b/modules/debug/README similarity index 100% rename from trunk/modules/debug/README rename to modules/debug/README diff --git a/trunk/modules/debug/config.m4 b/modules/debug/config.m4 similarity index 100% rename from trunk/modules/debug/config.m4 rename to modules/debug/config.m4 diff --git a/trunk/modules/debug/mod_bucketeer.c b/modules/debug/mod_bucketeer.c similarity index 100% rename from trunk/modules/debug/mod_bucketeer.c rename to modules/debug/mod_bucketeer.c diff --git a/trunk/modules/debug/mod_bucketeer.dsp b/modules/debug/mod_bucketeer.dsp similarity index 100% rename from trunk/modules/debug/mod_bucketeer.dsp rename to modules/debug/mod_bucketeer.dsp diff --git a/trunk/modules/debug/mod_dumpio.c b/modules/debug/mod_dumpio.c similarity index 100% rename from trunk/modules/debug/mod_dumpio.c rename to modules/debug/mod_dumpio.c diff --git a/trunk/modules/debug/mod_dumpio.dsp b/modules/debug/mod_dumpio.dsp similarity index 100% rename from trunk/modules/debug/mod_dumpio.dsp rename to modules/debug/mod_dumpio.dsp diff --git a/trunk/modules/echo/.indent.pro b/modules/echo/.indent.pro similarity index 100% rename from trunk/modules/echo/.indent.pro rename to modules/echo/.indent.pro diff --git a/trunk/modules/echo/Makefile.in b/modules/echo/Makefile.in similarity index 100% rename from trunk/modules/echo/Makefile.in rename to modules/echo/Makefile.in diff --git a/trunk/modules/echo/NWGNUmakefile b/modules/echo/NWGNUmakefile similarity index 100% rename from trunk/modules/echo/NWGNUmakefile rename to modules/echo/NWGNUmakefile diff --git a/trunk/modules/echo/config.m4 b/modules/echo/config.m4 similarity index 100% rename from trunk/modules/echo/config.m4 rename to modules/echo/config.m4 diff --git a/trunk/modules/echo/mod_echo.c b/modules/echo/mod_echo.c similarity index 100% rename from trunk/modules/echo/mod_echo.c rename to modules/echo/mod_echo.c diff --git a/trunk/modules/echo/mod_echo.dsp b/modules/echo/mod_echo.dsp similarity index 100% rename from trunk/modules/echo/mod_echo.dsp rename to modules/echo/mod_echo.dsp diff --git a/trunk/modules/experimental/.indent.pro b/modules/experimental/.indent.pro similarity index 100% rename from trunk/modules/experimental/.indent.pro rename to modules/experimental/.indent.pro diff --git a/trunk/modules/experimental/Makefile.in b/modules/experimental/Makefile.in similarity index 100% rename from trunk/modules/experimental/Makefile.in rename to modules/experimental/Makefile.in diff --git a/trunk/modules/experimental/NWGNUcharsetl b/modules/experimental/NWGNUcharsetl similarity index 100% rename from trunk/modules/experimental/NWGNUcharsetl rename to modules/experimental/NWGNUcharsetl diff --git a/trunk/modules/experimental/NWGNUexample b/modules/experimental/NWGNUexample similarity index 100% rename from trunk/modules/experimental/NWGNUexample rename to modules/experimental/NWGNUexample diff --git a/trunk/modules/experimental/NWGNUmakefile b/modules/experimental/NWGNUmakefile similarity index 100% rename from trunk/modules/experimental/NWGNUmakefile rename to modules/experimental/NWGNUmakefile diff --git a/trunk/modules/experimental/NWGNUmod_filter b/modules/experimental/NWGNUmod_filter similarity index 100% rename from trunk/modules/experimental/NWGNUmod_filter rename to modules/experimental/NWGNUmod_filter diff --git a/trunk/modules/experimental/README b/modules/experimental/README similarity index 100% rename from trunk/modules/experimental/README rename to modules/experimental/README diff --git a/trunk/modules/experimental/config.m4 b/modules/experimental/config.m4 similarity index 100% rename from trunk/modules/experimental/config.m4 rename to modules/experimental/config.m4 diff --git a/trunk/modules/experimental/mod_case_filter.c b/modules/experimental/mod_case_filter.c similarity index 100% rename from trunk/modules/experimental/mod_case_filter.c rename to modules/experimental/mod_case_filter.c diff --git a/trunk/modules/experimental/mod_case_filter_in.c b/modules/experimental/mod_case_filter_in.c similarity index 100% rename from trunk/modules/experimental/mod_case_filter_in.c rename to modules/experimental/mod_case_filter_in.c diff --git a/trunk/modules/experimental/mod_charset_lite.c b/modules/experimental/mod_charset_lite.c similarity index 100% rename from trunk/modules/experimental/mod_charset_lite.c rename to modules/experimental/mod_charset_lite.c diff --git a/trunk/modules/experimental/mod_charset_lite.dsp b/modules/experimental/mod_charset_lite.dsp similarity index 100% rename from trunk/modules/experimental/mod_charset_lite.dsp rename to modules/experimental/mod_charset_lite.dsp diff --git a/trunk/modules/experimental/mod_charset_lite.exp b/modules/experimental/mod_charset_lite.exp similarity index 100% rename from trunk/modules/experimental/mod_charset_lite.exp rename to modules/experimental/mod_charset_lite.exp diff --git a/trunk/modules/experimental/mod_dbd.c b/modules/experimental/mod_dbd.c similarity index 100% rename from trunk/modules/experimental/mod_dbd.c rename to modules/experimental/mod_dbd.c diff --git a/trunk/modules/experimental/mod_dbd.h b/modules/experimental/mod_dbd.h similarity index 100% rename from trunk/modules/experimental/mod_dbd.h rename to modules/experimental/mod_dbd.h diff --git a/trunk/modules/experimental/mod_example.c b/modules/experimental/mod_example.c similarity index 100% rename from trunk/modules/experimental/mod_example.c rename to modules/experimental/mod_example.c diff --git a/trunk/modules/experimental/mod_filter.c b/modules/experimental/mod_filter.c similarity index 100% rename from trunk/modules/experimental/mod_filter.c rename to modules/experimental/mod_filter.c diff --git a/trunk/modules/filters/.indent.pro b/modules/filters/.indent.pro similarity index 100% rename from trunk/modules/filters/.indent.pro rename to modules/filters/.indent.pro diff --git a/trunk/modules/filters/Makefile.in b/modules/filters/Makefile.in similarity index 100% rename from trunk/modules/filters/Makefile.in rename to modules/filters/Makefile.in diff --git a/trunk/modules/filters/NWGNUdeflate b/modules/filters/NWGNUdeflate similarity index 100% rename from trunk/modules/filters/NWGNUdeflate rename to modules/filters/NWGNUdeflate diff --git a/trunk/modules/filters/NWGNUextfiltr b/modules/filters/NWGNUextfiltr similarity index 100% rename from trunk/modules/filters/NWGNUextfiltr rename to modules/filters/NWGNUextfiltr diff --git a/trunk/modules/filters/NWGNUmakefile b/modules/filters/NWGNUmakefile similarity index 100% rename from trunk/modules/filters/NWGNUmakefile rename to modules/filters/NWGNUmakefile diff --git a/trunk/modules/filters/config.m4 b/modules/filters/config.m4 similarity index 100% rename from trunk/modules/filters/config.m4 rename to modules/filters/config.m4 diff --git a/trunk/modules/filters/mod_deflate.c b/modules/filters/mod_deflate.c similarity index 100% rename from trunk/modules/filters/mod_deflate.c rename to modules/filters/mod_deflate.c diff --git a/trunk/modules/filters/mod_deflate.dsp b/modules/filters/mod_deflate.dsp similarity index 100% rename from trunk/modules/filters/mod_deflate.dsp rename to modules/filters/mod_deflate.dsp diff --git a/trunk/modules/filters/mod_deflate.exp b/modules/filters/mod_deflate.exp similarity index 100% rename from trunk/modules/filters/mod_deflate.exp rename to modules/filters/mod_deflate.exp diff --git a/trunk/modules/filters/mod_ext_filter.c b/modules/filters/mod_ext_filter.c similarity index 100% rename from trunk/modules/filters/mod_ext_filter.c rename to modules/filters/mod_ext_filter.c diff --git a/trunk/modules/filters/mod_ext_filter.dsp b/modules/filters/mod_ext_filter.dsp similarity index 100% rename from trunk/modules/filters/mod_ext_filter.dsp rename to modules/filters/mod_ext_filter.dsp diff --git a/trunk/modules/filters/mod_ext_filter.exp b/modules/filters/mod_ext_filter.exp similarity index 100% rename from trunk/modules/filters/mod_ext_filter.exp rename to modules/filters/mod_ext_filter.exp diff --git a/trunk/modules/filters/mod_include.c b/modules/filters/mod_include.c similarity index 100% rename from trunk/modules/filters/mod_include.c rename to modules/filters/mod_include.c diff --git a/trunk/modules/filters/mod_include.dsp b/modules/filters/mod_include.dsp similarity index 100% rename from trunk/modules/filters/mod_include.dsp rename to modules/filters/mod_include.dsp diff --git a/trunk/modules/filters/mod_include.exp b/modules/filters/mod_include.exp similarity index 100% rename from trunk/modules/filters/mod_include.exp rename to modules/filters/mod_include.exp diff --git a/trunk/modules/filters/mod_include.h b/modules/filters/mod_include.h similarity index 100% rename from trunk/modules/filters/mod_include.h rename to modules/filters/mod_include.h diff --git a/trunk/modules/generators/.indent.pro b/modules/generators/.indent.pro similarity index 100% rename from trunk/modules/generators/.indent.pro rename to modules/generators/.indent.pro diff --git a/trunk/modules/generators/Makefile.in b/modules/generators/Makefile.in similarity index 100% rename from trunk/modules/generators/Makefile.in rename to modules/generators/Makefile.in diff --git a/trunk/modules/generators/NWGNUautoindex b/modules/generators/NWGNUautoindex similarity index 100% rename from trunk/modules/generators/NWGNUautoindex rename to modules/generators/NWGNUautoindex diff --git a/trunk/modules/generators/NWGNUinfo b/modules/generators/NWGNUinfo similarity index 100% rename from trunk/modules/generators/NWGNUinfo rename to modules/generators/NWGNUinfo diff --git a/trunk/modules/generators/NWGNUmakefile b/modules/generators/NWGNUmakefile similarity index 100% rename from trunk/modules/generators/NWGNUmakefile rename to modules/generators/NWGNUmakefile diff --git a/trunk/modules/generators/NWGNUmod_asis b/modules/generators/NWGNUmod_asis similarity index 100% rename from trunk/modules/generators/NWGNUmod_asis rename to modules/generators/NWGNUmod_asis diff --git a/trunk/modules/generators/NWGNUmod_cgi b/modules/generators/NWGNUmod_cgi similarity index 100% rename from trunk/modules/generators/NWGNUmod_cgi rename to modules/generators/NWGNUmod_cgi diff --git a/trunk/modules/generators/NWGNUstatus b/modules/generators/NWGNUstatus similarity index 100% rename from trunk/modules/generators/NWGNUstatus rename to modules/generators/NWGNUstatus diff --git a/trunk/modules/generators/config5.m4 b/modules/generators/config5.m4 similarity index 100% rename from trunk/modules/generators/config5.m4 rename to modules/generators/config5.m4 diff --git a/trunk/modules/generators/mod_asis.c b/modules/generators/mod_asis.c similarity index 100% rename from trunk/modules/generators/mod_asis.c rename to modules/generators/mod_asis.c diff --git a/trunk/modules/generators/mod_asis.dsp b/modules/generators/mod_asis.dsp similarity index 100% rename from trunk/modules/generators/mod_asis.dsp rename to modules/generators/mod_asis.dsp diff --git a/trunk/modules/generators/mod_asis.exp b/modules/generators/mod_asis.exp similarity index 100% rename from trunk/modules/generators/mod_asis.exp rename to modules/generators/mod_asis.exp diff --git a/trunk/modules/generators/mod_autoindex.c b/modules/generators/mod_autoindex.c similarity index 100% rename from trunk/modules/generators/mod_autoindex.c rename to modules/generators/mod_autoindex.c diff --git a/trunk/modules/generators/mod_autoindex.dsp b/modules/generators/mod_autoindex.dsp similarity index 100% rename from trunk/modules/generators/mod_autoindex.dsp rename to modules/generators/mod_autoindex.dsp diff --git a/trunk/modules/generators/mod_autoindex.exp b/modules/generators/mod_autoindex.exp similarity index 100% rename from trunk/modules/generators/mod_autoindex.exp rename to modules/generators/mod_autoindex.exp diff --git a/trunk/modules/generators/mod_cgi.c b/modules/generators/mod_cgi.c similarity index 100% rename from trunk/modules/generators/mod_cgi.c rename to modules/generators/mod_cgi.c diff --git a/trunk/modules/generators/mod_cgi.dsp b/modules/generators/mod_cgi.dsp similarity index 100% rename from trunk/modules/generators/mod_cgi.dsp rename to modules/generators/mod_cgi.dsp diff --git a/trunk/modules/generators/mod_cgi.exp b/modules/generators/mod_cgi.exp similarity index 100% rename from trunk/modules/generators/mod_cgi.exp rename to modules/generators/mod_cgi.exp diff --git a/trunk/modules/generators/mod_cgi.h b/modules/generators/mod_cgi.h similarity index 100% rename from trunk/modules/generators/mod_cgi.h rename to modules/generators/mod_cgi.h diff --git a/trunk/modules/generators/mod_cgid.c b/modules/generators/mod_cgid.c similarity index 100% rename from trunk/modules/generators/mod_cgid.c rename to modules/generators/mod_cgid.c diff --git a/trunk/modules/generators/mod_cgid.exp b/modules/generators/mod_cgid.exp similarity index 100% rename from trunk/modules/generators/mod_cgid.exp rename to modules/generators/mod_cgid.exp diff --git a/trunk/modules/generators/mod_info.c b/modules/generators/mod_info.c similarity index 100% rename from trunk/modules/generators/mod_info.c rename to modules/generators/mod_info.c diff --git a/trunk/modules/generators/mod_info.dsp b/modules/generators/mod_info.dsp similarity index 100% rename from trunk/modules/generators/mod_info.dsp rename to modules/generators/mod_info.dsp diff --git a/trunk/modules/generators/mod_info.exp b/modules/generators/mod_info.exp similarity index 100% rename from trunk/modules/generators/mod_info.exp rename to modules/generators/mod_info.exp diff --git a/trunk/modules/generators/mod_status.c b/modules/generators/mod_status.c similarity index 100% rename from trunk/modules/generators/mod_status.c rename to modules/generators/mod_status.c diff --git a/trunk/modules/generators/mod_status.dsp b/modules/generators/mod_status.dsp similarity index 100% rename from trunk/modules/generators/mod_status.dsp rename to modules/generators/mod_status.dsp diff --git a/trunk/modules/generators/mod_status.exp b/modules/generators/mod_status.exp similarity index 100% rename from trunk/modules/generators/mod_status.exp rename to modules/generators/mod_status.exp diff --git a/trunk/modules/generators/mod_status.h b/modules/generators/mod_status.h similarity index 100% rename from trunk/modules/generators/mod_status.h rename to modules/generators/mod_status.h diff --git a/trunk/modules/generators/mod_suexec.c b/modules/generators/mod_suexec.c similarity index 100% rename from trunk/modules/generators/mod_suexec.c rename to modules/generators/mod_suexec.c diff --git a/trunk/modules/generators/mod_suexec.h b/modules/generators/mod_suexec.h similarity index 100% rename from trunk/modules/generators/mod_suexec.h rename to modules/generators/mod_suexec.h diff --git a/trunk/modules/http/.indent.pro b/modules/http/.indent.pro similarity index 100% rename from trunk/modules/http/.indent.pro rename to modules/http/.indent.pro diff --git a/trunk/modules/http/Makefile.in b/modules/http/Makefile.in similarity index 100% rename from trunk/modules/http/Makefile.in rename to modules/http/Makefile.in diff --git a/trunk/modules/http/byterange_filter.c b/modules/http/byterange_filter.c similarity index 100% rename from trunk/modules/http/byterange_filter.c rename to modules/http/byterange_filter.c diff --git a/trunk/modules/http/chunk_filter.c b/modules/http/chunk_filter.c similarity index 100% rename from trunk/modules/http/chunk_filter.c rename to modules/http/chunk_filter.c diff --git a/trunk/modules/http/config2.m4 b/modules/http/config2.m4 similarity index 100% rename from trunk/modules/http/config2.m4 rename to modules/http/config2.m4 diff --git a/trunk/modules/http/http_core.c b/modules/http/http_core.c similarity index 100% rename from trunk/modules/http/http_core.c rename to modules/http/http_core.c diff --git a/trunk/modules/http/http_etag.c b/modules/http/http_etag.c similarity index 100% rename from trunk/modules/http/http_etag.c rename to modules/http/http_etag.c diff --git a/trunk/modules/http/http_filters.c b/modules/http/http_filters.c similarity index 100% rename from trunk/modules/http/http_filters.c rename to modules/http/http_filters.c diff --git a/trunk/modules/http/http_protocol.c b/modules/http/http_protocol.c similarity index 100% rename from trunk/modules/http/http_protocol.c rename to modules/http/http_protocol.c diff --git a/trunk/modules/http/http_request.c b/modules/http/http_request.c similarity index 100% rename from trunk/modules/http/http_request.c rename to modules/http/http_request.c diff --git a/trunk/modules/http/mod_core.h b/modules/http/mod_core.h similarity index 100% rename from trunk/modules/http/mod_core.h rename to modules/http/mod_core.h diff --git a/trunk/modules/http/mod_mime.c b/modules/http/mod_mime.c similarity index 100% rename from trunk/modules/http/mod_mime.c rename to modules/http/mod_mime.c diff --git a/trunk/modules/http/mod_mime.dsp b/modules/http/mod_mime.dsp similarity index 100% rename from trunk/modules/http/mod_mime.dsp rename to modules/http/mod_mime.dsp diff --git a/trunk/modules/http/mod_mime.exp b/modules/http/mod_mime.exp similarity index 100% rename from trunk/modules/http/mod_mime.exp rename to modules/http/mod_mime.exp diff --git a/trunk/modules/ldap/Makefile.in b/modules/ldap/Makefile.in similarity index 100% rename from trunk/modules/ldap/Makefile.in rename to modules/ldap/Makefile.in diff --git a/trunk/modules/ldap/NWGNUmakefile b/modules/ldap/NWGNUmakefile similarity index 100% rename from trunk/modules/ldap/NWGNUmakefile rename to modules/ldap/NWGNUmakefile diff --git a/trunk/modules/ldap/README.ldap b/modules/ldap/README.ldap similarity index 100% rename from trunk/modules/ldap/README.ldap rename to modules/ldap/README.ldap diff --git a/trunk/modules/ldap/config.m4 b/modules/ldap/config.m4 similarity index 100% rename from trunk/modules/ldap/config.m4 rename to modules/ldap/config.m4 diff --git a/trunk/modules/ldap/mod_ldap.dsp b/modules/ldap/mod_ldap.dsp similarity index 100% rename from trunk/modules/ldap/mod_ldap.dsp rename to modules/ldap/mod_ldap.dsp diff --git a/trunk/modules/ldap/util_ldap.c b/modules/ldap/util_ldap.c similarity index 100% rename from trunk/modules/ldap/util_ldap.c rename to modules/ldap/util_ldap.c diff --git a/trunk/modules/ldap/util_ldap_cache.c b/modules/ldap/util_ldap_cache.c similarity index 100% rename from trunk/modules/ldap/util_ldap_cache.c rename to modules/ldap/util_ldap_cache.c diff --git a/trunk/modules/ldap/util_ldap_cache.h b/modules/ldap/util_ldap_cache.h similarity index 100% rename from trunk/modules/ldap/util_ldap_cache.h rename to modules/ldap/util_ldap_cache.h diff --git a/trunk/modules/ldap/util_ldap_cache_mgr.c b/modules/ldap/util_ldap_cache_mgr.c similarity index 100% rename from trunk/modules/ldap/util_ldap_cache_mgr.c rename to modules/ldap/util_ldap_cache_mgr.c diff --git a/trunk/modules/loggers/.indent.pro b/modules/loggers/.indent.pro similarity index 100% rename from trunk/modules/loggers/.indent.pro rename to modules/loggers/.indent.pro diff --git a/trunk/modules/loggers/Makefile.in b/modules/loggers/Makefile.in similarity index 100% rename from trunk/modules/loggers/Makefile.in rename to modules/loggers/Makefile.in diff --git a/trunk/modules/loggers/NWGNUforensic b/modules/loggers/NWGNUforensic similarity index 100% rename from trunk/modules/loggers/NWGNUforensic rename to modules/loggers/NWGNUforensic diff --git a/trunk/modules/loggers/NWGNUmakefile b/modules/loggers/NWGNUmakefile similarity index 100% rename from trunk/modules/loggers/NWGNUmakefile rename to modules/loggers/NWGNUmakefile diff --git a/trunk/modules/loggers/NWGNUmodlogio b/modules/loggers/NWGNUmodlogio similarity index 100% rename from trunk/modules/loggers/NWGNUmodlogio rename to modules/loggers/NWGNUmodlogio diff --git a/trunk/modules/loggers/config.m4 b/modules/loggers/config.m4 similarity index 100% rename from trunk/modules/loggers/config.m4 rename to modules/loggers/config.m4 diff --git a/trunk/modules/loggers/mod_log_config.c b/modules/loggers/mod_log_config.c similarity index 100% rename from trunk/modules/loggers/mod_log_config.c rename to modules/loggers/mod_log_config.c diff --git a/trunk/modules/loggers/mod_log_config.dsp b/modules/loggers/mod_log_config.dsp similarity index 100% rename from trunk/modules/loggers/mod_log_config.dsp rename to modules/loggers/mod_log_config.dsp diff --git a/trunk/modules/loggers/mod_log_config.exp b/modules/loggers/mod_log_config.exp similarity index 100% rename from trunk/modules/loggers/mod_log_config.exp rename to modules/loggers/mod_log_config.exp diff --git a/trunk/modules/loggers/mod_log_config.h b/modules/loggers/mod_log_config.h similarity index 100% rename from trunk/modules/loggers/mod_log_config.h rename to modules/loggers/mod_log_config.h diff --git a/trunk/modules/loggers/mod_log_forensic.c b/modules/loggers/mod_log_forensic.c similarity index 100% rename from trunk/modules/loggers/mod_log_forensic.c rename to modules/loggers/mod_log_forensic.c diff --git a/trunk/modules/loggers/mod_log_forensic.dsp b/modules/loggers/mod_log_forensic.dsp similarity index 100% rename from trunk/modules/loggers/mod_log_forensic.dsp rename to modules/loggers/mod_log_forensic.dsp diff --git a/trunk/modules/loggers/mod_log_forensic.exp b/modules/loggers/mod_log_forensic.exp similarity index 100% rename from trunk/modules/loggers/mod_log_forensic.exp rename to modules/loggers/mod_log_forensic.exp diff --git a/trunk/modules/loggers/mod_logio.c b/modules/loggers/mod_logio.c similarity index 100% rename from trunk/modules/loggers/mod_logio.c rename to modules/loggers/mod_logio.c diff --git a/trunk/modules/loggers/mod_logio.dsp b/modules/loggers/mod_logio.dsp similarity index 100% rename from trunk/modules/loggers/mod_logio.dsp rename to modules/loggers/mod_logio.dsp diff --git a/trunk/modules/mappers/.indent.pro b/modules/mappers/.indent.pro similarity index 100% rename from trunk/modules/mappers/.indent.pro rename to modules/mappers/.indent.pro diff --git a/trunk/modules/mappers/Makefile.in b/modules/mappers/Makefile.in similarity index 100% rename from trunk/modules/mappers/Makefile.in rename to modules/mappers/Makefile.in diff --git a/trunk/modules/mappers/NWGNUactions b/modules/mappers/NWGNUactions similarity index 100% rename from trunk/modules/mappers/NWGNUactions rename to modules/mappers/NWGNUactions diff --git a/trunk/modules/mappers/NWGNUimagemap b/modules/mappers/NWGNUimagemap similarity index 100% rename from trunk/modules/mappers/NWGNUimagemap rename to modules/mappers/NWGNUimagemap diff --git a/trunk/modules/mappers/NWGNUmakefile b/modules/mappers/NWGNUmakefile similarity index 100% rename from trunk/modules/mappers/NWGNUmakefile rename to modules/mappers/NWGNUmakefile diff --git a/trunk/modules/mappers/NWGNUrewrite b/modules/mappers/NWGNUrewrite similarity index 100% rename from trunk/modules/mappers/NWGNUrewrite rename to modules/mappers/NWGNUrewrite diff --git a/trunk/modules/mappers/NWGNUspeling b/modules/mappers/NWGNUspeling similarity index 100% rename from trunk/modules/mappers/NWGNUspeling rename to modules/mappers/NWGNUspeling diff --git a/trunk/modules/mappers/NWGNUuserdir b/modules/mappers/NWGNUuserdir similarity index 100% rename from trunk/modules/mappers/NWGNUuserdir rename to modules/mappers/NWGNUuserdir diff --git a/trunk/modules/mappers/NWGNUvhost b/modules/mappers/NWGNUvhost similarity index 100% rename from trunk/modules/mappers/NWGNUvhost rename to modules/mappers/NWGNUvhost diff --git a/trunk/modules/mappers/config9.m4 b/modules/mappers/config9.m4 similarity index 100% rename from trunk/modules/mappers/config9.m4 rename to modules/mappers/config9.m4 diff --git a/trunk/modules/mappers/mod_actions.c b/modules/mappers/mod_actions.c similarity index 100% rename from trunk/modules/mappers/mod_actions.c rename to modules/mappers/mod_actions.c diff --git a/trunk/modules/mappers/mod_actions.dsp b/modules/mappers/mod_actions.dsp similarity index 100% rename from trunk/modules/mappers/mod_actions.dsp rename to modules/mappers/mod_actions.dsp diff --git a/trunk/modules/mappers/mod_actions.exp b/modules/mappers/mod_actions.exp similarity index 100% rename from trunk/modules/mappers/mod_actions.exp rename to modules/mappers/mod_actions.exp diff --git a/trunk/modules/mappers/mod_alias.c b/modules/mappers/mod_alias.c similarity index 100% rename from trunk/modules/mappers/mod_alias.c rename to modules/mappers/mod_alias.c diff --git a/trunk/modules/mappers/mod_alias.dsp b/modules/mappers/mod_alias.dsp similarity index 100% rename from trunk/modules/mappers/mod_alias.dsp rename to modules/mappers/mod_alias.dsp diff --git a/trunk/modules/mappers/mod_alias.exp b/modules/mappers/mod_alias.exp similarity index 100% rename from trunk/modules/mappers/mod_alias.exp rename to modules/mappers/mod_alias.exp diff --git a/trunk/modules/mappers/mod_dir.c b/modules/mappers/mod_dir.c similarity index 100% rename from trunk/modules/mappers/mod_dir.c rename to modules/mappers/mod_dir.c diff --git a/trunk/modules/mappers/mod_dir.dsp b/modules/mappers/mod_dir.dsp similarity index 100% rename from trunk/modules/mappers/mod_dir.dsp rename to modules/mappers/mod_dir.dsp diff --git a/trunk/modules/mappers/mod_dir.exp b/modules/mappers/mod_dir.exp similarity index 100% rename from trunk/modules/mappers/mod_dir.exp rename to modules/mappers/mod_dir.exp diff --git a/trunk/modules/mappers/mod_imagemap.c b/modules/mappers/mod_imagemap.c similarity index 100% rename from trunk/modules/mappers/mod_imagemap.c rename to modules/mappers/mod_imagemap.c diff --git a/trunk/modules/mappers/mod_imagemap.dsp b/modules/mappers/mod_imagemap.dsp similarity index 100% rename from trunk/modules/mappers/mod_imagemap.dsp rename to modules/mappers/mod_imagemap.dsp diff --git a/trunk/modules/mappers/mod_imagemap.exp b/modules/mappers/mod_imagemap.exp similarity index 100% rename from trunk/modules/mappers/mod_imagemap.exp rename to modules/mappers/mod_imagemap.exp diff --git a/trunk/modules/mappers/mod_negotiation.c b/modules/mappers/mod_negotiation.c similarity index 100% rename from trunk/modules/mappers/mod_negotiation.c rename to modules/mappers/mod_negotiation.c diff --git a/trunk/modules/mappers/mod_negotiation.dsp b/modules/mappers/mod_negotiation.dsp similarity index 100% rename from trunk/modules/mappers/mod_negotiation.dsp rename to modules/mappers/mod_negotiation.dsp diff --git a/trunk/modules/mappers/mod_negotiation.exp b/modules/mappers/mod_negotiation.exp similarity index 100% rename from trunk/modules/mappers/mod_negotiation.exp rename to modules/mappers/mod_negotiation.exp diff --git a/trunk/modules/mappers/mod_rewrite.c b/modules/mappers/mod_rewrite.c similarity index 100% rename from trunk/modules/mappers/mod_rewrite.c rename to modules/mappers/mod_rewrite.c diff --git a/trunk/modules/mappers/mod_rewrite.dsp b/modules/mappers/mod_rewrite.dsp similarity index 100% rename from trunk/modules/mappers/mod_rewrite.dsp rename to modules/mappers/mod_rewrite.dsp diff --git a/trunk/modules/mappers/mod_rewrite.exp b/modules/mappers/mod_rewrite.exp similarity index 100% rename from trunk/modules/mappers/mod_rewrite.exp rename to modules/mappers/mod_rewrite.exp diff --git a/trunk/modules/mappers/mod_rewrite.h b/modules/mappers/mod_rewrite.h similarity index 100% rename from trunk/modules/mappers/mod_rewrite.h rename to modules/mappers/mod_rewrite.h diff --git a/trunk/modules/mappers/mod_so.c b/modules/mappers/mod_so.c similarity index 100% rename from trunk/modules/mappers/mod_so.c rename to modules/mappers/mod_so.c diff --git a/trunk/modules/mappers/mod_so.h b/modules/mappers/mod_so.h similarity index 100% rename from trunk/modules/mappers/mod_so.h rename to modules/mappers/mod_so.h diff --git a/trunk/modules/mappers/mod_speling.c b/modules/mappers/mod_speling.c similarity index 100% rename from trunk/modules/mappers/mod_speling.c rename to modules/mappers/mod_speling.c diff --git a/trunk/modules/mappers/mod_speling.dsp b/modules/mappers/mod_speling.dsp similarity index 100% rename from trunk/modules/mappers/mod_speling.dsp rename to modules/mappers/mod_speling.dsp diff --git a/trunk/modules/mappers/mod_speling.exp b/modules/mappers/mod_speling.exp similarity index 100% rename from trunk/modules/mappers/mod_speling.exp rename to modules/mappers/mod_speling.exp diff --git a/trunk/modules/mappers/mod_userdir.c b/modules/mappers/mod_userdir.c similarity index 100% rename from trunk/modules/mappers/mod_userdir.c rename to modules/mappers/mod_userdir.c diff --git a/trunk/modules/mappers/mod_userdir.dsp b/modules/mappers/mod_userdir.dsp similarity index 100% rename from trunk/modules/mappers/mod_userdir.dsp rename to modules/mappers/mod_userdir.dsp diff --git a/trunk/modules/mappers/mod_userdir.exp b/modules/mappers/mod_userdir.exp similarity index 100% rename from trunk/modules/mappers/mod_userdir.exp rename to modules/mappers/mod_userdir.exp diff --git a/trunk/modules/mappers/mod_vhost_alias.c b/modules/mappers/mod_vhost_alias.c similarity index 100% rename from trunk/modules/mappers/mod_vhost_alias.c rename to modules/mappers/mod_vhost_alias.c diff --git a/trunk/modules/mappers/mod_vhost_alias.dsp b/modules/mappers/mod_vhost_alias.dsp similarity index 100% rename from trunk/modules/mappers/mod_vhost_alias.dsp rename to modules/mappers/mod_vhost_alias.dsp diff --git a/trunk/modules/mappers/mod_vhost_alias.exp b/modules/mappers/mod_vhost_alias.exp similarity index 100% rename from trunk/modules/mappers/mod_vhost_alias.exp rename to modules/mappers/mod_vhost_alias.exp diff --git a/trunk/modules/metadata/.indent.pro b/modules/metadata/.indent.pro similarity index 100% rename from trunk/modules/metadata/.indent.pro rename to modules/metadata/.indent.pro diff --git a/trunk/modules/metadata/Makefile.in b/modules/metadata/Makefile.in similarity index 100% rename from trunk/modules/metadata/Makefile.in rename to modules/metadata/Makefile.in diff --git a/trunk/modules/metadata/NWGNUcernmeta b/modules/metadata/NWGNUcernmeta similarity index 100% rename from trunk/modules/metadata/NWGNUcernmeta rename to modules/metadata/NWGNUcernmeta diff --git a/trunk/modules/metadata/NWGNUexpires b/modules/metadata/NWGNUexpires similarity index 100% rename from trunk/modules/metadata/NWGNUexpires rename to modules/metadata/NWGNUexpires diff --git a/trunk/modules/metadata/NWGNUheaders b/modules/metadata/NWGNUheaders similarity index 100% rename from trunk/modules/metadata/NWGNUheaders rename to modules/metadata/NWGNUheaders diff --git a/trunk/modules/metadata/NWGNUmakefile b/modules/metadata/NWGNUmakefile similarity index 100% rename from trunk/modules/metadata/NWGNUmakefile rename to modules/metadata/NWGNUmakefile diff --git a/trunk/modules/metadata/NWGNUmimemagi b/modules/metadata/NWGNUmimemagi similarity index 100% rename from trunk/modules/metadata/NWGNUmimemagi rename to modules/metadata/NWGNUmimemagi diff --git a/trunk/modules/metadata/NWGNUmodident b/modules/metadata/NWGNUmodident similarity index 100% rename from trunk/modules/metadata/NWGNUmodident rename to modules/metadata/NWGNUmodident diff --git a/trunk/modules/metadata/NWGNUmodversion b/modules/metadata/NWGNUmodversion similarity index 100% rename from trunk/modules/metadata/NWGNUmodversion rename to modules/metadata/NWGNUmodversion diff --git a/trunk/modules/metadata/NWGNUuniqueid b/modules/metadata/NWGNUuniqueid similarity index 100% rename from trunk/modules/metadata/NWGNUuniqueid rename to modules/metadata/NWGNUuniqueid diff --git a/trunk/modules/metadata/NWGNUusertrk b/modules/metadata/NWGNUusertrk similarity index 100% rename from trunk/modules/metadata/NWGNUusertrk rename to modules/metadata/NWGNUusertrk diff --git a/trunk/modules/metadata/config.m4 b/modules/metadata/config.m4 similarity index 100% rename from trunk/modules/metadata/config.m4 rename to modules/metadata/config.m4 diff --git a/trunk/modules/metadata/mod_cern_meta.c b/modules/metadata/mod_cern_meta.c similarity index 100% rename from trunk/modules/metadata/mod_cern_meta.c rename to modules/metadata/mod_cern_meta.c diff --git a/trunk/modules/metadata/mod_cern_meta.dsp b/modules/metadata/mod_cern_meta.dsp similarity index 100% rename from trunk/modules/metadata/mod_cern_meta.dsp rename to modules/metadata/mod_cern_meta.dsp diff --git a/trunk/modules/metadata/mod_cern_meta.exp b/modules/metadata/mod_cern_meta.exp similarity index 100% rename from trunk/modules/metadata/mod_cern_meta.exp rename to modules/metadata/mod_cern_meta.exp diff --git a/trunk/modules/metadata/mod_env.c b/modules/metadata/mod_env.c similarity index 100% rename from trunk/modules/metadata/mod_env.c rename to modules/metadata/mod_env.c diff --git a/trunk/modules/metadata/mod_env.dsp b/modules/metadata/mod_env.dsp similarity index 100% rename from trunk/modules/metadata/mod_env.dsp rename to modules/metadata/mod_env.dsp diff --git a/trunk/modules/metadata/mod_env.exp b/modules/metadata/mod_env.exp similarity index 100% rename from trunk/modules/metadata/mod_env.exp rename to modules/metadata/mod_env.exp diff --git a/trunk/modules/metadata/mod_expires.c b/modules/metadata/mod_expires.c similarity index 100% rename from trunk/modules/metadata/mod_expires.c rename to modules/metadata/mod_expires.c diff --git a/trunk/modules/metadata/mod_expires.dsp b/modules/metadata/mod_expires.dsp similarity index 100% rename from trunk/modules/metadata/mod_expires.dsp rename to modules/metadata/mod_expires.dsp diff --git a/trunk/modules/metadata/mod_expires.exp b/modules/metadata/mod_expires.exp similarity index 100% rename from trunk/modules/metadata/mod_expires.exp rename to modules/metadata/mod_expires.exp diff --git a/trunk/modules/metadata/mod_headers.c b/modules/metadata/mod_headers.c similarity index 100% rename from trunk/modules/metadata/mod_headers.c rename to modules/metadata/mod_headers.c diff --git a/trunk/modules/metadata/mod_headers.dsp b/modules/metadata/mod_headers.dsp similarity index 100% rename from trunk/modules/metadata/mod_headers.dsp rename to modules/metadata/mod_headers.dsp diff --git a/trunk/modules/metadata/mod_headers.exp b/modules/metadata/mod_headers.exp similarity index 100% rename from trunk/modules/metadata/mod_headers.exp rename to modules/metadata/mod_headers.exp diff --git a/trunk/modules/metadata/mod_ident.c b/modules/metadata/mod_ident.c similarity index 100% rename from trunk/modules/metadata/mod_ident.c rename to modules/metadata/mod_ident.c diff --git a/trunk/modules/metadata/mod_ident.dsp b/modules/metadata/mod_ident.dsp similarity index 100% rename from trunk/modules/metadata/mod_ident.dsp rename to modules/metadata/mod_ident.dsp diff --git a/trunk/modules/metadata/mod_ident.exp b/modules/metadata/mod_ident.exp similarity index 100% rename from trunk/modules/metadata/mod_ident.exp rename to modules/metadata/mod_ident.exp diff --git a/trunk/modules/metadata/mod_mime_magic.c b/modules/metadata/mod_mime_magic.c similarity index 100% rename from trunk/modules/metadata/mod_mime_magic.c rename to modules/metadata/mod_mime_magic.c diff --git a/trunk/modules/metadata/mod_mime_magic.dsp b/modules/metadata/mod_mime_magic.dsp similarity index 100% rename from trunk/modules/metadata/mod_mime_magic.dsp rename to modules/metadata/mod_mime_magic.dsp diff --git a/trunk/modules/metadata/mod_mime_magic.exp b/modules/metadata/mod_mime_magic.exp similarity index 100% rename from trunk/modules/metadata/mod_mime_magic.exp rename to modules/metadata/mod_mime_magic.exp diff --git a/trunk/modules/metadata/mod_setenvif.c b/modules/metadata/mod_setenvif.c similarity index 100% rename from trunk/modules/metadata/mod_setenvif.c rename to modules/metadata/mod_setenvif.c diff --git a/trunk/modules/metadata/mod_setenvif.dsp b/modules/metadata/mod_setenvif.dsp similarity index 100% rename from trunk/modules/metadata/mod_setenvif.dsp rename to modules/metadata/mod_setenvif.dsp diff --git a/trunk/modules/metadata/mod_setenvif.exp b/modules/metadata/mod_setenvif.exp similarity index 100% rename from trunk/modules/metadata/mod_setenvif.exp rename to modules/metadata/mod_setenvif.exp diff --git a/trunk/modules/metadata/mod_unique_id.c b/modules/metadata/mod_unique_id.c similarity index 100% rename from trunk/modules/metadata/mod_unique_id.c rename to modules/metadata/mod_unique_id.c diff --git a/trunk/modules/metadata/mod_unique_id.dsp b/modules/metadata/mod_unique_id.dsp similarity index 100% rename from trunk/modules/metadata/mod_unique_id.dsp rename to modules/metadata/mod_unique_id.dsp diff --git a/trunk/modules/metadata/mod_unique_id.exp b/modules/metadata/mod_unique_id.exp similarity index 100% rename from trunk/modules/metadata/mod_unique_id.exp rename to modules/metadata/mod_unique_id.exp diff --git a/trunk/modules/metadata/mod_usertrack.c b/modules/metadata/mod_usertrack.c similarity index 100% rename from trunk/modules/metadata/mod_usertrack.c rename to modules/metadata/mod_usertrack.c diff --git a/trunk/modules/metadata/mod_usertrack.dsp b/modules/metadata/mod_usertrack.dsp similarity index 100% rename from trunk/modules/metadata/mod_usertrack.dsp rename to modules/metadata/mod_usertrack.dsp diff --git a/trunk/modules/metadata/mod_usertrack.exp b/modules/metadata/mod_usertrack.exp similarity index 100% rename from trunk/modules/metadata/mod_usertrack.exp rename to modules/metadata/mod_usertrack.exp diff --git a/trunk/modules/metadata/mod_version.c b/modules/metadata/mod_version.c similarity index 100% rename from trunk/modules/metadata/mod_version.c rename to modules/metadata/mod_version.c diff --git a/trunk/modules/metadata/mod_version.dsp b/modules/metadata/mod_version.dsp similarity index 100% rename from trunk/modules/metadata/mod_version.dsp rename to modules/metadata/mod_version.dsp diff --git a/trunk/modules/metadata/mod_version.exp b/modules/metadata/mod_version.exp similarity index 100% rename from trunk/modules/metadata/mod_version.exp rename to modules/metadata/mod_version.exp diff --git a/trunk/modules/proxy/.indent.pro b/modules/proxy/.indent.pro similarity index 100% rename from trunk/modules/proxy/.indent.pro rename to modules/proxy/.indent.pro diff --git a/trunk/modules/proxy/CHANGES b/modules/proxy/CHANGES similarity index 100% rename from trunk/modules/proxy/CHANGES rename to modules/proxy/CHANGES diff --git a/trunk/modules/proxy/Makefile.in b/modules/proxy/Makefile.in similarity index 100% rename from trunk/modules/proxy/Makefile.in rename to modules/proxy/Makefile.in diff --git a/trunk/modules/proxy/NWGNUmakefile b/modules/proxy/NWGNUmakefile similarity index 100% rename from trunk/modules/proxy/NWGNUmakefile rename to modules/proxy/NWGNUmakefile diff --git a/trunk/modules/proxy/NWGNUproxy b/modules/proxy/NWGNUproxy similarity index 100% rename from trunk/modules/proxy/NWGNUproxy rename to modules/proxy/NWGNUproxy diff --git a/trunk/modules/proxy/NWGNUproxyajp b/modules/proxy/NWGNUproxyajp similarity index 100% rename from trunk/modules/proxy/NWGNUproxyajp rename to modules/proxy/NWGNUproxyajp diff --git a/trunk/modules/proxy/NWGNUproxybalancer b/modules/proxy/NWGNUproxybalancer similarity index 100% rename from trunk/modules/proxy/NWGNUproxybalancer rename to modules/proxy/NWGNUproxybalancer diff --git a/trunk/modules/proxy/NWGNUproxycon b/modules/proxy/NWGNUproxycon similarity index 100% rename from trunk/modules/proxy/NWGNUproxycon rename to modules/proxy/NWGNUproxycon diff --git a/trunk/modules/proxy/NWGNUproxyftp b/modules/proxy/NWGNUproxyftp similarity index 100% rename from trunk/modules/proxy/NWGNUproxyftp rename to modules/proxy/NWGNUproxyftp diff --git a/trunk/modules/proxy/NWGNUproxyhtp b/modules/proxy/NWGNUproxyhtp similarity index 100% rename from trunk/modules/proxy/NWGNUproxyhtp rename to modules/proxy/NWGNUproxyhtp diff --git a/trunk/modules/proxy/ajp.h b/modules/proxy/ajp.h similarity index 100% rename from trunk/modules/proxy/ajp.h rename to modules/proxy/ajp.h diff --git a/trunk/modules/proxy/ajp_header.c b/modules/proxy/ajp_header.c similarity index 100% rename from trunk/modules/proxy/ajp_header.c rename to modules/proxy/ajp_header.c diff --git a/trunk/modules/proxy/ajp_header.h b/modules/proxy/ajp_header.h similarity index 100% rename from trunk/modules/proxy/ajp_header.h rename to modules/proxy/ajp_header.h diff --git a/trunk/modules/proxy/ajp_link.c b/modules/proxy/ajp_link.c similarity index 100% rename from trunk/modules/proxy/ajp_link.c rename to modules/proxy/ajp_link.c diff --git a/trunk/modules/proxy/ajp_msg.c b/modules/proxy/ajp_msg.c similarity index 100% rename from trunk/modules/proxy/ajp_msg.c rename to modules/proxy/ajp_msg.c diff --git a/trunk/modules/proxy/config.m4 b/modules/proxy/config.m4 similarity index 100% rename from trunk/modules/proxy/config.m4 rename to modules/proxy/config.m4 diff --git a/trunk/modules/proxy/libproxy.exp b/modules/proxy/libproxy.exp similarity index 100% rename from trunk/modules/proxy/libproxy.exp rename to modules/proxy/libproxy.exp diff --git a/trunk/modules/proxy/mod_proxy.c b/modules/proxy/mod_proxy.c similarity index 100% rename from trunk/modules/proxy/mod_proxy.c rename to modules/proxy/mod_proxy.c diff --git a/trunk/modules/proxy/mod_proxy.dsp b/modules/proxy/mod_proxy.dsp similarity index 100% rename from trunk/modules/proxy/mod_proxy.dsp rename to modules/proxy/mod_proxy.dsp diff --git a/trunk/modules/proxy/mod_proxy.h b/modules/proxy/mod_proxy.h similarity index 100% rename from trunk/modules/proxy/mod_proxy.h rename to modules/proxy/mod_proxy.h diff --git a/trunk/modules/proxy/mod_proxy_ajp.c b/modules/proxy/mod_proxy_ajp.c similarity index 100% rename from trunk/modules/proxy/mod_proxy_ajp.c rename to modules/proxy/mod_proxy_ajp.c diff --git a/trunk/modules/proxy/mod_proxy_ajp.dsp b/modules/proxy/mod_proxy_ajp.dsp similarity index 100% rename from trunk/modules/proxy/mod_proxy_ajp.dsp rename to modules/proxy/mod_proxy_ajp.dsp diff --git a/trunk/modules/proxy/mod_proxy_balancer.c b/modules/proxy/mod_proxy_balancer.c similarity index 100% rename from trunk/modules/proxy/mod_proxy_balancer.c rename to modules/proxy/mod_proxy_balancer.c diff --git a/trunk/modules/proxy/mod_proxy_balancer.dsp b/modules/proxy/mod_proxy_balancer.dsp similarity index 100% rename from trunk/modules/proxy/mod_proxy_balancer.dsp rename to modules/proxy/mod_proxy_balancer.dsp diff --git a/trunk/modules/proxy/mod_proxy_connect.c b/modules/proxy/mod_proxy_connect.c similarity index 100% rename from trunk/modules/proxy/mod_proxy_connect.c rename to modules/proxy/mod_proxy_connect.c diff --git a/trunk/modules/proxy/mod_proxy_connect.dsp b/modules/proxy/mod_proxy_connect.dsp similarity index 100% rename from trunk/modules/proxy/mod_proxy_connect.dsp rename to modules/proxy/mod_proxy_connect.dsp diff --git a/trunk/modules/proxy/mod_proxy_ftp.c b/modules/proxy/mod_proxy_ftp.c similarity index 100% rename from trunk/modules/proxy/mod_proxy_ftp.c rename to modules/proxy/mod_proxy_ftp.c diff --git a/trunk/modules/proxy/mod_proxy_ftp.dsp b/modules/proxy/mod_proxy_ftp.dsp similarity index 100% rename from trunk/modules/proxy/mod_proxy_ftp.dsp rename to modules/proxy/mod_proxy_ftp.dsp diff --git a/trunk/modules/proxy/mod_proxy_http.c b/modules/proxy/mod_proxy_http.c similarity index 100% rename from trunk/modules/proxy/mod_proxy_http.c rename to modules/proxy/mod_proxy_http.c diff --git a/trunk/modules/proxy/mod_proxy_http.dsp b/modules/proxy/mod_proxy_http.dsp similarity index 100% rename from trunk/modules/proxy/mod_proxy_http.dsp rename to modules/proxy/mod_proxy_http.dsp diff --git a/trunk/modules/proxy/proxy_util.c b/modules/proxy/proxy_util.c similarity index 100% rename from trunk/modules/proxy/proxy_util.c rename to modules/proxy/proxy_util.c diff --git a/trunk/modules/ssl/Makefile.in b/modules/ssl/Makefile.in similarity index 100% rename from trunk/modules/ssl/Makefile.in rename to modules/ssl/Makefile.in diff --git a/trunk/modules/ssl/NWGNUmakefile b/modules/ssl/NWGNUmakefile similarity index 100% rename from trunk/modules/ssl/NWGNUmakefile rename to modules/ssl/NWGNUmakefile diff --git a/trunk/modules/ssl/README b/modules/ssl/README similarity index 100% rename from trunk/modules/ssl/README rename to modules/ssl/README diff --git a/README.dsov.fig b/modules/ssl/README.dsov.fig similarity index 100% rename from README.dsov.fig rename to modules/ssl/README.dsov.fig diff --git a/README.dsov.ps b/modules/ssl/README.dsov.ps similarity index 100% rename from README.dsov.ps rename to modules/ssl/README.dsov.ps diff --git a/config.m4 b/modules/ssl/config.m4 similarity index 100% rename from config.m4 rename to modules/ssl/config.m4 diff --git a/mod_ssl.c b/modules/ssl/mod_ssl.c similarity index 100% rename from mod_ssl.c rename to modules/ssl/mod_ssl.c diff --git a/mod_ssl.dsp b/modules/ssl/mod_ssl.dsp similarity index 100% rename from mod_ssl.dsp rename to modules/ssl/mod_ssl.dsp diff --git a/mod_ssl.h b/modules/ssl/mod_ssl.h similarity index 100% rename from mod_ssl.h rename to modules/ssl/mod_ssl.h diff --git a/ssl_engine_config.c b/modules/ssl/ssl_engine_config.c similarity index 100% rename from ssl_engine_config.c rename to modules/ssl/ssl_engine_config.c diff --git a/ssl_engine_dh.c b/modules/ssl/ssl_engine_dh.c similarity index 100% rename from ssl_engine_dh.c rename to modules/ssl/ssl_engine_dh.c diff --git a/ssl_engine_init.c b/modules/ssl/ssl_engine_init.c similarity index 100% rename from ssl_engine_init.c rename to modules/ssl/ssl_engine_init.c diff --git a/ssl_engine_io.c b/modules/ssl/ssl_engine_io.c similarity index 100% rename from ssl_engine_io.c rename to modules/ssl/ssl_engine_io.c diff --git a/ssl_engine_kernel.c b/modules/ssl/ssl_engine_kernel.c similarity index 100% rename from ssl_engine_kernel.c rename to modules/ssl/ssl_engine_kernel.c diff --git a/ssl_engine_log.c b/modules/ssl/ssl_engine_log.c similarity index 100% rename from ssl_engine_log.c rename to modules/ssl/ssl_engine_log.c diff --git a/ssl_engine_mutex.c b/modules/ssl/ssl_engine_mutex.c similarity index 100% rename from ssl_engine_mutex.c rename to modules/ssl/ssl_engine_mutex.c diff --git a/ssl_engine_pphrase.c b/modules/ssl/ssl_engine_pphrase.c similarity index 100% rename from ssl_engine_pphrase.c rename to modules/ssl/ssl_engine_pphrase.c diff --git a/ssl_engine_rand.c b/modules/ssl/ssl_engine_rand.c similarity index 100% rename from ssl_engine_rand.c rename to modules/ssl/ssl_engine_rand.c diff --git a/ssl_engine_vars.c b/modules/ssl/ssl_engine_vars.c similarity index 100% rename from ssl_engine_vars.c rename to modules/ssl/ssl_engine_vars.c diff --git a/ssl_expr.c b/modules/ssl/ssl_expr.c similarity index 100% rename from ssl_expr.c rename to modules/ssl/ssl_expr.c diff --git a/ssl_expr.h b/modules/ssl/ssl_expr.h similarity index 100% rename from ssl_expr.h rename to modules/ssl/ssl_expr.h diff --git a/ssl_expr_eval.c b/modules/ssl/ssl_expr_eval.c similarity index 100% rename from ssl_expr_eval.c rename to modules/ssl/ssl_expr_eval.c diff --git a/ssl_expr_parse.c b/modules/ssl/ssl_expr_parse.c similarity index 100% rename from ssl_expr_parse.c rename to modules/ssl/ssl_expr_parse.c diff --git a/ssl_expr_parse.h b/modules/ssl/ssl_expr_parse.h similarity index 100% rename from ssl_expr_parse.h rename to modules/ssl/ssl_expr_parse.h diff --git a/ssl_expr_parse.y b/modules/ssl/ssl_expr_parse.y similarity index 100% rename from ssl_expr_parse.y rename to modules/ssl/ssl_expr_parse.y diff --git a/ssl_expr_scan.c b/modules/ssl/ssl_expr_scan.c similarity index 100% rename from ssl_expr_scan.c rename to modules/ssl/ssl_expr_scan.c diff --git a/ssl_expr_scan.l b/modules/ssl/ssl_expr_scan.l similarity index 100% rename from ssl_expr_scan.l rename to modules/ssl/ssl_expr_scan.l diff --git a/ssl_private.h b/modules/ssl/ssl_private.h similarity index 100% rename from ssl_private.h rename to modules/ssl/ssl_private.h diff --git a/ssl_scache.c b/modules/ssl/ssl_scache.c similarity index 100% rename from ssl_scache.c rename to modules/ssl/ssl_scache.c diff --git a/ssl_scache_dbm.c b/modules/ssl/ssl_scache_dbm.c similarity index 100% rename from ssl_scache_dbm.c rename to modules/ssl/ssl_scache_dbm.c diff --git a/ssl_scache_dc.c b/modules/ssl/ssl_scache_dc.c similarity index 100% rename from ssl_scache_dc.c rename to modules/ssl/ssl_scache_dc.c diff --git a/ssl_scache_shmcb.c b/modules/ssl/ssl_scache_shmcb.c similarity index 100% rename from ssl_scache_shmcb.c rename to modules/ssl/ssl_scache_shmcb.c diff --git a/ssl_toolkit_compat.h b/modules/ssl/ssl_toolkit_compat.h similarity index 100% rename from ssl_toolkit_compat.h rename to modules/ssl/ssl_toolkit_compat.h diff --git a/ssl_util.c b/modules/ssl/ssl_util.c similarity index 100% rename from ssl_util.c rename to modules/ssl/ssl_util.c diff --git a/ssl_util_ssl.c b/modules/ssl/ssl_util_ssl.c similarity index 100% rename from ssl_util_ssl.c rename to modules/ssl/ssl_util_ssl.c diff --git a/ssl_util_ssl.h b/modules/ssl/ssl_util_ssl.h similarity index 100% rename from ssl_util_ssl.h rename to modules/ssl/ssl_util_ssl.h diff --git a/trunk/modules/test/.indent.pro b/modules/test/.indent.pro similarity index 100% rename from trunk/modules/test/.indent.pro rename to modules/test/.indent.pro diff --git a/trunk/modules/test/Makefile.in b/modules/test/Makefile.in similarity index 100% rename from trunk/modules/test/Makefile.in rename to modules/test/Makefile.in diff --git a/trunk/modules/test/README b/modules/test/README similarity index 100% rename from trunk/modules/test/README rename to modules/test/README diff --git a/trunk/modules/test/config.m4 b/modules/test/config.m4 similarity index 100% rename from trunk/modules/test/config.m4 rename to modules/test/config.m4 diff --git a/trunk/modules/test/mod_optional_fn_export.c b/modules/test/mod_optional_fn_export.c similarity index 100% rename from trunk/modules/test/mod_optional_fn_export.c rename to modules/test/mod_optional_fn_export.c diff --git a/trunk/modules/test/mod_optional_fn_export.h b/modules/test/mod_optional_fn_export.h similarity index 100% rename from trunk/modules/test/mod_optional_fn_export.h rename to modules/test/mod_optional_fn_export.h diff --git a/trunk/modules/test/mod_optional_fn_import.c b/modules/test/mod_optional_fn_import.c similarity index 100% rename from trunk/modules/test/mod_optional_fn_import.c rename to modules/test/mod_optional_fn_import.c diff --git a/trunk/modules/test/mod_optional_hook_export.c b/modules/test/mod_optional_hook_export.c similarity index 100% rename from trunk/modules/test/mod_optional_hook_export.c rename to modules/test/mod_optional_hook_export.c diff --git a/trunk/modules/test/mod_optional_hook_export.h b/modules/test/mod_optional_hook_export.h similarity index 100% rename from trunk/modules/test/mod_optional_hook_export.h rename to modules/test/mod_optional_hook_export.h diff --git a/trunk/modules/test/mod_optional_hook_import.c b/modules/test/mod_optional_hook_import.c similarity index 100% rename from trunk/modules/test/mod_optional_hook_import.c rename to modules/test/mod_optional_hook_import.c diff --git a/trunk/os/.indent.pro b/os/.indent.pro similarity index 100% rename from trunk/os/.indent.pro rename to os/.indent.pro diff --git a/trunk/os/Makefile.in b/os/Makefile.in similarity index 100% rename from trunk/os/Makefile.in rename to os/Makefile.in diff --git a/trunk/os/beos/Makefile.in b/os/beos/Makefile.in similarity index 100% rename from trunk/os/beos/Makefile.in rename to os/beos/Makefile.in diff --git a/trunk/os/beos/beosd.c b/os/beos/beosd.c similarity index 100% rename from trunk/os/beos/beosd.c rename to os/beos/beosd.c diff --git a/trunk/os/beos/beosd.h b/os/beos/beosd.h similarity index 100% rename from trunk/os/beos/beosd.h rename to os/beos/beosd.h diff --git a/trunk/os/beos/config.m4 b/os/beos/config.m4 similarity index 100% rename from trunk/os/beos/config.m4 rename to os/beos/config.m4 diff --git a/trunk/os/beos/os.c b/os/beos/os.c similarity index 100% rename from trunk/os/beos/os.c rename to os/beos/os.c diff --git a/trunk/os/beos/os.h b/os/beos/os.h similarity index 100% rename from trunk/os/beos/os.h rename to os/beos/os.h diff --git a/trunk/os/bs2000/ebcdic.c b/os/bs2000/ebcdic.c similarity index 100% rename from trunk/os/bs2000/ebcdic.c rename to os/bs2000/ebcdic.c diff --git a/trunk/os/bs2000/ebcdic.h b/os/bs2000/ebcdic.h similarity index 100% rename from trunk/os/bs2000/ebcdic.h rename to os/bs2000/ebcdic.h diff --git a/trunk/os/bs2000/os.c b/os/bs2000/os.c similarity index 100% rename from trunk/os/bs2000/os.c rename to os/bs2000/os.c diff --git a/trunk/os/bs2000/os.h b/os/bs2000/os.h similarity index 100% rename from trunk/os/bs2000/os.h rename to os/bs2000/os.h diff --git a/trunk/os/config.m4 b/os/config.m4 similarity index 100% rename from trunk/os/config.m4 rename to os/config.m4 diff --git a/trunk/os/netware/Apache.def b/os/netware/Apache.def similarity index 100% rename from trunk/os/netware/Apache.def rename to os/netware/Apache.def diff --git a/trunk/os/netware/apache.xdc b/os/netware/apache.xdc similarity index 100% rename from trunk/os/netware/apache.xdc rename to os/netware/apache.xdc diff --git a/trunk/os/netware/modules.c b/os/netware/modules.c similarity index 100% rename from trunk/os/netware/modules.c rename to os/netware/modules.c diff --git a/trunk/os/netware/os.h b/os/netware/os.h similarity index 100% rename from trunk/os/netware/os.h rename to os/netware/os.h diff --git a/trunk/os/netware/pre_nw.h b/os/netware/pre_nw.h similarity index 100% rename from trunk/os/netware/pre_nw.h rename to os/netware/pre_nw.h diff --git a/trunk/os/netware/util_nw.c b/os/netware/util_nw.c similarity index 100% rename from trunk/os/netware/util_nw.c rename to os/netware/util_nw.c diff --git a/trunk/os/os2/Makefile.in b/os/os2/Makefile.in similarity index 100% rename from trunk/os/os2/Makefile.in rename to os/os2/Makefile.in diff --git a/trunk/os/os2/config.m4 b/os/os2/config.m4 similarity index 100% rename from trunk/os/os2/config.m4 rename to os/os2/config.m4 diff --git a/trunk/os/os2/core.mk b/os/os2/core.mk similarity index 100% rename from trunk/os/os2/core.mk rename to os/os2/core.mk diff --git a/trunk/os/os2/core_header.def b/os/os2/core_header.def similarity index 100% rename from trunk/os/os2/core_header.def rename to os/os2/core_header.def diff --git a/trunk/os/os2/os.h b/os/os2/os.h similarity index 100% rename from trunk/os/os2/os.h rename to os/os2/os.h diff --git a/trunk/os/os2/util_os2.c b/os/os2/util_os2.c similarity index 100% rename from trunk/os/os2/util_os2.c rename to os/os2/util_os2.c diff --git a/trunk/os/tpf/TPFExport b/os/tpf/TPFExport similarity index 100% rename from trunk/os/tpf/TPFExport rename to os/tpf/TPFExport diff --git a/trunk/os/tpf/ebcdic.c b/os/tpf/ebcdic.c similarity index 100% rename from trunk/os/tpf/ebcdic.c rename to os/tpf/ebcdic.c diff --git a/trunk/os/tpf/ebcdic.h b/os/tpf/ebcdic.h similarity index 100% rename from trunk/os/tpf/ebcdic.h rename to os/tpf/ebcdic.h diff --git a/trunk/os/tpf/os.c b/os/tpf/os.c similarity index 100% rename from trunk/os/tpf/os.c rename to os/tpf/os.c diff --git a/trunk/os/tpf/os.h b/os/tpf/os.h similarity index 100% rename from trunk/os/tpf/os.h rename to os/tpf/os.h diff --git a/trunk/os/tpf/samples/linkdll.jcl b/os/tpf/samples/linkdll.jcl similarity index 100% rename from trunk/os/tpf/samples/linkdll.jcl rename to os/tpf/samples/linkdll.jcl diff --git a/trunk/os/tpf/samples/loadset.jcl b/os/tpf/samples/loadset.jcl similarity index 100% rename from trunk/os/tpf/samples/loadset.jcl rename to os/tpf/samples/loadset.jcl diff --git a/trunk/os/unix/Makefile.in b/os/unix/Makefile.in similarity index 100% rename from trunk/os/unix/Makefile.in rename to os/unix/Makefile.in diff --git a/trunk/os/unix/config.m4 b/os/unix/config.m4 similarity index 100% rename from trunk/os/unix/config.m4 rename to os/unix/config.m4 diff --git a/trunk/os/unix/os.h b/os/unix/os.h similarity index 100% rename from trunk/os/unix/os.h rename to os/unix/os.h diff --git a/trunk/os/unix/unixd.c b/os/unix/unixd.c similarity index 100% rename from trunk/os/unix/unixd.c rename to os/unix/unixd.c diff --git a/trunk/os/unix/unixd.h b/os/unix/unixd.h similarity index 100% rename from trunk/os/unix/unixd.h rename to os/unix/unixd.h diff --git a/trunk/os/win32/BaseAddr.ref b/os/win32/BaseAddr.ref similarity index 100% rename from trunk/os/win32/BaseAddr.ref rename to os/win32/BaseAddr.ref diff --git a/trunk/os/win32/ap_regkey.c b/os/win32/ap_regkey.c similarity index 100% rename from trunk/os/win32/ap_regkey.c rename to os/win32/ap_regkey.c diff --git a/trunk/os/win32/modules.c b/os/win32/modules.c similarity index 100% rename from trunk/os/win32/modules.c rename to os/win32/modules.c diff --git a/trunk/os/win32/os.h b/os/win32/os.h similarity index 100% rename from trunk/os/win32/os.h rename to os/win32/os.h diff --git a/trunk/os/win32/util_win32.c b/os/win32/util_win32.c similarity index 100% rename from trunk/os/win32/util_win32.c rename to os/win32/util_win32.c diff --git a/trunk/server/.indent.pro b/server/.indent.pro similarity index 100% rename from trunk/server/.indent.pro rename to server/.indent.pro diff --git a/trunk/server/Makefile.in b/server/Makefile.in similarity index 100% rename from trunk/server/Makefile.in rename to server/Makefile.in diff --git a/trunk/server/NWGNUmakefile b/server/NWGNUmakefile similarity index 100% rename from trunk/server/NWGNUmakefile rename to server/NWGNUmakefile diff --git a/trunk/server/buildmark.c b/server/buildmark.c similarity index 100% rename from trunk/server/buildmark.c rename to server/buildmark.c diff --git a/trunk/server/config.c b/server/config.c similarity index 100% rename from trunk/server/config.c rename to server/config.c diff --git a/trunk/server/config.m4 b/server/config.m4 similarity index 100% rename from trunk/server/config.m4 rename to server/config.m4 diff --git a/trunk/server/connection.c b/server/connection.c similarity index 100% rename from trunk/server/connection.c rename to server/connection.c diff --git a/trunk/server/core.c b/server/core.c similarity index 100% rename from trunk/server/core.c rename to server/core.c diff --git a/trunk/server/core_filters.c b/server/core_filters.c similarity index 100% rename from trunk/server/core_filters.c rename to server/core_filters.c diff --git a/trunk/server/eoc_bucket.c b/server/eoc_bucket.c similarity index 100% rename from trunk/server/eoc_bucket.c rename to server/eoc_bucket.c diff --git a/trunk/server/error_bucket.c b/server/error_bucket.c similarity index 100% rename from trunk/server/error_bucket.c rename to server/error_bucket.c diff --git a/trunk/server/gen_test_char.c b/server/gen_test_char.c similarity index 100% rename from trunk/server/gen_test_char.c rename to server/gen_test_char.c diff --git a/trunk/server/gen_test_char.dsp b/server/gen_test_char.dsp similarity index 100% rename from trunk/server/gen_test_char.dsp rename to server/gen_test_char.dsp diff --git a/trunk/server/listen.c b/server/listen.c similarity index 100% rename from trunk/server/listen.c rename to server/listen.c diff --git a/trunk/server/log.c b/server/log.c similarity index 100% rename from trunk/server/log.c rename to server/log.c diff --git a/trunk/server/main.c b/server/main.c similarity index 100% rename from trunk/server/main.c rename to server/main.c diff --git a/trunk/server/mpm/MPM.NAMING b/server/mpm/MPM.NAMING similarity index 100% rename from trunk/server/mpm/MPM.NAMING rename to server/mpm/MPM.NAMING diff --git a/trunk/server/mpm/Makefile.in b/server/mpm/Makefile.in similarity index 100% rename from trunk/server/mpm/Makefile.in rename to server/mpm/Makefile.in diff --git a/trunk/server/mpm/beos/Makefile.in b/server/mpm/beos/Makefile.in similarity index 100% rename from trunk/server/mpm/beos/Makefile.in rename to server/mpm/beos/Makefile.in diff --git a/trunk/server/mpm/beos/beos.c b/server/mpm/beos/beos.c similarity index 100% rename from trunk/server/mpm/beos/beos.c rename to server/mpm/beos/beos.c diff --git a/trunk/server/mpm/beos/beos.h b/server/mpm/beos/beos.h similarity index 100% rename from trunk/server/mpm/beos/beos.h rename to server/mpm/beos/beos.h diff --git a/trunk/server/mpm/beos/config5.m4 b/server/mpm/beos/config5.m4 similarity index 100% rename from trunk/server/mpm/beos/config5.m4 rename to server/mpm/beos/config5.m4 diff --git a/trunk/server/mpm/beos/mpm.h b/server/mpm/beos/mpm.h similarity index 100% rename from trunk/server/mpm/beos/mpm.h rename to server/mpm/beos/mpm.h diff --git a/trunk/server/mpm/beos/mpm_default.h b/server/mpm/beos/mpm_default.h similarity index 100% rename from trunk/server/mpm/beos/mpm_default.h rename to server/mpm/beos/mpm_default.h diff --git a/trunk/server/mpm/config.m4 b/server/mpm/config.m4 similarity index 100% rename from trunk/server/mpm/config.m4 rename to server/mpm/config.m4 diff --git a/trunk/server/mpm/experimental/event/Makefile.in b/server/mpm/experimental/event/Makefile.in similarity index 100% rename from trunk/server/mpm/experimental/event/Makefile.in rename to server/mpm/experimental/event/Makefile.in diff --git a/trunk/server/mpm/experimental/event/config5.m4 b/server/mpm/experimental/event/config5.m4 similarity index 100% rename from trunk/server/mpm/experimental/event/config5.m4 rename to server/mpm/experimental/event/config5.m4 diff --git a/trunk/server/mpm/experimental/event/event.c b/server/mpm/experimental/event/event.c similarity index 100% rename from trunk/server/mpm/experimental/event/event.c rename to server/mpm/experimental/event/event.c diff --git a/trunk/server/mpm/experimental/event/fdqueue.c b/server/mpm/experimental/event/fdqueue.c similarity index 100% rename from trunk/server/mpm/experimental/event/fdqueue.c rename to server/mpm/experimental/event/fdqueue.c diff --git a/trunk/server/mpm/experimental/event/fdqueue.h b/server/mpm/experimental/event/fdqueue.h similarity index 100% rename from trunk/server/mpm/experimental/event/fdqueue.h rename to server/mpm/experimental/event/fdqueue.h diff --git a/trunk/server/mpm/experimental/event/mpm.h b/server/mpm/experimental/event/mpm.h similarity index 100% rename from trunk/server/mpm/experimental/event/mpm.h rename to server/mpm/experimental/event/mpm.h diff --git a/trunk/server/mpm/experimental/event/mpm_default.h b/server/mpm/experimental/event/mpm_default.h similarity index 100% rename from trunk/server/mpm/experimental/event/mpm_default.h rename to server/mpm/experimental/event/mpm_default.h diff --git a/trunk/server/mpm/experimental/event/pod.c b/server/mpm/experimental/event/pod.c similarity index 100% rename from trunk/server/mpm/experimental/event/pod.c rename to server/mpm/experimental/event/pod.c diff --git a/trunk/server/mpm/experimental/event/pod.h b/server/mpm/experimental/event/pod.h similarity index 100% rename from trunk/server/mpm/experimental/event/pod.h rename to server/mpm/experimental/event/pod.h diff --git a/trunk/server/mpm/experimental/leader/Makefile.in b/server/mpm/experimental/leader/Makefile.in similarity index 100% rename from trunk/server/mpm/experimental/leader/Makefile.in rename to server/mpm/experimental/leader/Makefile.in diff --git a/trunk/server/mpm/experimental/leader/README b/server/mpm/experimental/leader/README similarity index 100% rename from trunk/server/mpm/experimental/leader/README rename to server/mpm/experimental/leader/README diff --git a/trunk/server/mpm/experimental/leader/config5.m4 b/server/mpm/experimental/leader/config5.m4 similarity index 100% rename from trunk/server/mpm/experimental/leader/config5.m4 rename to server/mpm/experimental/leader/config5.m4 diff --git a/trunk/server/mpm/experimental/leader/leader.c b/server/mpm/experimental/leader/leader.c similarity index 100% rename from trunk/server/mpm/experimental/leader/leader.c rename to server/mpm/experimental/leader/leader.c diff --git a/trunk/server/mpm/experimental/leader/mpm.h b/server/mpm/experimental/leader/mpm.h similarity index 100% rename from trunk/server/mpm/experimental/leader/mpm.h rename to server/mpm/experimental/leader/mpm.h diff --git a/trunk/server/mpm/experimental/leader/mpm_default.h b/server/mpm/experimental/leader/mpm_default.h similarity index 100% rename from trunk/server/mpm/experimental/leader/mpm_default.h rename to server/mpm/experimental/leader/mpm_default.h diff --git a/trunk/server/mpm/experimental/perchild/Makefile.in b/server/mpm/experimental/perchild/Makefile.in similarity index 100% rename from trunk/server/mpm/experimental/perchild/Makefile.in rename to server/mpm/experimental/perchild/Makefile.in diff --git a/trunk/server/mpm/experimental/perchild/config5.m4 b/server/mpm/experimental/perchild/config5.m4 similarity index 100% rename from trunk/server/mpm/experimental/perchild/config5.m4 rename to server/mpm/experimental/perchild/config5.m4 diff --git a/trunk/server/mpm/experimental/perchild/mpm.h b/server/mpm/experimental/perchild/mpm.h similarity index 100% rename from trunk/server/mpm/experimental/perchild/mpm.h rename to server/mpm/experimental/perchild/mpm.h diff --git a/trunk/server/mpm/experimental/perchild/mpm_default.h b/server/mpm/experimental/perchild/mpm_default.h similarity index 100% rename from trunk/server/mpm/experimental/perchild/mpm_default.h rename to server/mpm/experimental/perchild/mpm_default.h diff --git a/trunk/server/mpm/experimental/perchild/perchild.c b/server/mpm/experimental/perchild/perchild.c similarity index 100% rename from trunk/server/mpm/experimental/perchild/perchild.c rename to server/mpm/experimental/perchild/perchild.c diff --git a/trunk/server/mpm/experimental/threadpool/Makefile.in b/server/mpm/experimental/threadpool/Makefile.in similarity index 100% rename from trunk/server/mpm/experimental/threadpool/Makefile.in rename to server/mpm/experimental/threadpool/Makefile.in diff --git a/trunk/server/mpm/experimental/threadpool/README b/server/mpm/experimental/threadpool/README similarity index 100% rename from trunk/server/mpm/experimental/threadpool/README rename to server/mpm/experimental/threadpool/README diff --git a/trunk/server/mpm/experimental/threadpool/config5.m4 b/server/mpm/experimental/threadpool/config5.m4 similarity index 100% rename from trunk/server/mpm/experimental/threadpool/config5.m4 rename to server/mpm/experimental/threadpool/config5.m4 diff --git a/trunk/server/mpm/experimental/threadpool/mpm.h b/server/mpm/experimental/threadpool/mpm.h similarity index 100% rename from trunk/server/mpm/experimental/threadpool/mpm.h rename to server/mpm/experimental/threadpool/mpm.h diff --git a/trunk/server/mpm/experimental/threadpool/mpm_default.h b/server/mpm/experimental/threadpool/mpm_default.h similarity index 100% rename from trunk/server/mpm/experimental/threadpool/mpm_default.h rename to server/mpm/experimental/threadpool/mpm_default.h diff --git a/trunk/server/mpm/experimental/threadpool/pod.c b/server/mpm/experimental/threadpool/pod.c similarity index 100% rename from trunk/server/mpm/experimental/threadpool/pod.c rename to server/mpm/experimental/threadpool/pod.c diff --git a/trunk/server/mpm/experimental/threadpool/pod.h b/server/mpm/experimental/threadpool/pod.h similarity index 100% rename from trunk/server/mpm/experimental/threadpool/pod.h rename to server/mpm/experimental/threadpool/pod.h diff --git a/trunk/server/mpm/experimental/threadpool/threadpool.c b/server/mpm/experimental/threadpool/threadpool.c similarity index 100% rename from trunk/server/mpm/experimental/threadpool/threadpool.c rename to server/mpm/experimental/threadpool/threadpool.c diff --git a/trunk/server/mpm/mpmt_os2/Makefile.in b/server/mpm/mpmt_os2/Makefile.in similarity index 100% rename from trunk/server/mpm/mpmt_os2/Makefile.in rename to server/mpm/mpmt_os2/Makefile.in diff --git a/trunk/server/mpm/mpmt_os2/config5.m4 b/server/mpm/mpmt_os2/config5.m4 similarity index 100% rename from trunk/server/mpm/mpmt_os2/config5.m4 rename to server/mpm/mpmt_os2/config5.m4 diff --git a/trunk/server/mpm/mpmt_os2/mpm.h b/server/mpm/mpmt_os2/mpm.h similarity index 100% rename from trunk/server/mpm/mpmt_os2/mpm.h rename to server/mpm/mpmt_os2/mpm.h diff --git a/trunk/server/mpm/mpmt_os2/mpm_default.h b/server/mpm/mpmt_os2/mpm_default.h similarity index 100% rename from trunk/server/mpm/mpmt_os2/mpm_default.h rename to server/mpm/mpmt_os2/mpm_default.h diff --git a/trunk/server/mpm/mpmt_os2/mpmt_os2.c b/server/mpm/mpmt_os2/mpmt_os2.c similarity index 100% rename from trunk/server/mpm/mpmt_os2/mpmt_os2.c rename to server/mpm/mpmt_os2/mpmt_os2.c diff --git a/trunk/server/mpm/mpmt_os2/mpmt_os2_child.c b/server/mpm/mpmt_os2/mpmt_os2_child.c similarity index 100% rename from trunk/server/mpm/mpmt_os2/mpmt_os2_child.c rename to server/mpm/mpmt_os2/mpmt_os2_child.c diff --git a/trunk/server/mpm/netware/mpm.h b/server/mpm/netware/mpm.h similarity index 100% rename from trunk/server/mpm/netware/mpm.h rename to server/mpm/netware/mpm.h diff --git a/trunk/server/mpm/netware/mpm_default.h b/server/mpm/netware/mpm_default.h similarity index 100% rename from trunk/server/mpm/netware/mpm_default.h rename to server/mpm/netware/mpm_default.h diff --git a/trunk/server/mpm/netware/mpm_netware.c b/server/mpm/netware/mpm_netware.c similarity index 100% rename from trunk/server/mpm/netware/mpm_netware.c rename to server/mpm/netware/mpm_netware.c diff --git a/trunk/server/mpm/prefork/Makefile.in b/server/mpm/prefork/Makefile.in similarity index 100% rename from trunk/server/mpm/prefork/Makefile.in rename to server/mpm/prefork/Makefile.in diff --git a/trunk/server/mpm/prefork/config.m4 b/server/mpm/prefork/config.m4 similarity index 100% rename from trunk/server/mpm/prefork/config.m4 rename to server/mpm/prefork/config.m4 diff --git a/trunk/server/mpm/prefork/mpm.h b/server/mpm/prefork/mpm.h similarity index 100% rename from trunk/server/mpm/prefork/mpm.h rename to server/mpm/prefork/mpm.h diff --git a/trunk/server/mpm/prefork/mpm_default.h b/server/mpm/prefork/mpm_default.h similarity index 100% rename from trunk/server/mpm/prefork/mpm_default.h rename to server/mpm/prefork/mpm_default.h diff --git a/trunk/server/mpm/prefork/prefork.c b/server/mpm/prefork/prefork.c similarity index 100% rename from trunk/server/mpm/prefork/prefork.c rename to server/mpm/prefork/prefork.c diff --git a/trunk/server/mpm/winnt/Win9xConHook.c b/server/mpm/winnt/Win9xConHook.c similarity index 100% rename from trunk/server/mpm/winnt/Win9xConHook.c rename to server/mpm/winnt/Win9xConHook.c diff --git a/trunk/server/mpm/winnt/Win9xConHook.def b/server/mpm/winnt/Win9xConHook.def similarity index 100% rename from trunk/server/mpm/winnt/Win9xConHook.def rename to server/mpm/winnt/Win9xConHook.def diff --git a/trunk/server/mpm/winnt/Win9xConHook.dsp b/server/mpm/winnt/Win9xConHook.dsp similarity index 100% rename from trunk/server/mpm/winnt/Win9xConHook.dsp rename to server/mpm/winnt/Win9xConHook.dsp diff --git a/trunk/server/mpm/winnt/Win9xConHook.h b/server/mpm/winnt/Win9xConHook.h similarity index 100% rename from trunk/server/mpm/winnt/Win9xConHook.h rename to server/mpm/winnt/Win9xConHook.h diff --git a/trunk/server/mpm/winnt/child.c b/server/mpm/winnt/child.c similarity index 100% rename from trunk/server/mpm/winnt/child.c rename to server/mpm/winnt/child.c diff --git a/trunk/server/mpm/winnt/mpm.h b/server/mpm/winnt/mpm.h similarity index 100% rename from trunk/server/mpm/winnt/mpm.h rename to server/mpm/winnt/mpm.h diff --git a/trunk/server/mpm/winnt/mpm_default.h b/server/mpm/winnt/mpm_default.h similarity index 100% rename from trunk/server/mpm/winnt/mpm_default.h rename to server/mpm/winnt/mpm_default.h diff --git a/trunk/server/mpm/winnt/mpm_winnt.c b/server/mpm/winnt/mpm_winnt.c similarity index 100% rename from trunk/server/mpm/winnt/mpm_winnt.c rename to server/mpm/winnt/mpm_winnt.c diff --git a/trunk/server/mpm/winnt/mpm_winnt.h b/server/mpm/winnt/mpm_winnt.h similarity index 100% rename from trunk/server/mpm/winnt/mpm_winnt.h rename to server/mpm/winnt/mpm_winnt.h diff --git a/trunk/server/mpm/winnt/nt_eventlog.c b/server/mpm/winnt/nt_eventlog.c similarity index 100% rename from trunk/server/mpm/winnt/nt_eventlog.c rename to server/mpm/winnt/nt_eventlog.c diff --git a/trunk/server/mpm/winnt/service.c b/server/mpm/winnt/service.c similarity index 100% rename from trunk/server/mpm/winnt/service.c rename to server/mpm/winnt/service.c diff --git a/trunk/server/mpm/worker/Makefile.in b/server/mpm/worker/Makefile.in similarity index 100% rename from trunk/server/mpm/worker/Makefile.in rename to server/mpm/worker/Makefile.in diff --git a/trunk/server/mpm/worker/config5.m4 b/server/mpm/worker/config5.m4 similarity index 100% rename from trunk/server/mpm/worker/config5.m4 rename to server/mpm/worker/config5.m4 diff --git a/trunk/server/mpm/worker/fdqueue.c b/server/mpm/worker/fdqueue.c similarity index 100% rename from trunk/server/mpm/worker/fdqueue.c rename to server/mpm/worker/fdqueue.c diff --git a/trunk/server/mpm/worker/fdqueue.h b/server/mpm/worker/fdqueue.h similarity index 100% rename from trunk/server/mpm/worker/fdqueue.h rename to server/mpm/worker/fdqueue.h diff --git a/trunk/server/mpm/worker/mpm.h b/server/mpm/worker/mpm.h similarity index 100% rename from trunk/server/mpm/worker/mpm.h rename to server/mpm/worker/mpm.h diff --git a/trunk/server/mpm/worker/mpm_default.h b/server/mpm/worker/mpm_default.h similarity index 100% rename from trunk/server/mpm/worker/mpm_default.h rename to server/mpm/worker/mpm_default.h diff --git a/trunk/server/mpm/worker/pod.c b/server/mpm/worker/pod.c similarity index 100% rename from trunk/server/mpm/worker/pod.c rename to server/mpm/worker/pod.c diff --git a/trunk/server/mpm/worker/pod.h b/server/mpm/worker/pod.h similarity index 100% rename from trunk/server/mpm/worker/pod.h rename to server/mpm/worker/pod.h diff --git a/trunk/server/mpm/worker/worker.c b/server/mpm/worker/worker.c similarity index 100% rename from trunk/server/mpm/worker/worker.c rename to server/mpm/worker/worker.c diff --git a/trunk/server/mpm_common.c b/server/mpm_common.c similarity index 100% rename from trunk/server/mpm_common.c rename to server/mpm_common.c diff --git a/trunk/server/protocol.c b/server/protocol.c similarity index 100% rename from trunk/server/protocol.c rename to server/protocol.c diff --git a/trunk/server/provider.c b/server/provider.c similarity index 100% rename from trunk/server/provider.c rename to server/provider.c diff --git a/trunk/server/request.c b/server/request.c similarity index 100% rename from trunk/server/request.c rename to server/request.c diff --git a/trunk/server/scoreboard.c b/server/scoreboard.c similarity index 100% rename from trunk/server/scoreboard.c rename to server/scoreboard.c diff --git a/trunk/server/util.c b/server/util.c similarity index 100% rename from trunk/server/util.c rename to server/util.c diff --git a/trunk/server/util_cfgtree.c b/server/util_cfgtree.c similarity index 100% rename from trunk/server/util_cfgtree.c rename to server/util_cfgtree.c diff --git a/trunk/server/util_charset.c b/server/util_charset.c similarity index 100% rename from trunk/server/util_charset.c rename to server/util_charset.c diff --git a/trunk/server/util_debug.c b/server/util_debug.c similarity index 100% rename from trunk/server/util_debug.c rename to server/util_debug.c diff --git a/trunk/server/util_ebcdic.c b/server/util_ebcdic.c similarity index 100% rename from trunk/server/util_ebcdic.c rename to server/util_ebcdic.c diff --git a/trunk/server/util_filter.c b/server/util_filter.c similarity index 100% rename from trunk/server/util_filter.c rename to server/util_filter.c diff --git a/trunk/server/util_md5.c b/server/util_md5.c similarity index 100% rename from trunk/server/util_md5.c rename to server/util_md5.c diff --git a/trunk/server/util_pcre.c b/server/util_pcre.c similarity index 100% rename from trunk/server/util_pcre.c rename to server/util_pcre.c diff --git a/trunk/server/util_script.c b/server/util_script.c similarity index 100% rename from trunk/server/util_script.c rename to server/util_script.c diff --git a/trunk/server/util_time.c b/server/util_time.c similarity index 100% rename from trunk/server/util_time.c rename to server/util_time.c diff --git a/trunk/server/util_xml.c b/server/util_xml.c similarity index 100% rename from trunk/server/util_xml.c rename to server/util_xml.c diff --git a/trunk/server/vhost.c b/server/vhost.c similarity index 100% rename from trunk/server/vhost.c rename to server/vhost.c diff --git a/trunk/srclib/Makefile.in b/srclib/Makefile.in similarity index 100% rename from trunk/srclib/Makefile.in rename to srclib/Makefile.in diff --git a/trunk/srclib/pcre/AUTHORS b/srclib/pcre/AUTHORS similarity index 100% rename from trunk/srclib/pcre/AUTHORS rename to srclib/pcre/AUTHORS diff --git a/trunk/srclib/pcre/COPYING b/srclib/pcre/COPYING similarity index 100% rename from trunk/srclib/pcre/COPYING rename to srclib/pcre/COPYING diff --git a/trunk/srclib/pcre/ChangeLog b/srclib/pcre/ChangeLog similarity index 100% rename from trunk/srclib/pcre/ChangeLog rename to srclib/pcre/ChangeLog diff --git a/trunk/srclib/pcre/INSTALL b/srclib/pcre/INSTALL similarity index 100% rename from trunk/srclib/pcre/INSTALL rename to srclib/pcre/INSTALL diff --git a/trunk/srclib/pcre/LICENCE b/srclib/pcre/LICENCE similarity index 100% rename from trunk/srclib/pcre/LICENCE rename to srclib/pcre/LICENCE diff --git a/trunk/srclib/pcre/Makefile.in b/srclib/pcre/Makefile.in similarity index 100% rename from trunk/srclib/pcre/Makefile.in rename to srclib/pcre/Makefile.in diff --git a/trunk/srclib/pcre/NEWS b/srclib/pcre/NEWS similarity index 100% rename from trunk/srclib/pcre/NEWS rename to srclib/pcre/NEWS diff --git a/trunk/srclib/pcre/NON-UNIX-USE b/srclib/pcre/NON-UNIX-USE similarity index 100% rename from trunk/srclib/pcre/NON-UNIX-USE rename to srclib/pcre/NON-UNIX-USE diff --git a/trunk/srclib/pcre/NWGNUmakefile b/srclib/pcre/NWGNUmakefile similarity index 100% rename from trunk/srclib/pcre/NWGNUmakefile rename to srclib/pcre/NWGNUmakefile diff --git a/trunk/srclib/pcre/README b/srclib/pcre/README similarity index 100% rename from trunk/srclib/pcre/README rename to srclib/pcre/README diff --git a/trunk/srclib/pcre/RunTest.in b/srclib/pcre/RunTest.in similarity index 100% rename from trunk/srclib/pcre/RunTest.in rename to srclib/pcre/RunTest.in diff --git a/trunk/srclib/pcre/config.hw b/srclib/pcre/config.hw similarity index 100% rename from trunk/srclib/pcre/config.hw rename to srclib/pcre/config.hw diff --git a/trunk/srclib/pcre/config.in b/srclib/pcre/config.in similarity index 100% rename from trunk/srclib/pcre/config.in rename to srclib/pcre/config.in diff --git a/trunk/srclib/pcre/configure.in b/srclib/pcre/configure.in similarity index 100% rename from trunk/srclib/pcre/configure.in rename to srclib/pcre/configure.in diff --git a/trunk/srclib/pcre/dftables.c b/srclib/pcre/dftables.c similarity index 100% rename from trunk/srclib/pcre/dftables.c rename to srclib/pcre/dftables.c diff --git a/trunk/srclib/pcre/dftables.dsp b/srclib/pcre/dftables.dsp similarity index 100% rename from trunk/srclib/pcre/dftables.dsp rename to srclib/pcre/dftables.dsp diff --git a/trunk/srclib/pcre/dll.mk b/srclib/pcre/dll.mk similarity index 100% rename from trunk/srclib/pcre/dll.mk rename to srclib/pcre/dll.mk diff --git a/trunk/srclib/pcre/doc/README_httpd b/srclib/pcre/doc/README_httpd similarity index 100% rename from trunk/srclib/pcre/doc/README_httpd rename to srclib/pcre/doc/README_httpd diff --git a/trunk/srclib/pcre/get.c b/srclib/pcre/get.c similarity index 100% rename from trunk/srclib/pcre/get.c rename to srclib/pcre/get.c diff --git a/trunk/srclib/pcre/install-sh b/srclib/pcre/install-sh similarity index 100% rename from trunk/srclib/pcre/install-sh rename to srclib/pcre/install-sh diff --git a/trunk/srclib/pcre/internal.h b/srclib/pcre/internal.h similarity index 100% rename from trunk/srclib/pcre/internal.h rename to srclib/pcre/internal.h diff --git a/trunk/srclib/pcre/libpcre.def b/srclib/pcre/libpcre.def similarity index 100% rename from trunk/srclib/pcre/libpcre.def rename to srclib/pcre/libpcre.def diff --git a/trunk/srclib/pcre/libpcre.pc.in b/srclib/pcre/libpcre.pc.in similarity index 100% rename from trunk/srclib/pcre/libpcre.pc.in rename to srclib/pcre/libpcre.pc.in diff --git a/trunk/srclib/pcre/libpcreposix.def b/srclib/pcre/libpcreposix.def similarity index 100% rename from trunk/srclib/pcre/libpcreposix.def rename to srclib/pcre/libpcreposix.def diff --git a/trunk/srclib/pcre/maketables.c b/srclib/pcre/maketables.c similarity index 100% rename from trunk/srclib/pcre/maketables.c rename to srclib/pcre/maketables.c diff --git a/trunk/srclib/pcre/makevp.bat b/srclib/pcre/makevp.bat similarity index 100% rename from trunk/srclib/pcre/makevp.bat rename to srclib/pcre/makevp.bat diff --git a/trunk/srclib/pcre/mkinstalldirs b/srclib/pcre/mkinstalldirs similarity index 100% rename from trunk/srclib/pcre/mkinstalldirs rename to srclib/pcre/mkinstalldirs diff --git a/trunk/srclib/pcre/pcre-config.in b/srclib/pcre/pcre-config.in similarity index 100% rename from trunk/srclib/pcre/pcre-config.in rename to srclib/pcre/pcre-config.in diff --git a/trunk/srclib/pcre/pcre.c b/srclib/pcre/pcre.c similarity index 100% rename from trunk/srclib/pcre/pcre.c rename to srclib/pcre/pcre.c diff --git a/trunk/srclib/pcre/pcre.def b/srclib/pcre/pcre.def similarity index 100% rename from trunk/srclib/pcre/pcre.def rename to srclib/pcre/pcre.def diff --git a/trunk/srclib/pcre/pcre.dsp b/srclib/pcre/pcre.dsp similarity index 100% rename from trunk/srclib/pcre/pcre.dsp rename to srclib/pcre/pcre.dsp diff --git a/trunk/srclib/pcre/pcre.hw b/srclib/pcre/pcre.hw similarity index 100% rename from trunk/srclib/pcre/pcre.hw rename to srclib/pcre/pcre.hw diff --git a/trunk/srclib/pcre/pcre.in b/srclib/pcre/pcre.in similarity index 100% rename from trunk/srclib/pcre/pcre.in rename to srclib/pcre/pcre.in diff --git a/trunk/srclib/pcre/pcredemo.c b/srclib/pcre/pcredemo.c similarity index 100% rename from trunk/srclib/pcre/pcredemo.c rename to srclib/pcre/pcredemo.c diff --git a/trunk/srclib/pcre/pcregrep.c b/srclib/pcre/pcregrep.c similarity index 100% rename from trunk/srclib/pcre/pcregrep.c rename to srclib/pcre/pcregrep.c diff --git a/trunk/srclib/pcre/pcreposix.c b/srclib/pcre/pcreposix.c similarity index 100% rename from trunk/srclib/pcre/pcreposix.c rename to srclib/pcre/pcreposix.c diff --git a/trunk/srclib/pcre/pcreposix.dsp b/srclib/pcre/pcreposix.dsp similarity index 100% rename from trunk/srclib/pcre/pcreposix.dsp rename to srclib/pcre/pcreposix.dsp diff --git a/trunk/srclib/pcre/pcretest.c b/srclib/pcre/pcretest.c similarity index 100% rename from trunk/srclib/pcre/pcretest.c rename to srclib/pcre/pcretest.c diff --git a/trunk/srclib/pcre/perltest b/srclib/pcre/perltest similarity index 100% rename from trunk/srclib/pcre/perltest rename to srclib/pcre/perltest diff --git a/trunk/srclib/pcre/perltest8 b/srclib/pcre/perltest8 similarity index 100% rename from trunk/srclib/pcre/perltest8 rename to srclib/pcre/perltest8 diff --git a/trunk/srclib/pcre/pgrep.c b/srclib/pcre/pgrep.c similarity index 100% rename from trunk/srclib/pcre/pgrep.c rename to srclib/pcre/pgrep.c diff --git a/trunk/srclib/pcre/printint.c b/srclib/pcre/printint.c similarity index 100% rename from trunk/srclib/pcre/printint.c rename to srclib/pcre/printint.c diff --git a/trunk/srclib/pcre/study.c b/srclib/pcre/study.c similarity index 100% rename from trunk/srclib/pcre/study.c rename to srclib/pcre/study.c diff --git a/trunk/srclib/pcre/testdata/testinput1 b/srclib/pcre/testdata/testinput1 similarity index 100% rename from trunk/srclib/pcre/testdata/testinput1 rename to srclib/pcre/testdata/testinput1 diff --git a/trunk/srclib/pcre/testdata/testinput2 b/srclib/pcre/testdata/testinput2 similarity index 100% rename from trunk/srclib/pcre/testdata/testinput2 rename to srclib/pcre/testdata/testinput2 diff --git a/trunk/srclib/pcre/testdata/testinput3 b/srclib/pcre/testdata/testinput3 similarity index 100% rename from trunk/srclib/pcre/testdata/testinput3 rename to srclib/pcre/testdata/testinput3 diff --git a/trunk/srclib/pcre/testdata/testinput4 b/srclib/pcre/testdata/testinput4 similarity index 100% rename from trunk/srclib/pcre/testdata/testinput4 rename to srclib/pcre/testdata/testinput4 diff --git a/trunk/srclib/pcre/testdata/testinput5 b/srclib/pcre/testdata/testinput5 similarity index 100% rename from trunk/srclib/pcre/testdata/testinput5 rename to srclib/pcre/testdata/testinput5 diff --git a/trunk/srclib/pcre/testdata/testinput6 b/srclib/pcre/testdata/testinput6 similarity index 100% rename from trunk/srclib/pcre/testdata/testinput6 rename to srclib/pcre/testdata/testinput6 diff --git a/trunk/srclib/pcre/testdata/testoutput1 b/srclib/pcre/testdata/testoutput1 similarity index 100% rename from trunk/srclib/pcre/testdata/testoutput1 rename to srclib/pcre/testdata/testoutput1 diff --git a/trunk/srclib/pcre/testdata/testoutput2 b/srclib/pcre/testdata/testoutput2 similarity index 100% rename from trunk/srclib/pcre/testdata/testoutput2 rename to srclib/pcre/testdata/testoutput2 diff --git a/trunk/srclib/pcre/testdata/testoutput3 b/srclib/pcre/testdata/testoutput3 similarity index 100% rename from trunk/srclib/pcre/testdata/testoutput3 rename to srclib/pcre/testdata/testoutput3 diff --git a/trunk/srclib/pcre/testdata/testoutput4 b/srclib/pcre/testdata/testoutput4 similarity index 100% rename from trunk/srclib/pcre/testdata/testoutput4 rename to srclib/pcre/testdata/testoutput4 diff --git a/trunk/srclib/pcre/testdata/testoutput5 b/srclib/pcre/testdata/testoutput5 similarity index 100% rename from trunk/srclib/pcre/testdata/testoutput5 rename to srclib/pcre/testdata/testoutput5 diff --git a/trunk/srclib/pcre/testdata/testoutput6 b/srclib/pcre/testdata/testoutput6 similarity index 100% rename from trunk/srclib/pcre/testdata/testoutput6 rename to srclib/pcre/testdata/testoutput6 diff --git a/trunk/srclib/pcre/ucp.c b/srclib/pcre/ucp.c similarity index 100% rename from trunk/srclib/pcre/ucp.c rename to srclib/pcre/ucp.c diff --git a/trunk/srclib/pcre/ucp.h b/srclib/pcre/ucp.h similarity index 100% rename from trunk/srclib/pcre/ucp.h rename to srclib/pcre/ucp.h diff --git a/trunk/srclib/pcre/ucpinternal.h b/srclib/pcre/ucpinternal.h similarity index 100% rename from trunk/srclib/pcre/ucpinternal.h rename to srclib/pcre/ucpinternal.h diff --git a/trunk/srclib/pcre/ucptable.c b/srclib/pcre/ucptable.c similarity index 100% rename from trunk/srclib/pcre/ucptable.c rename to srclib/pcre/ucptable.c diff --git a/trunk/srclib/pcre/ucptypetable.c b/srclib/pcre/ucptypetable.c similarity index 100% rename from trunk/srclib/pcre/ucptypetable.c rename to srclib/pcre/ucptypetable.c diff --git a/trunk/support/.indent.pro b/support/.indent.pro similarity index 100% rename from trunk/support/.indent.pro rename to support/.indent.pro diff --git a/trunk/support/Makefile.in b/support/Makefile.in similarity index 100% rename from trunk/support/Makefile.in rename to support/Makefile.in diff --git a/trunk/support/NWGNUab b/support/NWGNUab similarity index 100% rename from trunk/support/NWGNUab rename to support/NWGNUab diff --git a/trunk/support/NWGNUhtcacheclean b/support/NWGNUhtcacheclean similarity index 100% rename from trunk/support/NWGNUhtcacheclean rename to support/NWGNUhtcacheclean diff --git a/trunk/support/NWGNUhtdbm b/support/NWGNUhtdbm similarity index 100% rename from trunk/support/NWGNUhtdbm rename to support/NWGNUhtdbm diff --git a/trunk/support/NWGNUhtdigest b/support/NWGNUhtdigest similarity index 100% rename from trunk/support/NWGNUhtdigest rename to support/NWGNUhtdigest diff --git a/trunk/support/NWGNUhtpasswd b/support/NWGNUhtpasswd similarity index 100% rename from trunk/support/NWGNUhtpasswd rename to support/NWGNUhtpasswd diff --git a/trunk/support/NWGNUlogres b/support/NWGNUlogres similarity index 100% rename from trunk/support/NWGNUlogres rename to support/NWGNUlogres diff --git a/trunk/support/NWGNUmakefile b/support/NWGNUmakefile similarity index 100% rename from trunk/support/NWGNUmakefile rename to support/NWGNUmakefile diff --git a/trunk/support/NWGNUrotlogs b/support/NWGNUrotlogs similarity index 100% rename from trunk/support/NWGNUrotlogs rename to support/NWGNUrotlogs diff --git a/trunk/support/README b/support/README similarity index 100% rename from trunk/support/README rename to support/README diff --git a/trunk/support/SHA1/README.sha1 b/support/SHA1/README.sha1 similarity index 100% rename from trunk/support/SHA1/README.sha1 rename to support/SHA1/README.sha1 diff --git a/trunk/support/SHA1/convert-sha1.pl b/support/SHA1/convert-sha1.pl similarity index 100% rename from trunk/support/SHA1/convert-sha1.pl rename to support/SHA1/convert-sha1.pl diff --git a/trunk/support/SHA1/htpasswd-sha1.pl b/support/SHA1/htpasswd-sha1.pl similarity index 100% rename from trunk/support/SHA1/htpasswd-sha1.pl rename to support/SHA1/htpasswd-sha1.pl diff --git a/trunk/support/SHA1/ldif-sha1.example b/support/SHA1/ldif-sha1.example similarity index 100% rename from trunk/support/SHA1/ldif-sha1.example rename to support/SHA1/ldif-sha1.example diff --git a/trunk/support/ab.c b/support/ab.c similarity index 100% rename from trunk/support/ab.c rename to support/ab.c diff --git a/trunk/support/ab.dsp b/support/ab.dsp similarity index 100% rename from trunk/support/ab.dsp rename to support/ab.dsp diff --git a/trunk/support/abs.dsp b/support/abs.dsp similarity index 100% rename from trunk/support/abs.dsp rename to support/abs.dsp diff --git a/trunk/support/apachectl.in b/support/apachectl.in similarity index 100% rename from trunk/support/apachectl.in rename to support/apachectl.in diff --git a/trunk/support/apxs.in b/support/apxs.in similarity index 100% rename from trunk/support/apxs.in rename to support/apxs.in diff --git a/trunk/support/check_forensic b/support/check_forensic similarity index 100% rename from trunk/support/check_forensic rename to support/check_forensic diff --git a/trunk/support/checkgid.c b/support/checkgid.c similarity index 100% rename from trunk/support/checkgid.c rename to support/checkgid.c diff --git a/trunk/support/config.m4 b/support/config.m4 similarity index 100% rename from trunk/support/config.m4 rename to support/config.m4 diff --git a/trunk/support/dbmmanage.in b/support/dbmmanage.in similarity index 100% rename from trunk/support/dbmmanage.in rename to support/dbmmanage.in diff --git a/trunk/support/envvars-std.in b/support/envvars-std.in similarity index 100% rename from trunk/support/envvars-std.in rename to support/envvars-std.in diff --git a/trunk/support/htcacheclean.c b/support/htcacheclean.c similarity index 100% rename from trunk/support/htcacheclean.c rename to support/htcacheclean.c diff --git a/trunk/support/htdbm.c b/support/htdbm.c similarity index 100% rename from trunk/support/htdbm.c rename to support/htdbm.c diff --git a/trunk/support/htdbm.dsp b/support/htdbm.dsp similarity index 100% rename from trunk/support/htdbm.dsp rename to support/htdbm.dsp diff --git a/trunk/support/htdigest.c b/support/htdigest.c similarity index 100% rename from trunk/support/htdigest.c rename to support/htdigest.c diff --git a/trunk/support/htdigest.dsp b/support/htdigest.dsp similarity index 100% rename from trunk/support/htdigest.dsp rename to support/htdigest.dsp diff --git a/trunk/support/htpasswd.c b/support/htpasswd.c similarity index 100% rename from trunk/support/htpasswd.c rename to support/htpasswd.c diff --git a/trunk/support/htpasswd.dsp b/support/htpasswd.dsp similarity index 100% rename from trunk/support/htpasswd.dsp rename to support/htpasswd.dsp diff --git a/trunk/support/list_hooks.pl b/support/list_hooks.pl similarity index 100% rename from trunk/support/list_hooks.pl rename to support/list_hooks.pl diff --git a/trunk/support/log_server_status.in b/support/log_server_status.in similarity index 100% rename from trunk/support/log_server_status.in rename to support/log_server_status.in diff --git a/trunk/support/logresolve.c b/support/logresolve.c similarity index 100% rename from trunk/support/logresolve.c rename to support/logresolve.c diff --git a/trunk/support/logresolve.dsp b/support/logresolve.dsp similarity index 100% rename from trunk/support/logresolve.dsp rename to support/logresolve.dsp diff --git a/trunk/support/logresolve.pl.in b/support/logresolve.pl.in similarity index 100% rename from trunk/support/logresolve.pl.in rename to support/logresolve.pl.in diff --git a/trunk/support/phf_abuse_log.cgi.in b/support/phf_abuse_log.cgi.in similarity index 100% rename from trunk/support/phf_abuse_log.cgi.in rename to support/phf_abuse_log.cgi.in diff --git a/trunk/support/rotatelogs.c b/support/rotatelogs.c similarity index 100% rename from trunk/support/rotatelogs.c rename to support/rotatelogs.c diff --git a/trunk/support/rotatelogs.dsp b/support/rotatelogs.dsp similarity index 100% rename from trunk/support/rotatelogs.dsp rename to support/rotatelogs.dsp diff --git a/trunk/support/split-logfile.in b/support/split-logfile.in similarity index 100% rename from trunk/support/split-logfile.in rename to support/split-logfile.in diff --git a/trunk/support/suexec.c b/support/suexec.c similarity index 100% rename from trunk/support/suexec.c rename to support/suexec.c diff --git a/trunk/support/suexec.h b/support/suexec.h similarity index 100% rename from trunk/support/suexec.h rename to support/suexec.h diff --git a/trunk/support/utilitiesnw.def b/support/utilitiesnw.def similarity index 100% rename from trunk/support/utilitiesnw.def rename to support/utilitiesnw.def diff --git a/trunk/support/win32/ApacheMonitor.c b/support/win32/ApacheMonitor.c similarity index 100% rename from trunk/support/win32/ApacheMonitor.c rename to support/win32/ApacheMonitor.c diff --git a/trunk/support/win32/ApacheMonitor.dsp b/support/win32/ApacheMonitor.dsp similarity index 100% rename from trunk/support/win32/ApacheMonitor.dsp rename to support/win32/ApacheMonitor.dsp diff --git a/trunk/support/win32/ApacheMonitor.h b/support/win32/ApacheMonitor.h similarity index 100% rename from trunk/support/win32/ApacheMonitor.h rename to support/win32/ApacheMonitor.h diff --git a/trunk/support/win32/ApacheMonitor.ico b/support/win32/ApacheMonitor.ico similarity index 100% rename from trunk/support/win32/ApacheMonitor.ico rename to support/win32/ApacheMonitor.ico diff --git a/trunk/support/win32/ApacheMonitor.rc b/support/win32/ApacheMonitor.rc similarity index 100% rename from trunk/support/win32/ApacheMonitor.rc rename to support/win32/ApacheMonitor.rc diff --git a/trunk/support/win32/apache_header.bmp b/support/win32/apache_header.bmp similarity index 100% rename from trunk/support/win32/apache_header.bmp rename to support/win32/apache_header.bmp diff --git a/trunk/support/win32/aprun.ico b/support/win32/aprun.ico similarity index 100% rename from trunk/support/win32/aprun.ico rename to support/win32/aprun.ico diff --git a/trunk/support/win32/apstop.ico b/support/win32/apstop.ico similarity index 100% rename from trunk/support/win32/apstop.ico rename to support/win32/apstop.ico diff --git a/trunk/support/win32/srun.bmp b/support/win32/srun.bmp similarity index 100% rename from trunk/support/win32/srun.bmp rename to support/win32/srun.bmp diff --git a/trunk/support/win32/sstop.bmp b/support/win32/sstop.bmp similarity index 100% rename from trunk/support/win32/sstop.bmp rename to support/win32/sstop.bmp diff --git a/trunk/support/win32/wintty.c b/support/win32/wintty.c similarity index 100% rename from trunk/support/win32/wintty.c rename to support/win32/wintty.c diff --git a/trunk/support/win32/wintty.dsp b/support/win32/wintty.dsp similarity index 100% rename from trunk/support/win32/wintty.dsp rename to support/win32/wintty.dsp diff --git a/trunk/test/.indent.pro b/test/.indent.pro similarity index 100% rename from trunk/test/.indent.pro rename to test/.indent.pro diff --git a/trunk/test/Makefile.in b/test/Makefile.in similarity index 100% rename from trunk/test/Makefile.in rename to test/Makefile.in diff --git a/trunk/test/README b/test/README similarity index 100% rename from trunk/test/README rename to test/README diff --git a/trunk/test/check_chunked b/test/check_chunked similarity index 100% rename from trunk/test/check_chunked rename to test/check_chunked diff --git a/trunk/test/cls.c b/test/cls.c similarity index 100% rename from trunk/test/cls.c rename to test/cls.c diff --git a/trunk/test/tcpdumpscii.txt b/test/tcpdumpscii.txt similarity index 100% rename from trunk/test/tcpdumpscii.txt rename to test/tcpdumpscii.txt diff --git a/trunk/test/test-writev.c b/test/test-writev.c similarity index 100% rename from trunk/test/test-writev.c rename to test/test-writev.c diff --git a/trunk/test/test_find.c b/test/test_find.c similarity index 100% rename from trunk/test/test_find.c rename to test/test_find.c diff --git a/trunk/test/test_limits.c b/test/test_limits.c similarity index 100% rename from trunk/test/test_limits.c rename to test/test_limits.c diff --git a/trunk/test/test_parser.c b/test/test_parser.c similarity index 100% rename from trunk/test/test_parser.c rename to test/test_parser.c diff --git a/trunk/test/test_select.c b/test/test_select.c similarity index 100% rename from trunk/test/test_select.c rename to test/test_select.c diff --git a/trunk/test/time-sem.c b/test/time-sem.c similarity index 100% rename from trunk/test/time-sem.c rename to test/time-sem.c diff --git a/trunk/test/zb.c b/test/zb.c similarity index 100% rename from trunk/test/zb.c rename to test/zb.c diff --git a/trunk/Makefile.in b/trunk/Makefile.in deleted file mode 100644 index 6d8348d9f4210e8fda8662dc6ab9d0cd5e945aa6..0000000000000000000000000000000000000000 --- a/trunk/Makefile.in +++ /dev/null @@ -1,212 +0,0 @@ - -SUBDIRS = srclib os server modules support -CLEAN_SUBDIRS = test - -PROGRAM_NAME = $(progname) -PROGRAM_SOURCES = modules.c -PROGRAM_LDADD = buildmark.o $(HTTPD_LDFLAGS) $(PROGRAM_DEPENDENCIES) $(EXTRA_LIBS) $(AP_LIBS) $(LIBS) -PROGRAM_PRELINK = $(COMPILE) -c $(top_srcdir)/server/buildmark.c -PROGRAM_DEPENDENCIES = \ - server/libmain.la \ - $(BUILTIN_LIBS) \ - $(MPM_LIB) \ - os/$(OS_DIR)/libos.la - -PROGRAMS = $(PROGRAM_NAME) -TARGETS = $(PROGRAMS) $(shared_build) $(other_targets) -INSTALL_TARGETS = install-conf install-htdocs install-error install-icons \ - install-other install-cgi install-include install-suexec install-build \ - install-man - -DISTCLEAN_TARGETS = include/ap_config_auto.h include/ap_config_layout.h \ - modules.c config.cache config.log config.status build/config_vars.mk \ - build/rules.mk docs/conf/httpd-std.conf docs/conf/ssl-std.conf shlibtool -EXTRACLEAN_TARGETS = configure include/ap_config_auto.h.in generated_lists \ - httpd.spec - -include $(top_builddir)/build/rules.mk -include $(top_srcdir)/build/program.mk - -install-conf: - @echo Installing configuration files ; \ - if [ ! -d $(DESTDIR)$(sysconfdir) ]; then \ - $(MKINSTALLDIRS) $(DESTDIR)$(sysconfdir) ; \ - fi ; \ - if [ ! -d $(DESTDIR)$(sysconfdir)/extra ]; then \ - $(MKINSTALLDIRS) $(DESTDIR)$(sysconfdir)/extra ; \ - fi ; \ - if [ ! -d $(DESTDIR)$(sysconfdir)/original ]; then \ - $(MKINSTALLDIRS) $(DESTDIR)$(sysconfdir)/original ; \ - $(MKINSTALLDIRS) $(DESTDIR)$(sysconfdir)/original/extra ; \ - fi ; \ - cd $(top_srcdir)/docs/conf; \ - for i in mime.types magic; do \ - if test ! -f $(DESTDIR)$(sysconfdir)/$$i; then \ - $(INSTALL_DATA) $$i $(DESTDIR)$(sysconfdir); \ - fi; \ - done; \ - for j in $(top_srcdir)/docs/conf $(top_builddir)/docs/conf ; do \ - cd $$j ; \ - for i in httpd.conf extra/httpd-*.conf; do \ - ( \ - n_lm=`awk 'BEGIN {n=0} /@@LoadModule@@/ {n+=1} END {print n}' < $$i`; \ - if test $$n_lm -eq 0 -o "x$(DSO_MODULES)" = "x"; then \ - sed -e 's#@@ServerRoot@@#$(prefix)#g' \ - -e 's#@@Port@@#$(PORT)#g' \ - -e '/@@LoadModule@@/d' \ - < $$i; \ - else \ - sed -n -e '/@@LoadModule@@/q' \ - -e 's#@@ServerRoot@@#$(prefix)#g' \ - -e 's#@@Port@@#$(PORT)#g' \ - -e 'p' \ - < $$i; \ - for j in $(DSO_MODULES) "^EOL^"; do \ - if test $$j != "^EOL^"; then \ - echo "LoadModule $${j}_module $(rel_libexecdir)/mod_$${j}.so"; \ - fi; \ - done; \ - sed -e '1,/@@LoadModule@@/d' \ - -e '/@@LoadModule@@/d' \ - -e 's#@@ServerRoot@@#$(prefix)#g' \ - -e 's#@@Port@@#$(PORT)#g' \ - < $$i; \ - fi \ - ) > $(DESTDIR)$(sysconfdir)/original/$$i; \ - chmod 0644 $(DESTDIR)$(sysconfdir)/original/$$i; \ - file=$$i; \ - if [ "$$i" = "httpd.conf" ]; then \ - file=`echo $$i|sed s/.*.conf/$(PROGRAM_NAME).conf/`; \ - fi; \ - if test ! -f $(DESTDIR)$(sysconfdir)/$$file; then \ - $(INSTALL_DATA) $(DESTDIR)$(sysconfdir)/original/$$i $(DESTDIR)$(sysconfdir)/$$file; \ - fi; \ - done ; \ - done ; \ - if test -f "$(builddir)/envvars-std"; then \ - cp -p envvars-std $(DESTDIR)$(sbindir); \ - if test ! -f $(DESTDIR)$(sbindir)/envvars; then \ - cp -p envvars-std $(DESTDIR)$(sbindir)/envvars ; \ - fi ; \ - fi - -install-build: - @echo Installing build system files - @test -d $(DESTDIR)$(installbuilddir) || $(MKINSTALLDIRS) $(DESTDIR)$(installbuilddir) - @cp $(top_srcdir)/build/*.mk $(DESTDIR)$(installbuilddir); \ - cp build/*.mk $(DESTDIR)$(installbuilddir); \ - sed "/^LIBTOOL/s#/[^ ]*/libtool \(.*\)#`$(APR_CONFIG) --apr-libtool` $(LTFLAGS)#" \ - build/config_vars.mk > $(DESTDIR)$(installbuilddir)/config_vars.mk; \ - cp $(top_srcdir)/build/instdso.sh $(DESTDIR)$(installbuilddir); \ - cp $(top_builddir)/config.nice $(DESTDIR)$(installbuilddir); - -htdocs-srcdir = $(top_srcdir)/docs/docroot - -docs:: - mkdir -p ./docs/api - srclib/apr/build/scandoc.pl -i./build/default.pl -p./docs/api/ ./include/*.h - -dox:: - doxygen $(top_srcdir)/docs/doxygen.conf - -install-htdocs: - -@if [ -d $(DESTDIR)$(htdocsdir) ]; then \ - echo "[PRESERVING EXISTING HTDOCS SUBDIR: $(DESTDIR)$(htdocsdir)]"; \ - else \ - echo Installing HTML documents ; \ - $(MKINSTALLDIRS) $(DESTDIR)$(htdocsdir) ; \ - test -d $(htdocs-srcdir) && (cd $(htdocs-srcdir) && cp -rp * $(DESTDIR)$(htdocsdir)) ; \ - cd $(DESTDIR)$(htdocsdir) && find . -name ".svn" -type d -print | xargs rm -rf 2>/dev/null || true; \ - fi - -install-error: - -@if [ -d $(DESTDIR)$(errordir) ]; then \ - echo "[PRESERVING EXISTING ERROR SUBDIR: $(DESTDIR)$(errordir)]"; \ - else \ - echo Installing error documents ; \ - $(MKINSTALLDIRS) $(DESTDIR)$(errordir) ; \ - cd $(top_srcdir)/docs/error && cp -rp * $(DESTDIR)$(errordir) ; \ - test "x$(errordir)" != "x" && cd $(DESTDIR)$(errordir) && find . -name ".svn" -type d -print | xargs rm -rf 2>/dev/null || true; \ - fi - -install-icons: - -@if [ -d $(DESTDIR)$(iconsdir) ]; then \ - echo "[PRESERVING EXISTING ICONS SUBDIR: $(DESTDIR)$(iconsdir)]"; \ - else \ - echo Installing icons ; \ - $(MKINSTALLDIRS) $(DESTDIR)$(iconsdir) ; \ - cd $(top_srcdir)/docs/icons && cp -rp * $(DESTDIR)$(iconsdir) ; \ - test "x$(iconsdir)" != "x" && cd $(DESTDIR)$(iconsdir) && find . -name ".svn" -type d -print | xargs rm -rf 2>/dev/null || true; \ - fi - -install-cgi: - -@if [ -d $(DESTDIR)$(cgidir) ];then \ - echo "[PRESERVING EXISTING CGI SUBDIR: $(DESTDIR)$(cgidir)]"; \ - else \ - echo Installing CGIs ; \ - $(MKINSTALLDIRS) $(DESTDIR)$(cgidir) ; \ - cd $(top_srcdir)/docs/cgi-examples && cp -rp * $(DESTDIR)$(cgidir) ; \ - test "x$(cgidir)" != "x" && cd $(DESTDIR)$(cgidir) && find . -name ".svn" -type d -print | xargs rm -rf 2>/dev/null || true; \ - fi - -install-other: - @test -d $(DESTDIR)$(logfiledir) || $(MKINSTALLDIRS) $(DESTDIR)$(logfiledir) - @test -d $(DESTDIR)$(runtimedir) || $(MKINSTALLDIRS) $(DESTDIR)$(runtimedir) - @for ext in dll x; do \ - file=apachecore.$$ext; \ - if test -f $$file; then \ - cp -p $$file $(DESTDIR)$(libdir); \ - fi; \ - done; \ - file=httpd.dll; \ - if test -f $$file; then \ - cp -p $$file $(DESTDIR)$(bindir); \ - fi; - -install-include: - @echo Installing header files - @test -d $(DESTDIR)$(includedir) || $(MKINSTALLDIRS) $(DESTDIR)$(includedir) - @cp -p include/*.h $(DESTDIR)$(includedir) - @cp -p $(srcdir)/include/*.h $(DESTDIR)$(includedir) - @cp -p $(srcdir)/os/$(OS_DIR)/os.h $(DESTDIR)$(includedir) - @if test -f $(srcdir)/os/$(OS_DIR)/os-inline.c; then \ - cp -p $(srcdir)/os/$(OS_DIR)/os-inline.c $(DESTDIR)$(includedir); \ - fi; - @cp -p $(srcdir)/server/mpm/$(MPM_SUBDIR_NAME)/*.h $(DESTDIR)$(includedir) - @cp -p $(srcdir)/modules/aaa/mod_auth.h $(DESTDIR)$(includedir) - @cp -p $(srcdir)/modules/dav/main/mod_dav.h $(DESTDIR)$(includedir) - @cp -p $(srcdir)/modules/filters/mod_include.h $(DESTDIR)$(includedir) - @cp -p $(srcdir)/modules/generators/mod_cgi.h $(DESTDIR)$(includedir) - @cp -p $(srcdir)/modules/generators/mod_status.h $(DESTDIR)$(includedir) - @cp -p $(srcdir)/modules/loggers/mod_log_config.h $(DESTDIR)$(includedir) - @cp -p $(srcdir)/modules/http/mod_core.h $(DESTDIR)$(includedir) - @cp -p $(srcdir)/modules/proxy/mod_proxy.h $(DESTDIR)$(includedir) - @cp -p $(srcdir)/modules/ssl/mod_ssl.h $(DESTDIR)$(includedir) - @cp -p $(srcdir)/os/$(OS_DIR)/*.h $(DESTDIR)$(includedir) - @chmod 644 $(DESTDIR)$(includedir)/*.h - -install-man: - @echo Installing man pages and online manual - @test -d $(DESTDIR)$(mandir) || $(MKINSTALLDIRS) $(DESTDIR)$(mandir) - @test -d $(DESTDIR)$(mandir)/man1 || $(MKINSTALLDIRS) $(DESTDIR)$(mandir)/man1 - @test -d $(DESTDIR)$(mandir)/man8 || $(MKINSTALLDIRS) $(DESTDIR)$(mandir)/man8 - @test -d $(DESTDIR)$(manualdir) || $(MKINSTALLDIRS) $(DESTDIR)$(manualdir) - @cp -p $(top_srcdir)/docs/man/*.1 $(DESTDIR)$(mandir)/man1 - @cp -p $(top_srcdir)/docs/man/*.8 $(DESTDIR)$(mandir)/man8 - @(cd $(top_srcdir)/docs/manual && cp -rp * $(DESTDIR)$(manualdir)) - @(cd $(DESTDIR)$(manualdir) && find . -name ".svn" -type d -print | xargs rm -rf 2>/dev/null ) || true - -install-suexec: - @if test -f $(builddir)/support/suexec; then \ - test -d $(DESTDIR)$(sbindir) || $(MKINSTALLDIRS) $(DESTDIR)$(sbindir); \ - $(INSTALL_PROGRAM) $(top_builddir)/support/suexec $(DESTDIR)$(sbindir); \ - chmod 4755 $(DESTDIR)$(sbindir)/suexec; \ - fi - -suexec: - cd support && $(MAKE) suexec - -x-local-distclean: - @rm -rf autom4te.cache - -include $(top_srcdir)/os/os2/core.mk diff --git a/trunk/NWGNUmakefile b/trunk/NWGNUmakefile deleted file mode 100644 index a763811850bd212d8ce464443e4a0d4bd3fc917a..0000000000000000000000000000000000000000 --- a/trunk/NWGNUmakefile +++ /dev/null @@ -1,397 +0,0 @@ -# -# Declare the sub-directories to be built here -# - -SUBDIRS = \ - $(APR_WORK) \ - build \ - support \ - modules \ - $(EOLIST) - -# -# Get the 'head' of the build environment. This includes default targets and -# paths to tools -# - -include $(AP_WORK)\build\NWGNUhead.inc - -# -# build this level's files - -# -# Make sure all needed macro's are defined -# - -# -# These directories will be at the beginning of the include list, followed by -# INCDIRS -# -XINCDIRS += \ - $(APR)/include \ - $(APRUTIL)/include \ - $(AP_WORK)/include \ - $(AP_WORK)/modules/filters/ \ - $(AP_WORK)/modules/generators/ \ - $(AP_WORK)/modules/http/ \ - $(AP_WORK)/modules/loggers/ \ - $(AP_WORK)/modules/mappers/ \ - $(AP_WORK)/modules/proxy/ \ - $(AP_WORK)/os/NetWare \ - $(AP_WORK)/server/mpm/NetWare \ - $(AP_WORK)/srclib/pcre \ - $(NWOS) \ - $(EOLIST) - -# -# These flags will come after CFLAGS -# -XCFLAGS += \ - $(EOLIST) - -# -# These defines will come after DEFINES -# -XDEFINES += \ - $(EOLIST) - -# -# These flags will be added to the link.opt file -# -XLFLAGS += \ - $(EOLIST) - -# -# These values will be appended to the correct variables based on the value of -# RELEASE -# -ifeq "$(RELEASE)" "debug" -XINCDIRS += \ - $(EOLIST) - -XCFLAGS += \ - $(EOLIST) - -XDEFINES += \ - $(EOLIST) - -XLFLAGS += \ - $(EOLIST) -endif - -ifeq "$(RELEASE)" "noopt" -XINCDIRS += \ - $(EOLIST) - -XCFLAGS += \ - $(EOLIST) - -XDEFINES += \ - $(EOLIST) - -XLFLAGS += \ - $(EOLIST) -endif - -ifeq "$(RELEASE)" "release" -XINCDIRS += \ - $(EOLIST) - -XCFLAGS += \ - $(EOLIST) - -XDEFINES += \ - $(EOLIST) - -XLFLAGS += \ - $(EOLIST) -endif - -# -# These are used by the link target if an NLM is being generated -# This is used by the link 'name' directive to name the nlm. If left blank -# TARGET_nlm (see below) will be used. -# -NLM_NAME = Apache2 - -# -# This is used by the link '-desc ' directive. -# If left blank, NLM_NAME will be used. -# -NLM_DESCRIPTION = Apache Web Server $(VERSION_STR) - -# -# This is used by the '-threadname' directive. If left blank, -# NLM_NAME Thread will be used. -# -NLM_THREAD_NAME = Apache - -# -# This is used by the '-screenname' directive. If left blank, -# 'Apache for NetWare' Thread will be used. -# -NLM_SCREEN_NAME = Apache $(VERSION_STR) for NetWare - - -# -# If this is specified, it will override VERSION value in -# $(AP_WORK)\build\NWGNUenvironment.inc -# -NLM_VERSION = - -# -# If this is specified, it will override the default of 64K -# -NLM_STACK_SIZE = 65536 - - -# -# If this is specified it will be used by the link '-entry' directive -# -NLM_ENTRY_SYM = _LibCPrelude - -# -# If this is specified it will be used by the link '-exit' directive -# -NLM_EXIT_SYM = _LibCPostlude - -# -# If this is specified it will be used by the link '-check' directive -# -NLM_CHECK_SYM = _LibCCheckUnload - -# -# If these are specified it will be used by the link '-flags' directive -# -NLM_FLAGS = PSEUDOPREEMPTION - -# -# If this is specified it will be linked in with the XDCData option in the def -# file instead of the default of $(NWOS)/apache.xdc. XDCData can be disabled -# by setting APACHE_UNIPROC in the environment -# -XDCDATA = - -# -# If there is an NLM target, put it here -# -TARGET_nlm = \ - $(OBJDIR)/Apache2.nlm \ - $(EOLIST) - -# -# If there is an LIB target, put it here -# -TARGET_lib = \ - $(EOLIST) - -# -# These are the OBJ files needed to create the NLM target above. -# Paths must all use the '/' character -# -FILES_nlm_objs = \ - $(OBJDIR)/buildmark.o \ - $(OBJDIR)/config.o \ - $(OBJDIR)/connection.o \ - $(OBJDIR)/core.o \ - $(OBJDIR)/core_filters.o \ - $(OBJDIR)/eoc_bucket.o \ - $(OBJDIR)/error_bucket.o \ - $(OBJDIR)/http_core.o \ - $(OBJDIR)/http_protocol.o \ - $(OBJDIR)/http_request.o \ - $(OBJDIR)/byterange_filter.o \ - $(OBJDIR)/chunk_filter.o \ - $(OBJDIR)/http_etag.o \ - $(OBJDIR)/http_filters.o \ - $(OBJDIR)/listen.o \ - $(OBJDIR)/log.o \ - $(OBJDIR)/main.o \ - $(OBJDIR)/mod_authz_host.o \ - $(OBJDIR)/mod_alias.o \ - $(OBJDIR)/mod_dir.o \ - $(OBJDIR)/mod_env.o \ - $(OBJDIR)/mod_include.o \ - $(OBJDIR)/mod_log_config.o \ - $(OBJDIR)/mod_mime.o \ - $(OBJDIR)/mod_negotiation.o \ - $(OBJDIR)/mod_netware.o \ - $(OBJDIR)/mod_setenvif.o \ - $(OBJDIR)/mod_so.o \ - $(OBJDIR)/modules.o \ - $(OBJDIR)/mpm_common.o \ - $(OBJDIR)/mpm_netware.o \ - $(OBJDIR)/pcre.o \ - $(OBJDIR)/protocol.o \ - $(OBJDIR)/provider.o \ - $(OBJDIR)/request.o \ - $(OBJDIR)/scoreboard.o \ - $(OBJDIR)/util.o \ - $(OBJDIR)/util_cfgtree.o \ - $(OBJDIR)/util_charset.o \ - $(OBJDIR)/util_debug.o \ - $(OBJDIR)/util_filter.o \ - $(OBJDIR)/util_md5.o \ - $(OBJDIR)/util_nw.o \ - $(OBJDIR)/util_pcre.o \ - $(OBJDIR)/util_script.o \ - $(OBJDIR)/util_time.o \ - $(OBJDIR)/util_xml.o \ - $(OBJDIR)/vhost.o \ - $(EOLIST) - -# Build in mod_nw_ssl if Winsock is being used -ifndef USE_STDSOCKETS -FILES_nlm_objs += $(OBJDIR)/mod_nw_ssl.o \ - $(EOLIST) -endif - -# -# These are the LIB files needed to create the NLM target above. -# These will be added as a library command in the link.opt file. -# -FILES_nlm_libs = \ - libcpre.o \ - $(EOLIST) - -# -# These are the modules that the above NLM target depends on to load. -# These will be added as a module command in the link.opt file. -# -FILES_nlm_modules = \ - aprlib \ - Libc \ - $(EOLIST) - -# -# If the nlm has a msg file, put it's path here -# -FILE_nlm_msg = - -# -# If the nlm has a hlp file put it's path here -# -FILE_nlm_hlp = - -# -# If this is specified, it will override $(NWOS)\copyright.txt. -# -FILE_nlm_copyright = - -# -# Any additional imports go here -# -FILES_nlm_Ximports = \ - @netware.imp \ - @$(APR)/aprlib.imp \ - @libc.imp \ - GetCurrentAddressSpace \ - $(EOLIST) - -# Don't link with Winsock if standard sockets are being used -ifndef USE_STDSOCKETS -FILES_nlm_Ximports += @ws2nlm.imp \ - $(EOLIST) -endif - -# -# Any symbols exported to here -# -FILES_nlm_exports = \ - @$(NWOS)/httpd.imp \ - $(EOLIST) - -# -# These are the OBJ files needed to create the LIB target above. -# Paths must all use the '/' character -# -FILES_lib_objs = \ - $(EOLIST) - -# -# implement targets and dependancies (leave this section alone) -# - -libs :: $(OBJDIR) $(TARGET_lib) - -nlms :: libs $(TARGET_nlm) - -# -# Updated this target to create necessary directories and copy files to the -# correct place. (See $(AP_WORK)\build\NWGNUhead.inc for examples) -# -install :: nlms FORCE - -copy $(OBJDIR)\Apache2.nlm $(INSTALL)\Apache2\*.* - -copy ABOUT_APACHE $(INSTALL)\Apache2\*.* - -copy README $(INSTALL)\Apache2\*.* - -copy STATUS $(INSTALL)\Apache2\*.* - -copy LICENSE $(INSTALL)\Apache2\*.* - -copy CHANGES $(INSTALL)\Apache2\*.* - -copy support\dbmmanage.in $(INSTALL)\Apache2\bin\dbmmanage.pl - -copy support\logresolve.pl.in $(INSTALL)\Apache2\bin\logresolve.pl -ifdef USE_STDSOCKETS - -awk -f build\mkconfnw.awk docs\conf\httpd.conf.in >$(INSTALL)\Apache2\conf\httpd.conf -else - -awk -v SSL=1 -f build\mkconfnw.awk docs\conf\httpd.conf.in >$(INSTALL)\Apache2\conf\httpd.conf -endif - $(CHKNOT) $(INSTALL)\Apache2\conf\extra\nul mkdir $(INSTALL)\Apache2\conf\extra - -awk -f build\mkconfnw.awk docs\conf\extra\httpd-autoindex.conf.in >$(INSTALL)\Apache2\conf\extra\httpd-autoindex.conf - -awk -f build\mkconfnw.awk docs\conf\extra\httpd-dav.conf.in >$(INSTALL)\Apache2\conf\extra\httpd-dav.conf - -awk -f build\mkconfnw.awk docs\conf\extra\httpd-default.conf.in >$(INSTALL)\Apache2\conf\extra\httpd-default.conf - -awk -f build\mkconfnw.awk docs\conf\extra\httpd-info.conf.in >$(INSTALL)\Apache2\conf\extra\httpd-info.conf - -awk -f build\mkconfnw.awk docs\conf\extra\httpd-languages.conf.in >$(INSTALL)\Apache2\conf\extra\httpd-languages.conf - -awk -f build\mkconfnw.awk docs\conf\extra\httpd-manual.conf.in >$(INSTALL)\Apache2\conf\extra\httpd-manual.conf - -awk -f build\mkconfnw.awk docs\conf\extra\httpd-mpm.conf.in >$(INSTALL)\Apache2\conf\extra\httpd-mpm.conf - -awk -f build\mkconfnw.awk docs\conf\extra\httpd-multilang-errordoc.conf.in >$(INSTALL)\Apache2\conf\extra\httpd-multilang-errordoc.conf - -awk -f build\mkconfnw.awk docs\conf\extra\httpd-ssl.conf.in >$(INSTALL)\Apache2\conf\extra\httpd-ssl.conf - -awk -f build\mkconfnw.awk docs\conf\extra\httpd-userdir.conf.in >$(INSTALL)\Apache2\conf\extra\httpd-userdir.conf - -awk -f build\mkconfnw.awk docs\conf\extra\httpd-vhosts.conf.in >$(INSTALL)\Apache2\conf\extra\httpd-vhosts.conf - -copy docs\conf\magic $(INSTALL)\Apache2\conf\magic - -copy docs\conf\mime.types $(INSTALL)\Apache2\conf\mime.types - -copy docs\conf\charset.conv $(INSTALL)\Apache2\conf\charset.conv - -copy docs\cgi-examples\printenv $(INSTALL)\Apache2\cgi-bin\printenv.pl - @echo rem copying the docs directories > xc.bat - @echo xcopy docs\error $(INSTALL)\Apache2\error $(XCOPYSW) >> xc.bat - @echo xcopy docs\docroot $(INSTALL)\Apache2\htdocs $(XCOPYSW) >> xc.bat - @echo xcopy docs\icons $(INSTALL)\Apache2\icons $(XCOPYSW) >> xc.bat - @echo xcopy docs\man $(INSTALL)\Apache2\man $(XCOPYSW) >> xc.bat - @echo xcopy docs\manual $(INSTALL)\Apache2\manual $(XCOPYSW) >> xc.bat - $(CMD) xc.bat - $(DEL) xc.bat - - - -installdev :: FORCE - -copy $(subst /,\,$(AP_WORK))\include\*.h $(INSTALL)\Apache2\include\*.* - -copy $(subst /,\,$(AP_WORK))\os\netware\*.h $(INSTALL)\Apache2\include\*.* - -copy $(subst /,\,$(NWOS))\*.imp $(INSTALL)\Apache2\lib\*.* - -copy $(subst /,\,$(APR))\include\*.h $(INSTALL)\Apache2\include\*.* - -copy $(subst /,\,$(APRUTIL))\include\*.h $(INSTALL)\Apache2\include\*.* - -copy $(subst /,\,$(APR))\*.imp $(INSTALL)\Apache2\lib\*.* - -copy $(subst /,\,$(NWOS))\*.xdc $(INSTALL)\Apache2\lib\*.* - -prebuild :: FORCE - $(MAKE) -C server -f NWGNUMakefile - $(MAKE) -C srclib/pcre -f NWGNUMakefile - $(MAKE) -C $(APU_WORK)/uri -f NWGNUMakefile - $(CHKNOT) $(PREBUILD_INST)\nul mkdir $(PREBUILD_INST) - -copy $(AP_WORK)\server\$(OBJDIR)\*.nlm $(PREBUILD_INST)\*.* - -copy $(AP_WORK)\srclib\pcre\$(basename $(OBJDIR))\*.nlm $(PREBUILD_INST)\*.* - -copy $(APU_WORK)\uri\$(basename $(OBJDIR))\*.nlm $(PREBUILD_INST)\*.* - - -# -# Any specialized rules here -# - -vpath %.c server:modules/arch/netware:modules/http:modules/aaa:modules/mappers -vpath %.c modules/generators:modules/metadata:modules/filters:modules/loggers -vpath %.c os/netware:server/mpm/netware:srclib/pcre - -# -# Include the 'tail' makefile that has targets that depend on variables defined -# in this makefile -# - -include $(AP_WORK)\build\NWGNUtail.inc - diff --git a/trunk/README b/trunk/README deleted file mode 100644 index 59217a37d9bcd584146e92de7f6a3d5570851e01..0000000000000000000000000000000000000000 --- a/trunk/README +++ /dev/null @@ -1,90 +0,0 @@ - - Apache HTTP Server - - What is it? - ----------- - - The Apache HTTP Server is a powerful and flexible HTTP/1.1 compliant - web server. Originally designed as a replacement for the NCSA HTTP - Server, it has grown to be the most popular web server on the - Internet. As a project of the Apache Software Foundation, the - developers aim to collaboratively develop and maintain a robust, - commercial-grade, standards-based server with freely available - source code. - - The Latest Version - ------------------ - - Details of the latest version can be found on the Apache HTTP - server project page under http://httpd.apache.org/. - - Documentation - ------------- - - The documentation available as of the date of this release is - included in HTML format in the docs/manual/ directory. The most - up-to-date documentation can be found at - http://httpd.apache.org/docs-2.1/. - - Installation - ------------ - - Please see the file called INSTALL. Platform specific notes can be - found in README.platforms. - - Licensing - --------- - - Please see the file called LICENSE. - - Contacts - -------- - - o If you want to be informed about new code releases, bug fixes, - security fixes, general news and information about the Apache server - subscribe to the apache-announce mailing list as described under - http://httpd.apache.org/lists.html#http-announce - - o If you want freely available support for running Apache please join the - Apache user community by subscribing to Users Mailing List at - http://httpd.apache.org/userslist.html or one of the following USENET - newsgroups: - comp.infosystems.www.servers.unix - comp.infosystems.www.servers.ms-windows - Also available at: - http://groups.google.com/groups?group=comp.infosystems.www.servers - - o If you want commercial support for running Apache please contact - one of the companies and contractors which are listed at - http://www.apache.org/info/support.cgi - - o If you have a concrete bug report for Apache please go to the - Apache Group Bug Database and submit your report: - http://httpd.apache.org/bug_report.html - - o If you want to participate in actively developing Apache please - subscribe to the `dev@httpd.apache.org' mailing list as described at - http://www.apache.org/lists.html#http-dev - - Acknowledgments - ---------------- - - We wish to acknowledge the following copyrighted works that - make up portions of the Apache software: - - Portions of this software were developed at the National Center - for Supercomputing Applications (NCSA) at the University of - Illinois at Urbana-Champaign. - - This software contains code derived from the RSA Data Security - Inc. MD5 Message-Digest Algorithm, including various - modifications by Spyglass Inc., Carnegie Mellon University, and - Bell Communications Research, Inc (Bellcore). - - Regular expression support is provided by the PCRE library package, which - is open source software, written by Philip Hazel, and copyright by the - University of Cambridge, England. The original software is available from - ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/ - - Apache 2 relies heavily on the use of autoconf and libtool to provide - a build environment. diff --git a/trunk/modules/ssl/README.dsov.fig b/trunk/modules/ssl/README.dsov.fig deleted file mode 100644 index d8d03db247c0e7bde4800e256d0cb3070073cfda..0000000000000000000000000000000000000000 --- a/trunk/modules/ssl/README.dsov.fig +++ /dev/null @@ -1,346 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -0 32 #616561 -0 33 #b6b2b6 -0 34 #f7f3f7 -0 35 #cfcfcf -0 36 #ffffff -6 6345 2835 7155 3150 -6 6345 2970 7110 3150 -4 0 0 200 0 20 8 0.0000 4 120 585 6345 3105 "ssl_module")\001 --6 -4 0 0 200 0 20 8 0.0000 4 120 660 6345 2970 ap_ctx_get(...,\001 --6 -6 10800 2610 12240 3060 -4 0 0 200 0 20 8 0.0000 4 120 1170 10800 2745 ap_get_module_config(...\001 -4 0 0 200 0 20 8 0.0000 4 120 795 10800 2880 ->per_dir_config,\001 -4 0 0 200 0 20 8 0.0000 4 120 585 10800 3015 &ssl_module)\001 --6 -6 7920 4770 9135 4995 -2 4 0 1 35 35 200 0 20 0.000 0 0 4 0 0 5 - 9135 4995 7920 4995 7920 4770 9135 4770 9135 4995 -4 0 0 100 0 18 12 0.0000 4 180 1065 8010 4950 request_rec\001 --6 -2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 6975 3330 7425 2520 -2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 7200 4230 9450 2520 -2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 7875 4905 7200 5220 -2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 6750 5130 6750 4545 -2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 6705 5445 7155 6120 -2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 7875 4815 7200 4590 -2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 9585 2565 11475 4230 -2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 10170 5130 11835 4545 -2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 7920 6075 9855 5400 -2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 9990 5445 10935 5625 -2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 10215 5310 10935 5310 -2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 11925 4590 11925 5085 -2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 9810 5490 9810 6840 -2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 9945 5445 10935 6030 -2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 8865 4725 10800 2565 -2 1 0 3 0 34 200 0 20 0.000 0 0 -1 0 0 2 - 675 6075 5850 6075 -2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 675 6525 675 6075 -2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2 - 1 0 1.00 60.00 120.00 - 5850 6075 5850 6525 -2 1 0 3 0 34 200 0 20 0.000 0 0 -1 0 0 2 - 900 5625 5625 5625 -2 1 0 3 0 34 200 0 20 0.000 0 0 -1 0 0 2 - 1125 5175 5400 5175 -2 1 0 3 0 34 200 0 20 0.000 0 0 -1 0 0 2 - 1350 4725 5175 4725 -2 1 0 3 0 34 200 0 20 0.000 0 0 -1 0 0 2 - 1575 4275 4950 4275 -2 1 0 3 0 34 200 0 20 0.000 0 0 -1 0 0 2 - 1800 3825 4725 3825 -2 1 0 3 0 34 200 0 20 0.000 0 0 -1 0 0 2 - 2025 3375 4500 3375 -2 1 0 3 0 34 200 0 20 0.000 0 0 -1 0 0 2 - 2250 2925 4275 2925 -2 1 0 3 0 34 200 0 20 0.000 0 0 -1 0 0 2 - 2475 2475 4050 2475 -2 1 0 3 0 34 200 0 20 0.000 0 0 -1 0 0 2 - 2700 2025 3825 2025 -2 1 0 3 0 34 200 0 20 0.000 0 0 -1 0 0 2 - 2925 1575 3600 1575 -2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 900 6075 900 5625 -2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 1125 6525 1125 5175 -2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 1350 5175 1350 4725 -2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 1575 4725 1575 4275 -2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 1800 6525 1800 3825 -2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 2025 3825 2025 3375 -2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 2250 3375 2250 2925 -2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 2475 2925 2475 2475 -2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2 - 1 0 1.00 60.00 120.00 - 5625 5625 5625 6075 -2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2 - 1 0 1.00 60.00 120.00 - 5400 5175 5400 6525 -2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2 - 1 0 1.00 60.00 120.00 - 5175 4725 5175 5175 -2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2 - 1 0 1.00 60.00 120.00 - 4950 4275 4950 4725 -2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2 - 1 0 1.00 60.00 120.00 - 4725 3825 4725 6525 -2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2 - 1 0 1.00 60.00 120.00 - 4500 3375 4500 3825 -2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2 - 1 0 1.00 60.00 120.00 - 4275 2925 4275 3375 -2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2 - 1 0 1.00 60.00 120.00 - 4050 2475 4050 2925 -2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 2700 6525 2700 2025 -2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2 - 1 0 1.00 60.00 120.00 - 3825 2025 3825 6525 -2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2 - 1 0 1.00 60.00 120.00 - 3600 1575 3600 2025 -2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 2925 2025 2925 1575 -2 1 0 4 0 0 200 0 20 0.000 0 0 -1 1 0 2 - 1 1 4.00 60.00 120.00 - 540 6525 6300 6525 -2 3 0 1 7 7 800 0 20 0.000 0 0 -1 0 0 9 - 675 6525 5850 6525 5850 6075 5625 6075 5625 5625 900 5625 - 900 6075 675 6075 675 6525 -2 3 0 1 34 34 700 0 20 0.000 0 0 -1 0 0 13 - 1125 6525 5355 6525 5400 5175 5175 5175 5175 4725 4950 4725 - 4950 4275 1575 4275 1575 4725 1350 4725 1350 5175 1125 5175 - 1125 6525 -2 3 0 1 35 35 500 0 20 0.000 0 0 -1 0 0 17 - 1800 6525 4725 6525 4725 3825 4500 3825 4500 3375 4275 3375 - 4275 2925 4050 2925 4050 2475 2475 2475 2475 2925 2250 2925 - 2250 3375 2025 3375 2025 3825 1800 3825 1800 6525 -2 3 0 1 33 33 400 0 20 0.000 0 0 -1 0 0 9 - 2700 6525 3825 6525 3825 2025 3600 2025 3600 1575 2925 1575 - 2925 2025 2700 2025 2700 6525 -2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 1 2 - 2 0 1.00 60.00 120.00 - 2 0 1.00 60.00 120.00 - 2700 6750 3825 6750 -2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 1 2 - 2 0 1.00 60.00 120.00 - 2 0 1.00 60.00 120.00 - 1125 7200 5400 7200 -2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 1 2 - 2 0 1.00 60.00 120.00 - 2 0 1.00 60.00 120.00 - 1800 6975 4725 6975 -2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 1 2 - 2 0 1.00 60.00 120.00 - 2 0 1.00 60.00 120.00 - 675 7425 5850 7425 -2 1 2 1 0 34 200 0 20 3.000 0 1 -1 0 0 2 - 675 6570 675 7650 -2 1 2 1 0 34 200 0 20 3.000 0 1 -1 0 0 2 - 1125 6570 1125 7650 -2 1 2 1 0 34 200 0 20 3.000 0 1 -1 0 0 2 - 1800 6570 1800 7650 -2 1 2 1 0 34 200 0 20 3.000 0 1 -1 0 0 2 - 2700 6570 2700 7650 -2 1 2 1 0 34 200 0 20 3.000 0 1 -1 0 0 2 - 3825 6570 3825 7650 -2 1 2 1 0 34 200 0 20 3.000 0 1 -1 0 0 2 - 4725 6570 4725 7650 -2 1 2 1 0 34 200 0 20 3.000 0 1 -1 0 0 2 - 5400 6570 5400 7650 -2 1 2 1 0 34 200 0 20 3.000 0 1 -1 0 0 2 - 5850 6570 5850 7650 -2 4 0 2 0 7 100 0 -1 0.000 0 0 20 0 0 5 - 12600 8550 450 8550 450 225 12600 225 12600 8550 -2 4 0 1 0 34 200 0 20 0.000 0 0 20 0 0 5 - 12600 1350 450 1350 450 225 12600 225 12600 1350 -2 4 0 1 35 35 200 0 20 0.000 0 0 4 0 0 5 - 10170 2475 8775 2475 8775 2250 10170 2250 10170 2475 -2 4 0 1 35 35 200 0 20 0.000 0 0 4 0 0 5 - 11925 2475 10575 2475 10575 2250 11925 2250 11925 2475 -2 4 0 1 35 35 200 0 20 0.000 0 0 4 0 0 5 - 12375 4500 11430 4500 11430 4275 12375 4275 12375 4500 -2 4 0 1 35 35 200 0 20 0.000 0 0 4 0 0 5 - 12375 5400 10980 5400 10980 5175 12375 5175 12375 5400 -2 4 0 1 35 35 200 0 20 0.000 0 0 4 0 0 5 - 10170 5400 9675 5400 9675 5175 10170 5175 10170 5400 -2 4 0 1 35 35 200 0 20 0.000 0 0 4 0 0 5 - 7875 6300 7200 6300 7200 6075 7875 6075 7875 6300 -2 4 0 1 35 35 200 0 20 0.000 0 0 4 0 0 5 - 8190 2475 6750 2475 6750 2250 8190 2250 8190 2475 -2 4 0 1 35 35 200 0 20 0.000 0 0 4 0 0 5 - 7605 3600 6300 3600 6300 3375 7605 3375 7605 3600 -2 4 0 1 35 35 200 0 20 0.000 0 0 4 0 0 5 - 7335 4500 6300 4500 6300 4275 7335 4275 7335 4500 -2 4 0 1 35 35 200 0 20 0.000 0 0 4 0 0 5 - 7200 5400 6300 5400 6300 5175 7200 5175 7200 5400 -2 1 0 6 7 7 600 0 -1 0.000 0 0 -1 0 0 2 - 9450 4500 6075 1935 -2 1 0 6 7 7 600 0 -1 0.000 0 0 4 0 0 2 - 9450 4500 12465 2205 -2 1 0 6 7 7 600 0 -1 0.000 0 0 4 0 0 2 - 9450 4500 9450 7785 -2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 9630 5310 7245 5310 -2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 11385 4365 7380 4365 -2 4 0 1 35 35 200 0 20 0.000 0 0 4 0 0 5 - 12240 5805 10980 5805 10980 5580 12240 5580 12240 5805 -2 4 0 1 35 35 200 0 20 0.000 0 0 4 0 0 5 - 12375 6210 10980 6210 10980 5985 12375 5985 12375 6210 -2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 11205 6885 9900 5445 -2 4 0 1 35 35 200 0 20 0.000 0 0 4 0 0 5 - 12285 7155 10530 7155 10530 6930 12285 6930 12285 7155 -2 4 0 1 35 35 200 0 20 0.000 0 0 4 0 0 5 - 10170 7155 9630 7155 9630 6930 10170 6930 10170 7155 -2 1 0 6 7 7 600 0 -1 0.000 0 0 4 0 0 2 - 12510 6435 9450 6435 -2 1 0 1 0 34 300 0 20 0.000 0 0 7 1 0 4 - 1 1 1.00 60.00 120.00 - 12375 4455 12510 4635 12510 6210 11970 6885 -2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 9850 5143 9175 4918 -3 1 0 1 34 34 800 0 20 0.000 0 0 0 41 - 7380 1710 6390 2115 5535 2115 6075 3015 5670 3465 6165 3915 - 5715 4410 6030 5040 6030 5310 6480 5715 6390 6255 6975 6300 - 7065 6975 7965 6750 8100 7560 8955 7290 9360 7740 9720 7560 - 10755 8145 12060 8280 12375 7650 12420 7200 12510 7065 12330 6660 - 12510 6390 12420 5940 12375 5400 12510 5220 12510 4725 12600 4275 - 12375 3645 12105 3240 12150 2745 12375 2700 12330 1980 11790 1575 - 11250 1935 10125 1485 8955 2070 7785 1620 7695 1575 - 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 - 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 - 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 - 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 - 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 - 1.000 -4 0 0 100 0 0 12 0.0000 4 180 1440 10575 675 Ralf S. Engelschall\001 -4 0 0 100 0 18 20 0.0000 4 270 3840 4275 675 Apache+mod_ssl+OpenSSL\001 -4 0 0 100 0 0 10 0.0000 4 135 1320 10575 855 rse@engelschall.com\001 -4 0 0 100 0 0 10 0.0000 4 135 1410 10575 1035 www.engelschall.com\001 -4 0 0 100 0 0 12 0.0000 4 135 870 900 675 Version 1.3\001 -4 0 0 100 0 0 12 0.0000 4 180 1035 900 855 12-Apr-1999\001 -4 0 0 200 0 20 8 0.0000 4 60 390 6210 4680 ->server\001 -4 0 0 200 0 20 8 0.0000 4 120 855 8280 6120 ap_ctx_get(...,"ssl")\001 -4 0 0 200 0 20 8 0.0000 4 120 1170 7740 2700 ap_get_module_config(...\001 -4 0 0 200 0 20 8 0.0000 4 120 810 7740 2835 ->module_config,\001 -4 0 0 200 0 20 8 0.0000 4 120 585 7740 2970 &ssl_module)\001 -4 0 0 100 0 18 20 0.0000 4 270 1200 9000 8100 Chaining\001 -4 0 0 100 0 18 20 0.0000 4 210 1095 2745 8100 Lifetime\001 -4 0 0 100 0 18 12 0.0000 4 180 1215 810 6255 ap_global_ctx\001 -4 0 0 100 0 18 12 0.0000 4 180 1305 990 5805 SSLModConfig\001 -4 0 0 100 0 18 12 0.0000 4 180 840 4050 4455 SSL_CTX\001 -4 0 0 100 0 18 12 0.0000 4 150 975 4455 5355 server_rec\001 -4 0 0 100 0 18 12 0.0000 4 180 1260 3870 4905 SSLSrvConfig\001 -4 0 0 100 0 18 12 0.0000 4 135 480 1845 4005 BUFF\001 -4 0 0 100 0 18 12 0.0000 4 150 810 2070 3555 conn_rec\001 -4 0 0 100 0 18 12 0.0000 4 135 345 2295 3105 BIO\001 -4 0 0 100 0 18 12 0.0000 4 135 375 2565 2655 SSL\001 -4 0 0 100 0 18 12 0.0000 4 180 1185 3645 1620 SSLDirConfig\001 -4 0 0 100 0 18 12 0.0000 4 180 1065 3915 2070 request_rec\001 -4 0 0 200 0 0 8 0.0000 4 120 1440 900 7560 Startup, Runtime, Shutdown\001 -4 0 0 200 0 0 8 0.0000 4 105 975 1350 7335 Configuration Time\001 -4 0 0 200 0 0 8 0.0000 4 90 1050 2025 7110 Connection Duration\001 -4 0 0 200 0 0 8 0.0000 4 120 885 2835 6885 Request Duration\001 -4 0 0 200 0 18 20 0.0000 4 195 90 6345 6795 t\001 -4 0 0 200 0 20 8 0.0000 4 90 345 7110 5985 ->client\001 -4 0 0 100 0 18 12 0.0000 4 180 1305 6795 2430 SSLModConfig\001 -4 0 0 100 0 18 12 0.0000 4 180 1260 8865 2430 SSLSrvConfig\001 -4 0 0 100 0 18 12 0.0000 4 180 1215 6345 3555 ap_global_ctx\001 -4 0 0 100 0 18 12 0.0000 4 150 975 6345 4455 server_rec\001 -4 0 0 100 0 18 12 0.0000 4 150 810 6345 5355 conn_rec\001 -4 0 0 100 0 18 12 0.0000 4 135 375 9720 5355 SSL\001 -4 0 0 100 0 18 12 0.0000 4 180 1185 10665 2430 SSLDirConfig\001 -4 0 0 100 0 18 12 0.0000 4 135 480 7290 6255 BUFF\001 -4 0 0 100 0 18 12 0.0000 4 180 1305 11025 5355 SSL_METHOD\001 -4 0 0 100 0 18 12 0.0000 4 180 840 11475 4455 SSL_CTX\001 -4 0 0 100 0 18 24 0.0000 4 285 4365 3915 1080 Data Structure Overview\001 -4 0 0 200 0 20 8 0.0000 4 90 615 7065 5085 ->connection\001 -4 0 0 200 0 20 8 0.0000 4 60 390 7065 4770 ->server\001 -4 0 0 200 0 20 8 0.0000 4 120 960 8010 5445 SSL_get_app_data()\001 -4 0 0 200 0 20 8 0.0000 4 120 510 10530 4050 ->pSSLCtx\001 -4 0 0 200 0 20 8 0.0000 4 120 1215 7875 4275 SSL_CTX_get_app_data()\001 -4 0 0 200 0 20 8 0.0000 4 120 1155 10305 5535 SSL_get_current_cipher()\001 -4 0 0 100 0 18 12 0.0000 4 180 1170 11025 5760 SSL_CIPHER\001 -4 0 0 100 0 18 12 0.0000 4 180 1350 10980 6165 SSL_SESSION\001 -4 0 0 200 0 20 8 0.0000 4 120 840 10440 5940 SSL_get_session()\001 -4 0 0 100 0 18 12 0.0000 4 180 1665 10575 7110 X509_STORE_CTX\001 -4 0 0 100 0 18 12 0.0000 4 135 345 9720 7110 BIO\001 -4 0 0 200 0 20 8 0.0000 4 120 840 9540 7335 SSL_get_{r,w}bio()\001 -4 0 0 100 0 18 20 0.0000 4 270 1170 8730 3465 mod_ssl\001 -4 0 0 100 0 18 20 0.0000 4 270 1050 8145 6750 Apache\001 -4 0 0 200 0 20 8 0.0000 4 120 945 10125 4680 SSL_get_SSL_CTX()\001 -4 0 0 200 0 20 8 0.0000 4 120 1170 10350 5175 SSL_get_SSL_METHOD()\001 -4 0 0 200 0 20 8 0.0000 4 90 465 11745 4770 ->method\001 -4 0 0 200 0 20 8 0.0000 4 120 1665 9945 6480 X509_STORE_CTX_get_app_data()\001 -4 0 0 200 0 20 8 0.0000 4 120 1215 10980 6705 SSL_CTX_get_cert_store()\001 -4 0 0 200 0 20 8 0.0000 4 120 1020 8280 5130 SSL_get_app_data2()\001 -4 0 0 100 0 18 20 0.0000 4 270 1290 10710 7605 OpenSSL\001 -4 0 0 100 0 18 12 0.0000 4 180 720 10710 7785 [Crypto]\001 -4 0 0 100 0 18 20 0.0000 4 270 1290 10935 3645 OpenSSL\001 -4 0 0 100 0 18 12 0.0000 4 180 495 10935 3825 [SSL]\001 diff --git a/trunk/modules/ssl/README.dsov.ps b/trunk/modules/ssl/README.dsov.ps deleted file mode 100644 index def19dbecfa746eed65efb7695e63753d4789a83..0000000000000000000000000000000000000000 --- a/trunk/modules/ssl/README.dsov.ps +++ /dev/null @@ -1,1138 +0,0 @@ -%!PS-Adobe-2.0 -%%Title: README.dsov.ps -%%Creator: fig2dev Version 3.2 Patchlevel 1 -%%CreationDate: Mon Apr 12 17:09:11 1999 -%%For: rse@en1.engelschall.com (Ralf S. Engelschall) -%%Orientation: Landscape -%%BoundingBox: 59 37 553 755 -%%Pages: 1 -%%BeginSetup -%%IncludeFeature: *PageSize Letter -%%EndSetup -%%Magnification: 0.9340 -%%EndComments -/$F2psDict 200 dict def -$F2psDict begin -$F2psDict /mtrx matrix put -/col-1 {0 setgray} bind def -/col0 {0.000 0.000 0.000 srgb} bind def -/col1 {0.000 0.000 1.000 srgb} bind def -/col2 {0.000 1.000 0.000 srgb} bind def -/col3 {0.000 1.000 1.000 srgb} bind def -/col4 {1.000 0.000 0.000 srgb} bind def -/col5 {1.000 0.000 1.000 srgb} bind def -/col6 {1.000 1.000 0.000 srgb} bind def -/col7 {1.000 1.000 1.000 srgb} bind def -/col8 {0.000 0.000 0.560 srgb} bind def -/col9 {0.000 0.000 0.690 srgb} bind def -/col10 {0.000 0.000 0.820 srgb} bind def -/col11 {0.530 0.810 1.000 srgb} bind def -/col12 {0.000 0.560 0.000 srgb} bind def -/col13 {0.000 0.690 0.000 srgb} bind def -/col14 {0.000 0.820 0.000 srgb} bind def -/col15 {0.000 0.560 0.560 srgb} bind def -/col16 {0.000 0.690 0.690 srgb} bind def -/col17 {0.000 0.820 0.820 srgb} bind def -/col18 {0.560 0.000 0.000 srgb} bind def -/col19 {0.690 0.000 0.000 srgb} bind def -/col20 {0.820 0.000 0.000 srgb} bind def -/col21 {0.560 0.000 0.560 srgb} bind def -/col22 {0.690 0.000 0.690 srgb} bind def -/col23 {0.820 0.000 0.820 srgb} bind def -/col24 {0.500 0.190 0.000 srgb} bind def -/col25 {0.630 0.250 0.000 srgb} bind def -/col26 {0.750 0.380 0.000 srgb} bind def -/col27 {1.000 0.500 0.500 srgb} bind def -/col28 {1.000 0.630 0.630 srgb} bind def -/col29 {1.000 0.750 0.750 srgb} bind def -/col30 {1.000 0.880 0.880 srgb} bind def -/col31 {1.000 0.840 0.000 srgb} bind def -/col32 {0.380 0.396 0.380 srgb} bind def -/col33 {0.714 0.698 0.714 srgb} bind def -/col34 {0.969 0.953 0.969 srgb} bind def -/col35 {0.812 0.812 0.812 srgb} bind def -/col36 {1.000 1.000 1.000 srgb} bind def - -end -save -48.0 12.0 translate - 90 rotate -1 -1 scale - -/cp {closepath} bind def -/ef {eofill} bind def -/gr {grestore} bind def -/gs {gsave} bind def -/sa {save} bind def -/rs {restore} bind def -/l {lineto} bind def -/m {moveto} bind def -/rm {rmoveto} bind def -/n {newpath} bind def -/s {stroke} bind def -/sh {show} bind def -/slc {setlinecap} bind def -/slj {setlinejoin} bind def -/slw {setlinewidth} bind def -/srgb {setrgbcolor} bind def -/rot {rotate} bind def -/sc {scale} bind def -/sd {setdash} bind def -/ff {findfont} bind def -/sf {setfont} bind def -/scf {scalefont} bind def -/sw {stringwidth} bind def -/tr {translate} bind def -/tnt {dup dup currentrgbcolor - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} - bind def -/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul - 4 -2 roll mul srgb} bind def -/reencdict 12 dict def /ReEncode { reencdict begin -/newcodesandnames exch def /newfontname exch def /basefontname exch def -/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def -basefontdict { exch dup /FID ne { dup /Encoding eq -{ exch dup length array copy newfont 3 1 roll put } -{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall -newfont /FontName newfontname put newcodesandnames aload pop -128 1 255 { newfont /Encoding get exch /.notdef put } for -newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat -newfontname newfont definefont pop end } def -/isovec [ -8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde -8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis -8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron -8#220 /dotlessi 8#230 /oe 8#231 /OE -8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling -8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis -8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot -8#255 /endash 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus -8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph -8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine -8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf -8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute -8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring -8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute -8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute -8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve -8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply -8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex -8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave -8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring -8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute -8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute -8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve -8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide -8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex -8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def -/Times-Roman /Times-Roman-iso isovec ReEncode -/Helvetica-Bold /Helvetica-Bold-iso isovec ReEncode -/Helvetica-Narrow /Helvetica-Narrow-iso isovec ReEncode -/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def -/$F2psEnd {$F2psEnteredState restore end} def -%%EndProlog - -$F2psBegin -10 setmiterlimit -n -1000 9572 m -1000 -1000 l 13622 -1000 l 13622 9572 l cp clip - 0.05883 0.05883 sc -%%Page: 1 1 -% Polyline -7.500 slw -n 6413 2048 m 6380 2054 l 6348 2061 l 6315 2067 l 6283 2073 l 6250 2079 l - 6217 2084 l 6185 2090 l 6152 2095 l 6120 2101 l 6088 2107 l - 6057 2113 l 6027 2120 l 5998 2126 l 5970 2134 l 5943 2141 l - 5918 2149 l 5894 2158 l 5873 2167 l 5853 2177 l 5835 2187 l - 5819 2198 l 5805 2210 l 5793 2222 l 5782 2235 l 5774 2250 l - 5768 2265 l 5763 2281 l 5760 2299 l 5759 2318 l 5759 2339 l - 5761 2360 l 5764 2383 l 5768 2408 l 5774 2433 l 5780 2460 l - 5788 2488 l 5797 2516 l 5806 2546 l 5815 2575 l 5825 2606 l - 5836 2636 l 5846 2666 l 5856 2696 l 5866 2726 l 5875 2755 l - 5884 2784 l 5892 2812 l 5899 2839 l 5905 2866 l 5910 2891 l - 5915 2916 l 5918 2940 l 5919 2968 l 5920 2995 l 5919 3022 l - 5916 3048 l 5912 3075 l 5908 3101 l 5902 3127 l 5895 3153 l - 5887 3179 l 5880 3205 l 5871 3230 l 5863 3254 l 5855 3278 l - 5848 3302 l 5841 3324 l 5834 3346 l 5829 3367 l 5824 3388 l - 5821 3408 l 5819 3427 l 5819 3446 l 5820 3465 l 5823 3484 l - 5827 3503 l 5833 3522 l 5840 3542 l 5848 3562 l 5858 3582 l - 5868 3603 l 5880 3625 l 5891 3647 l 5904 3669 l 5916 3691 l - 5929 3713 l 5941 3736 l 5953 3758 l 5964 3779 l 5974 3801 l - 5983 3822 l 5991 3843 l 5997 3863 l 6002 3883 l 6006 3903 l - 6008 3923 l 6008 3942 l 6006 3962 l 6003 3983 l 5998 4004 l - 5992 4025 l 5985 4048 l 5977 4070 l 5968 4094 l 5958 4118 l - 5947 4142 l 5936 4167 l 5925 4192 l 5913 4216 l 5902 4241 l - 5892 4266 l 5882 4291 l 5872 4315 l 5864 4339 l 5857 4362 l - 5851 4386 l 5846 4409 l 5843 4433 l 5840 4456 l 5840 4480 l - 5840 4505 l 5842 4530 l 5845 4556 l 5849 4582 l 5854 4609 l - 5860 4636 l 5867 4664 l 5875 4692 l 5883 4720 l 5892 4747 l - 5901 4774 l 5910 4801 l 5920 4827 l 5929 4852 l 5938 4875 l - 5947 4898 l 5955 4920 l 5963 4941 l 5971 4961 l 5978 4980 l - 5985 5002 l 5992 5024 l 5999 5046 l 6005 5067 l 6010 5088 l - 6016 5109 l 6022 5129 l 6027 5150 l 6033 5170 l 6039 5190 l - 6045 5209 l 6052 5228 l 6059 5246 l 6067 5264 l 6075 5281 l - 6084 5298 l 6094 5315 l 6105 5333 l 6115 5347 l 6125 5361 l - 6137 5376 l 6149 5392 l 6162 5408 l 6176 5425 l 6191 5443 l - 6206 5461 l 6221 5480 l 6237 5499 l 6253 5519 l 6269 5539 l - 6284 5559 l 6299 5579 l 6313 5599 l 6327 5619 l 6340 5639 l - 6352 5659 l 6363 5679 l 6373 5698 l 6382 5718 l 6390 5738 l - 6398 5759 l 6404 5782 l 6410 5805 l 6415 5828 l 6420 5852 l - 6424 5877 l 6428 5902 l 6431 5927 l 6435 5952 l 6438 5977 l - 6442 6001 l 6446 6025 l 6450 6048 l 6455 6069 l 6461 6090 l - 6467 6109 l 6474 6127 l 6483 6143 l 6492 6159 l 6503 6173 l - 6515 6185 l 6528 6197 l 6543 6209 l 6560 6220 l 6578 6230 l - 6598 6240 l 6619 6250 l 6641 6260 l 6663 6270 l 6687 6281 l - 6710 6291 l 6733 6302 l 6757 6312 l 6779 6324 l 6801 6335 l - 6821 6348 l 6841 6361 l 6859 6374 l 6876 6389 l 6893 6405 l - 6906 6421 l 6919 6437 l 6932 6455 l 6944 6475 l 6955 6495 l - 6967 6516 l 6979 6538 l 6991 6561 l 7003 6584 l 7015 6608 l - 7027 6631 l 7040 6654 l 7053 6677 l 7067 6699 l 7081 6720 l - 7096 6739 l 7111 6758 l 7127 6774 l 7144 6789 l 7161 6803 l - 7180 6815 l 7200 6825 l 7220 6833 l 7240 6840 l 7263 6845 l - 7286 6850 l 7311 6854 l 7338 6857 l 7365 6859 l 7394 6861 l - 7424 6862 l 7454 6864 l 7485 6865 l 7516 6866 l 7547 6867 l - 7578 6868 l 7609 6870 l 7639 6872 l 7668 6875 l 7696 6879 l - 7723 6883 l 7748 6889 l 7773 6895 l 7795 6903 l 7817 6912 l - 7838 6923 l 7857 6934 l 7875 6948 l 7892 6963 l 7909 6980 l - 7926 6998 l 7941 7017 l 7957 7038 l 7972 7060 l 7987 7083 l - 8002 7106 l 8017 7130 l 8031 7154 l 8046 7178 l 8061 7202 l - 8075 7225 l 8090 7247 l 8105 7269 l 8120 7289 l 8135 7308 l - 8151 7326 l 8167 7342 l 8184 7356 l 8202 7369 l 8220 7380 l - 8239 7390 l 8260 7397 l 8282 7404 l 8305 7409 l 8330 7413 l - 8356 7416 l 8383 7418 l 8412 7420 l 8441 7420 l 8471 7419 l - 8502 7418 l 8534 7417 l 8565 7415 l 8597 7413 l 8629 7411 l - 8660 7409 l 8690 7407 l 8720 7405 l 8749 7404 l 8777 7404 l - 8804 7404 l 8830 7405 l 8856 7407 l 8880 7410 l 8906 7414 l - 8931 7420 l 8956 7427 l 8981 7435 l 9005 7444 l 9029 7455 l - 9053 7466 l 9077 7478 l 9100 7491 l 9123 7504 l 9146 7517 l - 9168 7531 l 9190 7544 l 9210 7557 l 9230 7570 l 9250 7582 l - 9268 7593 l 9286 7604 l 9304 7613 l 9320 7621 l 9336 7629 l - 9353 7635 l 9370 7641 l 9388 7645 l 9406 7648 l 9425 7650 l - 9444 7652 l 9464 7653 l 9485 7653 l 9508 7653 l 9531 7653 l - 9555 7653 l 9579 7653 l 9605 7654 l 9631 7655 l 9658 7656 l - 9685 7659 l 9713 7662 l 9742 7666 l 9771 7672 l 9801 7679 l - 9833 7688 l 9853 7694 l 9874 7700 l 9895 7708 l 9918 7716 l - 9941 7725 l 9966 7734 l 9991 7745 l 10017 7755 l 10045 7767 l - 10073 7779 l 10102 7791 l 10132 7804 l 10163 7818 l 10194 7831 l - 10227 7845 l 10259 7860 l 10293 7874 l 10326 7889 l 10360 7903 l - 10394 7918 l 10429 7932 l 10463 7947 l 10497 7961 l 10531 7974 l - 10565 7988 l 10599 8001 l 10633 8013 l 10667 8025 l 10700 8037 l - 10733 8049 l 10767 8059 l 10800 8070 l 10834 8080 l 10868 8090 l - 10902 8099 l 10937 8108 l 10973 8117 l 11009 8125 l 11045 8133 l - 11083 8141 l 11120 8148 l 11158 8155 l 11197 8161 l 11236 8167 l - 11275 8172 l 11313 8177 l 11352 8181 l 11391 8184 l 11429 8187 l - 11467 8190 l 11504 8191 l 11540 8192 l 11576 8192 l 11610 8192 l - 11644 8191 l 11676 8189 l 11707 8187 l 11738 8184 l 11767 8180 l - 11794 8176 l 11821 8171 l 11847 8165 l 11871 8159 l 11895 8153 l - 11923 8143 l 11950 8133 l 11976 8122 l 12001 8109 l 12025 8096 l - 12048 8081 l 12071 8065 l 12092 8048 l 12113 8031 l 12133 8012 l - 12153 7992 l 12171 7972 l 12188 7951 l 12205 7930 l 12220 7909 l - 12235 7887 l 12248 7865 l 12260 7843 l 12272 7822 l 12282 7800 l - 12292 7779 l 12301 7759 l 12309 7739 l 12316 7719 l 12323 7699 l - 12330 7680 l 12338 7655 l 12345 7631 l 12352 7607 l 12359 7582 l - 12365 7558 l 12371 7533 l 12377 7508 l 12382 7484 l 12388 7460 l - 12392 7436 l 12397 7414 l 12401 7391 l 12405 7370 l 12409 7350 l - 12412 7331 l 12415 7313 l 12418 7297 l 12421 7281 l 12424 7266 l - 12428 7253 l 12432 7234 l 12437 7216 l 12442 7199 l 12446 7183 l - 12451 7166 l 12456 7150 l 12460 7134 l 12463 7117 l 12466 7101 l - 12468 7086 l 12469 7070 l 12469 7054 l 12467 7037 l 12465 7020 l - 12462 7006 l 12459 6991 l 12455 6975 l 12450 6958 l 12445 6940 l - 12440 6921 l 12434 6901 l 12428 6880 l 12422 6859 l 12416 6838 l - 12411 6817 l 12406 6796 l 12401 6776 l 12397 6756 l 12394 6736 l - 12392 6718 l 12390 6700 l 12390 6683 l 12390 6665 l 12392 6649 l - 12394 6631 l 12397 6614 l 12401 6597 l 12406 6579 l 12411 6561 l - 12416 6542 l 12422 6524 l 12428 6505 l 12434 6487 l 12440 6468 l - 12445 6450 l 12450 6432 l 12455 6414 l 12459 6396 l 12462 6378 l - 12465 6360 l 12467 6343 l 12468 6326 l 12469 6308 l 12469 6289 l - 12468 6269 l 12468 6249 l 12466 6227 l 12464 6205 l 12462 6182 l - 12460 6159 l 12457 6135 l 12454 6111 l 12451 6087 l 12447 6063 l - 12444 6040 l 12441 6016 l 12437 5993 l 12434 5970 l 12431 5948 l - 12428 5925 l 12424 5902 l 12421 5879 l 12419 5855 l 12416 5831 l - 12413 5806 l 12411 5781 l 12408 5755 l 12406 5729 l 12404 5702 l - 12403 5676 l 12401 5651 l 12400 5625 l 12400 5601 l 12399 5578 l - 12399 5555 l 12400 5534 l 12401 5514 l 12402 5495 l 12403 5477 l - 12405 5460 l 12408 5440 l 12411 5421 l 12416 5402 l 12420 5384 l - 12426 5365 l 12431 5347 l 12437 5329 l 12444 5311 l 12450 5293 l - 12456 5275 l 12462 5258 l 12468 5240 l 12474 5222 l 12479 5205 l - 12483 5186 l 12488 5168 l 12490 5152 l 12493 5135 l 12496 5117 l - 12498 5099 l 12500 5079 l 12502 5058 l 12504 5036 l 12506 5014 l - 12507 4990 l 12509 4966 l 12510 4942 l 12512 4918 l 12513 4893 l - 12515 4869 l 12516 4845 l 12518 4822 l 12520 4799 l 12521 4776 l - 12523 4754 l 12525 4733 l 12527 4713 l 12529 4693 l 12531 4673 l - 12534 4653 l 12536 4632 l 12539 4610 l 12541 4588 l 12543 4566 l - 12546 4543 l 12548 4520 l 12550 4497 l 12552 4473 l 12553 4450 l - 12554 4426 l 12555 4403 l 12555 4380 l 12555 4357 l 12555 4334 l - 12554 4312 l 12552 4290 l 12550 4267 l 12548 4245 l 12545 4224 l - 12541 4203 l 12537 4181 l 12533 4159 l 12528 4136 l 12523 4112 l - 12517 4088 l 12510 4064 l 12503 4038 l 12496 4013 l 12488 3987 l - 12479 3961 l 12471 3935 l 12462 3909 l 12452 3884 l 12443 3859 l - 12434 3835 l 12424 3811 l 12415 3788 l 12405 3766 l 12396 3744 l - 12386 3723 l 12377 3702 l 12368 3683 l 12357 3661 l 12347 3640 l - 12336 3619 l 12325 3598 l 12314 3576 l 12303 3555 l 12291 3533 l - 12280 3511 l 12269 3489 l 12257 3467 l 12246 3446 l 12235 3424 l - 12225 3402 l 12215 3381 l 12206 3360 l 12197 3340 l 12189 3320 l - 12181 3301 l 12174 3281 l 12168 3262 l 12162 3244 l 12158 3225 l - 12153 3204 l 12149 3183 l 12145 3162 l 12142 3139 l 12140 3117 l - 12138 3094 l 12137 3071 l 12137 3047 l 12138 3024 l 12139 3001 l - 12141 2978 l 12143 2956 l 12146 2935 l 12150 2915 l 12154 2896 l - 12158 2879 l 12163 2862 l 12168 2847 l 12174 2833 l 12180 2820 l - 12188 2805 l 12197 2792 l 12206 2779 l 12216 2766 l 12227 2754 l - 12238 2742 l 12249 2730 l 12260 2717 l 12272 2704 l 12282 2691 l - 12292 2676 l 12302 2661 l 12310 2645 l 12318 2627 l 12324 2608 l - 12330 2588 l 12334 2571 l 12336 2553 l 12339 2534 l 12341 2513 l - 12342 2491 l 12343 2467 l 12343 2442 l 12342 2416 l 12340 2389 l - 12338 2360 l 12335 2332 l 12331 2303 l 12326 2273 l 12320 2244 l - 12314 2215 l 12307 2187 l 12299 2159 l 12290 2132 l 12280 2106 l - 12270 2081 l 12259 2056 l 12248 2033 l 12236 2011 l 12224 1990 l - 12210 1970 l 12196 1949 l 12181 1929 l 12164 1910 l 12147 1890 l - 12129 1871 l 12110 1853 l 12090 1835 l 12070 1818 l 12049 1802 l - 12027 1787 l 12005 1773 l 11983 1761 l 11961 1749 l 11939 1739 l - 11917 1730 l 11895 1722 l 11874 1716 l 11852 1710 l 11831 1707 l - 11811 1704 l 11790 1703 l 11769 1702 l 11748 1703 l 11727 1705 l - 11706 1708 l 11683 1711 l 11660 1716 l 11636 1721 l 11612 1727 l - 11587 1733 l 11560 1740 l 11534 1747 l 11506 1754 l 11479 1761 l - 11450 1768 l 11422 1774 l 11393 1780 l 11364 1786 l 11334 1791 l - 11305 1795 l 11275 1798 l 11245 1800 l 11215 1801 l 11184 1801 l - 11153 1800 l 11128 1798 l 11104 1796 l 11078 1793 l 11052 1790 l - 11025 1785 l 10997 1781 l 10968 1776 l 10939 1770 l 10908 1764 l - 10877 1758 l 10844 1751 l 10811 1744 l 10778 1737 l 10743 1730 l - 10708 1722 l 10673 1715 l 10637 1708 l 10601 1701 l 10565 1695 l - 10530 1688 l 10494 1682 l 10458 1677 l 10422 1672 l 10387 1668 l - 10352 1664 l 10318 1661 l 10284 1658 l 10250 1657 l 10216 1656 l - 10183 1655 l 10150 1656 l 10118 1658 l 10087 1660 l 10055 1663 l - 10024 1666 l 9992 1671 l 9960 1676 l 9927 1682 l 9894 1688 l - 9861 1695 l 9827 1703 l 9792 1711 l 9757 1720 l 9721 1729 l - 9685 1738 l 9649 1748 l 9613 1757 l 9576 1767 l 9539 1778 l - 9502 1788 l 9465 1798 l 9429 1807 l 9392 1817 l 9356 1826 l - 9320 1835 l 9285 1844 l 9250 1852 l 9216 1860 l 9182 1867 l - 9148 1873 l 9115 1879 l 9082 1884 l 9050 1889 l 9018 1892 l - 8987 1895 l 8955 1898 l 8919 1899 l 8883 1900 l 8847 1899 l - 8811 1898 l 8774 1896 l 8737 1893 l 8699 1889 l 8661 1884 l - 8623 1878 l 8585 1872 l 8546 1865 l 8508 1857 l 8470 1849 l - 8432 1840 l 8395 1830 l 8358 1821 l 8322 1811 l 8287 1801 l - 8254 1790 l 8221 1780 l 8189 1770 l 8159 1760 l 8130 1750 l - 8102 1740 l 8076 1730 l 8051 1721 l 8028 1712 l 8006 1703 l - 7985 1695 l 7965 1688 l 7931 1674 l 7899 1662 l 7871 1650 l - 7844 1640 l 7820 1631 l 7798 1623 l 7778 1617 l 7760 1611 l - 7743 1607 l 7728 1603 l 7715 1601 l 7702 1600 l 7691 1600 l - 7680 1601 l 7669 1603 l 7658 1605 l 7648 1607 l 7638 1610 l - 7627 1613 l 7615 1617 l 7601 1621 l 7587 1626 l 7571 1632 l - 7554 1638 l 7536 1645 l 7517 1653 l 7496 1661 l 7474 1670 l - 7452 1679 l 7428 1689 l 7403 1699 l 7378 1709 l 7352 1720 l - 7325 1731 l 7297 1743 l 7268 1755 l 7247 1763 l 7226 1772 l - 7204 1781 l 7182 1790 l 7158 1800 l 7133 1810 l 7108 1820 l - 7081 1831 l 7053 1842 l 7025 1853 l 6996 1864 l 6966 1875 l - 6935 1886 l 6904 1898 l 6873 1909 l 6841 1921 l 6809 1932 l - 6776 1943 l 6744 1954 l 6712 1964 l 6680 1974 l 6649 1984 l - 6618 1994 l 6587 2003 l 6557 2011 l 6527 2019 l 6498 2027 l - 6469 2034 l 6441 2041 l cp gs col34 1.00 shd ef gr gs col34 s gr -% Polyline -n 675 6525 m 5850 6525 l 5850 6075 l 5625 6075 l 5625 5625 l 900 5625 l - 900 6075 l 675 6075 l cp gs col7 1.00 shd ef gr gs col7 s gr -% Polyline -n 1125 6525 m 5355 6525 l 5400 5175 l 5175 5175 l 5175 4725 l 4950 4725 l - 4950 4275 l 1575 4275 l 1575 4725 l 1350 4725 l 1350 5175 l - 1125 5175 l cp gs col34 1.00 shd ef gr gs col34 s gr -% Polyline -75.000 slw -n 9450 4500 m 12465 2205 l gs col7 s gr -% Polyline -n 9450 4500 m 9450 7785 l gs col7 s gr -% Polyline -n 9450 4500 m 6075 1935 l gs col7 s gr -% Polyline -n 12510 6435 m 9450 6435 l gs col7 s gr -% Polyline -7.500 slw -n 1800 6525 m 4725 6525 l 4725 3825 l 4500 3825 l 4500 3375 l 4275 3375 l - 4275 2925 l 4050 2925 l 4050 2475 l 2475 2475 l 2475 2925 l - 2250 2925 l 2250 3375 l 2025 3375 l 2025 3825 l 1800 3825 l - cp gs col35 1.00 shd ef gr gs col35 s gr -% Polyline -n 2700 6525 m 3825 6525 l 3825 2025 l 3600 2025 l 3600 1575 l 2925 1575 l - 2925 2025 l 2700 2025 l cp gs col33 1.00 shd ef gr gs col33 s gr -% Polyline -gs clippath -12068 6810 m 11970 6885 l 12022 6773 l 11937 6878 l 11984 6915 l cp -clip -n 12375 4455 m 12510 4635 l 12510 6210 l 11970 6885 l gs col34 1.00 shd ef gr gs col0 s gr gr - -% arrowhead -n 12068 6810 m 11970 6885 l 12022 6773 l 12045 6791 l 12068 6810 l cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath -7113 6004 m 7155 6120 l 7063 6037 l 7138 6149 l 7188 6116 l cp -clip -n 6705 5445 m 7155 6120 l gs col34 1.00 shd ef gr gs col0 s gr gr - -% arrowhead -n 7113 6004 m 7155 6120 l 7063 6037 l 7088 6020 l 7113 6004 l cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath -7304 4656 m 7200 4590 l 7323 4599 l 7195 4557 l 7176 4614 l cp -clip -n 7875 4815 m 7200 4590 l gs col34 1.00 shd ef gr gs col0 s gr gr - -% arrowhead -n 7304 4656 m 7200 4590 l 7323 4599 l 7314 4628 l 7304 4656 l cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath -11405 4128 m 11475 4230 l 11365 4173 l 11466 4262 l 11506 4217 l cp -clip -n 9585 2565 m 11475 4230 l gs col34 1.00 shd ef gr gs col0 s gr gr - -% arrowhead -n 11405 4128 m 11475 4230 l 11365 4173 l 11385 4151 l 11405 4128 l cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath -11712 4556 m 11835 4545 l 11732 4613 l 11859 4568 l 11839 4512 l cp -clip -n 10170 5130 m 11835 4545 l gs col34 1.00 shd ef gr gs col0 s gr gr - -% arrowhead -n 11712 4556 m 11835 4545 l 11732 4613 l 11722 4585 l 11712 4556 l cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath -9732 5411 m 9855 5400 l 9752 5468 l 9879 5423 l 9859 5367 l cp -clip -n 7920 6075 m 9855 5400 l gs col34 1.00 shd ef gr gs col0 s gr gr - -% arrowhead -n 9732 5411 m 9855 5400 l 9752 5468 l 9742 5440 l 9732 5411 l cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath -10823 5573 m 10935 5625 l 10812 5632 l 10944 5657 l 10955 5598 l cp -clip -n 9990 5445 m 10935 5625 l gs col34 1.00 shd ef gr gs col0 s gr gr - -% arrowhead -n 10823 5573 m 10935 5625 l 10812 5632 l 10817 5603 l 10823 5573 l cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath -10815 5280 m 10935 5310 l 10815 5340 l 10950 5340 l 10950 5280 l cp -clip -n 10215 5310 m 10935 5310 l gs col34 1.00 shd ef gr gs col0 s gr gr - -% arrowhead -n 10815 5280 m 10935 5310 l 10815 5340 l 10815 5310 l 10815 5280 l cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath -11955 4965 m 11925 5085 l 11895 4965 l 11895 5100 l 11955 5100 l cp -clip -n 11925 4590 m 11925 5085 l gs col34 1.00 shd ef gr gs col0 s gr gr - -% arrowhead -n 11955 4965 m 11925 5085 l 11895 4965 l 11925 4965 l 11955 4965 l cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath -9840 6720 m 9810 6840 l 9780 6720 l 9780 6855 l 9840 6855 l cp -clip -n 9810 5490 m 9810 6840 l gs col34 1.00 shd ef gr gs col0 s gr gr - -% arrowhead -n 9840 6720 m 9810 6840 l 9780 6720 l 9810 6720 l 9840 6720 l cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath -10847 5943 m 10935 6030 l 10816 5995 l 10933 6063 l 10963 6012 l cp -clip -n 9945 5445 m 10935 6030 l gs col34 1.00 shd ef gr gs col0 s gr gr - -% arrowhead -n 10847 5943 m 10935 6030 l 10816 5995 l 10832 5969 l 10847 5943 l cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath -10698 2634 m 10800 2565 l 10742 2674 l 10832 2574 l 10788 2534 l cp -clip -n 8865 4725 m 10800 2565 l gs col34 1.00 shd ef gr gs col0 s gr gr - -% arrowhead -n 10698 2634 m 10800 2565 l 10742 2674 l 10720 2654 l 10698 2634 l cp gs 0.00 setgray ef gr col0 s -% Polyline -30.000 slw -n 675 6075 m 5850 6075 l gs col34 1.00 shd ef gr gs col0 s gr -% Polyline -7.500 slw - [15 15] 15 sd -gs clippath -645 6195 m 675 6075 l 705 6195 l 705 6060 l 645 6060 l cp -clip -n 675 6525 m 675 6075 l gs col34 1.00 shd ef gr gs col0 s gr gr - [] 0 sd -% arrowhead -n 645 6195 m 675 6075 l 705 6195 l 675 6195 l 645 6195 l cp gs 0.00 setgray ef gr col0 s -% Polyline - [15 15] 15 sd -gs clippath -5880 6405 m 5850 6525 l 5820 6405 l 5820 6540 l 5880 6540 l cp -clip -n 5850 6075 m 5850 6525 l gs col34 1.00 shd ef gr gs col0 s gr gr - [] 0 sd -% arrowhead -n 5880 6405 m 5850 6525 l 5820 6405 l 5850 6405 l 5880 6405 l cp gs col7 1.00 shd ef gr col0 s -% Polyline -30.000 slw -n 900 5625 m 5625 5625 l gs col34 1.00 shd ef gr gs col0 s gr -% Polyline -n 1125 5175 m 5400 5175 l gs col34 1.00 shd ef gr gs col0 s gr -% Polyline -n 1350 4725 m 5175 4725 l gs col34 1.00 shd ef gr gs col0 s gr -% Polyline -n 1575 4275 m 4950 4275 l gs col34 1.00 shd ef gr gs col0 s gr -% Polyline -n 1800 3825 m 4725 3825 l gs col34 1.00 shd ef gr gs col0 s gr -% Polyline -n 2025 3375 m 4500 3375 l gs col34 1.00 shd ef gr gs col0 s gr -% Polyline -n 2250 2925 m 4275 2925 l gs col34 1.00 shd ef gr gs col0 s gr -% Polyline -n 2475 2475 m 4050 2475 l gs col34 1.00 shd ef gr gs col0 s gr -% Polyline -n 2700 2025 m 3825 2025 l gs col34 1.00 shd ef gr gs col0 s gr -% Polyline -n 2925 1575 m 3600 1575 l gs col34 1.00 shd ef gr gs col0 s gr -% Polyline -7.500 slw - [15 15] 15 sd -gs clippath -870 5745 m 900 5625 l 930 5745 l 930 5610 l 870 5610 l cp -clip -n 900 6075 m 900 5625 l gs col34 1.00 shd ef gr gs col0 s gr gr - [] 0 sd -% arrowhead -n 870 5745 m 900 5625 l 930 5745 l 900 5745 l 870 5745 l cp gs 0.00 setgray ef gr col0 s -% Polyline - [15 15] 15 sd -gs clippath -1095 5295 m 1125 5175 l 1155 5295 l 1155 5160 l 1095 5160 l cp -clip -n 1125 6525 m 1125 5175 l gs col34 1.00 shd ef gr gs col0 s gr gr - [] 0 sd -% arrowhead -n 1095 5295 m 1125 5175 l 1155 5295 l 1125 5295 l 1095 5295 l cp gs 0.00 setgray ef gr col0 s -% Polyline - [15 15] 15 sd -gs clippath -1320 4845 m 1350 4725 l 1380 4845 l 1380 4710 l 1320 4710 l cp -clip -n 1350 5175 m 1350 4725 l gs col34 1.00 shd ef gr gs col0 s gr gr - [] 0 sd -% arrowhead -n 1320 4845 m 1350 4725 l 1380 4845 l 1350 4845 l 1320 4845 l cp gs 0.00 setgray ef gr col0 s -% Polyline - [15 15] 15 sd -gs clippath -1545 4395 m 1575 4275 l 1605 4395 l 1605 4260 l 1545 4260 l cp -clip -n 1575 4725 m 1575 4275 l gs col34 1.00 shd ef gr gs col0 s gr gr - [] 0 sd -% arrowhead -n 1545 4395 m 1575 4275 l 1605 4395 l 1575 4395 l 1545 4395 l cp gs 0.00 setgray ef gr col0 s -% Polyline - [15 15] 15 sd -gs clippath -1770 3945 m 1800 3825 l 1830 3945 l 1830 3810 l 1770 3810 l cp -clip -n 1800 6525 m 1800 3825 l gs col34 1.00 shd ef gr gs col0 s gr gr - [] 0 sd -% arrowhead -n 1770 3945 m 1800 3825 l 1830 3945 l 1800 3945 l 1770 3945 l cp gs 0.00 setgray ef gr col0 s -% Polyline - [15 15] 15 sd -gs clippath -1995 3495 m 2025 3375 l 2055 3495 l 2055 3360 l 1995 3360 l cp -clip -n 2025 3825 m 2025 3375 l gs col34 1.00 shd ef gr gs col0 s gr gr - [] 0 sd -% arrowhead -n 1995 3495 m 2025 3375 l 2055 3495 l 2025 3495 l 1995 3495 l cp gs 0.00 setgray ef gr col0 s -% Polyline - [15 15] 15 sd -gs clippath -2220 3045 m 2250 2925 l 2280 3045 l 2280 2910 l 2220 2910 l cp -clip -n 2250 3375 m 2250 2925 l gs col34 1.00 shd ef gr gs col0 s gr gr - [] 0 sd -% arrowhead -n 2220 3045 m 2250 2925 l 2280 3045 l 2250 3045 l 2220 3045 l cp gs 0.00 setgray ef gr col0 s -% Polyline - [15 15] 15 sd -gs clippath -2445 2595 m 2475 2475 l 2505 2595 l 2505 2460 l 2445 2460 l cp -clip -n 2475 2925 m 2475 2475 l gs col34 1.00 shd ef gr gs col0 s gr gr - [] 0 sd -% arrowhead -n 2445 2595 m 2475 2475 l 2505 2595 l 2475 2595 l 2445 2595 l cp gs 0.00 setgray ef gr col0 s -% Polyline - [15 15] 15 sd -gs clippath -5655 5955 m 5625 6075 l 5595 5955 l 5595 6090 l 5655 6090 l cp -clip -n 5625 5625 m 5625 6075 l gs col34 1.00 shd ef gr gs col0 s gr gr - [] 0 sd -% arrowhead -n 5655 5955 m 5625 6075 l 5595 5955 l 5625 5955 l 5655 5955 l cp gs col7 1.00 shd ef gr col0 s -% Polyline - [15 15] 15 sd -gs clippath -5430 6405 m 5400 6525 l 5370 6405 l 5370 6540 l 5430 6540 l cp -clip -n 5400 5175 m 5400 6525 l gs col34 1.00 shd ef gr gs col0 s gr gr - [] 0 sd -% arrowhead -n 5430 6405 m 5400 6525 l 5370 6405 l 5400 6405 l 5430 6405 l cp gs col7 1.00 shd ef gr col0 s -% Polyline - [15 15] 15 sd -gs clippath -5205 5055 m 5175 5175 l 5145 5055 l 5145 5190 l 5205 5190 l cp -clip -n 5175 4725 m 5175 5175 l gs col34 1.00 shd ef gr gs col0 s gr gr - [] 0 sd -% arrowhead -n 5205 5055 m 5175 5175 l 5145 5055 l 5175 5055 l 5205 5055 l cp gs col7 1.00 shd ef gr col0 s -% Polyline - [15 15] 15 sd -gs clippath -4980 4605 m 4950 4725 l 4920 4605 l 4920 4740 l 4980 4740 l cp -clip -n 4950 4275 m 4950 4725 l gs col34 1.00 shd ef gr gs col0 s gr gr - [] 0 sd -% arrowhead -n 4980 4605 m 4950 4725 l 4920 4605 l 4950 4605 l 4980 4605 l cp gs col7 1.00 shd ef gr col0 s -% Polyline - [15 15] 15 sd -gs clippath -4755 6405 m 4725 6525 l 4695 6405 l 4695 6540 l 4755 6540 l cp -clip -n 4725 3825 m 4725 6525 l gs col34 1.00 shd ef gr gs col0 s gr gr - [] 0 sd -% arrowhead -n 4755 6405 m 4725 6525 l 4695 6405 l 4725 6405 l 4755 6405 l cp gs col7 1.00 shd ef gr col0 s -% Polyline - [15 15] 15 sd -gs clippath -4530 3705 m 4500 3825 l 4470 3705 l 4470 3840 l 4530 3840 l cp -clip -n 4500 3375 m 4500 3825 l gs col34 1.00 shd ef gr gs col0 s gr gr - [] 0 sd -% arrowhead -n 4530 3705 m 4500 3825 l 4470 3705 l 4500 3705 l 4530 3705 l cp gs col7 1.00 shd ef gr col0 s -% Polyline - [15 15] 15 sd -gs clippath -4305 3255 m 4275 3375 l 4245 3255 l 4245 3390 l 4305 3390 l cp -clip -n 4275 2925 m 4275 3375 l gs col34 1.00 shd ef gr gs col0 s gr gr - [] 0 sd -% arrowhead -n 4305 3255 m 4275 3375 l 4245 3255 l 4275 3255 l 4305 3255 l cp gs col7 1.00 shd ef gr col0 s -% Polyline - [15 15] 15 sd -gs clippath -4080 2805 m 4050 2925 l 4020 2805 l 4020 2940 l 4080 2940 l cp -clip -n 4050 2475 m 4050 2925 l gs col34 1.00 shd ef gr gs col0 s gr gr - [] 0 sd -% arrowhead -n 4080 2805 m 4050 2925 l 4020 2805 l 4050 2805 l 4080 2805 l cp gs col7 1.00 shd ef gr col0 s -% Polyline - [15 15] 15 sd -gs clippath -2670 2145 m 2700 2025 l 2730 2145 l 2730 2010 l 2670 2010 l cp -clip -n 2700 6525 m 2700 2025 l gs col34 1.00 shd ef gr gs col0 s gr gr - [] 0 sd -% arrowhead -n 2670 2145 m 2700 2025 l 2730 2145 l 2700 2145 l 2670 2145 l cp gs 0.00 setgray ef gr col0 s -% Polyline - [15 15] 15 sd -gs clippath -3855 6405 m 3825 6525 l 3795 6405 l 3795 6540 l 3855 6540 l cp -clip -n 3825 2025 m 3825 6525 l gs col34 1.00 shd ef gr gs col0 s gr gr - [] 0 sd -% arrowhead -n 3855 6405 m 3825 6525 l 3795 6405 l 3825 6405 l 3855 6405 l cp gs col7 1.00 shd ef gr col0 s -% Polyline - [15 15] 15 sd -gs clippath -3630 1905 m 3600 2025 l 3570 1905 l 3570 2040 l 3630 2040 l cp -clip -n 3600 1575 m 3600 2025 l gs col34 1.00 shd ef gr gs col0 s gr gr - [] 0 sd -% arrowhead -n 3630 1905 m 3600 2025 l 3570 1905 l 3600 1905 l 3630 1905 l cp gs col7 1.00 shd ef gr col0 s -% Polyline - [15 15] 15 sd -gs clippath -2895 1695 m 2925 1575 l 2955 1695 l 2955 1560 l 2895 1560 l cp -clip -n 2925 2025 m 2925 1575 l gs col34 1.00 shd ef gr gs col0 s gr gr - [] 0 sd -% arrowhead -n 2895 1695 m 2925 1575 l 2955 1695 l 2925 1695 l 2895 1695 l cp gs 0.00 setgray ef gr col0 s -% Polyline -45.000 slw -gs clippath -6087 6495 m 6207 6525 l 6087 6555 l 6360 6555 l 6360 6495 l cp -clip -n 540 6525 m 6300 6525 l gs 0.00 setgray ef gr gs col0 s gr gr - -% arrowhead -n 6087 6495 m 6207 6525 l 6087 6555 l 6087 6525 l 6087 6495 l cp gs 0.00 setgray ef gr col0 s -% Polyline -7.500 slw -gs clippath -3681 6720 m 3825 6750 l 3681 6780 l 3840 6780 l 3840 6720 l cp -2844 6780 m 2700 6750 l 2844 6720 l 2685 6720 l 2685 6780 l cp -clip -n 2700 6750 m 3825 6750 l gs col34 1.00 shd ef gr gs col0 s gr gr - -% arrowhead -n 2844 6780 m 2700 6750 l 2844 6720 l 2820 6750 l 2844 6780 l cp gs col7 1.00 shd ef gr col0 s -% arrowhead -n 3681 6720 m 3825 6750 l 3681 6780 l 3705 6750 l 3681 6720 l cp gs col7 1.00 shd ef gr col0 s -% Polyline -gs clippath -5256 7170 m 5400 7200 l 5256 7230 l 5415 7230 l 5415 7170 l cp -1269 7230 m 1125 7200 l 1269 7170 l 1110 7170 l 1110 7230 l cp -clip -n 1125 7200 m 5400 7200 l gs col34 1.00 shd ef gr gs col0 s gr gr - -% arrowhead -n 1269 7230 m 1125 7200 l 1269 7170 l 1245 7200 l 1269 7230 l cp gs col7 1.00 shd ef gr col0 s -% arrowhead -n 5256 7170 m 5400 7200 l 5256 7230 l 5280 7200 l 5256 7170 l cp gs col7 1.00 shd ef gr col0 s -% Polyline -gs clippath -4581 6945 m 4725 6975 l 4581 7005 l 4740 7005 l 4740 6945 l cp -1944 7005 m 1800 6975 l 1944 6945 l 1785 6945 l 1785 7005 l cp -clip -n 1800 6975 m 4725 6975 l gs col34 1.00 shd ef gr gs col0 s gr gr - -% arrowhead -n 1944 7005 m 1800 6975 l 1944 6945 l 1920 6975 l 1944 7005 l cp gs col7 1.00 shd ef gr col0 s -% arrowhead -n 4581 6945 m 4725 6975 l 4581 7005 l 4605 6975 l 4581 6945 l cp gs col7 1.00 shd ef gr col0 s -% Polyline -gs clippath -5706 7395 m 5850 7425 l 5706 7455 l 5865 7455 l 5865 7395 l cp -819 7455 m 675 7425 l 819 7395 l 660 7395 l 660 7455 l cp -clip -n 675 7425 m 5850 7425 l gs col34 1.00 shd ef gr gs col0 s gr gr - -% arrowhead -n 819 7455 m 675 7425 l 819 7395 l 795 7425 l 819 7455 l cp gs col7 1.00 shd ef gr col0 s -% arrowhead -n 5706 7395 m 5850 7425 l 5706 7455 l 5730 7425 l 5706 7395 l cp gs col7 1.00 shd ef gr col0 s -% Polyline -1 slc - [15 45] 45 sd -n 675 6570 m 675 7650 l gs col34 1.00 shd ef gr gs col0 s gr [] 0 sd -% Polyline - [15 45] 45 sd -n 1125 6570 m 1125 7650 l gs col34 1.00 shd ef gr gs col0 s gr [] 0 sd -% Polyline - [15 45] 45 sd -n 1800 6570 m 1800 7650 l gs col34 1.00 shd ef gr gs col0 s gr [] 0 sd -% Polyline - [15 45] 45 sd -n 2700 6570 m 2700 7650 l gs col34 1.00 shd ef gr gs col0 s gr [] 0 sd -% Polyline - [15 45] 45 sd -n 3825 6570 m 3825 7650 l gs col34 1.00 shd ef gr gs col0 s gr [] 0 sd -% Polyline - [15 45] 45 sd -n 4725 6570 m 4725 7650 l gs col34 1.00 shd ef gr gs col0 s gr [] 0 sd -% Polyline - [15 45] 45 sd -n 5400 6570 m 5400 7650 l gs col34 1.00 shd ef gr gs col0 s gr [] 0 sd -% Polyline - [15 45] 45 sd -n 5850 6570 m 5850 7650 l gs col34 1.00 shd ef gr gs col0 s gr [] 0 sd -% Polyline -0 slc -n 750 225 m 450 225 450 1050 300 arcto 4 {pop} repeat - 450 1350 12300 1350 300 arcto 4 {pop} repeat - 12600 1350 12600 525 300 arcto 4 {pop} repeat - 12600 225 750 225 300 arcto 4 {pop} repeat - cp gs col34 1.00 shd ef gr gs col0 s gr -% Polyline -n 8835 2250 m 8775 2250 8775 2415 60 arcto 4 {pop} repeat - 8775 2475 10110 2475 60 arcto 4 {pop} repeat - 10170 2475 10170 2310 60 arcto 4 {pop} repeat - 10170 2250 8835 2250 60 arcto 4 {pop} repeat - cp gs col35 1.00 shd ef gr gs col35 s gr -% Polyline -n 10635 2250 m 10575 2250 10575 2415 60 arcto 4 {pop} repeat - 10575 2475 11865 2475 60 arcto 4 {pop} repeat - 11925 2475 11925 2310 60 arcto 4 {pop} repeat - 11925 2250 10635 2250 60 arcto 4 {pop} repeat - cp gs col35 1.00 shd ef gr gs col35 s gr -% Polyline -n 11490 4275 m 11430 4275 11430 4440 60 arcto 4 {pop} repeat - 11430 4500 12315 4500 60 arcto 4 {pop} repeat - 12375 4500 12375 4335 60 arcto 4 {pop} repeat - 12375 4275 11490 4275 60 arcto 4 {pop} repeat - cp gs col35 1.00 shd ef gr gs col35 s gr -% Polyline -n 11040 5175 m 10980 5175 10980 5340 60 arcto 4 {pop} repeat - 10980 5400 12315 5400 60 arcto 4 {pop} repeat - 12375 5400 12375 5235 60 arcto 4 {pop} repeat - 12375 5175 11040 5175 60 arcto 4 {pop} repeat - cp gs col35 1.00 shd ef gr gs col35 s gr -% Polyline -n 9735 5175 m 9675 5175 9675 5340 60 arcto 4 {pop} repeat - 9675 5400 10110 5400 60 arcto 4 {pop} repeat - 10170 5400 10170 5235 60 arcto 4 {pop} repeat - 10170 5175 9735 5175 60 arcto 4 {pop} repeat - cp gs col35 1.00 shd ef gr gs col35 s gr -% Polyline -n 7260 6075 m 7200 6075 7200 6240 60 arcto 4 {pop} repeat - 7200 6300 7815 6300 60 arcto 4 {pop} repeat - 7875 6300 7875 6135 60 arcto 4 {pop} repeat - 7875 6075 7260 6075 60 arcto 4 {pop} repeat - cp gs col35 1.00 shd ef gr gs col35 s gr -% Polyline -n 6810 2250 m 6750 2250 6750 2415 60 arcto 4 {pop} repeat - 6750 2475 8130 2475 60 arcto 4 {pop} repeat - 8190 2475 8190 2310 60 arcto 4 {pop} repeat - 8190 2250 6810 2250 60 arcto 4 {pop} repeat - cp gs col35 1.00 shd ef gr gs col35 s gr -% Polyline -n 6360 3375 m 6300 3375 6300 3540 60 arcto 4 {pop} repeat - 6300 3600 7545 3600 60 arcto 4 {pop} repeat - 7605 3600 7605 3435 60 arcto 4 {pop} repeat - 7605 3375 6360 3375 60 arcto 4 {pop} repeat - cp gs col35 1.00 shd ef gr gs col35 s gr -% Polyline -n 6360 4275 m 6300 4275 6300 4440 60 arcto 4 {pop} repeat - 6300 4500 7275 4500 60 arcto 4 {pop} repeat - 7335 4500 7335 4335 60 arcto 4 {pop} repeat - 7335 4275 6360 4275 60 arcto 4 {pop} repeat - cp gs col35 1.00 shd ef gr gs col35 s gr -% Polyline -n 6360 5175 m 6300 5175 6300 5340 60 arcto 4 {pop} repeat - 6300 5400 7140 5400 60 arcto 4 {pop} repeat - 7200 5400 7200 5235 60 arcto 4 {pop} repeat - 7200 5175 6360 5175 60 arcto 4 {pop} repeat - cp gs col35 1.00 shd ef gr gs col35 s gr -% Polyline -gs clippath -7365 5340 m 7245 5310 l 7365 5280 l 7230 5280 l 7230 5340 l cp -clip -n 9630 5310 m 7245 5310 l gs col34 1.00 shd ef gr gs col0 s gr gr - -% arrowhead -n 7365 5340 m 7245 5310 l 7365 5280 l 7365 5310 l 7365 5340 l cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath -7500 4395 m 7380 4365 l 7500 4335 l 7365 4335 l 7365 4395 l cp -clip -n 11385 4365 m 7380 4365 l gs col34 1.00 shd ef gr gs col0 s gr gr - -% arrowhead -n 7500 4395 m 7380 4365 l 7500 4335 l 7500 4365 l 7500 4395 l cp gs 0.00 setgray ef gr col0 s -% Polyline -n 11040 5580 m 10980 5580 10980 5745 60 arcto 4 {pop} repeat - 10980 5805 12180 5805 60 arcto 4 {pop} repeat - 12240 5805 12240 5640 60 arcto 4 {pop} repeat - 12240 5580 11040 5580 60 arcto 4 {pop} repeat - cp gs col35 1.00 shd ef gr gs col35 s gr -% Polyline -n 11040 5985 m 10980 5985 10980 6150 60 arcto 4 {pop} repeat - 10980 6210 12315 6210 60 arcto 4 {pop} repeat - 12375 6210 12375 6045 60 arcto 4 {pop} repeat - 12375 5985 11040 5985 60 arcto 4 {pop} repeat - cp gs col35 1.00 shd ef gr gs col35 s gr -% Polyline -gs clippath -9958 5554 m 9900 5445 l 10003 5514 l 9912 5414 l 9868 5454 l cp -clip -n 11205 6885 m 9900 5445 l gs col34 1.00 shd ef gr gs col0 s gr gr - -% arrowhead -n 9958 5554 m 9900 5445 l 10003 5514 l 9981 5534 l 9958 5554 l cp gs 0.00 setgray ef gr col0 s -% Polyline -n 10590 6930 m 10530 6930 10530 7095 60 arcto 4 {pop} repeat - 10530 7155 12225 7155 60 arcto 4 {pop} repeat - 12285 7155 12285 6990 60 arcto 4 {pop} repeat - 12285 6930 10590 6930 60 arcto 4 {pop} repeat - cp gs col35 1.00 shd ef gr gs col35 s gr -% Polyline -n 9690 6930 m 9630 6930 9630 7095 60 arcto 4 {pop} repeat - 9630 7155 10110 7155 60 arcto 4 {pop} repeat - 10170 7155 10170 6990 60 arcto 4 {pop} repeat - 10170 6930 9690 6930 60 arcto 4 {pop} repeat - cp gs col35 1.00 shd ef gr gs col35 s gr -/Times-Roman-iso ff 120.00 scf sf -900 7560 m -gs 1 -1 sc (Startup, Runtime, Shutdown) col0 sh gr -/Helvetica-Narrow-iso ff 120.00 scf sf -6345 2970 m -gs 1 -1 sc (ap_ctx_get\(...,) col0 sh gr -/Helvetica-Narrow-iso ff 120.00 scf sf -10800 2745 m -gs 1 -1 sc (ap_get_module_config\(...) col0 sh gr -/Helvetica-Narrow-iso ff 120.00 scf sf -10800 2880 m -gs 1 -1 sc (->per_dir_config,) col0 sh gr -/Helvetica-Narrow-iso ff 120.00 scf sf -10800 3015 m -gs 1 -1 sc (&ssl_module\)) col0 sh gr -% Polyline -n 7980 4770 m 7920 4770 7920 4935 60 arcto 4 {pop} repeat - 7920 4995 9075 4995 60 arcto 4 {pop} repeat - 9135 4995 9135 4830 60 arcto 4 {pop} repeat - 9135 4770 7980 4770 60 arcto 4 {pop} repeat - cp gs col35 1.00 shd ef gr gs col35 s gr -% Polyline -gs clippath -7340 2610 m 7425 2520 l 7393 2639 l 7459 2521 l 7406 2492 l cp -clip -n 6975 3330 m 7425 2520 l gs col34 1.00 shd ef gr gs col0 s gr gr - -% arrowhead -n 7340 2610 m 7425 2520 l 7393 2639 l 7367 2625 l 7340 2610 l cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath -9336 2569 m 9450 2520 l 9373 2616 l 9480 2535 l 9444 2487 l cp -clip -n 7200 4230 m 9450 2520 l gs col34 1.00 shd ef gr gs col0 s gr gr - -% arrowhead -n 9336 2569 m 9450 2520 l 9373 2616 l 9354 2593 l 9336 2569 l cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath -7321 5196 m 7200 5220 l 7296 5142 l 7174 5199 l 7199 5254 l cp -clip -n 7875 4905 m 7200 5220 l gs col34 1.00 shd ef gr gs col0 s gr gr - -% arrowhead -n 7321 5196 m 7200 5220 l 7296 5142 l 7309 5169 l 7321 5196 l cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath -6720 4665 m 6750 4545 l 6780 4665 l 6780 4530 l 6720 4530 l cp -clip -n 6750 5130 m 6750 4545 l gs col34 1.00 shd ef gr gs col0 s gr gr - -% arrowhead -n 6720 4665 m 6750 4545 l 6780 4665 l 6750 4665 l 6720 4665 l cp gs 0.00 setgray ef gr col0 s -% Polyline - [15 15] 15 sd -gs clippath -9279 4984 m 9175 4918 l 9298 4927 l 9170 4885 l 9151 4942 l cp -clip -n 9850 5143 m 9175 4918 l gs col34 1.00 shd ef gr gs col0 s gr gr - [] 0 sd -% arrowhead -n 9279 4984 m 9175 4918 l 9298 4927 l 9289 4956 l 9279 4984 l cp gs 0.00 setgray ef gr col0 s -/Helvetica-Narrow-iso ff 120.00 scf sf -6210 4680 m -gs 1 -1 sc (->server) col0 sh gr -/Helvetica-Narrow-iso ff 120.00 scf sf -8280 6120 m -gs 1 -1 sc (ap_ctx_get\(...,"ssl"\)) col0 sh gr -/Helvetica-Narrow-iso ff 120.00 scf sf -7740 2700 m -gs 1 -1 sc (ap_get_module_config\(...) col0 sh gr -/Helvetica-Narrow-iso ff 120.00 scf sf -7740 2835 m -gs 1 -1 sc (->module_config,) col0 sh gr -/Helvetica-Narrow-iso ff 120.00 scf sf -7740 2970 m -gs 1 -1 sc (&ssl_module\)) col0 sh gr -/Helvetica-Narrow-iso ff 120.00 scf sf -6345 3105 m -gs 1 -1 sc ("ssl_module"\)) col0 sh gr -/Times-Roman-iso ff 120.00 scf sf -1350 7335 m -gs 1 -1 sc (Configuration Time) col0 sh gr -/Times-Roman-iso ff 120.00 scf sf -2025 7110 m -gs 1 -1 sc (Connection Duration) col0 sh gr -/Times-Roman-iso ff 120.00 scf sf -2835 6885 m -gs 1 -1 sc (Request Duration) col0 sh gr -/Helvetica-Bold-iso ff 300.00 scf sf -6345 6795 m -gs 1 -1 sc (t) col0 sh gr -/Helvetica-Narrow-iso ff 120.00 scf sf -7110 5985 m -gs 1 -1 sc (->client) col0 sh gr -/Helvetica-Narrow-iso ff 120.00 scf sf -7065 5085 m -gs 1 -1 sc (->connection) col0 sh gr -/Helvetica-Narrow-iso ff 120.00 scf sf -7065 4770 m -gs 1 -1 sc (->server) col0 sh gr -/Helvetica-Narrow-iso ff 120.00 scf sf -8010 5445 m -gs 1 -1 sc (SSL_get_app_data\(\)) col0 sh gr -/Helvetica-Narrow-iso ff 120.00 scf sf -10530 4050 m -gs 1 -1 sc (->pSSLCtx) col0 sh gr -/Helvetica-Narrow-iso ff 120.00 scf sf -7875 4275 m -gs 1 -1 sc (SSL_CTX_get_app_data\(\)) col0 sh gr -/Helvetica-Narrow-iso ff 120.00 scf sf -10305 5535 m -gs 1 -1 sc (SSL_get_current_cipher\(\)) col0 sh gr -/Helvetica-Narrow-iso ff 120.00 scf sf -10440 5940 m -gs 1 -1 sc (SSL_get_session\(\)) col0 sh gr -/Helvetica-Narrow-iso ff 120.00 scf sf -9540 7335 m -gs 1 -1 sc (SSL_get_{r,w}bio\(\)) col0 sh gr -/Helvetica-Narrow-iso ff 120.00 scf sf -10125 4680 m -gs 1 -1 sc (SSL_get_SSL_CTX\(\)) col0 sh gr -/Helvetica-Narrow-iso ff 120.00 scf sf -10350 5175 m -gs 1 -1 sc (SSL_get_SSL_METHOD\(\)) col0 sh gr -/Helvetica-Narrow-iso ff 120.00 scf sf -11745 4770 m -gs 1 -1 sc (->method) col0 sh gr -/Helvetica-Narrow-iso ff 120.00 scf sf -9945 6480 m -gs 1 -1 sc (X509_STORE_CTX_get_app_data\(\)) col0 sh gr -/Helvetica-Narrow-iso ff 120.00 scf sf -10980 6705 m -gs 1 -1 sc (SSL_CTX_get_cert_store\(\)) col0 sh gr -/Helvetica-Narrow-iso ff 120.00 scf sf -8280 5130 m -gs 1 -1 sc (SSL_get_app_data2\(\)) col0 sh gr -/Helvetica-Bold-iso ff 180.00 scf sf -3645 1620 m -gs 1 -1 sc (SSLDirConfig) col0 sh gr -/Helvetica-Bold-iso ff 300.00 scf sf -10935 3645 m -gs 1 -1 sc (OpenSSL) col0 sh gr -/Helvetica-Bold-iso ff 180.00 scf sf -10935 3825 m -gs 1 -1 sc ([SSL]) col0 sh gr -/Helvetica-Bold-iso ff 180.00 scf sf -11025 5760 m -gs 1 -1 sc (SSL_CIPHER) col0 sh gr -/Helvetica-Bold-iso ff 180.00 scf sf -10980 6165 m -gs 1 -1 sc (SSL_SESSION) col0 sh gr -/Helvetica-Bold-iso ff 300.00 scf sf -10710 7605 m -gs 1 -1 sc (OpenSSL) col0 sh gr -/Helvetica-Bold-iso ff 180.00 scf sf -10575 7110 m -gs 1 -1 sc (X509_STORE_CTX) col0 sh gr -/Helvetica-Bold-iso ff 180.00 scf sf -6795 2430 m -gs 1 -1 sc (SSLModConfig) col0 sh gr -/Helvetica-Bold-iso ff 180.00 scf sf -8865 2430 m -gs 1 -1 sc (SSLSrvConfig) col0 sh gr -/Helvetica-Bold-iso ff 180.00 scf sf -6345 3555 m -gs 1 -1 sc (ap_global_ctx) col0 sh gr -/Helvetica-Bold-iso ff 180.00 scf sf -6345 4455 m -gs 1 -1 sc (server_rec) col0 sh gr -/Helvetica-Bold-iso ff 180.00 scf sf -6345 5355 m -gs 1 -1 sc (conn_rec) col0 sh gr -/Helvetica-Bold-iso ff 180.00 scf sf -9720 5355 m -gs 1 -1 sc (SSL) col0 sh gr -/Helvetica-Bold-iso ff 180.00 scf sf -10665 2430 m -gs 1 -1 sc (SSLDirConfig) col0 sh gr -/Helvetica-Bold-iso ff 180.00 scf sf -7290 6255 m -gs 1 -1 sc (BUFF) col0 sh gr -/Helvetica-Bold-iso ff 180.00 scf sf -11025 5355 m -gs 1 -1 sc (SSL_METHOD) col0 sh gr -% Polyline -15.000 slw -n 750 225 m 450 225 450 8250 300 arcto 4 {pop} repeat - 450 8550 12300 8550 300 arcto 4 {pop} repeat - 12600 8550 12600 525 300 arcto 4 {pop} repeat - 12600 225 750 225 300 arcto 4 {pop} repeat - cp gs col0 s gr -/Helvetica-Bold-iso ff 180.00 scf sf -11475 4455 m -gs 1 -1 sc (SSL_CTX) col0 sh gr -/Helvetica-Bold-iso ff 180.00 scf sf -8010 4950 m -gs 1 -1 sc (request_rec) col0 sh gr -/Times-Roman-iso ff 180.00 scf sf -10575 675 m -gs 1 -1 sc (Ralf S. Engelschall) col0 sh gr -/Helvetica-Bold-iso ff 300.00 scf sf -4275 675 m -gs 1 -1 sc (Apache+mod_ssl+OpenSSL) col0 sh gr -/Times-Roman-iso ff 150.00 scf sf -10575 855 m -gs 1 -1 sc (rse@engelschall.com) col0 sh gr -/Times-Roman-iso ff 150.00 scf sf -10575 1035 m -gs 1 -1 sc (www.engelschall.com) col0 sh gr -/Times-Roman-iso ff 180.00 scf sf -900 675 m -gs 1 -1 sc (Version 1.3) col0 sh gr -/Times-Roman-iso ff 180.00 scf sf -900 855 m -gs 1 -1 sc (12-Apr-1999) col0 sh gr -/Helvetica-Bold-iso ff 360.00 scf sf -3915 1080 m -gs 1 -1 sc (Data Structure Overview) col0 sh gr -/Helvetica-Bold-iso ff 180.00 scf sf -9720 7110 m -gs 1 -1 sc (BIO) col0 sh gr -/Helvetica-Bold-iso ff 180.00 scf sf -10710 7785 m -gs 1 -1 sc ([Crypto]) col0 sh gr -/Helvetica-Bold-iso ff 300.00 scf sf -8730 3465 m -gs 1 -1 sc (mod_ssl) col0 sh gr -/Helvetica-Bold-iso ff 300.00 scf sf -8145 6750 m -gs 1 -1 sc (Apache) col0 sh gr -/Helvetica-Bold-iso ff 300.00 scf sf -9000 8100 m -gs 1 -1 sc (Chaining) col0 sh gr -/Helvetica-Bold-iso ff 300.00 scf sf -2745 8100 m -gs 1 -1 sc (Lifetime) col0 sh gr -/Helvetica-Bold-iso ff 180.00 scf sf -810 6255 m -gs 1 -1 sc (ap_global_ctx) col0 sh gr -/Helvetica-Bold-iso ff 180.00 scf sf -990 5805 m -gs 1 -1 sc (SSLModConfig) col0 sh gr -/Helvetica-Bold-iso ff 180.00 scf sf -4050 4455 m -gs 1 -1 sc (SSL_CTX) col0 sh gr -/Helvetica-Bold-iso ff 180.00 scf sf -4455 5355 m -gs 1 -1 sc (server_rec) col0 sh gr -/Helvetica-Bold-iso ff 180.00 scf sf -3870 4905 m -gs 1 -1 sc (SSLSrvConfig) col0 sh gr -/Helvetica-Bold-iso ff 180.00 scf sf -1845 4005 m -gs 1 -1 sc (BUFF) col0 sh gr -/Helvetica-Bold-iso ff 180.00 scf sf -2070 3555 m -gs 1 -1 sc (conn_rec) col0 sh gr -/Helvetica-Bold-iso ff 180.00 scf sf -2295 3105 m -gs 1 -1 sc (BIO) col0 sh gr -/Helvetica-Bold-iso ff 180.00 scf sf -2565 2655 m -gs 1 -1 sc (SSL) col0 sh gr -/Helvetica-Bold-iso ff 180.00 scf sf -3915 2070 m -gs 1 -1 sc (request_rec) col0 sh gr -$F2psEnd -rs -showpage diff --git a/trunk/modules/ssl/config.m4 b/trunk/modules/ssl/config.m4 deleted file mode 100644 index 7242f76ed95e911d684a4f0eba99cbbc0dbc81e7..0000000000000000000000000000000000000000 --- a/trunk/modules/ssl/config.m4 +++ /dev/null @@ -1,131 +0,0 @@ -dnl Copyright 2001-2004 The Apache Software Foundation -dnl Licensed under the Apache License, Version 2.0 (the "License"); -dnl you may not use this file except in compliance with the License. -dnl You may obtain a copy of the License at -dnl -dnl http://www.apache.org/licenses/LICENSE-2.0 -dnl -dnl Unless required by applicable law or agreed to in writing, software -dnl distributed under the License is distributed on an "AS IS" BASIS, -dnl WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -dnl See the License for the specific language governing permissions and -dnl limitations under the License. - -AC_DEFUN([CHECK_DISTCACHE], [ - AC_MSG_CHECKING(whether Distcache is required) - ap_ssltk_dc="no" - tmp_nomessage="" - tmp_forced="no" - AC_ARG_ENABLE(distcache, - APACHE_HELP_STRING(--enable-distcache,Select distcache support in mod_ssl), - ap_ssltk_dc="$enableval" - tmp_nomessage="" - tmp_forced="yes" - if test "x$ap_ssltk_dc" = "x"; then - ap_ssltk_dc="yes" - dnl our "error"s become "tests revealed that..." - tmp_forced="no" - fi - if test "$ap_ssltk_dc" != "yes" -a "$ap_ssltk_dc" != "no"; then - tmp_nomessage="--enable-distcache had illegal syntax - disabling" - ap_ssltk_dc="no" - fi) - if test "$tmp_forced" = "no"; then - AC_MSG_RESULT($ap_ssltk_dc (default)) - else - AC_MSG_RESULT($ap_ssltk_dc (specified)) - fi - if test "$tmp_forced" = "yes" -a "x$ap_ssltk_dc" = "xno" -a "x$tmp_nomessage" != "x"; then - AC_MSG_ERROR(distcache support failed: $tmp_nomessage) - fi - if test "$ap_ssltk_dc" = "yes"; then - AC_CHECK_HEADER( - [distcache/dc_client.h], - [], - [tmp_nomessage="can't include distcache headers" - ap_ssltk_dc="no"]) - if test "$tmp_forced" = "yes" -a "x$ap_ssltk_dc" = "xno"; then - AC_MSG_ERROR(distcache support failed: $tmp_nomessage) - fi - fi - if test "$ap_ssltk_dc" = "yes"; then - AC_MSG_CHECKING(for Distcache version) - AC_TRY_COMPILE( -[#include ], -[#if DISTCACHE_CLIENT_API != 0x0001 -#error "distcache API version is unrecognised" -#endif], -[], -[tmp_nomessage="distcache has an unsupported API version" -ap_ssltk_dc="no"]) - AC_MSG_RESULT($ap_ssltk_dc) - if test "$tmp_forced" = "yes" -a "x$ap_ssltk_dc" = "xno"; then - AC_MSG_ERROR(distcache support failed: $tmp_nomessage) - fi - fi - if test "$ap_ssltk_dc" = "yes"; then - AC_MSG_CHECKING(for Distcache libraries) - save_libs=$LIBS - LIBS="$LIBS -ldistcache -lnal" - AC_TRY_LINK( - [#include ], - [DC_CTX *foo = DC_CTX_new((const char *)0,0);], - [], - [tmp_no_message="failed to link with distcache libraries" - ap_ssltk_dc="no"]) - LIBS=$save_libs - AC_MSG_RESULT($ap_ssltk_dc) - if test "$tmp_forced" = "yes" -a "x$ap_ssltk_dc" = "xno"; then - AC_MSG_ERROR(distcache support failed: $tmp_nomessage) - else - APR_ADDTO(MOD_SSL_LDADD, [-ldistcache -lnal]) - AC_DEFINE(HAVE_DISTCACHE, 1, [Define if distcache support is enabled]) - fi - fi -]) - -dnl # start of module specific part -APACHE_MODPATH_INIT(ssl) - -dnl # list of module object files -ssl_objs="dnl -mod_ssl.lo dnl -ssl_engine_config.lo dnl -ssl_engine_dh.lo dnl -ssl_engine_init.lo dnl -ssl_engine_io.lo dnl -ssl_engine_kernel.lo dnl -ssl_engine_log.lo dnl -ssl_engine_mutex.lo dnl -ssl_engine_pphrase.lo dnl -ssl_engine_rand.lo dnl -ssl_engine_vars.lo dnl -ssl_expr.lo dnl -ssl_expr_eval.lo dnl -ssl_expr_parse.lo dnl -ssl_expr_scan.lo dnl -ssl_scache.lo dnl -ssl_scache_dbm.lo dnl -ssl_scache_shmcb.lo dnl -ssl_scache_dc.lo dnl -ssl_util.lo dnl -ssl_util_ssl.lo dnl -" -dnl # hook module into the Autoconf mechanism (--enable-ssl option) -APACHE_MODULE(ssl, [SSL/TLS support (mod_ssl)], $ssl_objs, , no, [ - APACHE_CHECK_SSL_TOOLKIT - APR_SETVAR(MOD_SSL_LDADD, [\$(SSL_LIBS)]) - CHECK_DISTCACHE - if test "x$enable_ssl" = "xshared"; then - # The only symbol which needs to be exported is the module - # structure, so ask libtool to hide everything else: - APR_ADDTO(MOD_SSL_LDADD, [-export-symbols-regex ssl_module]) - fi -]) - -# Ensure that other modules can pick up mod_ssl.h -APR_ADDTO(INCLUDES, [-I\$(top_srcdir)/$modpath_current]) - -dnl # end of module specific part -APACHE_MODPATH_FINISH - diff --git a/trunk/modules/ssl/mod_ssl.c b/trunk/modules/ssl/mod_ssl.c deleted file mode 100644 index 146f7e7a66a544da6774f37c8317a690e093d7db..0000000000000000000000000000000000000000 --- a/trunk/modules/ssl/mod_ssl.c +++ /dev/null @@ -1,516 +0,0 @@ -/* Copyright 2001-2005 The Apache Software Foundation or its licensors, as - * applicable. - * - * 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_ssl - * | '_ ` _ \ / _ \ / _` | / __/ __| | Apache Interface to OpenSSL - * | | | | | | (_) | (_| | \__ \__ \ | - * |_| |_| |_|\___/ \__,_|___|___/___/_| - * |_____| - * mod_ssl.c - * Apache API interface structures - */ - -#include "ssl_private.h" -#include "mod_ssl.h" -#include "util_md5.h" -#include - -/* - * the table of configuration directives we provide - */ - -#define SSL_CMD_ALL(name, args, desc) \ - AP_INIT_##args("SSL"#name, ssl_cmd_SSL##name, \ - NULL, RSRC_CONF|OR_AUTHCFG, desc), - -#define SSL_CMD_SRV(name, args, desc) \ - AP_INIT_##args("SSL"#name, ssl_cmd_SSL##name, \ - NULL, RSRC_CONF, desc), - -#define SSL_CMD_DIR(name, type, args, desc) \ - AP_INIT_##args("SSL"#name, ssl_cmd_SSL##name, \ - NULL, OR_##type, desc), - -#define AP_END_CMD { NULL } - -const char ssl_valid_ssl_mutex_string[] = - "Valid SSLMutex mechanisms are: `none', `default'" -#if APR_HAS_FLOCK_SERIALIZE - ", `flock:/path/to/file'" -#endif -#if APR_HAS_FCNTL_SERIALIZE - ", `fcntl:/path/to/file'" -#endif -#if APR_HAS_SYSVSEM_SERIALIZE && !defined(PERCHILD_MPM) - ", `sysvsem'" -#endif -#if APR_HAS_POSIXSEM_SERIALIZE - ", `posixsem'" -#endif -#if APR_HAS_PROC_PTHREAD_SERIALIZE - ", `pthread'" -#endif -#if APR_HAS_FLOCK_SERIALIZE || APR_HAS_FCNTL_SERIALIZE - ", `file:/path/to/file'" -#endif -#if (APR_HAS_SYSVSEM_SERIALIZE && !defined(PERCHILD_MPM)) || APR_HAS_POSIXSEM_SERIALIZE - ", `sem'" -#endif - " "; - -static const command_rec ssl_config_cmds[] = { - /* - * Global (main-server) context configuration directives - */ - SSL_CMD_SRV(Mutex, TAKE1, ssl_valid_ssl_mutex_string) - SSL_CMD_SRV(PassPhraseDialog, TAKE1, - "SSL dialog mechanism for the pass phrase query " - "(`builtin', `|/path/to/pipe_program`, " - "or `exec:/path/to/cgi_program')") - SSL_CMD_SRV(SessionCache, TAKE1, - "SSL Session Cache storage " - "(`none', `dbm:/path/to/file')") -#if defined(HAVE_OPENSSL_ENGINE_H) && defined(HAVE_ENGINE_INIT) - SSL_CMD_SRV(CryptoDevice, TAKE1, - "SSL external Crypto Device usage " - "(`builtin', `...')") -#endif - SSL_CMD_SRV(RandomSeed, TAKE23, - "SSL Pseudo Random Number Generator (PRNG) seeding source " - "(`startup|connect builtin|file:/path|exec:/path [bytes]')") - - /* - * Per-server context configuration directives - */ - SSL_CMD_SRV(Engine, TAKE1, - "SSL switch for the protocol engine " - "(`on', `off')") - SSL_CMD_ALL(CipherSuite, TAKE1, - "Colon-delimited list of permitted SSL Ciphers " - "(`XXX:...:XXX' - see manual)") - SSL_CMD_SRV(CertificateFile, TAKE1, - "SSL Server Certificate file " - "(`/path/to/file' - PEM or DER encoded)") - SSL_CMD_SRV(CertificateKeyFile, TAKE1, - "SSL Server Private Key file " - "(`/path/to/file' - PEM or DER encoded)") - SSL_CMD_SRV(CertificateChainFile, TAKE1, - "SSL Server CA Certificate Chain file " - "(`/path/to/file' - PEM encoded)") - SSL_CMD_ALL(CACertificatePath, TAKE1, - "SSL CA Certificate path " - "(`/path/to/dir' - contains PEM encoded files)") - SSL_CMD_ALL(CACertificateFile, TAKE1, - "SSL CA Certificate file " - "(`/path/to/file' - PEM encoded)") - SSL_CMD_SRV(CADNRequestPath, TAKE1, - "SSL CA Distinguished Name path " - "(`/path/to/dir' - symlink hashes to PEM of acceptable CA names to request)") - SSL_CMD_SRV(CADNRequestFile, TAKE1, - "SSL CA Distinguished Name file " - "(`/path/to/file' - PEM encoded to derive acceptable CA names to request)") - SSL_CMD_SRV(CARevocationPath, TAKE1, - "SSL CA Certificate Revocation List (CRL) path " - "(`/path/to/dir' - contains PEM encoded files)") - SSL_CMD_SRV(CARevocationFile, TAKE1, - "SSL CA Certificate Revocation List (CRL) file " - "(`/path/to/file' - PEM encoded)") - SSL_CMD_ALL(VerifyClient, TAKE1, - "SSL Client verify type " - "(`none', `optional', `require', `optional_no_ca')") - SSL_CMD_ALL(VerifyDepth, TAKE1, - "SSL Client verify depth " - "(`N' - number of intermediate certificates)") - SSL_CMD_SRV(SessionCacheTimeout, TAKE1, - "SSL Session Cache object lifetime " - "(`N' - number of seconds)") - SSL_CMD_SRV(Protocol, RAW_ARGS, - "Enable or disable various SSL protocols" - "(`[+-][SSLv2|SSLv3|TLSv1] ...' - see manual)") - SSL_CMD_SRV(HonorCipherOrder, FLAG, - "Use the server's cipher ordering preference") - SSL_CMD_ALL(UserName, TAKE1, - "Set user name to SSL variable value") - - /* - * Proxy configuration for remote SSL connections - */ - SSL_CMD_SRV(ProxyEngine, FLAG, - "SSL switch for the proxy protocol engine " - "(`on', `off')") - SSL_CMD_SRV(ProxyProtocol, RAW_ARGS, - "SSL Proxy: enable or disable SSL protocol flavors " - "(`[+-][SSLv2|SSLv3|TLSv1] ...' - see manual)") - SSL_CMD_SRV(ProxyCipherSuite, TAKE1, - "SSL Proxy: colon-delimited list of permitted SSL ciphers " - "(`XXX:...:XXX' - see manual)") - SSL_CMD_SRV(ProxyVerify, TAKE1, - "SSL Proxy: whether to verify the remote certificate " - "(`on' or `off')") - SSL_CMD_SRV(ProxyVerifyDepth, TAKE1, - "SSL Proxy: maximum certificate verification depth " - "(`N' - number of intermediate certificates)") - SSL_CMD_SRV(ProxyCACertificateFile, TAKE1, - "SSL Proxy: file containing server certificates " - "(`/path/to/file' - PEM encoded certificates)") - SSL_CMD_SRV(ProxyCACertificatePath, TAKE1, - "SSL Proxy: directory containing server certificates " - "(`/path/to/dir' - contains PEM encoded certificates)") - SSL_CMD_SRV(ProxyCARevocationPath, TAKE1, - "SSL Proxy: CA Certificate Revocation List (CRL) path " - "(`/path/to/dir' - contains PEM encoded files)") - SSL_CMD_SRV(ProxyCARevocationFile, TAKE1, - "SSL Proxy: CA Certificate Revocation List (CRL) file " - "(`/path/to/file' - PEM encoded)") - SSL_CMD_SRV(ProxyMachineCertificateFile, TAKE1, - "SSL Proxy: file containing client certificates " - "(`/path/to/file' - PEM encoded certificates)") - SSL_CMD_SRV(ProxyMachineCertificatePath, TAKE1, - "SSL Proxy: directory containing client certificates " - "(`/path/to/dir' - contains PEM encoded certificates)") - - /* - * Per-directory context configuration directives - */ - SSL_CMD_DIR(Options, OPTIONS, RAW_ARGS, - "Set one or more options to configure the SSL engine" - "(`[+-]option[=value] ...' - see manual)") - SSL_CMD_DIR(RequireSSL, AUTHCFG, NO_ARGS, - "Require the SSL protocol for the per-directory context " - "(no arguments)") - SSL_CMD_DIR(Require, AUTHCFG, RAW_ARGS, - "Require a boolean expression to evaluate to true for granting access" - "(arbitrary complex boolean expression - see manual)") - - /* Deprecated directives. */ - AP_INIT_RAW_ARGS("SSLLog", ap_set_deprecated, NULL, OR_ALL, - "SSLLog directive is no longer supported - use ErrorLog."), - AP_INIT_RAW_ARGS("SSLLogLevel", ap_set_deprecated, NULL, OR_ALL, - "SSLLogLevel directive is no longer supported - use LogLevel."), - - AP_END_CMD -}; - -/* - * the various processing hooks - */ -static apr_status_t ssl_cleanup_pre_config(void *data) -{ - /* - * Try to kill the internals of the SSL library. - */ -#ifdef HAVE_OPENSSL -#if OPENSSL_VERSION_NUMBER >= 0x00907001 - /* Corresponds to OPENSSL_load_builtin_modules(): - * XXX: borrowed from apps.h, but why not CONF_modules_free() - * which also invokes CONF_modules_finish()? - */ - CONF_modules_unload(1); -#endif -#endif - /* Corresponds to SSL_library_init: */ - EVP_cleanup(); -#if HAVE_ENGINE_LOAD_BUILTIN_ENGINES - ENGINE_cleanup(); -#endif -#ifdef HAVE_OPENSSL -#if OPENSSL_VERSION_NUMBER >= 0x00907001 - CRYPTO_cleanup_all_ex_data(); -#endif -#endif - ERR_remove_state(0); - - /* Don't call ERR_free_strings here; ERR_load_*_strings only - * actually load the error strings once per process due to static - * variable abuse in OpenSSL. */ - - /* - * TODO: determine somewhere we can safely shove out diagnostics - * (when enabled) at this late stage in the game: - * CRYPTO_mem_leaks_fp(stderr); - */ - return APR_SUCCESS; -} - -static int ssl_hook_pre_config(apr_pool_t *pconf, - apr_pool_t *plog, - apr_pool_t *ptemp) -{ - /* We must register the library in full, to ensure our configuration - * code can successfully test the SSL environment. - */ - CRYPTO_malloc_init(); -#ifdef HAVE_OPENSSL - ERR_load_crypto_strings(); -#endif - SSL_load_error_strings(); - SSL_library_init(); -#if HAVE_ENGINE_LOAD_BUILTIN_ENGINES - ENGINE_load_builtin_engines(); -#endif -#ifdef HAVE_OPENSSL -#if OPENSSL_VERSION_NUMBER >= 0x00907001 - OPENSSL_load_builtin_modules(); -#endif -#endif - - /* - * Let us cleanup the ssl library when the module is unloaded - */ - apr_pool_cleanup_register(pconf, NULL, ssl_cleanup_pre_config, - apr_pool_cleanup_null); - - /* Register us to handle mod_log_config %c/%x variables */ - ssl_var_log_config_register(pconf); - - /* Register to handle mod_status status page generation */ - ssl_scache_status_register(pconf); - - return OK; -} - -static SSLConnRec *ssl_init_connection_ctx(conn_rec *c) -{ - SSLConnRec *sslconn = myConnConfig(c); - - if (sslconn) { - return sslconn; - } - - sslconn = apr_pcalloc(c->pool, sizeof(*sslconn)); - - myConnConfigSet(c, sslconn); - - return sslconn; -} - -int ssl_proxy_enable(conn_rec *c) -{ - SSLSrvConfigRec *sc = mySrvConfig(c->base_server); - - SSLConnRec *sslconn = ssl_init_connection_ctx(c); - - if (!sc->proxy_enabled) { - ap_log_cerror(APLOG_MARK, APLOG_ERR, 0, c, - "SSL Proxy requested for %s but not enabled " - "[Hint: SSLProxyEngine]", sc->vhost_id); - - return 0; - } - - sslconn->is_proxy = 1; - sslconn->disabled = 0; - - return 1; -} - -int ssl_engine_disable(conn_rec *c) -{ - SSLSrvConfigRec *sc = mySrvConfig(c->base_server); - - SSLConnRec *sslconn; - - if (sc->enabled == SSL_ENABLED_FALSE) { - return 0; - } - - sslconn = ssl_init_connection_ctx(c); - - sslconn->disabled = 1; - - return 1; -} - -int ssl_init_ssl_connection(conn_rec *c) -{ - SSLSrvConfigRec *sc = mySrvConfig(c->base_server); - SSL *ssl; - SSLConnRec *sslconn = myConnConfig(c); - char *vhost_md5; - modssl_ctx_t *mctx; - - /* - * Seed the Pseudo Random Number Generator (PRNG) - */ - ssl_rand_seed(c->base_server, c->pool, SSL_RSCTX_CONNECT, ""); - - if (!sslconn) { - sslconn = ssl_init_connection_ctx(c); - } - - mctx = sslconn->is_proxy ? sc->proxy : sc->server; - - /* - * Create a new SSL connection with the configured server SSL context and - * attach this to the socket. Additionally we register this attachment - * so we can detach later. - */ - if (!(ssl = SSL_new(mctx->ssl_ctx))) { - ap_log_cerror(APLOG_MARK, APLOG_ERR, 0, c, - "Unable to create a new SSL connection from the SSL " - "context"); - ssl_log_ssl_error(APLOG_MARK, APLOG_ERR, c->base_server); - - c->aborted = 1; - - return DECLINED; /* XXX */ - } - - vhost_md5 = ap_md5_binary(c->pool, (unsigned char *)sc->vhost_id, - sc->vhost_id_len); - - if (!SSL_set_session_id_context(ssl, (unsigned char *)vhost_md5, - APR_MD5_DIGESTSIZE*2)) - { - ap_log_cerror(APLOG_MARK, APLOG_ERR, 0, c, - "Unable to set session id context to `%s'", vhost_md5); - ssl_log_ssl_error(APLOG_MARK, APLOG_ERR, c->base_server); - - c->aborted = 1; - - return DECLINED; /* XXX */ - } - - SSL_set_app_data(ssl, c); - SSL_set_app_data2(ssl, NULL); /* will be request_rec */ - - sslconn->ssl = ssl; - - /* - * Configure callbacks for SSL connection - */ - SSL_set_tmp_rsa_callback(ssl, ssl_callback_TmpRSA); - SSL_set_tmp_dh_callback(ssl, ssl_callback_TmpDH); - - SSL_set_verify_result(ssl, X509_V_OK); - - ssl_io_filter_init(c, ssl); - - return APR_SUCCESS; -} - -static const char *ssl_hook_http_scheme(const request_rec *r) -{ - SSLSrvConfigRec *sc = mySrvConfig(r->server); - - if (sc->enabled == SSL_ENABLED_FALSE || sc->enabled == SSL_ENABLED_OPTIONAL) { - return NULL; - } - - return "https"; -} - -static apr_port_t ssl_hook_default_port(const request_rec *r) -{ - SSLSrvConfigRec *sc = mySrvConfig(r->server); - - if (sc->enabled == SSL_ENABLED_FALSE || sc->enabled == SSL_ENABLED_OPTIONAL) { - return 0; - } - - return 443; -} - -static int ssl_hook_pre_connection(conn_rec *c, void *csd) -{ - SSLSrvConfigRec *sc = mySrvConfig(c->base_server); - SSLConnRec *sslconn = myConnConfig(c); - - /* - * Immediately stop processing if SSL is disabled for this connection - */ - if (!(sc && (sc->enabled == SSL_ENABLED_TRUE || - (sslconn && sslconn->is_proxy)))) - { - return DECLINED; - } - - /* - * Create SSL context - */ - if (!sslconn) { - sslconn = ssl_init_connection_ctx(c); - } - - if (sslconn->disabled) { - return DECLINED; - } - - /* - * Remember the connection information for - * later access inside callback functions - */ - - ap_log_cerror(APLOG_MARK, APLOG_INFO, 0, c, - "Connection to child %ld established " - "(server %s)", c->id, sc->vhost_id); - - return ssl_init_ssl_connection(c); -} - - -static void ssl_hook_Insert_Filter(request_rec *r) -{ - SSLSrvConfigRec *sc = mySrvConfig(r->server); - - if (sc->enabled == SSL_ENABLED_OPTIONAL) { - ap_add_output_filter("UPGRADE_FILTER", NULL, r, r->connection); - } -} - -/* - * the module registration phase - */ - -static void ssl_register_hooks(apr_pool_t *p) -{ - /* ssl_hook_ReadReq needs to use the BrowserMatch settings so must - * run after mod_setenvif's post_read_request hook. */ - static const char *pre_prr[] = { "mod_setenvif.c", NULL }; - - ssl_io_filter_register(p); - - ap_hook_pre_connection(ssl_hook_pre_connection,NULL,NULL, APR_HOOK_MIDDLE); - ap_hook_test_config (ssl_hook_ConfigTest, NULL,NULL, APR_HOOK_MIDDLE); - ap_hook_post_config (ssl_init_Module, NULL,NULL, APR_HOOK_MIDDLE); - ap_hook_http_scheme (ssl_hook_http_scheme, NULL,NULL, APR_HOOK_MIDDLE); - ap_hook_default_port (ssl_hook_default_port, NULL,NULL, APR_HOOK_MIDDLE); - ap_hook_pre_config (ssl_hook_pre_config, NULL,NULL, APR_HOOK_MIDDLE); - ap_hook_child_init (ssl_init_Child, NULL,NULL, APR_HOOK_MIDDLE); - ap_hook_check_user_id (ssl_hook_UserCheck, NULL,NULL, APR_HOOK_FIRST); - ap_hook_fixups (ssl_hook_Fixup, NULL,NULL, APR_HOOK_MIDDLE); - ap_hook_access_checker(ssl_hook_Access, NULL,NULL, APR_HOOK_MIDDLE); - ap_hook_auth_checker (ssl_hook_Auth, NULL,NULL, APR_HOOK_MIDDLE); - ap_hook_post_read_request(ssl_hook_ReadReq, pre_prr,NULL, APR_HOOK_MIDDLE); - ap_hook_insert_filter (ssl_hook_Insert_Filter, NULL,NULL, APR_HOOK_MIDDLE); -/* ap_hook_handler (ssl_hook_Upgrade, NULL,NULL, APR_HOOK_MIDDLE); */ - - ssl_var_register(); - - APR_REGISTER_OPTIONAL_FN(ssl_proxy_enable); - APR_REGISTER_OPTIONAL_FN(ssl_engine_disable); -} - -module AP_MODULE_DECLARE_DATA ssl_module = { - STANDARD20_MODULE_STUFF, - ssl_config_perdir_create, /* create per-dir config structures */ - ssl_config_perdir_merge, /* merge per-dir config structures */ - ssl_config_server_create, /* create per-server config structures */ - ssl_config_server_merge, /* merge per-server config structures */ - ssl_config_cmds, /* table of configuration directives */ - ssl_register_hooks /* register hooks */ -}; diff --git a/trunk/modules/ssl/mod_ssl.dsp b/trunk/modules/ssl/mod_ssl.dsp deleted file mode 100644 index 27eb31bed83d9c7e1d2cddf19287c7e5934a1461..0000000000000000000000000000000000000000 --- a/trunk/modules/ssl/mod_ssl.dsp +++ /dev/null @@ -1,328 +0,0 @@ -# Microsoft Developer Studio Project File - Name="mod_ssl" - 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_ssl - 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_ssl.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_ssl.mak" CFG="mod_ssl - Win32 Release" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "mod_ssl - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE "mod_ssl - 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_ssl - 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 /O2 /Oy- /Zi /I "../../include" /I "../generators" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /I "../../srclib/openssl/inc32" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "NO_IDEA" /D "NO_RC5" /D "NO_MDC2" /D "OPENSSL_NO_IDEA" /D "OPENSSL_NO_RC5" /D "OPENSSL_NO_MDC2" /D "HAVE_OPENSSL" /D "HAVE_SSL_SET_STATE=1" /Fd"Release\mod_ssl_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_ssl.so" /base:@..\..\os\win32\BaseAddr.ref,mod_ssl.so -# ADD LINK32 kernel32.lib user32.lib wsock32.lib ws2_32.lib advapi32.lib gdi32.lib libeay32.lib ssleay32.lib /nologo /subsystem:windows /dll /incremental:no /debug /machine:I386 /out:"Release/mod_ssl.so" /libpath:"../../srclib/openssl/out32dll" /libpath:"../../srclib/openssl/out32" /base:@..\..\os\win32\BaseAddr.ref,mod_ssl.so /opt:ref - -!ELSEIF "$(CFG)" == "mod_ssl - 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 "../generators" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /I "../../srclib/openssl/inc32" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "NO_IDEA" /D "NO_RC5" /D "NO_MDC2" /D "OPENSSL_NO_IDEA" /D "OPENSSL_NO_RC5" /D "OPENSSL_NO_MDC2" /D "HAVE_OPENSSL" /D "HAVE_SSL_SET_STATE=1" /Fd"Debug\mod_ssl_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_ssl.so" /base:@..\..\os\win32\BaseAddr.ref,mod_ssl.so -# ADD LINK32 kernel32.lib user32.lib wsock32.lib ws2_32.lib advapi32.lib gdi32.lib libeay32.lib ssleay32.lib /nologo /subsystem:windows /dll /incremental:no /debug /machine:I386 /out:"Debug/mod_ssl.so" /libpath:"../../srclib/openssl/out32dll.dbg" /libpath:"../../srclib/openssl/out32.dbg" /libpath:"../../srclib/openssl/out32dll" /libpath:"../../srclib/openssl/out32" /base:@..\..\os\win32\BaseAddr.ref,mod_ssl.so - -!ENDIF - -# Begin Target - -# Name "mod_ssl - Win32 Release" -# Name "mod_ssl - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "*.c" -# Begin Source File - -SOURCE=.\mod_ssl.c -# End Source File -# Begin Source File - -SOURCE=.\ssl_engine_config.c -# End Source File -# Begin Source File - -SOURCE=.\ssl_engine_dh.c -# End Source File -# Begin Source File - -SOURCE=.\ssl_engine_init.c -# End Source File -# Begin Source File - -SOURCE=.\ssl_engine_io.c -# End Source File -# Begin Source File - -SOURCE=.\ssl_engine_kernel.c -# End Source File -# Begin Source File - -SOURCE=.\ssl_engine_log.c -# End Source File -# Begin Source File - -SOURCE=.\ssl_engine_mutex.c -# End Source File -# Begin Source File - -SOURCE=.\ssl_engine_pphrase.c -# End Source File -# Begin Source File - -SOURCE=.\ssl_engine_rand.c -# End Source File -# Begin Source File - -SOURCE=.\ssl_engine_vars.c -# End Source File -# Begin Source File - -SOURCE=.\ssl_expr.c -# End Source File -# Begin Source File - -SOURCE=.\ssl_expr_eval.c -# End Source File -# Begin Source File - -SOURCE=.\ssl_expr_parse.c -# End Source File -# Begin Source File - -SOURCE=.\ssl_expr_scan.c -# End Source File -# Begin Source File - -SOURCE=.\ssl_scache.c -# End Source File -# Begin Source File - -SOURCE=.\ssl_scache_dbm.c -# End Source File -# Begin Source File - -SOURCE=.\ssl_scache_shmcb.c -# End Source File -# Begin Source File - -SOURCE=.\ssl_scache_dc.c -# End Source File -# Begin Source File - -SOURCE=.\ssl_util.c -# End Source File -# Begin Source File - -SOURCE=.\ssl_util_ssl.c -# End Source File -# End Group - # Begin Group "Header Files" - -# PROP Default_Filter "*.h" -# Begin Source File - -SOURCE=.\mod_ssl.h -# End Source File -# Begin Source File - -SOURCE=.\ssl_expr.h -# End Source File -# Begin Source File - -SOURCE=.\ssl_private.h -# End Source File -# Begin Source File - -SOURCE=.\ssl_expr_parse.h -# End Source File -# Begin Source File - -SOURCE=.\ssl_toolkit_compat.h -# End Source File -# Begin Source File - -SOURCE=.\ssl_util_ssl.h -# End Source File -# Begin Source File - -SOURCE=.\ssl_util_table.h -# End Source File -# End Group -# Begin Group "Generated Files" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\ssl_expr_parse.y - -!IF "$(CFG)" == "mod_ssl - Win32 Release" - -# Begin Custom Build - Generating ssl_expr_parse.c/.h from ssl_expr_parse.y -InputPath=.\ssl_expr_parse.y - -BuildCmds= \ - bison -y -d ssl_expr_parse.y \ - sed -e "s;yy;ssl_expr_yy;g" -e "/#if defined(c_plusplus) || defined(__cplusplus)/,/#endif/d" ssl_expr_parse.c \ - del y.tab.c \ - sed -e "s;yy;ssl_expr_yy;g" ssl_expr_parse.h \ - del y.tab.h \ - - -"ssl_expr_parse.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - $(BuildCmds) - -"ssl_expr_parse.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - $(BuildCmds) -# End Custom Build - -!ELSEIF "$(CFG)" == "mod_ssl - Win32 Debug" - -# Begin Custom Build - Generating ssl_expr_parse.c/.h from ssl_expr_parse.y -InputPath=.\ssl_expr_parse.y - -BuildCmds= \ - bison -y -d ssl_expr_parse.y \ - sed -e "s;yy;ssl_expr_yy;g" -e "/#if defined(c_plusplus) || defined(__cplusplus)/,/#endif/d" ssl_expr_parse.c \ - del y.tab.c \ - sed -e "s;yy;ssl_expr_yy;g" ssl_expr_parse.h \ - del y.tab.h \ - - -"ssl_expr_parse.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - $(BuildCmds) - -"ssl_expr_parse.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - $(BuildCmds) -# End Custom Build - -!ENDIF - -# End Source File -# Begin Source File - -SOURCE=.\ssl_expr_scan.l - -!IF "$(CFG)" == "mod_ssl - Win32 Release" - -# PROP Ignore_Default_Tool 1 -# Begin Custom Build - Generating ssl_expr_scan.c from ssl_expr_scan.l -InputPath=.\ssl_expr_scan.l - -"ssl_expr_scan.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - flex -Pssl_expr_yy -s -B ssl_expr_scan.l - sed -e "/$$Header:/d" ssl_expr_scan.c - del lex.ssl_expr_yy.c - -# End Custom Build - -!ELSEIF "$(CFG)" == "mod_ssl - Win32 Debug" - -# PROP Ignore_Default_Tool 1 -# Begin Custom Build - Generating ssl_expr_scan.c from ssl_expr_scan.l -InputPath=.\ssl_expr_scan.l - -"ssl_expr_scan.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - flex -Pssl_expr_yy -s -B ssl_expr_scan.l - sed -e "/$$Header:/d" ssl_expr_scan.c - del lex.ssl_expr_yy.c - -# End Custom Build - -!ENDIF - -# End Source File -# End Group -# Begin Source File - -SOURCE=.\mod_ssl.rc -# End Source File -# Begin Source File - -SOURCE=..\..\build\win32\win32ver.awk - -!IF "$(CFG)" == "mod_ssl - Win32 Release" - -# PROP Ignore_Default_Tool 1 -# Begin Custom Build - Creating Version Resource -InputPath=..\..\build\win32\win32ver.awk - -".\mod_ssl.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - awk -f ../../build/win32/win32ver.awk mod_ssl.so "ssl_module for Apache" ../../include/ap_release.h > .\mod_ssl.rc - -# End Custom Build - -!ELSEIF "$(CFG)" == "mod_ssl - Win32 Debug" - -# PROP Ignore_Default_Tool 1 -# Begin Custom Build - Creating Version Resource -InputPath=..\..\build\win32\win32ver.awk - -".\mod_ssl.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - awk -f ../../build/win32/win32ver.awk mod_ssl.so "ssl_module for Apache" ../../include/ap_release.h > .\mod_ssl.rc - -# End Custom Build - -!ENDIF - -# End Source File -# End Target -# End Project diff --git a/trunk/modules/ssl/mod_ssl.h b/trunk/modules/ssl/mod_ssl.h deleted file mode 100644 index fdde6411965b2230b829bb07223f2b0a4745d5c3..0000000000000000000000000000000000000000 --- a/trunk/modules/ssl/mod_ssl.h +++ /dev/null @@ -1,52 +0,0 @@ -/* Copyright 2001-2005 The Apache Software Foundation or its licensors, as - * applicable. - * - * 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. - */ - -#ifndef __MOD_SSL_H__ -#define __MOD_SSL_H__ - -#include "httpd.h" -#include "apr_optional.h" - -/* The ssl_var_lookup() optional function retrieves SSL environment - * variables. */ -APR_DECLARE_OPTIONAL_FN(char *, ssl_var_lookup, - (apr_pool_t *, server_rec *, - conn_rec *, request_rec *, - char *)); - -/* The ssl_ext_lookup() optional function retrieves the value of a SSL - * certificate X.509 extension. The client certificate is used if - * peer is non-zero; the server certificate is used otherwise. The - * oidnum parameter specifies the numeric OID (e.g. "1.2.3.4") of the - * desired extension. The string value of the extension is returned, - * or NULL on error. */ -APR_DECLARE_OPTIONAL_FN(const char *, ssl_ext_lookup, - (apr_pool_t *p, conn_rec *c, int peer, - const char *oidnum)); - -/* An optional function which returns non-zero if the given connection - * is using SSL/TLS. */ -APR_DECLARE_OPTIONAL_FN(int, ssl_is_https, (conn_rec *)); - -/* The ssl_proxy_enable() and ssl_engine_disable() optional functions - * are used by mod_proxy to enable use of SSL for outgoing - * connections. */ - -APR_DECLARE_OPTIONAL_FN(int, ssl_proxy_enable, (conn_rec *)); - -APR_DECLARE_OPTIONAL_FN(int, ssl_engine_disable, (conn_rec *)); - -#endif /* __MOD_SSL_H__ */ diff --git a/trunk/modules/ssl/ssl_engine_config.c b/trunk/modules/ssl/ssl_engine_config.c deleted file mode 100644 index c6572216e2cc700e6b5ffdaaca5b5be00684404c..0000000000000000000000000000000000000000 --- a/trunk/modules/ssl/ssl_engine_config.c +++ /dev/null @@ -1,1433 +0,0 @@ -/* Copyright 2001-2005 The Apache Software Foundation or its licensors, as - * applicable. - * - * 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_ssl - * | '_ ` _ \ / _ \ / _` | / __/ __| | Apache Interface to OpenSSL - * | | | | | | (_) | (_| | \__ \__ \ | - * |_| |_| |_|\___/ \__,_|___|___/___/_| - * |_____| - * ssl_engine_config.c - * Apache Configuration Directives - */ - /* ``Damned if you do, - damned if you don't.'' - -- Unknown */ -#include "ssl_private.h" - -/* _________________________________________________________________ -** -** Support for Global Configuration -** _________________________________________________________________ -*/ - -#define SSL_MOD_CONFIG_KEY "ssl_module" - -SSLModConfigRec *ssl_config_global_create(server_rec *s) -{ - apr_pool_t *pool = s->process->pool; - SSLModConfigRec *mc; - void *vmc; - - apr_pool_userdata_get(&vmc, SSL_MOD_CONFIG_KEY, pool); - if (vmc) { - return vmc; /* reused for lifetime of the server */ - } - - /* - * allocate an own subpool which survives server restarts - */ - mc = (SSLModConfigRec *)apr_palloc(pool, sizeof(*mc)); - mc->pPool = pool; - mc->bFixed = FALSE; - - /* - * initialize per-module configuration - */ - mc->nSessionCacheMode = SSL_SCMODE_UNSET; - mc->szSessionCacheDataFile = NULL; - mc->nSessionCacheDataSize = 0; - mc->pSessionCacheDataMM = NULL; - mc->pSessionCacheDataRMM = NULL; - mc->tSessionCacheDataTable = NULL; - mc->nMutexMode = SSL_MUTEXMODE_UNSET; - mc->nMutexMech = APR_LOCK_DEFAULT; - mc->szMutexFile = NULL; - mc->pMutex = NULL; - mc->aRandSeed = apr_array_make(pool, 4, - sizeof(ssl_randseed_t)); - mc->tVHostKeys = apr_hash_make(pool); - mc->tPrivateKey = apr_hash_make(pool); - mc->tPublicCert = apr_hash_make(pool); -#if defined(HAVE_OPENSSL_ENGINE_H) && defined(HAVE_ENGINE_INIT) - mc->szCryptoDevice = NULL; -#endif - - memset(mc->pTmpKeys, 0, sizeof(mc->pTmpKeys)); - - apr_pool_userdata_set(mc, SSL_MOD_CONFIG_KEY, - apr_pool_cleanup_null, - pool); - - return mc; -} - -void ssl_config_global_fix(SSLModConfigRec *mc) -{ - mc->bFixed = TRUE; -} - -BOOL ssl_config_global_isfixed(SSLModConfigRec *mc) -{ - return mc->bFixed; -} - -/* _________________________________________________________________ -** -** Configuration handling -** _________________________________________________________________ -*/ - -static void modssl_ctx_init(modssl_ctx_t *mctx) -{ - mctx->sc = NULL; /* set during module init */ - - mctx->ssl_ctx = NULL; /* set during module init */ - - mctx->pks = NULL; - mctx->pkp = NULL; - - mctx->protocol = SSL_PROTOCOL_ALL; - - mctx->pphrase_dialog_type = SSL_PPTYPE_UNSET; - mctx->pphrase_dialog_path = NULL; - - mctx->cert_chain = NULL; - - mctx->crl_path = NULL; - mctx->crl_file = NULL; - mctx->crl = NULL; /* set during module init */ - - mctx->auth.ca_cert_path = NULL; - mctx->auth.ca_cert_file = NULL; - mctx->auth.cipher_suite = NULL; - mctx->auth.verify_depth = UNSET; - mctx->auth.verify_mode = SSL_CVERIFY_UNSET; -} - -static void modssl_ctx_init_proxy(SSLSrvConfigRec *sc, - apr_pool_t *p) -{ - modssl_ctx_t *mctx; - - mctx = sc->proxy = apr_palloc(p, sizeof(*sc->proxy)); - - modssl_ctx_init(mctx); - - mctx->pkp = apr_palloc(p, sizeof(*mctx->pkp)); - - mctx->pkp->cert_file = NULL; - mctx->pkp->cert_path = NULL; - mctx->pkp->certs = NULL; -} - -static void modssl_ctx_init_server(SSLSrvConfigRec *sc, - apr_pool_t *p) -{ - modssl_ctx_t *mctx; - - mctx = sc->server = apr_palloc(p, sizeof(*sc->server)); - - modssl_ctx_init(mctx); - - mctx->pks = apr_pcalloc(p, sizeof(*mctx->pks)); - - /* mctx->pks->... certs/keys are set during module init */ -} - -static SSLSrvConfigRec *ssl_config_server_new(apr_pool_t *p) -{ - SSLSrvConfigRec *sc = apr_palloc(p, sizeof(*sc)); - - sc->mc = NULL; - sc->enabled = SSL_ENABLED_FALSE; - sc->proxy_enabled = UNSET; - sc->vhost_id = NULL; /* set during module init */ - sc->vhost_id_len = 0; /* set during module init */ - sc->session_cache_timeout = UNSET; - sc->cipher_server_pref = UNSET; - - modssl_ctx_init_proxy(sc, p); - - modssl_ctx_init_server(sc, p); - - return sc; -} - -/* - * Create per-server SSL configuration - */ -void *ssl_config_server_create(apr_pool_t *p, server_rec *s) -{ - SSLSrvConfigRec *sc = ssl_config_server_new(p); - - sc->mc = ssl_config_global_create(s); - - return sc; -} - -#define cfgMerge(el,unset) mrg->el = (add->el == (unset)) ? base->el : add->el -#define cfgMergeArray(el) mrg->el = apr_array_append(p, add->el, base->el) -#define cfgMergeString(el) cfgMerge(el, NULL) -#define cfgMergeBool(el) cfgMerge(el, UNSET) -#define cfgMergeInt(el) cfgMerge(el, UNSET) - -static void modssl_ctx_cfg_merge(modssl_ctx_t *base, - modssl_ctx_t *add, - modssl_ctx_t *mrg) -{ - cfgMerge(protocol, SSL_PROTOCOL_ALL); - - cfgMerge(pphrase_dialog_type, SSL_PPTYPE_UNSET); - cfgMergeString(pphrase_dialog_path); - - cfgMergeString(cert_chain); - - cfgMerge(crl_path, NULL); - cfgMerge(crl_file, NULL); - - cfgMergeString(auth.ca_cert_path); - cfgMergeString(auth.ca_cert_file); - cfgMergeString(auth.cipher_suite); - cfgMergeInt(auth.verify_depth); - cfgMerge(auth.verify_mode, SSL_CVERIFY_UNSET); -} - -static void modssl_ctx_cfg_merge_proxy(modssl_ctx_t *base, - modssl_ctx_t *add, - modssl_ctx_t *mrg) -{ - modssl_ctx_cfg_merge(base, add, mrg); - - cfgMergeString(pkp->cert_file); - cfgMergeString(pkp->cert_path); -} - -static void modssl_ctx_cfg_merge_server(modssl_ctx_t *base, - modssl_ctx_t *add, - modssl_ctx_t *mrg) -{ - int i; - - modssl_ctx_cfg_merge(base, add, mrg); - - for (i = 0; i < SSL_AIDX_MAX; i++) { - cfgMergeString(pks->cert_files[i]); - cfgMergeString(pks->key_files[i]); - } - - cfgMergeString(pks->ca_name_path); - cfgMergeString(pks->ca_name_file); -} - -/* - * Merge per-server SSL configurations - */ -void *ssl_config_server_merge(apr_pool_t *p, void *basev, void *addv) -{ - SSLSrvConfigRec *base = (SSLSrvConfigRec *)basev; - SSLSrvConfigRec *add = (SSLSrvConfigRec *)addv; - SSLSrvConfigRec *mrg = ssl_config_server_new(p); - - cfgMerge(mc, NULL); - cfgMerge(enabled, SSL_ENABLED_UNSET); - cfgMergeBool(proxy_enabled); - cfgMergeInt(session_cache_timeout); - cfgMergeBool(cipher_server_pref); - - modssl_ctx_cfg_merge_proxy(base->proxy, add->proxy, mrg->proxy); - - modssl_ctx_cfg_merge_server(base->server, add->server, mrg->server); - - return mrg; -} - -/* - * Create per-directory SSL configuration - */ -void *ssl_config_perdir_create(apr_pool_t *p, char *dir) -{ - SSLDirConfigRec *dc = apr_palloc(p, sizeof(*dc)); - - dc->bSSLRequired = FALSE; - dc->aRequirement = apr_array_make(p, 4, sizeof(ssl_require_t)); - dc->nOptions = SSL_OPT_NONE|SSL_OPT_RELSET; - dc->nOptionsAdd = SSL_OPT_NONE; - dc->nOptionsDel = SSL_OPT_NONE; - - dc->szCipherSuite = NULL; - dc->nVerifyClient = SSL_CVERIFY_UNSET; - dc->nVerifyDepth = UNSET; - - dc->szCACertificatePath = NULL; - dc->szCACertificateFile = NULL; - dc->szUserName = NULL; - - return dc; -} - -/* - * Merge per-directory SSL configurations - */ -void *ssl_config_perdir_merge(apr_pool_t *p, void *basev, void *addv) -{ - SSLDirConfigRec *base = (SSLDirConfigRec *)basev; - SSLDirConfigRec *add = (SSLDirConfigRec *)addv; - SSLDirConfigRec *mrg = (SSLDirConfigRec *)apr_palloc(p, sizeof(*mrg)); - - cfgMerge(bSSLRequired, FALSE); - cfgMergeArray(aRequirement); - - if (add->nOptions & SSL_OPT_RELSET) { - mrg->nOptionsAdd = - (base->nOptionsAdd & ~(add->nOptionsDel)) | add->nOptionsAdd; - mrg->nOptionsDel = - (base->nOptionsDel & ~(add->nOptionsAdd)) | add->nOptionsDel; - mrg->nOptions = - (base->nOptions & ~(mrg->nOptionsDel)) | mrg->nOptionsAdd; - } - else { - mrg->nOptions = add->nOptions; - mrg->nOptionsAdd = add->nOptionsAdd; - mrg->nOptionsDel = add->nOptionsDel; - } - - cfgMergeString(szCipherSuite); - cfgMerge(nVerifyClient, SSL_CVERIFY_UNSET); - cfgMergeInt(nVerifyDepth); - - cfgMergeString(szCACertificatePath); - cfgMergeString(szCACertificateFile); - cfgMergeString(szUserName); - - return mrg; -} - -/* - * Configuration functions for particular directives - */ - -const char *ssl_cmd_SSLMutex(cmd_parms *cmd, - void *dcfg, - const char *arg_) -{ - const char *err; - SSLModConfigRec *mc = myModConfig(cmd->server); - /* Split arg_ into meth and file */ - char *meth = apr_pstrdup(cmd->temp_pool, arg_); - char *file = strchr(meth, ':'); - if (file) { - *(file++) = '\0'; - if (!*file) { - file = NULL; - } - } - - if ((err = ap_check_cmd_context(cmd, GLOBAL_ONLY))) { - return err; - } - - if (ssl_config_global_isfixed(mc)) { - return NULL; - } - if (!strcasecmp(meth, "none") || !strcasecmp(meth, "no")) { - mc->nMutexMode = SSL_MUTEXMODE_NONE; - return NULL; - } - - /* APR determines temporary filename unless overridden below, - * we presume file indicates an szMutexFile is a file path - * unless the method sets szMutexFile=file and NULLs file - */ - mc->nMutexMode = SSL_MUTEXMODE_USED; - mc->szMutexFile = NULL; - - /* NOTE: previously, 'yes' implied 'sem' */ - if (!strcasecmp(meth, "default") || !strcasecmp(meth, "yes")) { - mc->nMutexMech = APR_LOCK_DEFAULT; - } -#if APR_HAS_FCNTL_SERIALIZE - else if ((!strcasecmp(meth, "fcntl") || !strcasecmp(meth, "file")) && file) { - mc->nMutexMech = APR_LOCK_FCNTL; - } -#endif -#if APR_HAS_FLOCK_SERIALIZE - else if ((!strcasecmp(meth, "flock") || !strcasecmp(meth, "file")) && file) { - mc->nMutexMech = APR_LOCK_FLOCK; - } -#endif -#if APR_HAS_POSIXSEM_SERIALIZE - else if (!strcasecmp(meth, "posixsem") || !strcasecmp(meth, "sem")) { - mc->nMutexMech = APR_LOCK_POSIXSEM; - /* Posix/SysV semaphores aren't file based, use the literal name - * if provided and fall back on APR's default if not. Today, APR - * will ignore it, but once supported it has an absurdly short limit. - */ - if (file) { - mc->szMutexFile = apr_pstrdup(cmd->server->process->pool, file); - - file = NULL; - } - } -#endif -#if APR_HAS_SYSVSEM_SERIALIZE && !defined(PERCHILD_MPM) - else if (!strcasecmp(meth, "sysvsem") || !strcasecmp(meth, "sem")) { - mc->nMutexMech = APR_LOCK_SYSVSEM; - } -#endif -#if APR_HAS_PROC_PTHREAD_SERIALIZE - else if (!strcasecmp(meth, "pthread")) { - mc->nMutexMech = APR_LOCK_PROC_PTHREAD; - } -#endif - else { - return apr_pstrcat(cmd->pool, "Invalid SSLMutex argument ", arg_, - " (", ssl_valid_ssl_mutex_string, ")", NULL); - } - - /* Unless the method above assumed responsibility for setting up - * mc->szMutexFile and NULLing out file, presume it is a file we - * are looking to use - */ - if (file) { - mc->szMutexFile = ap_server_root_relative(cmd->server->process->pool, file); - if (!mc->szMutexFile) { - return apr_pstrcat(cmd->pool, "Invalid SSLMutex ", meth, - ": filepath ", file, NULL); - } - } - - return NULL; -} - -const char *ssl_cmd_SSLPassPhraseDialog(cmd_parms *cmd, - void *dcfg, - const char *arg) -{ - SSLSrvConfigRec *sc = mySrvConfig(cmd->server); - const char *err; - int arglen = strlen(arg); - - if ((err = ap_check_cmd_context(cmd, GLOBAL_ONLY))) { - return err; - } - - if (strcEQ(arg, "builtin")) { - sc->server->pphrase_dialog_type = SSL_PPTYPE_BUILTIN; - sc->server->pphrase_dialog_path = NULL; - } - else if ((arglen > 5) && strEQn(arg, "exec:", 5)) { - sc->server->pphrase_dialog_type = SSL_PPTYPE_FILTER; - sc->server->pphrase_dialog_path = - ap_server_root_relative(cmd->pool, arg+5); - if (!sc->server->pphrase_dialog_path) { - return apr_pstrcat(cmd->pool, - "Invalid SSLPassPhraseDialog exec: path ", - arg+5, NULL); - } - if (!ssl_util_path_check(SSL_PCM_EXISTS, - sc->server->pphrase_dialog_path, - cmd->pool)) - { - return apr_pstrcat(cmd->pool, - "SSLPassPhraseDialog: file '", - sc->server->pphrase_dialog_path, - "' does not exist", NULL); - } - - } - else if ((arglen > 1) && (arg[0] == '|')) { - sc->server->pphrase_dialog_type = SSL_PPTYPE_PIPE; - sc->server->pphrase_dialog_path = arg + 1; - } - else { - return "SSLPassPhraseDialog: Invalid argument"; - } - - return NULL; -} - -#if defined(HAVE_OPENSSL_ENGINE_H) && defined(HAVE_ENGINE_INIT) -const char *ssl_cmd_SSLCryptoDevice(cmd_parms *cmd, - void *dcfg, - const char *arg) -{ - SSLModConfigRec *mc = myModConfig(cmd->server); - const char *err; - ENGINE *e; - - if ((err = ap_check_cmd_context(cmd, GLOBAL_ONLY))) { - return err; - } - - if (strcEQ(arg, "builtin")) { - mc->szCryptoDevice = NULL; - } - else if ((e = ENGINE_by_id(arg))) { - mc->szCryptoDevice = arg; - ENGINE_free(e); - } - else { - err = "SSLCryptoDevice: Invalid argument; must be one of: " - "'builtin' (none)"; - e = ENGINE_get_first(); - while (e) { - ENGINE *en; - err = apr_pstrcat(cmd->pool, err, ", '", ENGINE_get_id(e), - "' (", ENGINE_get_name(e), ")", NULL); - en = ENGINE_get_next(e); - ENGINE_free(e); - e = en; - } - return err; - } - - return NULL; -} -#endif - -const char *ssl_cmd_SSLRandomSeed(cmd_parms *cmd, - void *dcfg, - const char *arg1, - const char *arg2, - const char *arg3) -{ - SSLModConfigRec *mc = myModConfig(cmd->server); - const char *err; - ssl_randseed_t *seed; - int arg2len = strlen(arg2); - - if ((err = ap_check_cmd_context(cmd, GLOBAL_ONLY))) { - return err; - } - - if (ssl_config_global_isfixed(mc)) { - return NULL; - } - - seed = apr_array_push(mc->aRandSeed); - - if (strcEQ(arg1, "startup")) { - seed->nCtx = SSL_RSCTX_STARTUP; - } - else if (strcEQ(arg1, "connect")) { - seed->nCtx = SSL_RSCTX_CONNECT; - } - else { - return apr_pstrcat(cmd->pool, "SSLRandomSeed: " - "invalid context: `", arg1, "'", - NULL); - } - - if ((arg2len > 5) && strEQn(arg2, "file:", 5)) { - seed->nSrc = SSL_RSSRC_FILE; - seed->cpPath = ap_server_root_relative(mc->pPool, arg2+5); - } - else if ((arg2len > 5) && strEQn(arg2, "exec:", 5)) { - seed->nSrc = SSL_RSSRC_EXEC; - seed->cpPath = ap_server_root_relative(mc->pPool, arg2+5); - } - else if ((arg2len > 4) && strEQn(arg2, "egd:", 4)) { -#ifdef HAVE_SSL_RAND_EGD - seed->nSrc = SSL_RSSRC_EGD; - seed->cpPath = ap_server_root_relative(mc->pPool, arg2+4); -#else - return "egd not supported with this SSL toolkit"; -#endif - } - else if (strcEQ(arg2, "builtin")) { - seed->nSrc = SSL_RSSRC_BUILTIN; - seed->cpPath = NULL; - } - else { - seed->nSrc = SSL_RSSRC_FILE; - seed->cpPath = ap_server_root_relative(mc->pPool, arg2); - } - - if (seed->nSrc != SSL_RSSRC_BUILTIN) { - if (!seed->cpPath) { - return apr_pstrcat(cmd->pool, - "Invalid SSLRandomSeed path ", - arg2, NULL); - } - if (!ssl_util_path_check(SSL_PCM_EXISTS, seed->cpPath, cmd->pool)) { - return apr_pstrcat(cmd->pool, - "SSLRandomSeed: source path '", - seed->cpPath, "' does not exist", NULL); - } - } - - if (!arg3) { - seed->nBytes = 0; /* read whole file */ - } - else { - if (seed->nSrc == SSL_RSSRC_BUILTIN) { - return "SSLRandomSeed: byte specification not " - "allowed for builtin seed source"; - } - - seed->nBytes = atoi(arg3); - - if (seed->nBytes < 0) { - return "SSLRandomSeed: invalid number of bytes specified"; - } - } - - return NULL; -} - -const char *ssl_cmd_SSLEngine(cmd_parms *cmd, void *dcfg, const char *arg) -{ - SSLSrvConfigRec *sc = mySrvConfig(cmd->server); - - if (!strcasecmp(arg, "On")) { - sc->enabled = SSL_ENABLED_TRUE; - return NULL; - } - else if (!strcasecmp(arg, "Off")) { - sc->enabled = SSL_ENABLED_FALSE; - return NULL; - } - else if (!strcasecmp(arg, "Optional")) { - sc->enabled = SSL_ENABLED_OPTIONAL; - return NULL; - } - - return "Argument must be On, Off, or Optional"; -} - -const char *ssl_cmd_SSLCipherSuite(cmd_parms *cmd, - void *dcfg, - const char *arg) -{ - SSLSrvConfigRec *sc = mySrvConfig(cmd->server); - SSLDirConfigRec *dc = (SSLDirConfigRec *)dcfg; - - if (cmd->path) { - dc->szCipherSuite = arg; - } - else { - sc->server->auth.cipher_suite = arg; - } - - return NULL; -} - -#define SSL_FLAGS_CHECK_FILE \ - (SSL_PCM_EXISTS|SSL_PCM_ISREG|SSL_PCM_ISNONZERO) - -#define SSL_FLAGS_CHECK_DIR \ - (SSL_PCM_EXISTS|SSL_PCM_ISDIR) - -static const char *ssl_cmd_check_file(cmd_parms *parms, - const char **file) -{ - const char *filepath = ap_server_root_relative(parms->pool, *file); - - if (!filepath) { - return apr_pstrcat(parms->pool, parms->cmd->name, - ": Invalid file path ", *file, NULL); - } - *file = filepath; - - if (ssl_util_path_check(SSL_FLAGS_CHECK_FILE, *file, parms->pool)) { - return NULL; - } - - return apr_pstrcat(parms->pool, parms->cmd->name, - ": file '", *file, - "' does not exist or is empty", NULL); - -} - -const char *ssl_cmd_SSLHonorCipherOrder(cmd_parms *cmd, void *dcfg, int flag) -{ -#ifdef SSL_OP_CIPHER_SERVER_PREFERENCE - SSLSrvConfigRec *sc = mySrvConfig(cmd->server); - sc->cipher_server_pref = flag?TRUE:FALSE; - return NULL; -#else - return "SSLHonorCiperOrder unsupported; not implemented by the SSL library"; -#endif -} - -static const char *ssl_cmd_check_dir(cmd_parms *parms, - const char **dir) -{ - const char *dirpath = ap_server_root_relative(parms->pool, *dir); - - if (!dirpath) { - return apr_pstrcat(parms->pool, parms->cmd->name, - ": Invalid dir path ", *dir, NULL); - } - *dir = dirpath; - - if (ssl_util_path_check(SSL_FLAGS_CHECK_DIR, *dir, parms->pool)) { - return NULL; - } - - return apr_pstrcat(parms->pool, parms->cmd->name, - ": directory '", *dir, - "' does not exist", NULL); - -} - -#define SSL_AIDX_CERTS 1 -#define SSL_AIDX_KEYS 2 - -static const char *ssl_cmd_check_aidx_max(cmd_parms *parms, - const char *arg, - int idx) -{ - SSLSrvConfigRec *sc = mySrvConfig(parms->server); - const char *err, *desc=NULL, **files=NULL; - int i; - - if ((err = ssl_cmd_check_file(parms, &arg))) { - return err; - } - - switch (idx) { - case SSL_AIDX_CERTS: - desc = "certificates"; - files = sc->server->pks->cert_files; - break; - case SSL_AIDX_KEYS: - desc = "private keys"; - files = sc->server->pks->key_files; - break; - } - - for (i = 0; i < SSL_AIDX_MAX; i++) { - if (!files[i]) { - files[i] = arg; - return NULL; - } - } - - return apr_psprintf(parms->pool, - "%s: only up to %d " - "different %s per virtual host allowed", - parms->cmd->name, SSL_AIDX_MAX, desc); -} - -const char *ssl_cmd_SSLCertificateFile(cmd_parms *cmd, - void *dcfg, - const char *arg) -{ - - const char *err; - - if ((err = ssl_cmd_check_aidx_max(cmd, arg, SSL_AIDX_CERTS))) { - return err; - } - - return NULL; -} - -const char *ssl_cmd_SSLCertificateKeyFile(cmd_parms *cmd, - void *dcfg, - const char *arg) -{ - const char *err; - - if ((err = ssl_cmd_check_aidx_max(cmd, arg, SSL_AIDX_KEYS))) { - return err; - } - - return NULL; -} - -const char *ssl_cmd_SSLCertificateChainFile(cmd_parms *cmd, - void *dcfg, - const char *arg) -{ - SSLSrvConfigRec *sc = mySrvConfig(cmd->server); - const char *err; - - if ((err = ssl_cmd_check_file(cmd, &arg))) { - return err; - } - - sc->server->cert_chain = arg; - - return NULL; -} - -#define NO_PER_DIR_SSL_CA \ - "Your ssl library does not have support for per-directory CA" - -#ifdef HAVE_SSL_SET_CERT_STORE -# define MODSSL_HAVE_SSL_SET_CERT_STORE 1 -#else -# define MODSSL_HAVE_SSL_SET_CERT_STORE 0 -#endif - -#define MODSSL_SET_CA(f) \ - if (cmd->path) \ - if (MODSSL_HAVE_SSL_SET_CERT_STORE) \ - dc->f = arg; \ - else \ - return NO_PER_DIR_SSL_CA; \ - else \ - sc->f = arg \ - -const char *ssl_cmd_SSLCACertificatePath(cmd_parms *cmd, - void *dcfg, - const char *arg) -{ - /*SSLDirConfigRec *dc = (SSLDirConfigRec *)dcfg;*/ - SSLSrvConfigRec *sc = mySrvConfig(cmd->server); - const char *err; - - if ((err = ssl_cmd_check_dir(cmd, &arg))) { - return err; - } - - /* XXX: bring back per-dir */ - sc->server->auth.ca_cert_path = arg; - - return NULL; -} - -const char *ssl_cmd_SSLCACertificateFile(cmd_parms *cmd, - void *dcfg, - const char *arg) -{ - /*SSLDirConfigRec *dc = (SSLDirConfigRec *)dcfg;*/ - SSLSrvConfigRec *sc = mySrvConfig(cmd->server); - const char *err; - - if ((err = ssl_cmd_check_file(cmd, &arg))) { - return err; - } - - /* XXX: bring back per-dir */ - sc->server->auth.ca_cert_file = arg; - - return NULL; -} - -const char *ssl_cmd_SSLCADNRequestPath(cmd_parms *cmd, void *dcfg, - const char *arg) -{ - SSLSrvConfigRec *sc = mySrvConfig(cmd->server); - const char *err; - - if ((err = ssl_cmd_check_dir(cmd, &arg))) { - return err; - } - - sc->server->pks->ca_name_path = arg; - - return NULL; -} - -const char *ssl_cmd_SSLCADNRequestFile(cmd_parms *cmd, void *dcfg, - const char *arg) -{ - SSLSrvConfigRec *sc = mySrvConfig(cmd->server); - const char *err; - - if ((err = ssl_cmd_check_file(cmd, &arg))) { - return err; - } - - sc->server->pks->ca_name_file = arg; - - return NULL; -} - -const char *ssl_cmd_SSLCARevocationPath(cmd_parms *cmd, - void *dcfg, - const char *arg) -{ - SSLSrvConfigRec *sc = mySrvConfig(cmd->server); - const char *err; - - if ((err = ssl_cmd_check_dir(cmd, &arg))) { - return err; - } - - sc->server->crl_path = arg; - - return NULL; -} - -const char *ssl_cmd_SSLCARevocationFile(cmd_parms *cmd, - void *dcfg, - const char *arg) -{ - SSLSrvConfigRec *sc = mySrvConfig(cmd->server); - const char *err; - - if ((err = ssl_cmd_check_file(cmd, &arg))) { - return err; - } - - sc->server->crl_file = arg; - - return NULL; -} - -static const char *ssl_cmd_verify_parse(cmd_parms *parms, - const char *arg, - ssl_verify_t *id) -{ - if (strcEQ(arg, "none") || strcEQ(arg, "off")) { - *id = SSL_CVERIFY_NONE; - } - else if (strcEQ(arg, "optional")) { - *id = SSL_CVERIFY_OPTIONAL; - } - else if (strcEQ(arg, "require") || strcEQ(arg, "on")) { - *id = SSL_CVERIFY_REQUIRE; - } - else if (strcEQ(arg, "optional_no_ca")) { - *id = SSL_CVERIFY_OPTIONAL_NO_CA; - } - else { - return apr_pstrcat(parms->temp_pool, parms->cmd->name, - ": Invalid argument '", arg, "'", - NULL); - } - - return NULL; -} - -const char *ssl_cmd_SSLVerifyClient(cmd_parms *cmd, - void *dcfg, - const char *arg) -{ - SSLDirConfigRec *dc = (SSLDirConfigRec *)dcfg; - SSLSrvConfigRec *sc = mySrvConfig(cmd->server); - ssl_verify_t mode; - const char *err; - - if ((err = ssl_cmd_verify_parse(cmd, arg, &mode))) { - return err; - } - - if (cmd->path) { - dc->nVerifyClient = mode; - } - else { - sc->server->auth.verify_mode = mode; - } - - return NULL; -} - -static const char *ssl_cmd_verify_depth_parse(cmd_parms *parms, - const char *arg, - int *depth) -{ - if ((*depth = atoi(arg)) >= 0) { - return NULL; - } - - return apr_pstrcat(parms->temp_pool, parms->cmd->name, - ": Invalid argument '", arg, "'", - NULL); -} - -const char *ssl_cmd_SSLVerifyDepth(cmd_parms *cmd, - void *dcfg, - const char *arg) -{ - SSLDirConfigRec *dc = (SSLDirConfigRec *)dcfg; - SSLSrvConfigRec *sc = mySrvConfig(cmd->server); - int depth; - const char *err; - - if ((err = ssl_cmd_verify_depth_parse(cmd, arg, &depth))) { - return err; - } - - if (cmd->path) { - dc->nVerifyDepth = depth; - } - else { - sc->server->auth.verify_depth = depth; - } - - return NULL; -} - -#define MODSSL_NO_SHARED_MEMORY_ERROR \ - "SSLSessionCache: shared memory cache not useable on this platform" - -const char *ssl_cmd_SSLSessionCache(cmd_parms *cmd, - void *dcfg, - const char *arg) -{ - SSLModConfigRec *mc = myModConfig(cmd->server); - const char *err, *colon; - char *cp, *cp2; - int arglen = strlen(arg); - - if ((err = ap_check_cmd_context(cmd, GLOBAL_ONLY))) { - return err; - } - - if (ssl_config_global_isfixed(mc)) { - return NULL; - } - - if (strcEQ(arg, "none")) { - mc->nSessionCacheMode = SSL_SCMODE_NONE; - mc->szSessionCacheDataFile = NULL; - } - else if ((arglen > 4) && strcEQn(arg, "dbm:", 4)) { - mc->nSessionCacheMode = SSL_SCMODE_DBM; - mc->szSessionCacheDataFile = ap_server_root_relative(mc->pPool, arg+4); - if (!mc->szSessionCacheDataFile) { - return apr_psprintf(cmd->pool, - "SSLSessionCache: Invalid cache file path %s", - arg+4); - } - } - else if (((arglen > 4) && strcEQn(arg, "shm:", 4)) || - ((arglen > 6) && strcEQn(arg, "shmht:", 6)) || - ((arglen > 6) && strcEQn(arg, "shmcb:", 6))) { -#if !APR_HAS_SHARED_MEMORY - return MODSSL_NO_SHARED_MEMORY_ERROR; -#endif - mc->nSessionCacheMode = SSL_SCMODE_SHMCB; - colon = ap_strchr_c(arg, ':'); - mc->szSessionCacheDataFile = - ap_server_root_relative(mc->pPool, colon+1); - if (!mc->szSessionCacheDataFile) { - return apr_psprintf(cmd->pool, - "SSLSessionCache: Invalid cache file path %s", - colon+1); - } - mc->tSessionCacheDataTable = NULL; - mc->nSessionCacheDataSize = 1024*512; /* 512KB */ - - if ((cp = strchr(mc->szSessionCacheDataFile, '('))) { - *cp++ = NUL; - - if (!(cp2 = strchr(cp, ')'))) { - return "SSLSessionCache: Invalid argument: " - "no closing parenthesis"; - } - - *cp2 = NUL; - - mc->nSessionCacheDataSize = atoi(cp); - - if (mc->nSessionCacheDataSize < 8192) { - return "SSLSessionCache: Invalid argument: " - "size has to be >= 8192 bytes"; - - } - - if (mc->nSessionCacheDataSize >= APR_SHM_MAXSIZE) { - return apr_psprintf(cmd->pool, - "SSLSessionCache: Invalid argument: " - "size has to be < %d bytes on this " - "platform", APR_SHM_MAXSIZE); - - } - } - } - else if ((arglen > 3) && strcEQn(arg, "dc:", 3)) { -#ifdef HAVE_DISTCACHE - mc->nSessionCacheMode = SSL_SCMODE_DC; - mc->szSessionCacheDataFile = apr_pstrdup(mc->pPool, arg+3); - if (!mc->szSessionCacheDataFile) { - return apr_pstrcat(cmd->pool, - "SSLSessionCache: Invalid cache file path: ", - arg+3, NULL); - } -#else - return "SSLSessionCache: distcache support disabled"; -#endif - } - else { - return "SSLSessionCache: Invalid argument"; - } - - return NULL; -} - -const char *ssl_cmd_SSLSessionCacheTimeout(cmd_parms *cmd, - void *dcfg, - const char *arg) -{ - SSLSrvConfigRec *sc = mySrvConfig(cmd->server); - - sc->session_cache_timeout = atoi(arg); - - if (sc->session_cache_timeout < 0) { - return "SSLSessionCacheTimeout: Invalid argument"; - } - - return NULL; -} - -const char *ssl_cmd_SSLOptions(cmd_parms *cmd, - void *dcfg, - const char *arg) -{ - SSLDirConfigRec *dc = (SSLDirConfigRec *)dcfg; - ssl_opt_t opt; - int first = TRUE; - char action, *w; - - while (*arg) { - w = ap_getword_conf(cmd->pool, &arg); - action = NUL; - - if ((*w == '+') || (*w == '-')) { - action = *(w++); - } - else if (first) { - dc->nOptions = SSL_OPT_NONE; - first = FALSE; - } - - if (strcEQ(w, "StdEnvVars")) { - opt = SSL_OPT_STDENVVARS; - } - else if (strcEQ(w, "ExportCertData")) { - opt = SSL_OPT_EXPORTCERTDATA; - } - else if (strcEQ(w, "FakeBasicAuth")) { - opt = SSL_OPT_FAKEBASICAUTH; - } - else if (strcEQ(w, "StrictRequire")) { - opt = SSL_OPT_STRICTREQUIRE; - } - else if (strcEQ(w, "OptRenegotiate")) { - opt = SSL_OPT_OPTRENEGOTIATE; - } - else { - return apr_pstrcat(cmd->pool, - "SSLOptions: Illegal option '", w, "'", - NULL); - } - - if (action == '-') { - dc->nOptionsAdd &= ~opt; - dc->nOptionsDel |= opt; - dc->nOptions &= ~opt; - } - else if (action == '+') { - dc->nOptionsAdd |= opt; - dc->nOptionsDel &= ~opt; - dc->nOptions |= opt; - } - else { - dc->nOptions = opt; - dc->nOptionsAdd = opt; - dc->nOptionsDel = SSL_OPT_NONE; - } - } - - return NULL; -} - -const char *ssl_cmd_SSLRequireSSL(cmd_parms *cmd, void *dcfg) -{ - SSLDirConfigRec *dc = (SSLDirConfigRec *)dcfg; - - dc->bSSLRequired = TRUE; - - return NULL; -} - -const char *ssl_cmd_SSLRequire(cmd_parms *cmd, - void *dcfg, - const char *arg) -{ - SSLDirConfigRec *dc = (SSLDirConfigRec *)dcfg; - ssl_expr *expr; - ssl_require_t *require; - - if (!(expr = ssl_expr_comp(cmd->pool, (char *)arg))) { - return apr_pstrcat(cmd->pool, "SSLRequire: ", - ssl_expr_get_error(), NULL); - } - - require = apr_array_push(dc->aRequirement); - require->cpExpr = apr_pstrdup(cmd->pool, arg); - require->mpExpr = expr; - - return NULL; -} - -static const char *ssl_cmd_protocol_parse(cmd_parms *parms, - const char *arg, - ssl_proto_t *options) -{ - ssl_proto_t thisopt; - - *options = SSL_PROTOCOL_NONE; - - while (*arg) { - char *w = ap_getword_conf(parms->temp_pool, &arg); - char action = '\0'; - - if ((*w == '+') || (*w == '-')) { - action = *(w++); - } - - if (strcEQ(w, "SSLv2")) { - thisopt = SSL_PROTOCOL_SSLV2; - } - else if (strcEQ(w, "SSLv3")) { - thisopt = SSL_PROTOCOL_SSLV3; - } - else if (strcEQ(w, "TLSv1")) { - thisopt = SSL_PROTOCOL_TLSV1; - } - else if (strcEQ(w, "all")) { - thisopt = SSL_PROTOCOL_ALL; - } - else { - return apr_pstrcat(parms->temp_pool, - parms->cmd->name, - ": Illegal protocol '", - w, "'", NULL); - } - - if (action == '-') { - *options &= ~thisopt; - } - else if (action == '+') { - *options |= thisopt; - } - else { - *options = thisopt; - } - } - - return NULL; -} - -const char *ssl_cmd_SSLProtocol(cmd_parms *cmd, - void *dcfg, - const char *arg) -{ - SSLSrvConfigRec *sc = mySrvConfig(cmd->server); - - return ssl_cmd_protocol_parse(cmd, arg, &sc->server->protocol); -} - -const char *ssl_cmd_SSLProxyEngine(cmd_parms *cmd, void *dcfg, int flag) -{ - SSLSrvConfigRec *sc = mySrvConfig(cmd->server); - - sc->proxy_enabled = flag ? TRUE : FALSE; - - return NULL; -} - -const char *ssl_cmd_SSLProxyProtocol(cmd_parms *cmd, - void *dcfg, - const char *arg) -{ - SSLSrvConfigRec *sc = mySrvConfig(cmd->server); - - return ssl_cmd_protocol_parse(cmd, arg, &sc->proxy->protocol); -} - -const char *ssl_cmd_SSLProxyCipherSuite(cmd_parms *cmd, - void *dcfg, - const char *arg) -{ - SSLSrvConfigRec *sc = mySrvConfig(cmd->server); - - sc->proxy->auth.cipher_suite = arg; - - return NULL; -} - -const char *ssl_cmd_SSLProxyVerify(cmd_parms *cmd, - void *dcfg, - const char *arg) -{ - SSLSrvConfigRec *sc = mySrvConfig(cmd->server); - ssl_verify_t mode; - const char *err; - - if ((err = ssl_cmd_verify_parse(cmd, arg, &mode))) { - return err; - } - - sc->proxy->auth.verify_mode = mode; - - return NULL; -} - -const char *ssl_cmd_SSLProxyVerifyDepth(cmd_parms *cmd, - void *dcfg, - const char *arg) -{ - SSLSrvConfigRec *sc = mySrvConfig(cmd->server); - int depth; - const char *err; - - if ((err = ssl_cmd_verify_depth_parse(cmd, arg, &depth))) { - return err; - } - - sc->proxy->auth.verify_depth = depth; - - return NULL; -} - -const char *ssl_cmd_SSLProxyCACertificateFile(cmd_parms *cmd, - void *dcfg, - const char *arg) -{ - SSLSrvConfigRec *sc = mySrvConfig(cmd->server); - const char *err; - - if ((err = ssl_cmd_check_file(cmd, &arg))) { - return err; - } - - sc->proxy->auth.ca_cert_file = arg; - - return NULL; -} - -const char *ssl_cmd_SSLProxyCACertificatePath(cmd_parms *cmd, - void *dcfg, - const char *arg) -{ - SSLSrvConfigRec *sc = mySrvConfig(cmd->server); - const char *err; - - if ((err = ssl_cmd_check_dir(cmd, &arg))) { - return err; - } - - sc->proxy->auth.ca_cert_path = arg; - - return NULL; -} - -const char *ssl_cmd_SSLProxyCARevocationPath(cmd_parms *cmd, - void *dcfg, - const char *arg) -{ - SSLSrvConfigRec *sc = mySrvConfig(cmd->server); - const char *err; - - if ((err = ssl_cmd_check_dir(cmd, &arg))) { - return err; - } - - sc->proxy->crl_path = arg; - - return NULL; -} - -const char *ssl_cmd_SSLProxyCARevocationFile(cmd_parms *cmd, - void *dcfg, - const char *arg) -{ - SSLSrvConfigRec *sc = mySrvConfig(cmd->server); - const char *err; - - if ((err = ssl_cmd_check_file(cmd, &arg))) { - return err; - } - - sc->proxy->crl_file = arg; - - return NULL; -} - -const char *ssl_cmd_SSLProxyMachineCertificateFile(cmd_parms *cmd, - void *dcfg, - const char *arg) -{ - SSLSrvConfigRec *sc = mySrvConfig(cmd->server); - const char *err; - - if ((err = ssl_cmd_check_file(cmd, &arg))) { - return err; - } - - sc->proxy->pkp->cert_file = arg; - - return NULL; -} - -const char *ssl_cmd_SSLProxyMachineCertificatePath(cmd_parms *cmd, - void *dcfg, - const char *arg) -{ - SSLSrvConfigRec *sc = mySrvConfig(cmd->server); - const char *err; - - if ((err = ssl_cmd_check_dir(cmd, &arg))) { - return err; - } - - sc->proxy->pkp->cert_path = arg; - - return NULL; -} - - -const char *ssl_cmd_SSLUserName(cmd_parms *cmd, void *dcfg, - const char *arg) -{ - SSLDirConfigRec *dc = (SSLDirConfigRec *)dcfg; - dc->szUserName = arg; - return NULL; -} - -void ssl_hook_ConfigTest(apr_pool_t *pconf, server_rec *s) -{ - if (!ap_exists_config_define("DUMP_CERTS")) { - return; - } - - /* Dump the filenames of all configured server certificates to - * stdout. */ - while (s) { - SSLSrvConfigRec *sc = mySrvConfig(s); - - if (sc && sc->server && sc->server->pks) { - modssl_pk_server_t *const pks = sc->server->pks; - int i; - - for (i = 0; (i < SSL_AIDX_MAX) && pks->cert_files[i]; i++) { - printf("%s\n", pks->cert_files[i]); - } - } - - s = s->next; - } - -} diff --git a/trunk/modules/ssl/ssl_engine_dh.c b/trunk/modules/ssl/ssl_engine_dh.c deleted file mode 100644 index 48884d241b96206dfe48fc75a366f25302292ff3..0000000000000000000000000000000000000000 --- a/trunk/modules/ssl/ssl_engine_dh.c +++ /dev/null @@ -1,208 +0,0 @@ -#if 0 -=pod -#endif - -/* Copyright 2001-2005 The Apache Software Foundation or its licensors, as - * applicable. - * - * 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_ssl - * | '_ ` _ \ / _ \ / _` | / __/ __| | Apache Interface to OpenSSL - * | | | | | | (_) | (_| | \__ \__ \ | - * |_| |_| |_|\___/ \__,_|___|___/___/_| - * |_____| - * ssl_engine_dh.c - * Diffie-Hellman Built-in Temporary Parameters - */ - -#include "ssl_private.h" - -/* ----BEGIN GENERATED SECTION-------- */ - -/* -** Diffie-Hellman-Parameters: (512 bit) -** prime: -** 00:d4:bc:d5:24:06:f6:9b:35:99:4b:88:de:5d:b8: -** 96:82:c8:15:7f:62:d8:f3:36:33:ee:57:72:f1:1f: -** 05:ab:22:d6:b5:14:5b:9f:24:1e:5a:cc:31:ff:09: -** 0a:4b:c7:11:48:97:6f:76:79:50:94:e7:1e:79:03: -** 52:9f:5a:82:4b -** generator: 2 (0x2) -** Diffie-Hellman-Parameters: (1024 bit) -** prime: -** 00:e6:96:9d:3d:49:5b:e3:2c:7c:f1:80:c3:bd:d4: -** 79:8e:91:b7:81:82:51:bb:05:5e:2a:20:64:90:4a: -** 79:a7:70:fa:15:a2:59:cb:d5:23:a6:a6:ef:09:c4: -** 30:48:d5:a2:2f:97:1f:3c:20:12:9b:48:00:0e:6e: -** dd:06:1c:bc:05:3e:37:1d:79:4e:53:27:df:61:1e: -** bb:be:1b:ac:9b:5c:60:44:cf:02:3d:76:e0:5e:ea: -** 9b:ad:99:1b:13:a6:3c:97:4e:9e:f1:83:9e:b5:db: -** 12:51:36:f7:26:2e:56:a8:87:15:38:df:d8:23:c6: -** 50:50:85:e2:1f:0d:d5:c8:6b -** generator: 2 (0x2) -*/ - -static unsigned char dh512_p[] = -{ - 0xD4, 0xBC, 0xD5, 0x24, 0x06, 0xF6, 0x9B, 0x35, 0x99, 0x4B, 0x88, 0xDE, - 0x5D, 0xB8, 0x96, 0x82, 0xC8, 0x15, 0x7F, 0x62, 0xD8, 0xF3, 0x36, 0x33, - 0xEE, 0x57, 0x72, 0xF1, 0x1F, 0x05, 0xAB, 0x22, 0xD6, 0xB5, 0x14, 0x5B, - 0x9F, 0x24, 0x1E, 0x5A, 0xCC, 0x31, 0xFF, 0x09, 0x0A, 0x4B, 0xC7, 0x11, - 0x48, 0x97, 0x6F, 0x76, 0x79, 0x50, 0x94, 0xE7, 0x1E, 0x79, 0x03, 0x52, - 0x9F, 0x5A, 0x82, 0x4B, -}; -static unsigned char dh512_g[] = -{ - 0x02, -}; - -static DH *get_dh512(void) -{ - return modssl_dh_configure(dh512_p, sizeof(dh512_p), - dh512_g, sizeof(dh512_g)); -} - -static unsigned char dh1024_p[] = -{ - 0xE6, 0x96, 0x9D, 0x3D, 0x49, 0x5B, 0xE3, 0x2C, 0x7C, 0xF1, 0x80, 0xC3, - 0xBD, 0xD4, 0x79, 0x8E, 0x91, 0xB7, 0x81, 0x82, 0x51, 0xBB, 0x05, 0x5E, - 0x2A, 0x20, 0x64, 0x90, 0x4A, 0x79, 0xA7, 0x70, 0xFA, 0x15, 0xA2, 0x59, - 0xCB, 0xD5, 0x23, 0xA6, 0xA6, 0xEF, 0x09, 0xC4, 0x30, 0x48, 0xD5, 0xA2, - 0x2F, 0x97, 0x1F, 0x3C, 0x20, 0x12, 0x9B, 0x48, 0x00, 0x0E, 0x6E, 0xDD, - 0x06, 0x1C, 0xBC, 0x05, 0x3E, 0x37, 0x1D, 0x79, 0x4E, 0x53, 0x27, 0xDF, - 0x61, 0x1E, 0xBB, 0xBE, 0x1B, 0xAC, 0x9B, 0x5C, 0x60, 0x44, 0xCF, 0x02, - 0x3D, 0x76, 0xE0, 0x5E, 0xEA, 0x9B, 0xAD, 0x99, 0x1B, 0x13, 0xA6, 0x3C, - 0x97, 0x4E, 0x9E, 0xF1, 0x83, 0x9E, 0xB5, 0xDB, 0x12, 0x51, 0x36, 0xF7, - 0x26, 0x2E, 0x56, 0xA8, 0x87, 0x15, 0x38, 0xDF, 0xD8, 0x23, 0xC6, 0x50, - 0x50, 0x85, 0xE2, 0x1F, 0x0D, 0xD5, 0xC8, 0x6B, -}; -static unsigned char dh1024_g[] = -{ - 0x02, -}; - -static DH *get_dh1024(void) -{ - return modssl_dh_configure(dh1024_p, sizeof(dh1024_p), - dh1024_g, sizeof(dh1024_g)); -} -/* ----END GENERATED SECTION---------- */ - -DH *ssl_dh_GetTmpParam(int nKeyLen) -{ - DH *dh; - - if (nKeyLen == 512) - dh = get_dh512(); - else if (nKeyLen == 1024) - dh = get_dh1024(); - else - dh = get_dh1024(); - return dh; -} - -DH *ssl_dh_GetParamFromFile(char *file) -{ - DH *dh = NULL; - BIO *bio; - - if ((bio = BIO_new_file(file, "r")) == NULL) - return NULL; -#if SSL_LIBRARY_VERSION < 0x00904000 - dh = PEM_read_bio_DHparams(bio, NULL, NULL); -#else - dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL); -#endif - BIO_free(bio); - return (dh); -} - -/* -=cut -## -## Embedded Perl script for generating the temporary DH parameters -## - -require 5.003; -use strict; - -# configuration -my $file = $0; -my $begin = '----BEGIN GENERATED SECTION--------'; -my $end = '----END GENERATED SECTION----------'; - -# read ourself and keep a backup -open(FP, "<$file") || die; -my $source = ''; -$source .= $_ while (); -close(FP); -open(FP, ">$file.bak") || die; -print FP $source; -close(FP); - -# generate the DH parameters -print "1. Generate 512 and 1024 bit Diffie-Hellman parameters (p, g)\n"; -my $rand = ''; -foreach $file (qw(/var/log/messages /var/adm/messages - /kernel /vmunix /vmlinuz /etc/hosts /etc/resolv.conf)) { - if (-f $file) { - $rand = $file if ($rand eq ''); - $rand .= ":$file" if ($rand ne ''); - } -} -$rand = "-rand $rand" if ($rand ne ''); -system("openssl gendh $rand -out dh512.pem 512"); -system("openssl gendh $rand -out dh1024.pem 1024"); - -# generate DH param info -my $dhinfo = ''; -open(FP, "openssl dh -noout -text -in dh512.pem |") || die; -$dhinfo .= $_ while (); -close(FP); -open(FP, "openssl dh -noout -text -in dh1024.pem |") || die; -$dhinfo .= $_ while (); -close(FP); -$dhinfo =~ s|^|** |mg; -$dhinfo = "\n\/\*\n$dhinfo\*\/\n\n"; - -# generate C source from DH params -my $dhsource = ''; -open(FP, "openssl dh -noout -C -in dh512.pem | indent | expand |") || die; -$dhsource .= $_ while (); -close(FP); -open(FP, "openssl dh -noout -C -in dh1024.pem | indent | expand |") || die; -$dhsource .= $_ while (); -close(FP); -$dhsource =~ s|(DH\s+\*get_dh)|static $1|sg; - -# generate output -my $o = $dhinfo . $dhsource; - -# insert the generated code at the target location -$source =~ s|(\/\* $begin.+?\n).*\n(.*?\/\* $end)|$1$o$2|s; - -# and update the source on disk -print "Updating file `$file'\n"; -open(FP, ">$file") || die; -print FP $source; -close(FP); - -# cleanup -unlink("dh512.pem"); -unlink("dh1024.pem"); - -=pod -*/ diff --git a/trunk/modules/ssl/ssl_engine_init.c b/trunk/modules/ssl/ssl_engine_init.c deleted file mode 100644 index 90094df44fbc287507b89730585507a020135d58..0000000000000000000000000000000000000000 --- a/trunk/modules/ssl/ssl_engine_init.c +++ /dev/null @@ -1,1264 +0,0 @@ -/* Copyright 2001-2005 The Apache Software Foundation or its licensors, as - * applicable. - * - * 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_ssl - * | '_ ` _ \ / _ \ / _` | / __/ __| | Apache Interface to OpenSSL - * | | | | | | (_) | (_| | \__ \__ \ | - * |_| |_| |_|\___/ \__,_|___|___/___/_| - * |_____| - * ssl_engine_init.c - * Initialization of Servers - */ - /* ``Recursive, adj.; - see Recursive.'' - -- Unknown */ -#include "ssl_private.h" - -/* _________________________________________________________________ -** -** Module Initialization -** _________________________________________________________________ -*/ - -static char *ssl_add_version_component(apr_pool_t *p, - server_rec *s, - char *name) -{ - char *val = ssl_var_lookup(p, s, NULL, NULL, name); - - if (val && *val) { - ap_add_version_component(p, val); - } - - return val; -} - -static char *version_components[] = { - "SSL_VERSION_PRODUCT", - "SSL_VERSION_INTERFACE", - "SSL_VERSION_LIBRARY", - NULL -}; - -static void ssl_add_version_components(apr_pool_t *p, - server_rec *s) -{ - char *vals[sizeof(version_components)/sizeof(char *)]; - int i; - - for (i=0; version_components[i]; i++) { - vals[i] = ssl_add_version_component(p, s, - version_components[i]); - } - - ap_log_error(APLOG_MARK, APLOG_INFO, 0, s, - "Server: %s, Interface: %s, Library: %s", - AP_SERVER_BASEVERSION, - vals[1], /* SSL_VERSION_INTERFACE */ - vals[2]); /* SSL_VERSION_LIBRARY */ -} - - -/* - * Handle the Temporary RSA Keys and DH Params - */ - -#define MODSSL_TMP_KEY_FREE(mc, type, idx) \ - if (mc->pTmpKeys[idx]) { \ - type##_free((type *)mc->pTmpKeys[idx]); \ - mc->pTmpKeys[idx] = NULL; \ - } - -#define MODSSL_TMP_KEYS_FREE(mc, type) \ - MODSSL_TMP_KEY_FREE(mc, type, SSL_TMP_KEY_##type##_512); \ - MODSSL_TMP_KEY_FREE(mc, type, SSL_TMP_KEY_##type##_1024) - -static void ssl_tmp_keys_free(server_rec *s) -{ - SSLModConfigRec *mc = myModConfig(s); - - MODSSL_TMP_KEYS_FREE(mc, RSA); - MODSSL_TMP_KEYS_FREE(mc, DH); -} - -static int ssl_tmp_key_init_rsa(server_rec *s, - int bits, int idx) -{ - SSLModConfigRec *mc = myModConfig(s); - - if (!(mc->pTmpKeys[idx] = - RSA_generate_key(bits, RSA_F4, NULL, NULL))) - { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, - "Init: Failed to generate temporary " - "%d bit RSA private key", bits); - return !OK; - } - - return OK; -} - -static int ssl_tmp_key_init_dh(server_rec *s, - int bits, int idx) -{ - SSLModConfigRec *mc = myModConfig(s); - - if (!(mc->pTmpKeys[idx] = - ssl_dh_GetTmpParam(bits))) - { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, - "Init: Failed to generate temporary " - "%d bit DH parameters", bits); - return !OK; - } - - return OK; -} - -#define MODSSL_TMP_KEY_INIT_RSA(s, bits) \ - ssl_tmp_key_init_rsa(s, bits, SSL_TMP_KEY_RSA_##bits) - -#define MODSSL_TMP_KEY_INIT_DH(s, bits) \ - ssl_tmp_key_init_dh(s, bits, SSL_TMP_KEY_DH_##bits) - -static int ssl_tmp_keys_init(server_rec *s) -{ - ap_log_error(APLOG_MARK, APLOG_INFO, 0, s, - "Init: Generating temporary RSA private keys (512/1024 bits)"); - - if (MODSSL_TMP_KEY_INIT_RSA(s, 512) || - MODSSL_TMP_KEY_INIT_RSA(s, 1024)) { - return !OK; - } - - ap_log_error(APLOG_MARK, APLOG_INFO, 0, s, - "Init: Generating temporary DH parameters (512/1024 bits)"); - - if (MODSSL_TMP_KEY_INIT_DH(s, 512) || - MODSSL_TMP_KEY_INIT_DH(s, 1024)) { - return !OK; - } - - return OK; -} - -/* - * Per-module initialization - */ -int ssl_init_Module(apr_pool_t *p, apr_pool_t *plog, - apr_pool_t *ptemp, - server_rec *base_server) -{ - SSLModConfigRec *mc = myModConfig(base_server); - SSLSrvConfigRec *sc; - server_rec *s; - - /* We initialize mc->pid per-process in the child init, - * but it should be initialized for startup before we - * call ssl_rand_seed() below. - */ - mc->pid = getpid(); - - /* - * Let us cleanup on restarts and exists - */ - apr_pool_cleanup_register(p, base_server, - ssl_init_ModuleKill, - apr_pool_cleanup_null); - - /* - * Any init round fixes the global config - */ - ssl_config_global_create(base_server); /* just to avoid problems */ - ssl_config_global_fix(mc); - - /* - * try to fix the configuration and open the dedicated SSL - * logfile as early as possible - */ - for (s = base_server; s; s = s->next) { - sc = mySrvConfig(s); - - if (sc->server) { - sc->server->sc = sc; - } - - if (sc->proxy) { - sc->proxy->sc = sc; - } - - /* - * Create the server host:port string because we need it a lot - */ - sc->vhost_id = ssl_util_vhostid(p, s); - sc->vhost_id_len = strlen(sc->vhost_id); - - /* If sc->enabled is UNSET, then SSL is optional on this vhost */ - /* Fix up stuff that may not have been set */ - if (sc->enabled == SSL_ENABLED_UNSET) { - sc->enabled = SSL_ENABLED_FALSE; - } - if (sc->proxy_enabled == UNSET) { - sc->proxy_enabled = FALSE; - } - - if (sc->session_cache_timeout == UNSET) { - sc->session_cache_timeout = SSL_SESSION_CACHE_TIMEOUT; - } - - if (sc->server->pphrase_dialog_type == SSL_PPTYPE_UNSET) { - sc->server->pphrase_dialog_type = SSL_PPTYPE_BUILTIN; - } - - } - - /* - * SSL external crypto device ("engine") support - */ -#if defined(HAVE_OPENSSL_ENGINE_H) && defined(HAVE_ENGINE_INIT) - ssl_init_Engine(base_server, p); -#endif - -#if APR_HAS_THREADS - ssl_util_thread_setup(p); -#endif - - ap_log_error(APLOG_MARK, APLOG_INFO, 0, s, - "Init: Initialized %s library", SSL_LIBRARY_NAME); - - /* - * Seed the Pseudo Random Number Generator (PRNG) - * only need ptemp here; nothing inside allocated from the pool - * needs to live once we return from ssl_rand_seed(). - */ - ssl_rand_seed(base_server, ptemp, SSL_RSCTX_STARTUP, "Init: "); - - /* - * read server private keys/public certs into memory. - * decrypting any encrypted keys via configured SSLPassPhraseDialogs - * anything that needs to live longer than ptemp needs to also survive - * restarts, in which case they'll live inside s->process->pool. - */ - ssl_pphrase_Handle(base_server, ptemp); - - if (ssl_tmp_keys_init(base_server)) { - return !OK; - } - - /* - * initialize the mutex handling - */ - if (!ssl_mutex_init(base_server, p)) { - return HTTP_INTERNAL_SERVER_ERROR; - } - - /* - * initialize session caching - */ - ssl_scache_init(base_server, p); - - /* - * initialize servers - */ - ap_log_error(APLOG_MARK, APLOG_INFO, 0, base_server, - "Init: Initializing (virtual) servers for SSL"); - - for (s = base_server; s; s = s->next) { - sc = mySrvConfig(s); - /* - * Either now skip this server when SSL is disabled for - * it or give out some information about what we're - * configuring. - */ - - /* - * Read the server certificate and key - */ - ssl_init_ConfigureServer(s, p, ptemp, sc); - } - - /* - * Configuration consistency checks - */ - ssl_init_CheckServers(base_server, ptemp); - - /* - * Announce mod_ssl and SSL library in HTTP Server field - * as ``mod_ssl/X.X.X OpenSSL/X.X.X'' - */ - ssl_add_version_components(p, base_server); - - SSL_init_app_data2_idx(); /* for SSL_get_app_data2() at request time */ - - return OK; -} - -/* - * Support for external a Crypto Device ("engine"), usually - * a hardware accellerator card for crypto operations. - */ -#if defined(HAVE_OPENSSL_ENGINE_H) && defined(HAVE_ENGINE_INIT) -void ssl_init_Engine(server_rec *s, apr_pool_t *p) -{ - SSLModConfigRec *mc = myModConfig(s); - ENGINE *e; - - if (mc->szCryptoDevice) { - if (!(e = ENGINE_by_id(mc->szCryptoDevice))) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, - "Init: Failed to load Crypto Device API `%s'", - mc->szCryptoDevice); - ssl_log_ssl_error(APLOG_MARK, APLOG_ERR, s); - ssl_die(); - } - - if (strEQ(mc->szCryptoDevice, "chil")) { - ENGINE_ctrl(e, ENGINE_CTRL_CHIL_SET_FORKCHECK, 1, 0, 0); - } - - if (!ENGINE_set_default(e, ENGINE_METHOD_ALL)) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, - "Init: Failed to enable Crypto Device API `%s'", - mc->szCryptoDevice); - ssl_log_ssl_error(APLOG_MARK, APLOG_ERR, s); - ssl_die(); - } - - ENGINE_free(e); - } -} -#endif - -static void ssl_init_server_check(server_rec *s, - apr_pool_t *p, - apr_pool_t *ptemp, - modssl_ctx_t *mctx) -{ - /* - * check for important parameters and the - * possibility that the user forgot to set them. - */ - if (!mctx->pks->cert_files[0]) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, - "No SSL Certificate set [hint: SSLCertificateFile]"); - ssl_die(); - } - - /* - * Check for problematic re-initializations - */ - if (mctx->pks->certs[SSL_AIDX_RSA] || - mctx->pks->certs[SSL_AIDX_DSA]) - { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, - "Illegal attempt to re-initialise SSL for server " - "(theoretically shouldn't happen!)"); - ssl_die(); - } -} - -static void ssl_init_ctx_protocol(server_rec *s, - apr_pool_t *p, - apr_pool_t *ptemp, - modssl_ctx_t *mctx) -{ - SSL_CTX *ctx = NULL; - SSL_METHOD *method = NULL; - char *cp; - int protocol = mctx->protocol; - - /* - * Create the new per-server SSL context - */ - if (protocol == SSL_PROTOCOL_NONE) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, - "No SSL protocols available [hint: SSLProtocol]"); - ssl_die(); - } - - cp = apr_pstrcat(p, - (protocol & SSL_PROTOCOL_SSLV2 ? "SSLv2, " : ""), - (protocol & SSL_PROTOCOL_SSLV3 ? "SSLv3, " : ""), - (protocol & SSL_PROTOCOL_TLSV1 ? "TLSv1, " : ""), - NULL); - cp[strlen(cp)-2] = NUL; - - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "Creating new SSL context (protocols: %s)", cp); - - if (protocol == SSL_PROTOCOL_SSLV2) { - method = mctx->pkp ? - SSLv2_client_method() : /* proxy */ - SSLv2_server_method(); /* server */ - ctx = SSL_CTX_new(method); /* only SSLv2 is left */ - } - else { - method = mctx->pkp ? - SSLv23_client_method() : /* proxy */ - SSLv23_server_method(); /* server */ - ctx = SSL_CTX_new(method); /* be more flexible */ - } - - mctx->ssl_ctx = ctx; - - SSL_CTX_set_options(ctx, SSL_OP_ALL); - - if (!(protocol & SSL_PROTOCOL_SSLV2)) { - SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv2); - } - - if (!(protocol & SSL_PROTOCOL_SSLV3)) { - SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv3); - } - - if (!(protocol & SSL_PROTOCOL_TLSV1)) { - SSL_CTX_set_options(ctx, SSL_OP_NO_TLSv1); - } - -#ifdef SSL_OP_CIPHER_SERVER_PREFERENCE - { - SSLSrvConfigRec *sc = mySrvConfig(s); - if (sc->cipher_server_pref == TRUE) { - SSL_CTX_set_options(ctx, SSL_OP_CIPHER_SERVER_PREFERENCE); - } - } -#endif - - SSL_CTX_set_app_data(ctx, s); - - /* - * Configure additional context ingredients - */ - SSL_CTX_set_options(ctx, SSL_OP_SINGLE_DH_USE); - -#ifdef SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION - /* - * Disallow a session from being resumed during a renegotiation, - * so that an acceptable cipher suite can be negotiated. - */ - SSL_CTX_set_options(ctx, SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION); -#endif -} - -static void ssl_init_ctx_session_cache(server_rec *s, - apr_pool_t *p, - apr_pool_t *ptemp, - modssl_ctx_t *mctx) -{ - SSL_CTX *ctx = mctx->ssl_ctx; - SSLModConfigRec *mc = myModConfig(s); - long cache_mode = SSL_SESS_CACHE_OFF; - - if (mc->nSessionCacheMode != SSL_SCMODE_NONE) { - /* SSL_SESS_CACHE_NO_INTERNAL will force OpenSSL - * to ignore process local-caching and - * to always get/set/delete sessions using mod_ssl's callbacks. - */ - cache_mode = SSL_SESS_CACHE_SERVER|SSL_SESS_CACHE_NO_INTERNAL; - } - - SSL_CTX_set_session_cache_mode(ctx, cache_mode); - - SSL_CTX_sess_set_new_cb(ctx, ssl_callback_NewSessionCacheEntry); - SSL_CTX_sess_set_get_cb(ctx, ssl_callback_GetSessionCacheEntry); - SSL_CTX_sess_set_remove_cb(ctx, ssl_callback_DelSessionCacheEntry); -} - -static void ssl_init_ctx_callbacks(server_rec *s, - apr_pool_t *p, - apr_pool_t *ptemp, - modssl_ctx_t *mctx) -{ - SSL_CTX *ctx = mctx->ssl_ctx; - - SSL_CTX_set_tmp_rsa_callback(ctx, ssl_callback_TmpRSA); - SSL_CTX_set_tmp_dh_callback(ctx, ssl_callback_TmpDH); - - if (s->loglevel >= APLOG_DEBUG) { - /* this callback only logs if LogLevel >= info */ - SSL_CTX_set_info_callback(ctx, ssl_callback_LogTracingState); - } -} - -static void ssl_init_ctx_verify(server_rec *s, - apr_pool_t *p, - apr_pool_t *ptemp, - modssl_ctx_t *mctx) -{ - SSL_CTX *ctx = mctx->ssl_ctx; - - int verify = SSL_VERIFY_NONE; - STACK_OF(X509_NAME) *ca_list; - - if (mctx->auth.verify_mode == SSL_CVERIFY_UNSET) { - mctx->auth.verify_mode = SSL_CVERIFY_NONE; - } - - if (mctx->auth.verify_depth == UNSET) { - mctx->auth.verify_depth = 1; - } - - /* - * Configure callbacks for SSL context - */ - if (mctx->auth.verify_mode == SSL_CVERIFY_REQUIRE) { - verify |= SSL_VERIFY_PEER_STRICT; - } - - if ((mctx->auth.verify_mode == SSL_CVERIFY_OPTIONAL) || - (mctx->auth.verify_mode == SSL_CVERIFY_OPTIONAL_NO_CA)) - { - verify |= SSL_VERIFY_PEER; - } - - SSL_CTX_set_verify(ctx, verify, ssl_callback_SSLVerify); - - /* - * Configure Client Authentication details - */ - if (mctx->auth.ca_cert_file || mctx->auth.ca_cert_path) { - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "Configuring client authentication"); - - if (!SSL_CTX_load_verify_locations(ctx, - MODSSL_PCHAR_CAST mctx->auth.ca_cert_file, - MODSSL_PCHAR_CAST mctx->auth.ca_cert_path)) - { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, - "Unable to configure verify locations " - "for client authentication"); - ssl_log_ssl_error(APLOG_MARK, APLOG_ERR, s); - ssl_die(); - } - - if (mctx->pks && (mctx->pks->ca_name_file || mctx->pks->ca_name_path)) { - ca_list = ssl_init_FindCAList(s, ptemp, - mctx->pks->ca_name_file, - mctx->pks->ca_name_path); - } else - ca_list = ssl_init_FindCAList(s, ptemp, - mctx->auth.ca_cert_file, - mctx->auth.ca_cert_path); - if (!ca_list) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, - "Unable to determine list of acceptable " - "CA certificates for client authentication"); - ssl_die(); - } - - SSL_CTX_set_client_CA_list(ctx, (STACK *)ca_list); - } - - /* - * Give a warning when no CAs were configured but client authentication - * should take place. This cannot work. - */ - if (mctx->auth.verify_mode == SSL_CVERIFY_REQUIRE) { - ca_list = (STACK_OF(X509_NAME) *)SSL_CTX_get_client_CA_list(ctx); - - if (sk_X509_NAME_num(ca_list) == 0) { - ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s, - "Init: Oops, you want to request client " - "authentication, but no CAs are known for " - "verification!? [Hint: SSLCACertificate*]"); - } - } -} - -static void ssl_init_ctx_cipher_suite(server_rec *s, - apr_pool_t *p, - apr_pool_t *ptemp, - modssl_ctx_t *mctx) -{ - SSL_CTX *ctx = mctx->ssl_ctx; - const char *suite = mctx->auth.cipher_suite; - - /* - * Configure SSL Cipher Suite - */ - if (!suite) { - return; - } - - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "Configuring permitted SSL ciphers [%s]", - suite); - - if (!SSL_CTX_set_cipher_list(ctx, MODSSL_PCHAR_CAST suite)) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, - "Unable to configure permitted SSL ciphers"); - ssl_log_ssl_error(APLOG_MARK, APLOG_ERR, s); - ssl_die(); - } -} - -static void ssl_init_ctx_crl(server_rec *s, - apr_pool_t *p, - apr_pool_t *ptemp, - modssl_ctx_t *mctx) -{ - /* - * Configure Certificate Revocation List (CRL) Details - */ - - if (!(mctx->crl_file || mctx->crl_path)) { - return; - } - - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "Configuring certificate revocation facility"); - - mctx->crl = - SSL_X509_STORE_create((char *)mctx->crl_file, - (char *)mctx->crl_path); - - if (!mctx->crl) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, - "Unable to configure X.509 CRL storage " - "for certificate revocation"); - ssl_log_ssl_error(APLOG_MARK, APLOG_ERR, s); - ssl_die(); - } -} - -static void ssl_init_ctx_cert_chain(server_rec *s, - apr_pool_t *p, - apr_pool_t *ptemp, - modssl_ctx_t *mctx) -{ - BOOL skip_first = FALSE; - int i, n; - const char *chain = mctx->cert_chain; - - /* - * Optionally configure extra server certificate chain certificates. - * This is usually done by OpenSSL automatically when one of the - * server cert issuers are found under SSLCACertificatePath or in - * SSLCACertificateFile. But because these are intended for client - * authentication it can conflict. For instance when you use a - * Global ID server certificate you've to send out the intermediate - * CA certificate, too. When you would just configure this with - * SSLCACertificateFile and also use client authentication mod_ssl - * would accept all clients also issued by this CA. Obviously this - * isn't what we want in this situation. So this feature here exists - * to allow one to explicity configure CA certificates which are - * used only for the server certificate chain. - */ - if (!chain) { - return; - } - - for (i = 0; (i < SSL_AIDX_MAX) && mctx->pks->cert_files[i]; i++) { - if (strEQ(mctx->pks->cert_files[i], chain)) { - skip_first = TRUE; - break; - } - } - - n = SSL_CTX_use_certificate_chain(mctx->ssl_ctx, - (char *)chain, - skip_first, NULL); - if (n < 0) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, - "Failed to configure CA certificate chain!"); - ssl_die(); - } - - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "Configuring server certificate chain " - "(%d CA certificate%s)", - n, n == 1 ? "" : "s"); -} - -static void ssl_init_ctx(server_rec *s, - apr_pool_t *p, - apr_pool_t *ptemp, - modssl_ctx_t *mctx) -{ - ssl_init_ctx_protocol(s, p, ptemp, mctx); - - ssl_init_ctx_session_cache(s, p, ptemp, mctx); - - ssl_init_ctx_callbacks(s, p, ptemp, mctx); - - ssl_init_ctx_verify(s, p, ptemp, mctx); - - ssl_init_ctx_cipher_suite(s, p, ptemp, mctx); - - ssl_init_ctx_crl(s, p, ptemp, mctx); - - if (mctx->pks) { - /* XXX: proxy support? */ - ssl_init_ctx_cert_chain(s, p, ptemp, mctx); - } -} - -static int ssl_server_import_cert(server_rec *s, - modssl_ctx_t *mctx, - const char *id, - int idx) -{ - SSLModConfigRec *mc = myModConfig(s); - ssl_asn1_t *asn1; - unsigned char *ptr; - const char *type = ssl_asn1_keystr(idx); - X509 *cert; - - if (!(asn1 = ssl_asn1_table_get(mc->tPublicCert, id))) { - return FALSE; - } - - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "Configuring %s server certificate", type); - - ptr = asn1->cpData; - if (!(cert = d2i_X509(NULL, &ptr, asn1->nData))) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, - "Unable to import %s server certificate", type); - ssl_log_ssl_error(APLOG_MARK, APLOG_ERR, s); - ssl_die(); - } - - if (SSL_CTX_use_certificate(mctx->ssl_ctx, cert) <= 0) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, - "Unable to configure %s server certificate", type); - ssl_log_ssl_error(APLOG_MARK, APLOG_ERR, s); - ssl_die(); - } - - mctx->pks->certs[idx] = cert; - - return TRUE; -} - -static int ssl_server_import_key(server_rec *s, - modssl_ctx_t *mctx, - const char *id, - int idx) -{ - SSLModConfigRec *mc = myModConfig(s); - ssl_asn1_t *asn1; - unsigned char *ptr; - const char *type = ssl_asn1_keystr(idx); - int pkey_type = (idx == SSL_AIDX_RSA) ? EVP_PKEY_RSA : EVP_PKEY_DSA; - EVP_PKEY *pkey; - - if (!(asn1 = ssl_asn1_table_get(mc->tPrivateKey, id))) { - return FALSE; - } - - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "Configuring %s server private key", type); - - ptr = asn1->cpData; - if (!(pkey = d2i_PrivateKey(pkey_type, NULL, &ptr, asn1->nData))) - { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, - "Unable to import %s server private key", type); - ssl_log_ssl_error(APLOG_MARK, APLOG_ERR, s); - ssl_die(); - } - - if (SSL_CTX_use_PrivateKey(mctx->ssl_ctx, pkey) <= 0) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, - "Unable to configure %s server private key", type); - ssl_log_ssl_error(APLOG_MARK, APLOG_ERR, s); - ssl_die(); - } - - /* - * XXX: wonder if this is still needed, this is old todo doc. - * (see http://www.psy.uq.edu.au/~ftp/Crypto/ssleay/TODO.html) - */ - if ((pkey_type == EVP_PKEY_DSA) && mctx->pks->certs[idx]) { - EVP_PKEY *pubkey = X509_get_pubkey(mctx->pks->certs[idx]); - - if (pubkey && EVP_PKEY_missing_parameters(pubkey)) { - EVP_PKEY_copy_parameters(pubkey, pkey); - ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, - "Copying DSA parameters from private key to certificate"); - ssl_log_ssl_error(APLOG_MARK, APLOG_ERR, s); - EVP_PKEY_free(pubkey); - } - } - - mctx->pks->keys[idx] = pkey; - - return TRUE; -} - -static void ssl_check_public_cert(server_rec *s, - apr_pool_t *ptemp, - X509 *cert, - int type) -{ - int is_ca, pathlen; - char *cn; - - if (!cert) { - return; - } - - /* - * Some information about the certificate(s) - */ - - if (SSL_X509_isSGC(cert)) { - ap_log_error(APLOG_MARK, APLOG_INFO, 0, s, - "%s server certificate enables " - "Server Gated Cryptography (SGC)", - ssl_asn1_keystr(type)); - } - - if (SSL_X509_getBC(cert, &is_ca, &pathlen)) { - if (is_ca) { - ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s, - "%s server certificate is a CA certificate " - "(BasicConstraints: CA == TRUE !?)", - ssl_asn1_keystr(type)); - } - - if (pathlen > 0) { - ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s, - "%s server certificate is not a leaf certificate " - "(BasicConstraints: pathlen == %d > 0 !?)", - ssl_asn1_keystr(type), pathlen); - } - } - - if (SSL_X509_getCN(ptemp, cert, &cn)) { - int fnm_flags = APR_FNM_PERIOD|APR_FNM_CASE_BLIND; - - if (apr_fnmatch_test(cn) && - (apr_fnmatch(cn, s->server_hostname, - fnm_flags) == APR_FNM_NOMATCH)) - { - ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s, - "%s server certificate wildcard CommonName (CN) `%s' " - "does NOT match server name!?", - ssl_asn1_keystr(type), cn); - } - else if (strNE(s->server_hostname, cn)) { - ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s, - "%s server certificate CommonName (CN) `%s' " - "does NOT match server name!?", - ssl_asn1_keystr(type), cn); - } - } -} - -static void ssl_init_server_certs(server_rec *s, - apr_pool_t *p, - apr_pool_t *ptemp, - modssl_ctx_t *mctx) -{ - const char *rsa_id, *dsa_id; - const char *vhost_id = mctx->sc->vhost_id; - int i; - int have_rsa, have_dsa; - - rsa_id = ssl_asn1_table_keyfmt(ptemp, vhost_id, SSL_AIDX_RSA); - dsa_id = ssl_asn1_table_keyfmt(ptemp, vhost_id, SSL_AIDX_DSA); - - have_rsa = ssl_server_import_cert(s, mctx, rsa_id, SSL_AIDX_RSA); - have_dsa = ssl_server_import_cert(s, mctx, dsa_id, SSL_AIDX_DSA); - - if (!(have_rsa || have_dsa)) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, - "Oops, no RSA or DSA server certificate found?!"); - ssl_die(); - } - - for (i = 0; i < SSL_AIDX_MAX; i++) { - ssl_check_public_cert(s, ptemp, mctx->pks->certs[i], i); - } - - have_rsa = ssl_server_import_key(s, mctx, rsa_id, SSL_AIDX_RSA); - have_dsa = ssl_server_import_key(s, mctx, dsa_id, SSL_AIDX_DSA); - - if (!(have_rsa || have_dsa)) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, - "Oops, no RSA or DSA server private key found?!"); - ssl_die(); - } -} - -static void ssl_init_proxy_certs(server_rec *s, - apr_pool_t *p, - apr_pool_t *ptemp, - modssl_ctx_t *mctx) -{ - int n, ncerts = 0; - STACK_OF(X509_INFO) *sk; - modssl_pk_proxy_t *pkp = mctx->pkp; - - SSL_CTX_set_client_cert_cb(mctx->ssl_ctx, - ssl_callback_proxy_cert); - - if (!(pkp->cert_file || pkp->cert_path)) { - return; - } - - sk = sk_X509_INFO_new_null(); - - if (pkp->cert_file) { - SSL_X509_INFO_load_file(ptemp, sk, pkp->cert_file); - } - - if (pkp->cert_path) { - SSL_X509_INFO_load_path(ptemp, sk, pkp->cert_path); - } - - if ((ncerts = sk_X509_INFO_num(sk)) <= 0) { - sk_X509_INFO_free(sk); - ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s, - "no client certs found for SSL proxy"); - return; - } - - /* Check that all client certs have got certificates and private - * keys. */ - for (n = 0; n < ncerts; n++) { - X509_INFO *inf = sk_X509_INFO_value(sk, n); - - if (!inf->x509 || !inf->x_pkey) { - sk_X509_INFO_free(sk); - ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, s, - "incomplete client cert configured for SSL proxy " - "(missing or encrypted private key?)"); - ssl_die(); - return; - } - } - - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "loaded %d client certs for SSL proxy", - ncerts); - pkp->certs = sk; -} - -static void ssl_init_proxy_ctx(server_rec *s, - apr_pool_t *p, - apr_pool_t *ptemp, - SSLSrvConfigRec *sc) -{ - ssl_init_ctx(s, p, ptemp, sc->proxy); - - ssl_init_proxy_certs(s, p, ptemp, sc->proxy); -} - -static void ssl_init_server_ctx(server_rec *s, - apr_pool_t *p, - apr_pool_t *ptemp, - SSLSrvConfigRec *sc) -{ - ssl_init_server_check(s, p, ptemp, sc->server); - - ssl_init_ctx(s, p, ptemp, sc->server); - - ssl_init_server_certs(s, p, ptemp, sc->server); -} - -/* - * Configure a particular server - */ -void ssl_init_ConfigureServer(server_rec *s, - apr_pool_t *p, - apr_pool_t *ptemp, - SSLSrvConfigRec *sc) -{ - /* Initialize the server if SSL is enabled or optional. - */ - if ((sc->enabled == SSL_ENABLED_TRUE) || (sc->enabled == SSL_ENABLED_OPTIONAL)) { - ap_log_error(APLOG_MARK, APLOG_INFO, 0, s, - "Configuring server for SSL protocol"); - ssl_init_server_ctx(s, p, ptemp, sc); - } - - if (sc->proxy_enabled) { - ssl_init_proxy_ctx(s, p, ptemp, sc); - } -} - -void ssl_init_CheckServers(server_rec *base_server, apr_pool_t *p) -{ - server_rec *s, *ps; - SSLSrvConfigRec *sc; - apr_hash_t *table; - const char *key; - apr_ssize_t klen; - - BOOL conflict = FALSE; - - /* - * Give out warnings when a server has HTTPS configured - * for the HTTP port or vice versa - */ - for (s = base_server; s; s = s->next) { - sc = mySrvConfig(s); - - if ((sc->enabled == SSL_ENABLED_TRUE) && (s->port == DEFAULT_HTTP_PORT)) { - ap_log_error(APLOG_MARK, APLOG_WARNING, 0, - base_server, - "Init: (%s) You configured HTTPS(%d) " - "on the standard HTTP(%d) port!", - ssl_util_vhostid(p, s), - DEFAULT_HTTPS_PORT, DEFAULT_HTTP_PORT); - } - - if ((sc->enabled == SSL_ENABLED_FALSE) && (s->port == DEFAULT_HTTPS_PORT)) { - ap_log_error(APLOG_MARK, APLOG_WARNING, 0, - base_server, - "Init: (%s) You configured HTTP(%d) " - "on the standard HTTPS(%d) port!", - ssl_util_vhostid(p, s), - DEFAULT_HTTP_PORT, DEFAULT_HTTPS_PORT); - } - } - - /* - * Give out warnings when more than one SSL-aware virtual server uses the - * same IP:port. This doesn't work because mod_ssl then will always use - * just the certificate/keys of one virtual host (which one cannot be said - * easily - but that doesn't matter here). - */ - table = apr_hash_make(p); - - for (s = base_server; s; s = s->next) { - sc = mySrvConfig(s); - - if (!((sc->enabled == SSL_ENABLED_TRUE) && s->addrs)) { - continue; - } - - key = apr_psprintf(p, "%pA:%u", - &s->addrs->host_addr, s->addrs->host_port); - klen = strlen(key); - - if ((ps = (server_rec *)apr_hash_get(table, key, klen))) { - ap_log_error(APLOG_MARK, APLOG_WARNING, 0, - base_server, - "Init: SSL server IP/port conflict: " - "%s (%s:%d) vs. %s (%s:%d)", - ssl_util_vhostid(p, s), - (s->defn_name ? s->defn_name : "unknown"), - s->defn_line_number, - ssl_util_vhostid(p, ps), - (ps->defn_name ? ps->defn_name : "unknown"), - ps->defn_line_number); - conflict = TRUE; - continue; - } - - apr_hash_set(table, key, klen, s); - } - - if (conflict) { - ap_log_error(APLOG_MARK, APLOG_WARNING, 0, base_server, - "Init: You should not use name-based " - "virtual hosts in conjunction with SSL!!"); - } -} - -#ifdef SSLC_VERSION_NUMBER -static int ssl_init_FindCAList_X509NameCmp(char **a, char **b) -{ - return(X509_NAME_cmp((void*)*a, (void*)*b)); -} -#else -static int ssl_init_FindCAList_X509NameCmp(X509_NAME **a, X509_NAME **b) -{ - return(X509_NAME_cmp(*a, *b)); -} -#endif - -static void ssl_init_PushCAList(STACK_OF(X509_NAME) *ca_list, - server_rec *s, const char *file) -{ - int n; - STACK_OF(X509_NAME) *sk; - - sk = (STACK_OF(X509_NAME) *) - SSL_load_client_CA_file(MODSSL_PCHAR_CAST file); - - if (!sk) { - return; - } - - for (n = 0; n < sk_X509_NAME_num(sk); n++) { - char name_buf[256]; - X509_NAME *name = sk_X509_NAME_value(sk, n); - - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "CA certificate: %s", - X509_NAME_oneline(name, name_buf, sizeof(name_buf))); - - /* - * note that SSL_load_client_CA_file() checks for duplicates, - * but since we call it multiple times when reading a directory - * we must also check for duplicates ourselves. - */ - - if (sk_X509_NAME_find(ca_list, name) < 0) { - /* this will be freed when ca_list is */ - sk_X509_NAME_push(ca_list, name); - } - else { - /* need to free this ourselves, else it will leak */ - X509_NAME_free(name); - } - } - - sk_X509_NAME_free(sk); -} - -STACK_OF(X509_NAME) *ssl_init_FindCAList(server_rec *s, - apr_pool_t *ptemp, - const char *ca_file, - const char *ca_path) -{ - STACK_OF(X509_NAME) *ca_list; - - /* - * Start with a empty stack/list where new - * entries get added in sorted order. - */ - ca_list = sk_X509_NAME_new(ssl_init_FindCAList_X509NameCmp); - - /* - * Process CA certificate bundle file - */ - if (ca_file) { - ssl_init_PushCAList(ca_list, s, ca_file); - } - - /* - * Process CA certificate path files - */ - if (ca_path) { - apr_dir_t *dir; - apr_finfo_t direntry; - apr_int32_t finfo_flags = APR_FINFO_TYPE|APR_FINFO_NAME; - apr_status_t rv; - - if ((rv = apr_dir_open(&dir, ca_path, ptemp)) != APR_SUCCESS) { - ap_log_error(APLOG_MARK, APLOG_ERR, rv, s, - "Failed to open Certificate Path `%s'", - ca_path); - ssl_die(); - } - - while ((apr_dir_read(&direntry, finfo_flags, dir)) == APR_SUCCESS) { - const char *file; - if (direntry.filetype == APR_DIR) { - continue; /* don't try to load directories */ - } - file = apr_pstrcat(ptemp, ca_path, "/", direntry.name, NULL); - ssl_init_PushCAList(ca_list, s, file); - } - - apr_dir_close(dir); - } - - /* - * Cleanup - */ - sk_X509_NAME_set_cmp_func(ca_list, NULL); - - return ca_list; -} - -void ssl_init_Child(apr_pool_t *p, server_rec *s) -{ - SSLModConfigRec *mc = myModConfig(s); - mc->pid = getpid(); /* only call getpid() once per-process */ - - /* XXX: there should be an ap_srand() function */ - srand((unsigned int)time(NULL)); - - /* open the mutex lockfile */ - ssl_mutex_reinit(s, p); -} - -#define MODSSL_CFG_ITEM_FREE(func, item) \ - if (item) { \ - func(item); \ - item = NULL; \ - } - -static void ssl_init_ctx_cleanup(modssl_ctx_t *mctx) -{ - MODSSL_CFG_ITEM_FREE(X509_STORE_free, mctx->crl); - - MODSSL_CFG_ITEM_FREE(SSL_CTX_free, mctx->ssl_ctx); -} - -static void ssl_init_ctx_cleanup_proxy(modssl_ctx_t *mctx) -{ - ssl_init_ctx_cleanup(mctx); - - if (mctx->pkp->certs) { - sk_X509_INFO_pop_free(mctx->pkp->certs, X509_INFO_free); - } -} - -static void ssl_init_ctx_cleanup_server(modssl_ctx_t *mctx) -{ - int i; - - ssl_init_ctx_cleanup(mctx); - - for (i=0; i < SSL_AIDX_MAX; i++) { - MODSSL_CFG_ITEM_FREE(X509_free, - mctx->pks->certs[i]); - - MODSSL_CFG_ITEM_FREE(EVP_PKEY_free, - mctx->pks->keys[i]); - } -} - -apr_status_t ssl_init_ModuleKill(void *data) -{ - SSLSrvConfigRec *sc; - server_rec *base_server = (server_rec *)data; - server_rec *s; - - /* - * Drop the session cache and mutex - */ - ssl_scache_kill(base_server); - - /* - * Destroy the temporary keys and params - */ - ssl_tmp_keys_free(base_server); - - /* - * Free the non-pool allocated structures - * in the per-server configurations - */ - for (s = base_server; s; s = s->next) { - sc = mySrvConfig(s); - - ssl_init_ctx_cleanup_proxy(sc->proxy); - - ssl_init_ctx_cleanup_server(sc->server); - } - - return APR_SUCCESS; -} - diff --git a/trunk/modules/ssl/ssl_engine_io.c b/trunk/modules/ssl/ssl_engine_io.c deleted file mode 100644 index 169989747070d659e1ae6abf0909d651e25aa304..0000000000000000000000000000000000000000 --- a/trunk/modules/ssl/ssl_engine_io.c +++ /dev/null @@ -1,1608 +0,0 @@ -/* Copyright 2001-2005 The Apache Software Foundation or its licensors, as - * applicable. - * - * 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_ssl - * | '_ ` _ \ / _ \ / _` | / __/ __| | Apache Interface to OpenSSL - * | | | | | | (_) | (_| | \__ \__ \ | - * |_| |_| |_|\___/ \__,_|___|___/___/_| - * |_____| - * ssl_engine_io.c - * I/O Functions - */ - /* ``MY HACK: This universe. - Just one little problem: - core keeps dumping.'' - -- Unknown */ -#include "ssl_private.h" - -/* _________________________________________________________________ -** -** I/O Hooks -** _________________________________________________________________ -*/ - -/* This file is designed to be the bridge between OpenSSL and httpd. - * However, we really don't expect anyone (let alone ourselves) to - * remember what is in this file. So, first, a quick overview. - * - * In this file, you will find: - * - ssl_io_filter_input (Apache input filter) - * - ssl_io_filter_output (Apache output filter) - * - * - bio_filter_in_* (OpenSSL input filter) - * - bio_filter_out_* (OpenSSL output filter) - * - * The input chain is roughly: - * - * ssl_io_filter_input->ssl_io_input_read->SSL_read->... - * ...->bio_filter_in_read->ap_get_brigade/next-httpd-filter - * - * In mortal terminology, we do the following: - * - Receive a request for data to the SSL input filter - * - Call a helper function once we know we should perform a read - * - Call OpenSSL's SSL_read() - * - SSL_read() will then call bio_filter_in_read - * - bio_filter_in_read will then try to fetch data from the next httpd filter - * - bio_filter_in_read will flatten that data and return it to SSL_read - * - SSL_read will then decrypt the data - * - ssl_io_input_read will then receive decrypted data as a char* and - * ensure that there were no read errors - * - The char* is placed in a brigade and returned - * - * Since connection-level input filters in httpd need to be able to - * handle AP_MODE_GETLINE calls (namely identifying LF-terminated strings), - * ssl_io_input_getline which will handle this special case. - * - * Due to AP_MODE_GETLINE and AP_MODE_SPECULATIVE, we may sometimes have - * 'leftover' decoded data which must be setaside for the next read. That - * is currently handled by the char_buffer_{read|write} functions. So, - * ssl_io_input_read may be able to fulfill reads without invoking - * SSL_read(). - * - * Note that the filter context of ssl_io_filter_input and bio_filter_in_* - * are shared as bio_filter_in_ctx_t. - * - * Note that the filter is by choice limited to reading at most - * AP_IOBUFSIZE (8192 bytes) per call. - * - */ - -/* this custom BIO allows us to hook SSL_write directly into - * an apr_bucket_brigade and use transient buckets with the SSL - * malloc-ed buffer, rather than copying into a mem BIO. - * also allows us to pass the brigade as data is being written - * rather than buffering up the entire response in the mem BIO. - * - * when SSL needs to flush (e.g. SSL_accept()), it will call BIO_flush() - * which will trigger a call to bio_filter_out_ctrl() -> bio_filter_out_flush(). - * so we only need to flush the output ourselves if we receive an - * EOS or FLUSH bucket. this was not possible with the mem BIO where we - * had to flush all over the place not really knowing when it was required - * to do so. - */ - -typedef struct { - SSL *pssl; - BIO *pbioRead; - BIO *pbioWrite; - ap_filter_t *pInputFilter; - ap_filter_t *pOutputFilter; - int nobuffer; /* non-zero to prevent buffering */ -} ssl_filter_ctx_t; - -typedef struct { - ssl_filter_ctx_t *filter_ctx; - conn_rec *c; - apr_bucket_brigade *bb; - apr_size_t length; - char buffer[AP_IOBUFSIZE]; - apr_size_t blen; - apr_status_t rc; -} bio_filter_out_ctx_t; - -static bio_filter_out_ctx_t *bio_filter_out_ctx_new(ssl_filter_ctx_t *filter_ctx, - conn_rec *c) -{ - bio_filter_out_ctx_t *outctx = apr_palloc(c->pool, sizeof(*outctx)); - - outctx->filter_ctx = filter_ctx; - outctx->c = c; - outctx->bb = apr_brigade_create(c->pool, c->bucket_alloc); - outctx->blen = 0; - outctx->length = 0; - - return outctx; -} - -static int bio_filter_out_flush(BIO *bio) -{ - bio_filter_out_ctx_t *outctx = (bio_filter_out_ctx_t *)(bio->ptr); - apr_bucket *e; - - if (!(outctx->blen || outctx->length)) { - outctx->rc = APR_SUCCESS; - return 1; - } - - if (outctx->blen) { - e = apr_bucket_transient_create(outctx->buffer, outctx->blen, - outctx->bb->bucket_alloc); - /* we filled this buffer first so add it to the - * head of the brigade - */ - APR_BRIGADE_INSERT_HEAD(outctx->bb, e); - outctx->blen = 0; - } - - outctx->length = 0; - e = apr_bucket_flush_create(outctx->bb->bucket_alloc); - APR_BRIGADE_INSERT_TAIL(outctx->bb, e); - - outctx->rc = ap_pass_brigade(outctx->filter_ctx->pOutputFilter->next, - outctx->bb); - /* Fail if the connection was reset: */ - if (outctx->rc == APR_SUCCESS && outctx->c->aborted) { - outctx->rc = APR_ECONNRESET; - } - return (outctx->rc == APR_SUCCESS) ? 1 : -1; -} - -static int bio_filter_create(BIO *bio) -{ - bio->shutdown = 1; - bio->init = 1; - bio->num = -1; - bio->ptr = NULL; - - return 1; -} - -static int bio_filter_destroy(BIO *bio) -{ - if (bio == NULL) { - return 0; - } - - /* nothing to free here. - * apache will destroy the bucket brigade for us - */ - return 1; -} - -static int bio_filter_out_read(BIO *bio, char *out, int outl) -{ - /* this is never called */ - return -1; -} - -static int bio_filter_out_write(BIO *bio, const char *in, int inl) -{ - bio_filter_out_ctx_t *outctx = (bio_filter_out_ctx_t *)(bio->ptr); - - /* when handshaking we'll have a small number of bytes. - * max size SSL will pass us here is about 16k. - * (16413 bytes to be exact) - */ - BIO_clear_retry_flags(bio); - - if (!outctx->length && (inl + outctx->blen < sizeof(outctx->buffer)) && - !outctx->filter_ctx->nobuffer) { - /* the first two SSL_writes (of 1024 and 261 bytes) - * need to be in the same packet (vec[0].iov_base) - */ - /* XXX: could use apr_brigade_write() to make code look cleaner - * but this way we avoid the malloc(APR_BUCKET_BUFF_SIZE) - * and free() of it later - */ - memcpy(&outctx->buffer[outctx->blen], in, inl); - outctx->blen += inl; - } - else { - /* pass along the encrypted data - * need to flush since we're using SSL's malloc-ed buffer - * which will be overwritten once we leave here - */ - apr_bucket *bucket = apr_bucket_transient_create(in, inl, - outctx->bb->bucket_alloc); - - outctx->length += inl; - APR_BRIGADE_INSERT_TAIL(outctx->bb, bucket); - - if (bio_filter_out_flush(bio) < 0) { - return -1; - } - } - - return inl; -} - -static long bio_filter_out_ctrl(BIO *bio, int cmd, long num, void *ptr) -{ - long ret = 1; - char **pptr; - - bio_filter_out_ctx_t *outctx = (bio_filter_out_ctx_t *)(bio->ptr); - - switch (cmd) { - case BIO_CTRL_RESET: - outctx->blen = outctx->length = 0; - break; - case BIO_CTRL_EOF: - ret = (long)((outctx->blen + outctx->length) == 0); - break; - case BIO_C_SET_BUF_MEM_EOF_RETURN: - outctx->blen = outctx->length = (apr_size_t)num; - break; - case BIO_CTRL_INFO: - ret = (long)(outctx->blen + outctx->length); - if (ptr) { - pptr = (char **)ptr; - *pptr = (char *)&(outctx->buffer[0]); - } - break; - case BIO_CTRL_GET_CLOSE: - ret = (long)bio->shutdown; - break; - case BIO_CTRL_SET_CLOSE: - bio->shutdown = (int)num; - break; - case BIO_CTRL_WPENDING: - ret = 0L; - break; - case BIO_CTRL_PENDING: - ret = (long)(outctx->blen + outctx->length); - break; - case BIO_CTRL_FLUSH: - ret = bio_filter_out_flush(bio); - break; - case BIO_CTRL_DUP: - ret = 1; - break; - /* N/A */ - case BIO_C_SET_BUF_MEM: - case BIO_C_GET_BUF_MEM_PTR: - /* we don't care */ - case BIO_CTRL_PUSH: - case BIO_CTRL_POP: - default: - ret = 0; - break; - } - - return ret; -} - -static int bio_filter_out_gets(BIO *bio, char *buf, int size) -{ - /* this is never called */ - return -1; -} - -static int bio_filter_out_puts(BIO *bio, const char *str) -{ - /* this is never called */ - return -1; -} - -static BIO_METHOD bio_filter_out_method = { - BIO_TYPE_MEM, - "APR output filter", - bio_filter_out_write, - bio_filter_out_read, /* read is never called */ - bio_filter_out_puts, /* puts is never called */ - bio_filter_out_gets, /* gets is never called */ - bio_filter_out_ctrl, - bio_filter_create, - bio_filter_destroy, -#ifdef OPENSSL_VERSION_NUMBER - NULL /* sslc does not have the callback_ctrl field */ -#endif -}; - -typedef struct { - int length; - char *value; -} char_buffer_t; - -typedef struct { - SSL *ssl; - BIO *bio_out; - ap_filter_t *f; - apr_status_t rc; - ap_input_mode_t mode; - apr_read_type_e block; - apr_bucket_brigade *bb; - char_buffer_t cbuf; - apr_pool_t *pool; - char buffer[AP_IOBUFSIZE]; - ssl_filter_ctx_t *filter_ctx; -} bio_filter_in_ctx_t; - -/* - * this char_buffer api might seem silly, but we don't need to copy - * any of this data and we need to remember the length. - */ -static int char_buffer_read(char_buffer_t *buffer, char *in, int inl) -{ - if (!buffer->length) { - return 0; - } - - if (buffer->length > inl) { - /* we have have enough to fill the caller's buffer */ - memcpy(in, buffer->value, inl); - buffer->value += inl; - buffer->length -= inl; - } - else { - /* swallow remainder of the buffer */ - memcpy(in, buffer->value, buffer->length); - inl = buffer->length; - buffer->value = NULL; - buffer->length = 0; - } - - return inl; -} - -static int char_buffer_write(char_buffer_t *buffer, char *in, int inl) -{ - buffer->value = in; - buffer->length = inl; - return inl; -} - -/* This function will read from a brigade and discard the read buckets as it - * proceeds. It will read at most *len bytes. - */ -static apr_status_t brigade_consume(apr_bucket_brigade *bb, - apr_read_type_e block, - char *c, apr_size_t *len) -{ - apr_size_t actual = 0; - apr_status_t status = APR_SUCCESS; - - while (!APR_BRIGADE_EMPTY(bb)) { - apr_bucket *b = APR_BRIGADE_FIRST(bb); - const char *str; - apr_size_t str_len; - apr_size_t consume; - - /* Justin points out this is an http-ism that might - * not fit if brigade_consume is added to APR. Perhaps - * apr_bucket_read(eos_bucket) should return APR_EOF? - * Then this becomes mainline instead of a one-off. - */ - if (APR_BUCKET_IS_EOS(b)) { - status = APR_EOF; - break; - } - - /* The reason I'm not offering brigade_consume yet - * across to apr-util is that the following call - * illustrates how borked that API really is. For - * this sort of case (caller provided buffer) it - * would be much more trivial for apr_bucket_consume - * to do all the work that follows, based on the - * particular characteristics of the bucket we are - * consuming here. - */ - status = apr_bucket_read(b, &str, &str_len, block); - - if (status != APR_SUCCESS) { - if (APR_STATUS_IS_EOF(status)) { - /* This stream bucket was consumed */ - apr_bucket_delete(b); - continue; - } - break; - } - - if (str_len > 0) { - /* Do not block once some data has been consumed */ - block = APR_NONBLOCK_READ; - - /* Assure we don't overflow. */ - consume = (str_len + actual > *len) ? *len - actual : str_len; - - memcpy(c, str, consume); - - c += consume; - actual += consume; - - if (consume >= b->length) { - /* This physical bucket was consumed */ - apr_bucket_delete(b); - } - else { - /* Only part of this physical bucket was consumed */ - b->start += consume; - b->length -= consume; - } - } - else if (b->length == 0) { - apr_bucket_delete(b); - } - - /* This could probably be actual == *len, but be safe from stray - * photons. */ - if (actual >= *len) { - break; - } - } - - *len = actual; - return status; -} - -/* - * this is the function called by SSL_read() - */ -static int bio_filter_in_read(BIO *bio, char *in, int inlen) -{ - apr_size_t inl = inlen; - bio_filter_in_ctx_t *inctx = (bio_filter_in_ctx_t *)(bio->ptr); - apr_read_type_e block = inctx->block; - SSLConnRec *sslconn = myConnConfig(inctx->f->c); - - inctx->rc = APR_SUCCESS; - - /* OpenSSL catches this case, so should we. */ - if (!in) - return 0; - - /* XXX: flush here only required for SSLv2; - * OpenSSL calls BIO_flush() at the appropriate times for - * the other protocols. - */ - if ((SSL_version(inctx->ssl) == SSL2_VERSION) || sslconn->is_proxy) { - if (bio_filter_out_flush(inctx->bio_out) < 0) { - bio_filter_out_ctx_t *outctx = - (bio_filter_out_ctx_t *)(inctx->bio_out->ptr); - inctx->rc = outctx->rc; - return -1; - } - } - - BIO_clear_retry_flags(bio); - - if (!inctx->bb) { - inctx->rc = APR_EOF; - return -1; - } - - if (APR_BRIGADE_EMPTY(inctx->bb)) { - - inctx->rc = ap_get_brigade(inctx->f->next, inctx->bb, - AP_MODE_READBYTES, block, - inl); - - /* If the read returns EAGAIN or success with an empty - * brigade, return an error after setting the retry flag; - * SSL_read() will then return -1, and SSL_get_error() will - * indicate SSL_ERROR_WANT_READ. */ - if (APR_STATUS_IS_EAGAIN(inctx->rc) || APR_STATUS_IS_EINTR(inctx->rc) - || (inctx->rc == APR_SUCCESS && APR_BRIGADE_EMPTY(inctx->bb))) { - BIO_set_retry_read(bio); - return -1; - } - - if (inctx->rc != APR_SUCCESS) { - /* Unexpected errors discard the brigade */ - apr_brigade_cleanup(inctx->bb); - inctx->bb = NULL; - return -1; - } - } - - inctx->rc = brigade_consume(inctx->bb, block, in, &inl); - - if (inctx->rc == APR_SUCCESS) { - return (int)inl; - } - - if (APR_STATUS_IS_EAGAIN(inctx->rc) - || APR_STATUS_IS_EINTR(inctx->rc)) { - BIO_set_retry_read(bio); - return (int)inl; - } - - /* Unexpected errors and APR_EOF clean out the brigade. - * Subsequent calls will return APR_EOF. - */ - apr_brigade_cleanup(inctx->bb); - inctx->bb = NULL; - - if (APR_STATUS_IS_EOF(inctx->rc) && inl) { - /* Provide the results of this read pass, - * without resetting the BIO retry_read flag - */ - return (int)inl; - } - - return -1; -} - - -static BIO_METHOD bio_filter_in_method = { - BIO_TYPE_MEM, - "APR input filter", - NULL, /* write is never called */ - bio_filter_in_read, - NULL, /* puts is never called */ - NULL, /* gets is never called */ - NULL, /* ctrl is never called */ - bio_filter_create, - bio_filter_destroy, -#ifdef OPENSSL_VERSION_NUMBER - NULL /* sslc does not have the callback_ctrl field */ -#endif -}; - - -static apr_status_t ssl_io_input_read(bio_filter_in_ctx_t *inctx, - char *buf, - apr_size_t *len) -{ - apr_size_t wanted = *len; - apr_size_t bytes = 0; - int rc; - - *len = 0; - - /* If we have something leftover from last time, try that first. */ - if ((bytes = char_buffer_read(&inctx->cbuf, buf, wanted))) { - *len = bytes; - if (inctx->mode == AP_MODE_SPECULATIVE) { - /* We want to rollback this read. */ - if (inctx->cbuf.length > 0) { - inctx->cbuf.value -= bytes; - inctx->cbuf.length += bytes; - } else { - char_buffer_write(&inctx->cbuf, buf, (int)bytes); - } - return APR_SUCCESS; - } - /* This could probably be *len == wanted, but be safe from stray - * photons. - */ - if (*len >= wanted) { - return APR_SUCCESS; - } - if (inctx->mode == AP_MODE_GETLINE) { - if (memchr(buf, APR_ASCII_LF, *len)) { - return APR_SUCCESS; - } - } - else { - /* Down to a nonblock pattern as we have some data already - */ - inctx->block = APR_NONBLOCK_READ; - } - } - - while (1) { - - if (!inctx->filter_ctx->pssl) { - /* Ensure a non-zero error code is returned */ - if (inctx->rc == APR_SUCCESS) { - inctx->rc = APR_EGENERAL; - } - break; - } - - /* SSL_read may not read because we haven't taken enough data - * from the stack. This is where we want to consider all of - * the blocking and SPECULATIVE semantics - */ - rc = SSL_read(inctx->filter_ctx->pssl, buf + bytes, wanted - bytes); - - if (rc > 0) { - *len += rc; - if (inctx->mode == AP_MODE_SPECULATIVE) { - /* We want to rollback this read. */ - char_buffer_write(&inctx->cbuf, buf, rc); - } - return inctx->rc; - } - else if (rc == 0) { - /* If EAGAIN, we will loop given a blocking read, - * otherwise consider ourselves at EOF. - */ - if (APR_STATUS_IS_EAGAIN(inctx->rc) - || APR_STATUS_IS_EINTR(inctx->rc)) { - /* Already read something, return APR_SUCCESS instead. - * On win32 in particular, but perhaps on other kernels, - * a blocking call isn't 'always' blocking. - */ - if (*len > 0) { - inctx->rc = APR_SUCCESS; - break; - } - if (inctx->block == APR_NONBLOCK_READ) { - break; - } - } - else { - if (*len > 0) { - inctx->rc = APR_SUCCESS; - } - else { - inctx->rc = APR_EOF; - } - break; - } - } - else /* (rc < 0) */ { - int ssl_err = SSL_get_error(inctx->filter_ctx->pssl, rc); - conn_rec *c = (conn_rec*)SSL_get_app_data(inctx->filter_ctx->pssl); - - if (ssl_err == SSL_ERROR_WANT_READ) { - /* - * If OpenSSL wants to read more, and we were nonblocking, - * report as an EAGAIN. Otherwise loop, pulling more - * data from network filter. - * - * (This is usually the case when the client forces an SSL - * renegotation which is handled implicitly by OpenSSL.) - */ - inctx->rc = APR_EAGAIN; - - if (*len > 0) { - inctx->rc = APR_SUCCESS; - break; - } - if (inctx->block == APR_NONBLOCK_READ) { - break; - } - continue; /* Blocking and nothing yet? Try again. */ - } - else if (ssl_err == SSL_ERROR_SYSCALL) { - if (APR_STATUS_IS_EAGAIN(inctx->rc) - || APR_STATUS_IS_EINTR(inctx->rc)) { - /* Already read something, return APR_SUCCESS instead. */ - if (*len > 0) { - inctx->rc = APR_SUCCESS; - break; - } - if (inctx->block == APR_NONBLOCK_READ) { - break; - } - continue; /* Blocking and nothing yet? Try again. */ - } - else { - ap_log_cerror(APLOG_MARK, APLOG_INFO, inctx->rc, c, - "SSL input filter read failed."); - } - } - else /* if (ssl_err == SSL_ERROR_SSL) */ { - /* - * Log SSL errors and any unexpected conditions. - */ - ap_log_cerror(APLOG_MARK, APLOG_INFO, inctx->rc, c, - "SSL library error %d reading data", ssl_err); - ssl_log_ssl_error(APLOG_MARK, APLOG_INFO, c->base_server); - - } - if (inctx->rc == APR_SUCCESS) { - inctx->rc = APR_EGENERAL; - } - break; - } - } - return inctx->rc; -} - -static apr_status_t ssl_io_input_getline(bio_filter_in_ctx_t *inctx, - char *buf, - apr_size_t *len) -{ - const char *pos = NULL; - apr_status_t status; - apr_size_t tmplen = *len, buflen = *len, offset = 0; - - *len = 0; - - /* - * in most cases we get all the headers on the first SSL_read. - * however, in certain cases SSL_read will only get a partial - * chunk of the headers, so we try to read until LF is seen. - */ - - while (tmplen > 0) { - status = ssl_io_input_read(inctx, buf + offset, &tmplen); - - if (status != APR_SUCCESS) { - return status; - } - - *len += tmplen; - - if ((pos = memchr(buf, APR_ASCII_LF, *len))) { - break; - } - - offset += tmplen; - tmplen = buflen - offset; - } - - if (pos) { - char *value; - int length; - apr_size_t bytes = pos - buf; - - bytes += 1; - value = buf + bytes; - length = *len - bytes; - - char_buffer_write(&inctx->cbuf, value, length); - - *len = bytes; - } - - return APR_SUCCESS; -} - - -static apr_status_t ssl_filter_write(ap_filter_t *f, - const char *data, - apr_size_t len) -{ - ssl_filter_ctx_t *filter_ctx = f->ctx; - bio_filter_out_ctx_t *outctx; - int res; - - /* write SSL */ - if (filter_ctx->pssl == NULL) { - return APR_EGENERAL; - } - - outctx = (bio_filter_out_ctx_t *)filter_ctx->pbioWrite->ptr; - res = SSL_write(filter_ctx->pssl, (unsigned char *)data, len); - - if (res < 0) { - int ssl_err = SSL_get_error(filter_ctx->pssl, res); - conn_rec *c = (conn_rec*)SSL_get_app_data(outctx->filter_ctx->pssl); - - if (ssl_err == SSL_ERROR_WANT_WRITE) { - /* - * If OpenSSL wants to write more, and we were nonblocking, - * report as an EAGAIN. Otherwise loop, pushing more - * data at the network filter. - * - * (This is usually the case when the client forces an SSL - * renegotation which is handled implicitly by OpenSSL.) - */ - outctx->rc = APR_EAGAIN; - } - else if (ssl_err == SSL_ERROR_SYSCALL) { - ap_log_cerror(APLOG_MARK, APLOG_INFO, outctx->rc, c, - "SSL output filter write failed."); - } - else /* if (ssl_err == SSL_ERROR_SSL) */ { - /* - * Log SSL errors - */ - ap_log_cerror(APLOG_MARK, APLOG_INFO, outctx->rc, c, - "SSL library error %d writing data", ssl_err); - ssl_log_ssl_error(APLOG_MARK, APLOG_INFO, c->base_server); - } - if (outctx->rc == APR_SUCCESS) { - outctx->rc = APR_EGENERAL; - } - } - else if ((apr_size_t)res != len) { - conn_rec *c = f->c; - char *reason = "reason unknown"; - - /* XXX: probably a better way to determine this */ - if (SSL_total_renegotiations(filter_ctx->pssl)) { - reason = "likely due to failed renegotiation"; - } - - ap_log_cerror(APLOG_MARK, APLOG_INFO, outctx->rc, c, - "failed to write %" APR_SSIZE_T_FMT - " of %" APR_SIZE_T_FMT " bytes (%s)", - len - (apr_size_t)res, len, reason); - - outctx->rc = APR_EGENERAL; - } - return outctx->rc; -} - -/* Just use a simple request. Any request will work for this, because - * we use a flag in the conn_rec->conn_vector now. The fake request just - * gets the request back to the Apache core so that a response can be sent. - * - * To avoid calling back for more data from the socket, use an HTTP/0.9 - * request, and tack on an EOS bucket. - */ -#define HTTP_ON_HTTPS_PORT \ - "GET /" CRLF - -#define HTTP_ON_HTTPS_PORT_BUCKET(alloc) \ - apr_bucket_immortal_create(HTTP_ON_HTTPS_PORT, \ - sizeof(HTTP_ON_HTTPS_PORT) - 1, \ - alloc) - -static void ssl_io_filter_disable(SSLConnRec *sslconn, ap_filter_t *f) -{ - bio_filter_in_ctx_t *inctx = f->ctx; - SSL_free(inctx->ssl); - sslconn->ssl = NULL; - inctx->ssl = NULL; - inctx->filter_ctx->pssl = NULL; -} - -static apr_status_t ssl_io_filter_error(ap_filter_t *f, - apr_bucket_brigade *bb, - apr_status_t status) -{ - SSLConnRec *sslconn = myConnConfig(f->c); - apr_bucket *bucket; - - switch (status) { - case HTTP_BAD_REQUEST: - /* log the situation */ - ap_log_cerror(APLOG_MARK, APLOG_INFO, 0, f->c, - "SSL handshake failed: HTTP spoken on HTTPS port; " - "trying to send HTML error page"); - ssl_log_ssl_error(APLOG_MARK, APLOG_INFO, f->c->base_server); - - sslconn->non_ssl_request = 1; - ssl_io_filter_disable(sslconn, f); - - /* fake the request line */ - bucket = HTTP_ON_HTTPS_PORT_BUCKET(f->c->bucket_alloc); - break; - - default: - return status; - } - - APR_BRIGADE_INSERT_TAIL(bb, bucket); - bucket = apr_bucket_eos_create(f->c->bucket_alloc); - APR_BRIGADE_INSERT_TAIL(bb, bucket); - - return APR_SUCCESS; -} - -static const char ssl_io_filter[] = "SSL/TLS Filter"; - -/* - * Close the SSL part of the socket connection - * (called immediately _before_ the socket is closed) - * or called with - */ -static apr_status_t ssl_filter_io_shutdown(ssl_filter_ctx_t *filter_ctx, - conn_rec *c, - int abortive) -{ - SSL *ssl = filter_ctx->pssl; - const char *type = ""; - SSLConnRec *sslconn = myConnConfig(c); - int shutdown_type; - - if (!ssl) { - return APR_SUCCESS; - } - - /* - * Now close the SSL layer of the connection. We've to take - * the TLSv1 standard into account here: - * - * | 7.2.1. Closure alerts - * | - * | The client and the server must share knowledge that the connection is - * | ending in order to avoid a truncation attack. Either party may - * | initiate the exchange of closing messages. - * | - * | close_notify - * | This message notifies the recipient that the sender will not send - * | any more messages on this connection. The session becomes - * | unresumable if any connection is terminated without proper - * | close_notify messages with level equal to warning. - * | - * | Either party may initiate a close by sending a close_notify alert. - * | Any data received after a closure alert is ignored. - * | - * | Each party is required to send a close_notify alert before closing - * | the write side of the connection. It is required that the other party - * | respond with a close_notify alert of its own and close down the - * | connection immediately, discarding any pending writes. It is not - * | required for the initiator of the close to wait for the responding - * | close_notify alert before closing the read side of the connection. - * - * This means we've to send a close notify message, but haven't to wait - * for the close notify of the client. Actually we cannot wait for the - * close notify of the client because some clients (including Netscape - * 4.x) don't send one, so we would hang. - */ - - /* - * exchange close notify messages, but allow the user - * to force the type of handshake via SetEnvIf directive - */ - if (abortive) { - shutdown_type = SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN; - type = "abortive"; - } - else switch (sslconn->shutdown_type) { - case SSL_SHUTDOWN_TYPE_UNCLEAN: - /* perform no close notify handshake at all - (violates the SSL/TLS standard!) */ - shutdown_type = SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN; - type = "unclean"; - break; - case SSL_SHUTDOWN_TYPE_ACCURATE: - /* send close notify and wait for clients close notify - (standard compliant, but usually causes connection hangs) */ - shutdown_type = 0; - type = "accurate"; - break; - default: - /* - * case SSL_SHUTDOWN_TYPE_UNSET: - * case SSL_SHUTDOWN_TYPE_STANDARD: - */ - /* send close notify, but don't wait for clients close notify - (standard compliant and safe, so it's the DEFAULT!) */ - shutdown_type = SSL_RECEIVED_SHUTDOWN; - type = "standard"; - break; - } - - SSL_set_shutdown(ssl, shutdown_type); - SSL_smart_shutdown(ssl); - - /* and finally log the fact that we've closed the connection */ - if (c->base_server->loglevel >= APLOG_INFO) { - ap_log_cerror(APLOG_MARK, APLOG_INFO, 0, c, - "Connection closed to child %ld with %s shutdown " - "(server %s)", - c->id, type, ssl_util_vhostid(c->pool, c->base_server)); - } - - /* deallocate the SSL connection */ - if (sslconn->client_cert) { - X509_free(sslconn->client_cert); - sslconn->client_cert = NULL; - } - SSL_free(ssl); - sslconn->ssl = NULL; - filter_ctx->pssl = NULL; /* so filters know we've been shutdown */ - - if (abortive) { - /* prevent any further I/O */ - c->aborted = 1; - } - - return APR_SUCCESS; -} - -static apr_status_t ssl_io_filter_cleanup(void *data) -{ - ssl_filter_ctx_t *filter_ctx = data; - - if (filter_ctx->pssl) { - conn_rec *c = (conn_rec *)SSL_get_app_data(filter_ctx->pssl); - SSLConnRec *sslconn = myConnConfig(c); - - SSL_free(filter_ctx->pssl); - sslconn->ssl = filter_ctx->pssl = NULL; - } - - return APR_SUCCESS; -} - -/* - * The hook is NOT registered with ap_hook_process_connection. Instead, it is - * called manually from the churn () before it tries to read any data. - * There is some problem if I accept conn_rec *. Still investigating.. - * Adv. if conn_rec * can be accepted is we can hook this function using the - * ap_hook_process_connection hook. - */ -static int ssl_io_filter_connect(ssl_filter_ctx_t *filter_ctx) -{ - conn_rec *c = (conn_rec *)SSL_get_app_data(filter_ctx->pssl); - SSLConnRec *sslconn = myConnConfig(c); - SSLSrvConfigRec *sc = mySrvConfig(c->base_server); - X509 *cert; - int n; - int ssl_err; - long verify_result; - - if (SSL_is_init_finished(filter_ctx->pssl)) { - return APR_SUCCESS; - } - - if (sslconn->is_proxy) { - if ((n = SSL_connect(filter_ctx->pssl)) <= 0) { - ap_log_cerror(APLOG_MARK, APLOG_INFO, 0, c, - "SSL Proxy connect failed"); - ssl_log_ssl_error(APLOG_MARK, APLOG_INFO, c->base_server); - /* ensure that the SSL structures etc are freed, etc: */ - ssl_filter_io_shutdown(filter_ctx, c, 1); - return HTTP_BAD_GATEWAY; - } - - return APR_SUCCESS; - } - - if ((n = SSL_accept(filter_ctx->pssl)) <= 0) { - bio_filter_in_ctx_t *inctx = (bio_filter_in_ctx_t *) - (filter_ctx->pbioRead->ptr); - bio_filter_out_ctx_t *outctx = (bio_filter_out_ctx_t *) - (filter_ctx->pbioWrite->ptr); - apr_status_t rc = inctx->rc ? inctx->rc : outctx->rc ; - ssl_err = SSL_get_error(filter_ctx->pssl, n); - - if (ssl_err == SSL_ERROR_ZERO_RETURN) { - /* - * The case where the connection was closed before any data - * was transferred. That's not a real error and can occur - * sporadically with some clients. - */ - ap_log_cerror(APLOG_MARK, APLOG_INFO, rc, c, - "SSL handshake stopped: connection was closed"); - } - else if (ssl_err == SSL_ERROR_WANT_READ) { - /* - * This is in addition to what was present earlier. It is - * borrowed from openssl_state_machine.c [mod_tls]. - * TBD. - */ - outctx->rc = APR_EAGAIN; - return SSL_ERROR_WANT_READ; - } - else if (ERR_GET_LIB(ERR_peek_error()) == ERR_LIB_SSL && - ERR_GET_REASON(ERR_peek_error()) == SSL_R_HTTP_REQUEST) { - /* - * The case where OpenSSL has recognized a HTTP request: - * This means the client speaks plain HTTP on our HTTPS port. - * ssl_io_filter_error will disable the ssl filters when it - * sees this status code. - */ - return HTTP_BAD_REQUEST; - } - else if (ssl_err == SSL_ERROR_SYSCALL) { - ap_log_cerror(APLOG_MARK, APLOG_INFO, rc, c, - "SSL handshake interrupted by system " - "[Hint: Stop button pressed in browser?!]"); - } - else /* if (ssl_err == SSL_ERROR_SSL) */ { - /* - * Log SSL errors and any unexpected conditions. - */ - ap_log_cerror(APLOG_MARK, APLOG_INFO, rc, c, - "SSL library error %d in handshake " - "(server %s)", ssl_err, - ssl_util_vhostid(c->pool, c->base_server)); - ssl_log_ssl_error(APLOG_MARK, APLOG_INFO, c->base_server); - - } - if (inctx->rc == APR_SUCCESS) { - inctx->rc = APR_EGENERAL; - } - - return ssl_filter_io_shutdown(filter_ctx, c, 1); - } - - /* - * Check for failed client authentication - */ - verify_result = SSL_get_verify_result(filter_ctx->pssl); - - if ((verify_result != X509_V_OK) || - sslconn->verify_error) - { - if (ssl_verify_error_is_optional(verify_result) && - (sc->server->auth.verify_mode == SSL_CVERIFY_OPTIONAL_NO_CA)) - { - /* leaving this log message as an error for the moment, - * according to the mod_ssl docs: - * "level optional_no_ca is actually against the idea - * of authentication (but can be used to establish - * SSL test pages, etc.)" - * optional_no_ca doesn't appear to work as advertised - * in 1.x - */ - ap_log_cerror(APLOG_MARK, APLOG_INFO, 0, c, - "SSL client authentication failed, " - "accepting certificate based on " - "\"SSLVerifyClient optional_no_ca\" " - "configuration"); - ssl_log_ssl_error(APLOG_MARK, APLOG_INFO, c->base_server); - } - else { - const char *error = sslconn->verify_error ? - sslconn->verify_error : - X509_verify_cert_error_string(verify_result); - - ap_log_cerror(APLOG_MARK, APLOG_INFO, 0, c, - "SSL client authentication failed: %s", - error ? error : "unknown"); - ssl_log_ssl_error(APLOG_MARK, APLOG_INFO, c->base_server); - - return ssl_filter_io_shutdown(filter_ctx, c, 1); - } - } - - /* - * Remember the peer certificate's DN - */ - if ((cert = SSL_get_peer_certificate(filter_ctx->pssl))) { - if (sslconn->client_cert) { - X509_free(sslconn->client_cert); - } - sslconn->client_cert = cert; - sslconn->client_dn = NULL; - } - - /* - * Make really sure that when a peer certificate - * is required we really got one... (be paranoid) - */ - if ((sc->server->auth.verify_mode == SSL_CVERIFY_REQUIRE) && - !sslconn->client_cert) - { - ap_log_cerror(APLOG_MARK, APLOG_INFO, 0, c, - "No acceptable peer certificate available"); - - return ssl_filter_io_shutdown(filter_ctx, c, 1); - } - - return APR_SUCCESS; -} - -#define SWITCH_STATUS_LINE "HTTP/1.1 101 Switching Protocols" -#define UPGRADE_HEADER "Upgrade: TLS/1.0, HTTP/1.1" -#define CONNECTION_HEADER "Connection: Upgrade" - -static apr_status_t ssl_io_filter_Upgrade(ap_filter_t *f, - apr_bucket_brigade *bb) -{ - const char *upgrade; - apr_bucket_brigade *upgradebb; - request_rec *r = f->r; - SSLConnRec *sslconn; - apr_status_t rv; - apr_bucket *b; - SSL *ssl; - - /* Just remove the filter, if it doesn't work the first time, it won't - * work at all for this request. - */ - ap_remove_output_filter(f); - - /* No need to ensure that this is a server with optional SSL, the filter - * is only inserted if that is true. - */ - - upgrade = apr_table_get(r->headers_in, "Upgrade"); - if (upgrade == NULL - || strcmp(ap_getword(r->pool, &upgrade, ','), "TLS/1.0")) { - /* "Upgrade: TLS/1.0, ..." header not found, don't do Upgrade */ - return ap_pass_brigade(f->next, bb); - } - - apr_table_unset(r->headers_out, "Upgrade"); - - /* Send the interim 101 response. */ - upgradebb = apr_brigade_create(r->pool, f->c->bucket_alloc); - - ap_fputstrs(f->next, upgradebb, SWITCH_STATUS_LINE, CRLF, - UPGRADE_HEADER, CRLF, CONNECTION_HEADER, CRLF, CRLF, NULL); - - b = apr_bucket_flush_create(f->c->bucket_alloc); - APR_BRIGADE_INSERT_TAIL(upgradebb, b); - - rv = ap_pass_brigade(f->next, upgradebb); - if (rv) { - ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, - "could not send interim 101 Upgrade response"); - return AP_FILTER_ERROR; - } - - ssl_init_ssl_connection(f->c); - - ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r, - "Awaiting re-negotiation handshake"); - - sslconn = myConnConfig(f->c); - ssl = sslconn->ssl; - - /* XXX: Should replace SSL_set_state with SSL_renegotiate(ssl); - * However, this causes failures in perl-framework currently, - * perhaps pre-test if we have already negotiated? - */ - SSL_set_accept_state(ssl); - SSL_do_handshake(ssl); - - if (SSL_get_state(ssl) != SSL_ST_OK) { - ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, - "TLS Upgrade handshake failed: " - "Not accepted by client!?"); - - return AP_FILTER_ERROR; - } - - /* Now that we have initialized the ssl connection which added the ssl_io_filter, - pass the brigade off to the connection based output filters so that the - request can complete encrypted */ - return ap_pass_brigade(f->c->output_filters, bb); - -} - -static apr_status_t ssl_io_filter_input(ap_filter_t *f, - apr_bucket_brigade *bb, - ap_input_mode_t mode, - apr_read_type_e block, - apr_off_t readbytes) -{ - apr_status_t status; - bio_filter_in_ctx_t *inctx = f->ctx; - - apr_size_t len = sizeof(inctx->buffer); - int is_init = (mode == AP_MODE_INIT); - - if (f->c->aborted) { - /* XXX: Ok, if we aborted, we ARE at the EOS. We also have - * aborted. This 'double protection' is probably redundant, - * but also effective against just about anything. - */ - apr_bucket *bucket = apr_bucket_eos_create(f->c->bucket_alloc); - APR_BRIGADE_INSERT_TAIL(bb, bucket); - return APR_ECONNABORTED; - } - - if (!inctx->ssl) { - return ap_get_brigade(f->next, bb, mode, block, readbytes); - } - - /* XXX: we don't currently support anything other than these modes. */ - if (mode != AP_MODE_READBYTES && mode != AP_MODE_GETLINE && - mode != AP_MODE_SPECULATIVE && mode != AP_MODE_INIT) { - return APR_ENOTIMPL; - } - - inctx->mode = mode; - inctx->block = block; - - /* XXX: we could actually move ssl_io_filter_connect to an - * ap_hook_process_connection but would still need to call it for - * AP_MODE_INIT for protocols that may upgrade the connection - * rather than have SSLEngine On configured. - */ - if ((status = ssl_io_filter_connect(inctx->filter_ctx)) != APR_SUCCESS) { - return ssl_io_filter_error(f, bb, status); - } - - if (is_init) { - /* protocol module needs to handshake before sending - * data to client (e.g. NNTP or FTP) - */ - return APR_SUCCESS; - } - - if (inctx->mode == AP_MODE_READBYTES || - inctx->mode == AP_MODE_SPECULATIVE) { - /* Protected from truncation, readbytes < MAX_SIZE_T - * FIXME: No, it's *not* protected. -- jre */ - if (readbytes < len) { - len = (apr_size_t)readbytes; - } - status = ssl_io_input_read(inctx, inctx->buffer, &len); - } - else if (inctx->mode == AP_MODE_GETLINE) { - status = ssl_io_input_getline(inctx, inctx->buffer, &len); - } - else { - /* We have no idea what you are talking about, so return an error. */ - return APR_ENOTIMPL; - } - - if (status != APR_SUCCESS) { - return ssl_io_filter_error(f, bb, status); - } - - /* Create a transient bucket out of the decrypted data. */ - if (len > 0) { - apr_bucket *bucket = - apr_bucket_transient_create(inctx->buffer, len, f->c->bucket_alloc); - APR_BRIGADE_INSERT_TAIL(bb, bucket); - } - - return APR_SUCCESS; -} - -static apr_status_t ssl_io_filter_output(ap_filter_t *f, - apr_bucket_brigade *bb) -{ - apr_status_t status = APR_SUCCESS; - ssl_filter_ctx_t *filter_ctx = f->ctx; - bio_filter_in_ctx_t *inctx; - bio_filter_out_ctx_t *outctx; - apr_read_type_e rblock = APR_NONBLOCK_READ; - - if (f->c->aborted) { - apr_brigade_cleanup(bb); - return APR_ECONNABORTED; - } - - if (!filter_ctx->pssl) { - /* ssl_filter_io_shutdown was called */ - return ap_pass_brigade(f->next, bb); - } - - inctx = (bio_filter_in_ctx_t *)filter_ctx->pbioRead->ptr; - outctx = (bio_filter_out_ctx_t *)filter_ctx->pbioWrite->ptr; - - /* When we are the writer, we must initialize the inctx - * mode so that we block for any required ssl input, because - * output filtering is always nonblocking. - */ - inctx->mode = AP_MODE_READBYTES; - inctx->block = APR_BLOCK_READ; - - if ((status = ssl_io_filter_connect(filter_ctx)) != APR_SUCCESS) { - return ssl_io_filter_error(f, bb, status); - } - - while (!APR_BRIGADE_EMPTY(bb)) { - apr_bucket *bucket = APR_BRIGADE_FIRST(bb); - - /* If it is a flush or EOS, we need to pass this down. - * These types do not require translation by OpenSSL. - */ - if (APR_BUCKET_IS_EOS(bucket) || APR_BUCKET_IS_FLUSH(bucket)) { - if (bio_filter_out_flush(filter_ctx->pbioWrite) < 0) { - status = outctx->rc; - break; - } - - if (APR_BUCKET_IS_EOS(bucket)) { - /* - * By definition, nothing can come after EOS. - * which also means we can pass the rest of this brigade - * without creating a new one since it only contains the - * EOS bucket. - */ - - if ((status = ap_pass_brigade(f->next, bb)) != APR_SUCCESS) { - return status; - } - break; - } - else { - /* bio_filter_out_flush() already passed down a flush bucket - * if there was any data to be flushed. - */ - apr_bucket_delete(bucket); - } - } - else if (AP_BUCKET_IS_EOC(bucket)) { - /* The special "EOC" bucket means a shutdown is needed; - * - turn off buffering in bio_filter_out_write - * - issue the SSL_shutdown - */ - filter_ctx->nobuffer = 1; - status = ssl_filter_io_shutdown(filter_ctx, f->c, 0); - if (status != APR_SUCCESS) { - ap_log_cerror(APLOG_MARK, APLOG_INFO, status, f->c, - "SSL filter error shutting down I/O"); - } - if ((status = ap_pass_brigade(f->next, bb)) != APR_SUCCESS) { - return status; - } - break; - } - else { - /* filter output */ - const char *data; - apr_size_t len; - - status = apr_bucket_read(bucket, &data, &len, rblock); - - if (APR_STATUS_IS_EAGAIN(status)) { - /* No data available: flush... */ - if (bio_filter_out_flush(filter_ctx->pbioWrite) < 0) { - status = outctx->rc; - break; - } - rblock = APR_BLOCK_READ; - continue; /* and try again with a blocking read. */ - } - - rblock = APR_NONBLOCK_READ; - - if (!APR_STATUS_IS_EOF(status) && (status != APR_SUCCESS)) { - break; - } - - status = ssl_filter_write(f, data, len); - apr_bucket_delete(bucket); - - if (status != APR_SUCCESS) { - break; - } - } - } - - return status; -} - -static void ssl_io_input_add_filter(ssl_filter_ctx_t *filter_ctx, conn_rec *c, - SSL *ssl) -{ - bio_filter_in_ctx_t *inctx; - - inctx = apr_palloc(c->pool, sizeof(*inctx)); - - filter_ctx->pInputFilter = ap_add_input_filter(ssl_io_filter, inctx, NULL, c); - - filter_ctx->pbioRead = BIO_new(&bio_filter_in_method); - filter_ctx->pbioRead->ptr = (void *)inctx; - - inctx->ssl = ssl; - inctx->bio_out = filter_ctx->pbioWrite; - inctx->f = filter_ctx->pInputFilter; - inctx->rc = APR_SUCCESS; - inctx->mode = AP_MODE_READBYTES; - inctx->cbuf.length = 0; - inctx->bb = apr_brigade_create(c->pool, c->bucket_alloc); - inctx->block = APR_BLOCK_READ; - inctx->pool = c->pool; - inctx->filter_ctx = filter_ctx; -} - -void ssl_io_filter_init(conn_rec *c, SSL *ssl) -{ - ssl_filter_ctx_t *filter_ctx; - - filter_ctx = apr_palloc(c->pool, sizeof(ssl_filter_ctx_t)); - - filter_ctx->pOutputFilter = ap_add_output_filter(ssl_io_filter, - filter_ctx, NULL, c); - - filter_ctx->pbioWrite = BIO_new(&bio_filter_out_method); - filter_ctx->pbioWrite->ptr = (void *)bio_filter_out_ctx_new(filter_ctx, c); - - ssl_io_input_add_filter(filter_ctx, c, ssl); - - SSL_set_bio(ssl, filter_ctx->pbioRead, filter_ctx->pbioWrite); - filter_ctx->pssl = ssl; - - apr_pool_cleanup_register(c->pool, (void*)filter_ctx, - ssl_io_filter_cleanup, apr_pool_cleanup_null); - - if (c->base_server->loglevel >= APLOG_DEBUG) { - BIO_set_callback(SSL_get_rbio(ssl), ssl_io_data_cb); - BIO_set_callback_arg(SSL_get_rbio(ssl), (void *)ssl); - } - - return; -} - -void ssl_io_filter_register(apr_pool_t *p) -{ - /* This filter MUST be after the HTTP_HEADER filter, but it also must be - * a resource-level filter so it has the request_rec. - */ - ap_register_output_filter ("UPGRADE_FILTER", ssl_io_filter_Upgrade, NULL, AP_FTYPE_PROTOCOL + 5); - - ap_register_input_filter (ssl_io_filter, ssl_io_filter_input, NULL, AP_FTYPE_CONNECTION + 5); - ap_register_output_filter (ssl_io_filter, ssl_io_filter_output, NULL, AP_FTYPE_CONNECTION + 5); - return; -} - -/* _________________________________________________________________ -** -** I/O Data Debugging -** _________________________________________________________________ -*/ - -#define DUMP_WIDTH 16 - -static void ssl_io_data_dump(server_rec *srvr, - MODSSL_BIO_CB_ARG_TYPE *s, - long len) -{ - char buf[256]; - char tmp[64]; - int i, j, rows, trunc; - unsigned char ch; - - trunc = 0; - for(; (len > 0) && ((s[len-1] == ' ') || (s[len-1] == '\0')); len--) - trunc++; - rows = (len / DUMP_WIDTH); - if ((rows * DUMP_WIDTH) < len) - rows++; - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, srvr, - "+-------------------------------------------------------------------------+"); - for(i = 0 ; i< rows; i++) { - apr_snprintf(tmp, sizeof(tmp), "| %04x: ", i * DUMP_WIDTH); - apr_cpystrn(buf, tmp, sizeof(buf)); - for (j = 0; j < DUMP_WIDTH; j++) { - if (((i * DUMP_WIDTH) + j) >= len) - apr_cpystrn(buf+strlen(buf), " ", sizeof(buf)-strlen(buf)); - else { - ch = ((unsigned char)*((char *)(s) + i * DUMP_WIDTH + j)) & 0xff; - apr_snprintf(tmp, sizeof(tmp), "%02x%c", ch , j==7 ? '-' : ' '); - apr_cpystrn(buf+strlen(buf), tmp, sizeof(buf)-strlen(buf)); - } - } - apr_cpystrn(buf+strlen(buf), " ", sizeof(buf)-strlen(buf)); - for (j = 0; j < DUMP_WIDTH; j++) { - if (((i * DUMP_WIDTH) + j) >= len) - apr_cpystrn(buf+strlen(buf), " ", sizeof(buf)-strlen(buf)); - else { - ch = ((unsigned char)*((char *)(s) + i * DUMP_WIDTH + j)) & 0xff; - apr_snprintf(tmp, sizeof(tmp), "%c", ((ch >= ' ') && (ch <= '~')) ? ch : '.'); - apr_cpystrn(buf+strlen(buf), tmp, sizeof(buf)-strlen(buf)); - } - } - apr_cpystrn(buf+strlen(buf), " |", sizeof(buf)-strlen(buf)); - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, srvr, - "%s", buf); - } - if (trunc > 0) - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, srvr, - "| %04ld - ", len + trunc); - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, srvr, - "+-------------------------------------------------------------------------+"); - return; -} - -long ssl_io_data_cb(BIO *bio, int cmd, - MODSSL_BIO_CB_ARG_TYPE *argp, - int argi, long argl, long rc) -{ - SSL *ssl; - conn_rec *c; - server_rec *s; - - if ((ssl = (SSL *)BIO_get_callback_arg(bio)) == NULL) - return rc; - if ((c = (conn_rec *)SSL_get_app_data(ssl)) == NULL) - return rc; - s = c->base_server; - - if ( cmd == (BIO_CB_WRITE|BIO_CB_RETURN) - || cmd == (BIO_CB_READ |BIO_CB_RETURN) ) { - if (rc >= 0) { - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "%s: %s %ld/%d bytes %s BIO#%pp [mem: %pp] %s", - SSL_LIBRARY_NAME, - (cmd == (BIO_CB_WRITE|BIO_CB_RETURN) ? "write" : "read"), - rc, argi, (cmd == (BIO_CB_WRITE|BIO_CB_RETURN) ? "to" : "from"), - bio, argp, - (argp != NULL ? "(BIO dump follows)" : "(Oops, no memory buffer?)")); - if (argp != NULL) - ssl_io_data_dump(s, argp, rc); - } - else { - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "%s: I/O error, %d bytes expected to %s on BIO#%pp [mem: %pp]", - SSL_LIBRARY_NAME, argi, - (cmd == (BIO_CB_WRITE|BIO_CB_RETURN) ? "write" : "read"), - bio, argp); - } - } - return rc; -} diff --git a/trunk/modules/ssl/ssl_engine_kernel.c b/trunk/modules/ssl/ssl_engine_kernel.c deleted file mode 100644 index 03b1e88ce9e0199e8120495cbbbed26635b08862..0000000000000000000000000000000000000000 --- a/trunk/modules/ssl/ssl_engine_kernel.c +++ /dev/null @@ -1,1846 +0,0 @@ -/* Copyright 2001-2005 The Apache Software Foundation or its licensors, as - * applicable. - * - * 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_ssl - * | '_ ` _ \ / _ \ / _` | / __/ __| | Apache Interface to OpenSSL - * | | | | | | (_) | (_| | \__ \__ \ | - * |_| |_| |_|\___/ \__,_|___|___/___/_| - * |_____| - * ssl_engine_kernel.c - * The SSL engine kernel - */ - /* ``It took me fifteen years to discover - I had no talent for programming, but - I couldn't give it up because by that - time I was too famous.'' - -- Unknown */ -#include "ssl_private.h" - -static void ssl_configure_env(request_rec *r, SSLConnRec *sslconn); - -/* - * Post Read Request Handler - */ -int ssl_hook_ReadReq(request_rec *r) -{ - SSLConnRec *sslconn = myConnConfig(r->connection); - SSL *ssl; - - if (!sslconn) { - return DECLINED; - } - - if (sslconn->non_ssl_request) { - const char *errmsg; - char *thisurl; - char *thisport = ""; - int port = ap_get_server_port(r); - - if (!ap_is_default_port(port, r)) { - thisport = apr_psprintf(r->pool, ":%u", port); - } - - thisurl = ap_escape_html(r->pool, - apr_psprintf(r->pool, "https://%s%s/", - ap_get_server_name(r), - thisport)); - - errmsg = apr_psprintf(r->pool, - "Reason: You're speaking plain HTTP " - "to an SSL-enabled server port.
\n" - "Instead use the HTTPS scheme to access " - "this URL, please.
\n" - "
Hint: " - "%s
", - thisurl, thisurl); - - apr_table_setn(r->notes, "error-notes", errmsg); - - /* Now that we have caught this error, forget it. we are done - * with using SSL on this request. - */ - sslconn->non_ssl_request = 0; - - - return HTTP_BAD_REQUEST; - } - - /* - * Get the SSL connection structure and perform the - * delayed interlinking from SSL back to request_rec - */ - ssl = sslconn->ssl; - if (!ssl) { - return DECLINED; - } - SSL_set_app_data2(ssl, r); - - /* - * Log information about incoming HTTPS requests - */ - if (r->server->loglevel >= APLOG_INFO && ap_is_initial_req(r)) { - ap_log_error(APLOG_MARK, APLOG_INFO, 0, r->server, - "%s HTTPS request received for child %ld (server %s)", - (r->connection->keepalives <= 0 ? - "Initial (No.1)" : - apr_psprintf(r->pool, "Subsequent (No.%d)", - r->connection->keepalives+1)), - r->connection->id, - ssl_util_vhostid(r->pool, r->server)); - } - - /* SetEnvIf ssl-*-shutdown flags can only be per-server, - * so they won't change across keepalive requests - */ - if (sslconn->shutdown_type == SSL_SHUTDOWN_TYPE_UNSET) { - ssl_configure_env(r, sslconn); - } - - return DECLINED; -} - -/* - * Move SetEnvIf information from request_rec to conn_rec/BUFF - * to allow the close connection handler to use them. - */ - -static void ssl_configure_env(request_rec *r, SSLConnRec *sslconn) -{ - int i; - const apr_array_header_t *arr = apr_table_elts(r->subprocess_env); - const apr_table_entry_t *elts = (const apr_table_entry_t *)arr->elts; - - sslconn->shutdown_type = SSL_SHUTDOWN_TYPE_STANDARD; - - for (i = 0; i < arr->nelts; i++) { - const char *key = elts[i].key; - - switch (*key) { - case 's': - /* being case-sensitive here. - * and not checking for the -shutdown since these are the only - * SetEnvIf "flags" we support - */ - if (!strncmp(key+1, "sl-", 3)) { - key += 4; - if (!strncmp(key, "unclean", 7)) { - sslconn->shutdown_type = SSL_SHUTDOWN_TYPE_UNCLEAN; - } - else if (!strncmp(key, "accurate", 8)) { - sslconn->shutdown_type = SSL_SHUTDOWN_TYPE_ACCURATE; - } - return; /* should only ever be one ssl-*-shutdown */ - } - break; - } - } -} - -/* - * Access Handler - */ -int ssl_hook_Access(request_rec *r) -{ - SSLDirConfigRec *dc = myDirConfig(r); - SSLSrvConfigRec *sc = mySrvConfig(r->server); - SSLConnRec *sslconn = myConnConfig(r->connection); - SSL *ssl = sslconn ? sslconn->ssl : NULL; - SSL_CTX *ctx = NULL; - apr_array_header_t *requires; - ssl_require_t *ssl_requires; - char *cp; - int ok, i; - BOOL renegotiate = FALSE, renegotiate_quick = FALSE; - X509 *cert; - X509 *peercert; - X509_STORE *cert_store = NULL; - X509_STORE_CTX cert_store_ctx; - STACK_OF(SSL_CIPHER) *cipher_list_old = NULL, *cipher_list = NULL; - SSL_CIPHER *cipher = NULL; - int depth, verify_old, verify, n; - - if (ssl) { - ctx = SSL_get_SSL_CTX(ssl); - } - - /* - * Support for SSLRequireSSL directive - */ - if (dc->bSSLRequired && !ssl) { - if (sc->enabled == SSL_ENABLED_OPTIONAL) { - /* This vhost was configured for optional SSL, just tell the - * client that we need to upgrade. - */ - apr_table_setn(r->err_headers_out, "Upgrade", "TLS/1.0, HTTP/1.1"); - apr_table_setn(r->err_headers_out, "Connection", "Upgrade"); - - return HTTP_UPGRADE_REQUIRED; - } - - ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, - "access to %s failed, reason: %s", - r->filename, "SSL connection required"); - - /* remember forbidden access for strict require option */ - apr_table_setn(r->notes, "ssl-access-forbidden", "1"); - - return HTTP_FORBIDDEN; - } - - /* - * Check to see if SSL protocol is on - */ - if (!((sc->enabled == SSL_ENABLED_TRUE) || (sc->enabled == SSL_ENABLED_OPTIONAL) || ssl)) { - return DECLINED; - } - /* - * Support for per-directory reconfigured SSL connection parameters. - * - * This is implemented by forcing an SSL renegotiation with the - * reconfigured parameter suite. But Apache's internal API processing - * makes our life very hard here, because when internal sub-requests occur - * we nevertheless should avoid multiple unnecessary SSL handshakes (they - * require extra network I/O and especially time to perform). - * - * But the optimization for filtering out the unnecessary handshakes isn't - * obvious and trivial. Especially because while Apache is in its - * sub-request processing the client could force additional handshakes, - * too. And these take place perhaps without our notice. So the only - * possibility is to explicitly _ask_ OpenSSL whether the renegotiation - * has to be performed or not. It has to performed when some parameters - * which were previously known (by us) are not those we've now - * reconfigured (as known by OpenSSL) or (in optimized way) at least when - * the reconfigured parameter suite is stronger (more restrictions) than - * the currently active one. - */ - - /* - * Override of SSLCipherSuite - * - * We provide two options here: - * - * o The paranoid and default approach where we force a renegotiation when - * the cipher suite changed in _any_ way (which is straight-forward but - * often forces renegotiations too often and is perhaps not what the - * user actually wanted). - * - * o The optimized and still secure way where we force a renegotiation - * only if the currently active cipher is no longer contained in the - * reconfigured/new cipher suite. Any other changes are not important - * because it's the servers choice to select a cipher from the ones the - * client supports. So as long as the current cipher is still in the new - * cipher suite we're happy. Because we can assume we would have - * selected it again even when other (better) ciphers exists now in the - * new cipher suite. This approach is fine because the user explicitly - * has to enable this via ``SSLOptions +OptRenegotiate''. So we do no - * implicit optimizations. - */ - if (dc->szCipherSuite) { - /* remember old state */ - - if (dc->nOptions & SSL_OPT_OPTRENEGOTIATE) { - cipher = SSL_get_current_cipher(ssl); - } - else { - cipher_list_old = (STACK_OF(SSL_CIPHER) *)SSL_get_ciphers(ssl); - - if (cipher_list_old) { - cipher_list_old = sk_SSL_CIPHER_dup(cipher_list_old); - } - } - - /* configure new state */ - if (!modssl_set_cipher_list(ssl, dc->szCipherSuite)) { - ap_log_error(APLOG_MARK, APLOG_WARNING, 0, - r->server, - "Unable to reconfigure (per-directory) " - "permitted SSL ciphers"); - ssl_log_ssl_error(APLOG_MARK, APLOG_ERR, r->server); - - if (cipher_list_old) { - sk_SSL_CIPHER_free(cipher_list_old); - } - - return HTTP_FORBIDDEN; - } - - /* determine whether a renegotiation has to be forced */ - cipher_list = (STACK_OF(SSL_CIPHER) *)SSL_get_ciphers(ssl); - - if (dc->nOptions & SSL_OPT_OPTRENEGOTIATE) { - /* optimized way */ - if ((!cipher && cipher_list) || - (cipher && !cipher_list)) - { - renegotiate = TRUE; - } - else if (cipher && cipher_list && - (sk_SSL_CIPHER_find(cipher_list, cipher) < 0)) - { - renegotiate = TRUE; - } - } - else { - /* paranoid way */ - if ((!cipher_list_old && cipher_list) || - (cipher_list_old && !cipher_list)) - { - renegotiate = TRUE; - } - else if (cipher_list_old && cipher_list) { - for (n = 0; - !renegotiate && (n < sk_SSL_CIPHER_num(cipher_list)); - n++) - { - SSL_CIPHER *value = sk_SSL_CIPHER_value(cipher_list, n); - - if (sk_SSL_CIPHER_find(cipher_list_old, value) < 0) { - renegotiate = TRUE; - } - } - - for (n = 0; - !renegotiate && (n < sk_SSL_CIPHER_num(cipher_list_old)); - n++) - { - SSL_CIPHER *value = sk_SSL_CIPHER_value(cipher_list_old, n); - - if (sk_SSL_CIPHER_find(cipher_list, value) < 0) { - renegotiate = TRUE; - } - } - } - } - - /* cleanup */ - if (cipher_list_old) { - sk_SSL_CIPHER_free(cipher_list_old); - } - - /* tracing */ - if (renegotiate) { - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, - "Reconfigured cipher suite will force renegotiation"); - } - } - - /* - * override of SSLVerifyDepth - * - * The depth checks are handled by us manually inside the verify callback - * function and not by OpenSSL internally (and our function is aware of - * both the per-server and per-directory contexts). So we cannot ask - * OpenSSL about the currently verify depth. Instead we remember it in our - * ap_ctx attached to the SSL* of OpenSSL. We've to force the - * renegotiation if the reconfigured/new verify depth is less than the - * currently active/remembered verify depth (because this means more - * restriction on the certificate chain). - */ - if (dc->nVerifyDepth != UNSET) { - /* XXX: doesnt look like sslconn->verify_depth is actually used */ - if (!(n = sslconn->verify_depth)) { - sslconn->verify_depth = n = sc->server->auth.verify_depth; - } - - /* determine whether a renegotiation has to be forced */ - if (dc->nVerifyDepth < n) { - renegotiate = TRUE; - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, - "Reduced client verification depth will force " - "renegotiation"); - } - } - - /* - * override of SSLVerifyClient - * - * We force a renegotiation if the reconfigured/new verify type is - * stronger than the currently active verify type. - * - * The order is: none << optional_no_ca << optional << require - * - * Additionally the following optimization is possible here: When the - * currently active verify type is "none" but a client certificate is - * already known/present, it's enough to manually force a client - * verification but at least skip the I/O-intensive renegotation - * handshake. - */ - if (dc->nVerifyClient != SSL_CVERIFY_UNSET) { - /* remember old state */ - verify_old = SSL_get_verify_mode(ssl); - /* configure new state */ - verify = SSL_VERIFY_NONE; - - if (dc->nVerifyClient == SSL_CVERIFY_REQUIRE) { - verify |= SSL_VERIFY_PEER_STRICT; - } - - if ((dc->nVerifyClient == SSL_CVERIFY_OPTIONAL) || - (dc->nVerifyClient == SSL_CVERIFY_OPTIONAL_NO_CA)) - { - verify |= SSL_VERIFY_PEER; - } - - modssl_set_verify(ssl, verify, ssl_callback_SSLVerify); - SSL_set_verify_result(ssl, X509_V_OK); - - /* determine whether we've to force a renegotiation */ - if (!renegotiate && verify != verify_old) { - if (((verify_old == SSL_VERIFY_NONE) && - (verify != SSL_VERIFY_NONE)) || - - (!(verify_old & SSL_VERIFY_PEER) && - (verify & SSL_VERIFY_PEER)) || - - (!(verify_old & SSL_VERIFY_PEER_STRICT) && - (verify & SSL_VERIFY_PEER_STRICT))) - { - renegotiate = TRUE; - /* optimization */ - - if ((dc->nOptions & SSL_OPT_OPTRENEGOTIATE) && - (verify_old == SSL_VERIFY_NONE) && - ((peercert = SSL_get_peer_certificate(ssl)) != NULL)) - { - renegotiate_quick = TRUE; - X509_free(peercert); - } - - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, - r->server, - "Changed client verification type will force " - "%srenegotiation", - renegotiate_quick ? "quick " : ""); - } - } - } - - /* - * override SSLCACertificateFile & SSLCACertificatePath - * This is only enabled if the SSL_set_cert_store() function - * is available in the ssl library. the 1.x based mod_ssl - * used SSL_CTX_set_cert_store which is not thread safe. - */ - -#ifdef HAVE_SSL_SET_CERT_STORE - /* - * check if per-dir and per-server config field are not the same. - * if f is defined in per-dir and not defined in per-server - * or f is defined in both but not the equal ... - */ -#define MODSSL_CFG_NE(f) \ - (dc->f && (!sc->f || (sc->f && strNE(dc->f, sc->f)))) - -#define MODSSL_CFG_CA(f) \ - (dc->f ? dc->f : sc->f) - - if (MODSSL_CFG_NE(szCACertificateFile) || - MODSSL_CFG_NE(szCACertificatePath)) - { - STACK_OF(X509_NAME) *ca_list; - const char *ca_file = MODSSL_CFG_CA(szCACertificateFile); - const char *ca_path = MODSSL_CFG_CA(szCACertificatePath); - - cert_store = X509_STORE_new(); - - if (!X509_STORE_load_locations(cert_store, ca_file, ca_path)) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server, - "Unable to reconfigure verify locations " - "for client authentication"); - ssl_log_ssl_error(APLOG_MARK, APLOG_ERR, r->server); - - X509_STORE_free(cert_store); - - return HTTP_FORBIDDEN; - } - - /* SSL_free will free cert_store */ - SSL_set_cert_store(ssl, cert_store); - - if (!(ca_list = ssl_init_FindCAList(r->server, r->pool, - ca_file, ca_path))) - { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server, - "Unable to determine list of available " - "CA certificates for client authentication"); - - return HTTP_FORBIDDEN; - } - - SSL_set_client_CA_list(ssl, ca_list); - renegotiate = TRUE; - - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, - "Changed client verification locations will force " - "renegotiation"); - } -#endif /* HAVE_SSL_SET_CERT_STORE */ - - /* - * SSL renegotiations in conjunction with HTTP - * requests using the POST method are not supported. - * - * Background: - * - * 1. When the client sends a HTTP/HTTPS request, Apache's core code - * reads only the request line ("METHOD /path HTTP/x.y") and the - * attached MIME headers ("Foo: bar") up to the terminating line ("CR - * LF"). An attached request body (for instance the data of a POST - * method) is _NOT_ read. Instead it is read by mod_cgi's content - * handler and directly passed to the CGI script. - * - * 2. mod_ssl supports per-directory re-configuration of SSL parameters. - * This is implemented by performing an SSL renegotiation of the - * re-configured parameters after the request is read, but before the - * response is sent. In more detail: the renegotiation happens after the - * request line and MIME headers were read, but _before_ the attached - * request body is read. The reason simply is that in the HTTP protocol - * usually there is no acknowledgment step between the headers and the - * body (there is the 100-continue feature and the chunking facility - * only), so Apache has no API hook for this step. - * - * 3. the problem now occurs when the client sends a POST request for - * URL /foo via HTTPS the server and the server has SSL parameters - * re-configured on a per-URL basis for /foo. Then mod_ssl has to - * perform an SSL renegotiation after the request was read and before - * the response is sent. But the problem is the pending POST body data - * in the receive buffer of SSL (which Apache still has not read - it's - * pending until mod_cgi sucks it in). When mod_ssl now tries to perform - * the renegotiation the pending data leads to an I/O error. - * - * Solution Idea: - * - * There are only two solutions: Either to simply state that POST - * requests to URLs with SSL re-configurations are not allowed, or to - * renegotiate really after the _complete_ request (i.e. including - * the POST body) was read. Obviously the latter would be preferred, - * but it cannot be done easily inside Apache, because as already - * mentioned, there is no API step between the body reading and the body - * processing. And even when we mod_ssl would hook directly into the - * loop of mod_cgi, we wouldn't solve the problem for other handlers, of - * course. So the only general solution is to suck in the pending data - * of the request body from the OpenSSL BIO into the Apache BUFF. Then - * the renegotiation can be done and after this step Apache can proceed - * processing the request as before. - * - * Solution Implementation: - * - * We cannot simply suck in the data via an SSL_read-based loop because of - * HTTP chunking. Instead we _have_ to use the Apache API for this step which - * is aware of HTTP chunking. So the trick is to suck in the pending request - * data via the Apache API (which uses Apache's BUFF code and in the - * background mod_ssl's I/O glue code) and re-inject it later into the Apache - * BUFF code again. This way the data flows twice through the Apache BUFF, of - * course. But this way the solution doesn't depend on any Apache specifics - * and is fully transparent to Apache modules. - * - * !! BUT ALL THIS IS STILL NOT RE-IMPLEMENTED FOR APACHE 2.0 !! - */ - if (renegotiate && !renegotiate_quick && (r->method_number == M_POST)) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server, - "SSL Re-negotiation in conjunction " - "with POST method not supported! " - "hint: try SSLOptions +OptRenegotiate"); - - return HTTP_METHOD_NOT_ALLOWED; - } - - /* - * now do the renegotiation if anything was actually reconfigured - */ - if (renegotiate) { - /* - * Now we force the SSL renegotation by sending the Hello Request - * message to the client. Here we have to do a workaround: Actually - * OpenSSL returns immediately after sending the Hello Request (the - * intent AFAIK is because the SSL/TLS protocol says it's not a must - * that the client replies to a Hello Request). But because we insist - * on a reply (anything else is an error for us) we have to go to the - * ACCEPT state manually. Using SSL_set_accept_state() doesn't work - * here because it resets too much of the connection. So we set the - * state explicitly and continue the handshake manually. - */ - ap_log_error(APLOG_MARK, APLOG_INFO, 0, r->server, - "Requesting connection re-negotiation"); - - if (renegotiate_quick) { - STACK_OF(X509) *cert_stack; - - /* perform just a manual re-verification of the peer */ - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, - "Performing quick renegotiation: " - "just re-verifying the peer"); - - cert_stack = (STACK_OF(X509) *)SSL_get_peer_cert_chain(ssl); - - cert = SSL_get_peer_certificate(ssl); - - if (!cert_stack && cert) { - /* client cert is in the session cache, but there is - * no chain, since ssl3_get_client_certificate() - * sk_X509_shift-ed the peer cert out of the chain. - * we put it back here for the purpose of quick_renegotiation. - */ - cert_stack = sk_new_null(); - sk_X509_push(cert_stack, MODSSL_PCHAR_CAST cert); - } - - if (!cert_stack || (sk_X509_num(cert_stack) == 0)) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server, - "Cannot find peer certificate chain"); - - return HTTP_FORBIDDEN; - } - - if (!(cert_store || - (cert_store = SSL_CTX_get_cert_store(ctx)))) - { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server, - "Cannot find certificate storage"); - - return HTTP_FORBIDDEN; - } - - if (!cert) { - cert = sk_X509_value(cert_stack, 0); - } - - X509_STORE_CTX_init(&cert_store_ctx, cert_store, cert, cert_stack); - depth = SSL_get_verify_depth(ssl); - - if (depth >= 0) { - X509_STORE_CTX_set_depth(&cert_store_ctx, depth); - } - - X509_STORE_CTX_set_ex_data(&cert_store_ctx, - SSL_get_ex_data_X509_STORE_CTX_idx(), - (char *)ssl); - - if (!modssl_X509_verify_cert(&cert_store_ctx)) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server, - "Re-negotiation verification step failed"); - ssl_log_ssl_error(APLOG_MARK, APLOG_ERR, r->server); - } - - SSL_set_verify_result(ssl, cert_store_ctx.error); - X509_STORE_CTX_cleanup(&cert_store_ctx); - - if (cert_stack != SSL_get_peer_cert_chain(ssl)) { - /* we created this ourselves, so free it */ - sk_X509_pop_free(cert_stack, X509_free); - } - } - else { - request_rec *id = r->main ? r->main : r; - - /* do a full renegotiation */ - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, - "Performing full renegotiation: " - "complete handshake protocol"); - - SSL_set_session_id_context(ssl, - (unsigned char *)&id, - sizeof(id)); - - SSL_renegotiate(ssl); - SSL_do_handshake(ssl); - - if (SSL_get_state(ssl) != SSL_ST_OK) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server, - "Re-negotiation request failed"); - - r->connection->aborted = 1; - return HTTP_FORBIDDEN; - } - - ap_log_error(APLOG_MARK, APLOG_INFO, 0, r->server, - "Awaiting re-negotiation handshake"); - - /* XXX: Should replace SSL_set_state with SSL_renegotiate(ssl); - * However, this causes failures in perl-framework currently, - * perhaps pre-test if we have already negotiated? - */ - SSL_set_state(ssl, SSL_ST_ACCEPT); - SSL_do_handshake(ssl); - - if (SSL_get_state(ssl) != SSL_ST_OK) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server, - "Re-negotiation handshake failed: " - "Not accepted by client!?"); - - r->connection->aborted = 1; - return HTTP_FORBIDDEN; - } - } - - /* - * Remember the peer certificate's DN - */ - if ((cert = SSL_get_peer_certificate(ssl))) { - if (sslconn->client_cert) { - X509_free(sslconn->client_cert); - } - sslconn->client_cert = cert; - sslconn->client_dn = NULL; - } - - /* - * Finally check for acceptable renegotiation results - */ - if (dc->nVerifyClient != SSL_CVERIFY_NONE) { - BOOL do_verify = (dc->nVerifyClient == SSL_CVERIFY_REQUIRE); - - if (do_verify && (SSL_get_verify_result(ssl) != X509_V_OK)) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server, - "Re-negotiation handshake failed: " - "Client verification failed"); - - return HTTP_FORBIDDEN; - } - - if (do_verify) { - if ((peercert = SSL_get_peer_certificate(ssl)) == NULL) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server, - "Re-negotiation handshake failed: " - "Client certificate missing"); - - return HTTP_FORBIDDEN; - } - - X509_free(peercert); - } - } - - /* - * Also check that SSLCipherSuite has been enforced as expected. - */ - if (cipher_list) { - cipher = SSL_get_current_cipher(ssl); - if (sk_SSL_CIPHER_find(cipher_list, cipher) < 0) { - ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, - "SSL cipher suite not renegotiated: " - "access to %s denied using cipher %s", - r->filename, - SSL_CIPHER_get_name(cipher)); - return HTTP_FORBIDDEN; - } - } - } - - /* If we're trying to have the user name set from a client - * certificate then we need to set it here. This should be safe as - * the user name probably isn't important from an auth checking point - * of view as the certificate supplied acts in that capacity. - * However, if FakeAuth is being used then this isn't the case so - * we need to postpone setting the username until later. - */ - if ((dc->nOptions & SSL_OPT_FAKEBASICAUTH) == 0 && dc->szUserName) { - char *val = ssl_var_lookup(r->pool, r->server, r->connection, - r, (char *)dc->szUserName); - if (val && val[0]) - r->user = val; - } - - /* - * Check SSLRequire boolean expressions - */ - requires = dc->aRequirement; - ssl_requires = (ssl_require_t *)requires->elts; - - for (i = 0; i < requires->nelts; i++) { - ssl_require_t *req = &ssl_requires[i]; - ok = ssl_expr_exec(r, req->mpExpr); - - if (ok < 0) { - cp = apr_psprintf(r->pool, - "Failed to execute " - "SSL requirement expression: %s", - ssl_expr_get_error()); - - ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, - "access to %s failed, reason: %s", - r->filename, cp); - - /* remember forbidden access for strict require option */ - apr_table_setn(r->notes, "ssl-access-forbidden", "1"); - - return HTTP_FORBIDDEN; - } - - if (ok != 1) { - ap_log_error(APLOG_MARK, APLOG_INFO, 0, r->server, - "Access to %s denied for %s " - "(requirement expression not fulfilled)", - r->filename, r->connection->remote_ip); - - ap_log_error(APLOG_MARK, APLOG_INFO, 0, r->server, - "Failed expression: %s", req->cpExpr); - - ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, - "access to %s failed, reason: %s", - r->filename, - "SSL requirement expression not fulfilled " - "(see SSL logfile for more details)"); - - /* remember forbidden access for strict require option */ - apr_table_setn(r->notes, "ssl-access-forbidden", "1"); - - return HTTP_FORBIDDEN; - } - } - - /* - * Else access is granted from our point of view (except vendor - * handlers override). But we have to return DECLINED here instead - * of OK, because mod_auth and other modules still might want to - * deny access. - */ - - return DECLINED; -} - -/* - * Authentication Handler: - * Fake a Basic authentication from the X509 client certificate. - * - * This must be run fairly early on to prevent a real authentication from - * occuring, in particular it must be run before anything else that - * authenticates a user. This means that the Module statement for this - * module should be LAST in the Configuration file. - */ -int ssl_hook_UserCheck(request_rec *r) -{ - SSLConnRec *sslconn = myConnConfig(r->connection); - SSLSrvConfigRec *sc = mySrvConfig(r->server); - SSLDirConfigRec *dc = myDirConfig(r); - char *clientdn; - const char *auth_line, *username, *password; - - /* - * Additionally forbid access (again) - * when strict require option is used. - */ - if ((dc->nOptions & SSL_OPT_STRICTREQUIRE) && - (apr_table_get(r->notes, "ssl-access-forbidden"))) - { - return HTTP_FORBIDDEN; - } - - /* - * We decline when we are in a subrequest. The Authorization header - * would already be present if it was added in the main request. - */ - if (!ap_is_initial_req(r)) { - return DECLINED; - } - - /* - * Make sure the user is not able to fake the client certificate - * based authentication by just entering an X.509 Subject DN - * ("/XX=YYY/XX=YYY/..") as the username and "password" as the - * password. - */ - if ((auth_line = apr_table_get(r->headers_in, "Authorization"))) { - if (strcEQ(ap_getword(r->pool, &auth_line, ' '), "Basic")) { - while ((*auth_line == ' ') || (*auth_line == '\t')) { - auth_line++; - } - - auth_line = ap_pbase64decode(r->pool, auth_line); - username = ap_getword_nulls(r->pool, &auth_line, ':'); - password = auth_line; - - if ((username[0] == '/') && strEQ(password, "password")) { - ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, - "Encountered FakeBasicAuth spoof: %s", username); - return HTTP_FORBIDDEN; - } - } - } - - /* - * We decline operation in various situations... - * - SSLOptions +FakeBasicAuth not configured - * - r->user already authenticated - * - ssl not enabled - * - client did not present a certificate - */ - if (!((sc->enabled == SSL_ENABLED_TRUE || sc->enabled == SSL_ENABLED_OPTIONAL) - && sslconn && sslconn->ssl && sslconn->client_cert) || - !(dc->nOptions & SSL_OPT_FAKEBASICAUTH) || r->user) - { - return DECLINED; - } - - if (!sslconn->client_dn) { - X509_NAME *name = X509_get_subject_name(sslconn->client_cert); - char *cp = X509_NAME_oneline(name, NULL, 0); - sslconn->client_dn = apr_pstrdup(r->connection->pool, cp); - modssl_free(cp); - } - - clientdn = (char *)sslconn->client_dn; - - /* - * Fake a password - which one would be immaterial, as, it seems, an empty - * password in the users file would match ALL incoming passwords, if only - * we were using the standard crypt library routine. Unfortunately, OpenSSL - * "fixes" a "bug" in crypt and thus prevents blank passwords from - * working. (IMHO what they really fix is a bug in the users of the code - * - failing to program correctly for shadow passwords). We need, - * therefore, to provide a password. This password can be matched by - * adding the string "xxj31ZMTZzkVA" as the password in the user file. - * This is just the crypted variant of the word "password" ;-) - */ - auth_line = apr_pstrcat(r->pool, "Basic ", - ap_pbase64encode(r->pool, - apr_pstrcat(r->pool, clientdn, - ":password", NULL)), - NULL); - apr_table_set(r->headers_in, "Authorization", auth_line); - - ap_log_error(APLOG_MARK, APLOG_INFO, 0, r->server, - "Faking HTTP Basic Auth header: \"Authorization: %s\"", - auth_line); - - return DECLINED; -} - -/* authorization phase */ -int ssl_hook_Auth(request_rec *r) -{ - SSLDirConfigRec *dc = myDirConfig(r); - - /* - * Additionally forbid access (again) - * when strict require option is used. - */ - if ((dc->nOptions & SSL_OPT_STRICTREQUIRE) && - (apr_table_get(r->notes, "ssl-access-forbidden"))) - { - return HTTP_FORBIDDEN; - } - - return DECLINED; -} - -/* - * Fixup Handler - */ - -static const char *ssl_hook_Fixup_vars[] = { - "SSL_VERSION_INTERFACE", - "SSL_VERSION_LIBRARY", - "SSL_PROTOCOL", - "SSL_CIPHER", - "SSL_CIPHER_EXPORT", - "SSL_CIPHER_USEKEYSIZE", - "SSL_CIPHER_ALGKEYSIZE", - "SSL_CLIENT_VERIFY", - "SSL_CLIENT_M_VERSION", - "SSL_CLIENT_M_SERIAL", - "SSL_CLIENT_V_START", - "SSL_CLIENT_V_END", - "SSL_CLIENT_V_REMAIN", - "SSL_CLIENT_S_DN", - "SSL_CLIENT_S_DN_C", - "SSL_CLIENT_S_DN_ST", - "SSL_CLIENT_S_DN_L", - "SSL_CLIENT_S_DN_O", - "SSL_CLIENT_S_DN_OU", - "SSL_CLIENT_S_DN_CN", - "SSL_CLIENT_S_DN_T", - "SSL_CLIENT_S_DN_I", - "SSL_CLIENT_S_DN_G", - "SSL_CLIENT_S_DN_S", - "SSL_CLIENT_S_DN_D", - "SSL_CLIENT_S_DN_UID", - "SSL_CLIENT_S_DN_Email", - "SSL_CLIENT_I_DN", - "SSL_CLIENT_I_DN_C", - "SSL_CLIENT_I_DN_ST", - "SSL_CLIENT_I_DN_L", - "SSL_CLIENT_I_DN_O", - "SSL_CLIENT_I_DN_OU", - "SSL_CLIENT_I_DN_CN", - "SSL_CLIENT_I_DN_T", - "SSL_CLIENT_I_DN_I", - "SSL_CLIENT_I_DN_G", - "SSL_CLIENT_I_DN_S", - "SSL_CLIENT_I_DN_D", - "SSL_CLIENT_I_DN_UID", - "SSL_CLIENT_I_DN_Email", - "SSL_CLIENT_A_KEY", - "SSL_CLIENT_A_SIG", - "SSL_SERVER_M_VERSION", - "SSL_SERVER_M_SERIAL", - "SSL_SERVER_V_START", - "SSL_SERVER_V_END", - "SSL_SERVER_S_DN", - "SSL_SERVER_S_DN_C", - "SSL_SERVER_S_DN_ST", - "SSL_SERVER_S_DN_L", - "SSL_SERVER_S_DN_O", - "SSL_SERVER_S_DN_OU", - "SSL_SERVER_S_DN_CN", - "SSL_SERVER_S_DN_T", - "SSL_SERVER_S_DN_I", - "SSL_SERVER_S_DN_G", - "SSL_SERVER_S_DN_S", - "SSL_SERVER_S_DN_D", - "SSL_SERVER_S_DN_UID", - "SSL_SERVER_S_DN_Email", - "SSL_SERVER_I_DN", - "SSL_SERVER_I_DN_C", - "SSL_SERVER_I_DN_ST", - "SSL_SERVER_I_DN_L", - "SSL_SERVER_I_DN_O", - "SSL_SERVER_I_DN_OU", - "SSL_SERVER_I_DN_CN", - "SSL_SERVER_I_DN_T", - "SSL_SERVER_I_DN_I", - "SSL_SERVER_I_DN_G", - "SSL_SERVER_I_DN_S", - "SSL_SERVER_I_DN_D", - "SSL_SERVER_I_DN_UID", - "SSL_SERVER_I_DN_Email", - "SSL_SERVER_A_KEY", - "SSL_SERVER_A_SIG", - "SSL_SESSION_ID", - NULL -}; - -int ssl_hook_Fixup(request_rec *r) -{ - SSLConnRec *sslconn = myConnConfig(r->connection); - SSLSrvConfigRec *sc = mySrvConfig(r->server); - SSLDirConfigRec *dc = myDirConfig(r); - apr_table_t *env = r->subprocess_env; - char *var, *val = ""; - STACK_OF(X509) *peer_certs; - SSL *ssl; - int i; - - if (sc->enabled == SSL_ENABLED_OPTIONAL && !(sslconn && sslconn->ssl)) { - apr_table_setn(r->headers_out, "Upgrade", "TLS/1.0, HTTP/1.1"); - } - - /* - * Check to see if SSL is on - */ - if (!(((sc->enabled == SSL_ENABLED_TRUE) || (sc->enabled == SSL_ENABLED_OPTIONAL)) && sslconn && (ssl = sslconn->ssl))) { - return DECLINED; - } - - /* - * Annotate the SSI/CGI environment with standard SSL information - */ - /* the always present HTTPS (=HTTP over SSL) flag! */ - apr_table_setn(env, "HTTPS", "on"); - - /* standard SSL environment variables */ - if (dc->nOptions & SSL_OPT_STDENVVARS) { - for (i = 0; ssl_hook_Fixup_vars[i]; i++) { - var = (char *)ssl_hook_Fixup_vars[i]; - val = ssl_var_lookup(r->pool, r->server, r->connection, r, var); - if (!strIsEmpty(val)) { - apr_table_setn(env, var, val); - } - } - } - - /* - * On-demand bloat up the SSI/CGI environment with certificate data - */ - if (dc->nOptions & SSL_OPT_EXPORTCERTDATA) { - val = ssl_var_lookup(r->pool, r->server, r->connection, - r, "SSL_SERVER_CERT"); - - apr_table_setn(env, "SSL_SERVER_CERT", val); - - val = ssl_var_lookup(r->pool, r->server, r->connection, - r, "SSL_CLIENT_CERT"); - - apr_table_setn(env, "SSL_CLIENT_CERT", val); - - if ((peer_certs = (STACK_OF(X509) *)SSL_get_peer_cert_chain(ssl))) { - for (i = 0; i < sk_X509_num(peer_certs); i++) { - var = apr_psprintf(r->pool, "SSL_CLIENT_CERT_CHAIN_%d", i); - val = ssl_var_lookup(r->pool, r->server, r->connection, - r, var); - if (val) { - apr_table_setn(env, var, val); - } - } - } - } - - return DECLINED; -} - -/* _________________________________________________________________ -** -** OpenSSL Callback Functions -** _________________________________________________________________ -*/ - -/* - * Handle out temporary RSA private keys on demand - * - * The background of this as the TLSv1 standard explains it: - * - * | D.1. Temporary RSA keys - * | - * | US Export restrictions limit RSA keys used for encryption to 512 - * | bits, but do not place any limit on lengths of RSA keys used for - * | signing operations. Certificates often need to be larger than 512 - * | bits, since 512-bit RSA keys are not secure enough for high-value - * | transactions or for applications requiring long-term security. Some - * | certificates are also designated signing-only, in which case they - * | cannot be used for key exchange. - * | - * | When the public key in the certificate cannot be used for encryption, - * | the server signs a temporary RSA key, which is then exchanged. In - * | exportable applications, the temporary RSA key should be the maximum - * | allowable length (i.e., 512 bits). Because 512-bit RSA keys are - * | relatively insecure, they should be changed often. For typical - * | electronic commerce applications, it is suggested that keys be - * | changed daily or every 500 transactions, and more often if possible. - * | Note that while it is acceptable to use the same temporary key for - * | multiple transactions, it must be signed each time it is used. - * | - * | RSA key generation is a time-consuming process. In many cases, a - * | low-priority process can be assigned the task of key generation. - * | Whenever a new key is completed, the existing temporary key can be - * | replaced with the new one. - * - * XXX: base on comment above, if thread support is enabled, - * we should spawn a low-priority thread to generate new keys - * on the fly. - * - * So we generated 512 and 1024 bit temporary keys on startup - * which we now just hand out on demand.... - */ - -RSA *ssl_callback_TmpRSA(SSL *ssl, int export, int keylen) -{ - conn_rec *c = (conn_rec *)SSL_get_app_data(ssl); - SSLModConfigRec *mc = myModConfig(c->base_server); - int idx; - - ap_log_cerror(APLOG_MARK, APLOG_DEBUG, 0, c, - "handing out temporary %d bit RSA key", keylen); - - /* doesn't matter if export flag is on, - * we won't be asked for keylen > 512 in that case. - * if we are asked for a keylen > 1024, it is too expensive - * to generate on the fly. - * XXX: any reason not to generate 2048 bit keys at startup? - */ - - switch (keylen) { - case 512: - idx = SSL_TMP_KEY_RSA_512; - break; - - case 1024: - default: - idx = SSL_TMP_KEY_RSA_1024; - } - - return (RSA *)mc->pTmpKeys[idx]; -} - -/* - * Hand out the already generated DH parameters... - */ -DH *ssl_callback_TmpDH(SSL *ssl, int export, int keylen) -{ - conn_rec *c = (conn_rec *)SSL_get_app_data(ssl); - SSLModConfigRec *mc = myModConfig(c->base_server); - int idx; - - ap_log_cerror(APLOG_MARK, APLOG_DEBUG, 0, c, - "handing out temporary %d bit DH key", keylen); - - switch (keylen) { - case 512: - idx = SSL_TMP_KEY_DH_512; - break; - - case 1024: - default: - idx = SSL_TMP_KEY_DH_1024; - } - - return (DH *)mc->pTmpKeys[idx]; -} - -/* - * This OpenSSL callback function is called when OpenSSL - * does client authentication and verifies the certificate chain. - */ -int ssl_callback_SSLVerify(int ok, X509_STORE_CTX *ctx) -{ - /* Get Apache context back through OpenSSL context */ - SSL *ssl = X509_STORE_CTX_get_ex_data(ctx, - SSL_get_ex_data_X509_STORE_CTX_idx()); - conn_rec *conn = (conn_rec *)SSL_get_app_data(ssl); - server_rec *s = conn->base_server; - request_rec *r = (request_rec *)SSL_get_app_data2(ssl); - - SSLSrvConfigRec *sc = mySrvConfig(s); - SSLDirConfigRec *dc = r ? myDirConfig(r) : NULL; - SSLConnRec *sslconn = myConnConfig(conn); - modssl_ctx_t *mctx = myCtxConfig(sslconn, sc); - - /* Get verify ingredients */ - int errnum = X509_STORE_CTX_get_error(ctx); - int errdepth = X509_STORE_CTX_get_error_depth(ctx); - int depth, verify; - - /* - * Log verification information - */ - if (s->loglevel >= APLOG_DEBUG) { - X509 *cert = X509_STORE_CTX_get_current_cert(ctx); - char *sname = X509_NAME_oneline(X509_get_subject_name(cert), NULL, 0); - char *iname = X509_NAME_oneline(X509_get_issuer_name(cert), NULL, 0); - - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "Certificate Verification: " - "depth: %d, subject: %s, issuer: %s", - errdepth, - sname ? sname : "-unknown-", - iname ? iname : "-unknown-"); - - if (sname) { - modssl_free(sname); - } - - if (iname) { - modssl_free(iname); - } - } - - /* - * Check for optionally acceptable non-verifiable issuer situation - */ - if (dc && (dc->nVerifyClient != SSL_CVERIFY_UNSET)) { - verify = dc->nVerifyClient; - } - else { - verify = mctx->auth.verify_mode; - } - - if (verify == SSL_CVERIFY_NONE) { - /* - * SSLProxyVerify is either not configured or set to "none". - * (this callback doesn't happen in the server context if SSLVerify - * is not configured or set to "none") - */ - return TRUE; - } - - if (ssl_verify_error_is_optional(errnum) && - (verify == SSL_CVERIFY_OPTIONAL_NO_CA)) - { - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "Certificate Verification: Verifiable Issuer is " - "configured as optional, therefore we're accepting " - "the certificate"); - - sslconn->verify_info = "GENEROUS"; - ok = TRUE; - } - - /* - * Additionally perform CRL-based revocation checks - */ - if (ok) { - if (!(ok = ssl_callback_SSLVerify_CRL(ok, ctx, conn))) { - errnum = X509_STORE_CTX_get_error(ctx); - } - } - - /* - * If we already know it's not ok, log the real reason - */ - if (!ok) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, - "Certificate Verification: Error (%d): %s", - errnum, X509_verify_cert_error_string(errnum)); - - if (sslconn->client_cert) { - X509_free(sslconn->client_cert); - sslconn->client_cert = NULL; - } - sslconn->client_dn = NULL; - sslconn->verify_error = X509_verify_cert_error_string(errnum); - } - - /* - * Finally check the depth of the certificate verification - */ - if (dc && (dc->nVerifyDepth != UNSET)) { - depth = dc->nVerifyDepth; - } - else { - depth = mctx->auth.verify_depth; - } - - if (errdepth > depth) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, - "Certificate Verification: Certificate Chain too long " - "(chain has %d certificates, but maximum allowed are " - "only %d)", - errdepth, depth); - - errnum = X509_V_ERR_CERT_CHAIN_TOO_LONG; - sslconn->verify_error = X509_verify_cert_error_string(errnum); - - ok = FALSE; - } - - /* - * And finally signal OpenSSL the (perhaps changed) state - */ - return ok; -} - -int ssl_callback_SSLVerify_CRL(int ok, X509_STORE_CTX *ctx, conn_rec *c) -{ - server_rec *s = c->base_server; - SSLSrvConfigRec *sc = mySrvConfig(s); - SSLConnRec *sslconn = myConnConfig(c); - modssl_ctx_t *mctx = myCtxConfig(sslconn, sc); - X509_OBJECT obj; - X509_NAME *subject, *issuer; - X509 *cert; - X509_CRL *crl; - EVP_PKEY *pubkey; - int i, n, rc; - - /* - * Unless a revocation store for CRLs was created we - * cannot do any CRL-based verification, of course. - */ - if (!mctx->crl) { - return ok; - } - - /* - * Determine certificate ingredients in advance - */ - cert = X509_STORE_CTX_get_current_cert(ctx); - subject = X509_get_subject_name(cert); - issuer = X509_get_issuer_name(cert); - - /* - * OpenSSL provides the general mechanism to deal with CRLs but does not - * use them automatically when verifying certificates, so we do it - * explicitly here. We will check the CRL for the currently checked - * certificate, if there is such a CRL in the store. - * - * We come through this procedure for each certificate in the certificate - * chain, starting with the root-CA's certificate. At each step we've to - * both verify the signature on the CRL (to make sure it's a valid CRL) - * and it's revocation list (to make sure the current certificate isn't - * revoked). But because to check the signature on the CRL we need the - * public key of the issuing CA certificate (which was already processed - * one round before), we've a little problem. But we can both solve it and - * at the same time optimize the processing by using the following - * verification scheme (idea and code snippets borrowed from the GLOBUS - * project): - * - * 1. We'll check the signature of a CRL in each step when we find a CRL - * through the _subject_ name of the current certificate. This CRL - * itself will be needed the first time in the next round, of course. - * But we do the signature processing one round before this where the - * public key of the CA is available. - * - * 2. We'll check the revocation list of a CRL in each step when - * we find a CRL through the _issuer_ name of the current certificate. - * This CRLs signature was then already verified one round before. - * - * This verification scheme allows a CA to revoke its own certificate as - * well, of course. - */ - - /* - * Try to retrieve a CRL corresponding to the _subject_ of - * the current certificate in order to verify it's integrity. - */ - memset((char *)&obj, 0, sizeof(obj)); - rc = SSL_X509_STORE_lookup(mctx->crl, - X509_LU_CRL, subject, &obj); - crl = obj.data.crl; - - if ((rc > 0) && crl) { - /* - * Log information about CRL - * (A little bit complicated because of ASN.1 and BIOs...) - */ - if (s->loglevel >= APLOG_DEBUG) { - char buff[512]; /* should be plenty */ - BIO *bio = BIO_new(BIO_s_mem()); - - BIO_printf(bio, "CA CRL: Issuer: "); - X509_NAME_print(bio, issuer, 0); - - BIO_printf(bio, ", lastUpdate: "); - ASN1_UTCTIME_print(bio, X509_CRL_get_lastUpdate(crl)); - - BIO_printf(bio, ", nextUpdate: "); - ASN1_UTCTIME_print(bio, X509_CRL_get_nextUpdate(crl)); - - n = BIO_read(bio, buff, sizeof(buff) - 1); - buff[n] = '\0'; - - BIO_free(bio); - - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, "%s", buff); - } - - /* - * Verify the signature on this CRL - */ - pubkey = X509_get_pubkey(cert); - rc = X509_CRL_verify(crl, pubkey); -#ifdef OPENSSL_VERSION_NUMBER - /* Only refcounted in OpenSSL */ - if (pubkey) - EVP_PKEY_free(pubkey); -#endif - if (rc <= 0) { - ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s, - "Invalid signature on CRL"); - - X509_STORE_CTX_set_error(ctx, X509_V_ERR_CRL_SIGNATURE_FAILURE); - X509_OBJECT_free_contents(&obj); - return FALSE; - } - - /* - * Check date of CRL to make sure it's not expired - */ - i = X509_cmp_current_time(X509_CRL_get_nextUpdate(crl)); - - if (i == 0) { - ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s, - "Found CRL has invalid nextUpdate field"); - - X509_STORE_CTX_set_error(ctx, - X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD); - X509_OBJECT_free_contents(&obj); - - return FALSE; - } - - if (i < 0) { - ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s, - "Found CRL is expired - " - "revoking all certificates until you get updated CRL"); - - X509_STORE_CTX_set_error(ctx, X509_V_ERR_CRL_HAS_EXPIRED); - X509_OBJECT_free_contents(&obj); - - return FALSE; - } - - X509_OBJECT_free_contents(&obj); - } - - /* - * Try to retrieve a CRL corresponding to the _issuer_ of - * the current certificate in order to check for revocation. - */ - memset((char *)&obj, 0, sizeof(obj)); - rc = SSL_X509_STORE_lookup(mctx->crl, - X509_LU_CRL, issuer, &obj); - - crl = obj.data.crl; - if ((rc > 0) && crl) { - /* - * Check if the current certificate is revoked by this CRL - */ - n = sk_X509_REVOKED_num(X509_CRL_get_REVOKED(crl)); - - for (i = 0; i < n; i++) { - X509_REVOKED *revoked = - sk_X509_REVOKED_value(X509_CRL_get_REVOKED(crl), i); - - ASN1_INTEGER *sn = X509_REVOKED_get_serialNumber(revoked); - - if (!ASN1_INTEGER_cmp(sn, X509_get_serialNumber(cert))) { - if (s->loglevel >= APLOG_DEBUG) { - char *cp = X509_NAME_oneline(issuer, NULL, 0); - long serial = ASN1_INTEGER_get(sn); - - ap_log_error(APLOG_MARK, APLOG_INFO, 0, s, - "Certificate with serial %ld (0x%lX) " - "revoked per CRL from issuer %s", - serial, serial, cp); - modssl_free(cp); - } - - X509_STORE_CTX_set_error(ctx, X509_V_ERR_CERT_REVOKED); - X509_OBJECT_free_contents(&obj); - - return FALSE; - } - } - - X509_OBJECT_free_contents(&obj); - } - - return ok; -} - -#define SSLPROXY_CERT_CB_LOG_FMT \ - "Proxy client certificate callback: (%s) " - -static void modssl_proxy_info_log(server_rec *s, - X509_INFO *info, - const char *msg) -{ - SSLSrvConfigRec *sc = mySrvConfig(s); - char name_buf[256]; - X509_NAME *name; - char *dn; - - if (s->loglevel < APLOG_DEBUG) { - return; - } - - name = X509_get_subject_name(info->x509); - dn = X509_NAME_oneline(name, name_buf, sizeof(name_buf)); - - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - SSLPROXY_CERT_CB_LOG_FMT "%s, sending %s", - sc->vhost_id, msg, dn ? dn : "-uknown-"); -} - -/* - * caller will decrement the cert and key reference - * so we need to increment here to prevent them from - * being freed. - */ -#define modssl_set_cert_info(info, cert, pkey) \ - *cert = info->x509; \ - X509_reference_inc(*cert); \ - *pkey = info->x_pkey->dec_pkey; \ - EVP_PKEY_reference_inc(*pkey) - -int ssl_callback_proxy_cert(SSL *ssl, MODSSL_CLIENT_CERT_CB_ARG_TYPE **x509, EVP_PKEY **pkey) -{ - conn_rec *c = (conn_rec *)SSL_get_app_data(ssl); - server_rec *s = c->base_server; - SSLSrvConfigRec *sc = mySrvConfig(s); - X509_NAME *ca_name, *issuer; - X509_INFO *info; - STACK_OF(X509_NAME) *ca_list; - STACK_OF(X509_INFO) *certs = sc->proxy->pkp->certs; - int i, j; - - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - SSLPROXY_CERT_CB_LOG_FMT "entered", - sc->vhost_id); - - if (!certs || (sk_X509_INFO_num(certs) <= 0)) { - ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s, - SSLPROXY_CERT_CB_LOG_FMT - "downstream server wanted client certificate " - "but none are configured", sc->vhost_id); - return FALSE; - } - - ca_list = SSL_get_client_CA_list(ssl); - - if (!ca_list || (sk_X509_NAME_num(ca_list) <= 0)) { - /* - * downstream server didn't send us a list of acceptable CA certs, - * so we send the first client cert in the list. - */ - info = sk_X509_INFO_value(certs, 0); - - modssl_proxy_info_log(s, info, "no acceptable CA list"); - - modssl_set_cert_info(info, x509, pkey); - - return TRUE; - } - - for (i = 0; i < sk_X509_NAME_num(ca_list); i++) { - ca_name = sk_X509_NAME_value(ca_list, i); - - for (j = 0; j < sk_X509_INFO_num(certs); j++) { - info = sk_X509_INFO_value(certs, j); - issuer = X509_get_issuer_name(info->x509); - - if (X509_NAME_cmp(issuer, ca_name) == 0) { - modssl_proxy_info_log(s, info, "found acceptable cert"); - - modssl_set_cert_info(info, x509, pkey); - - return TRUE; - } - } - } - - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - SSLPROXY_CERT_CB_LOG_FMT - "no client certificate found!?", sc->vhost_id); - - return FALSE; -} - -static void ssl_session_log(server_rec *s, - const char *request, - unsigned char *id, - unsigned int idlen, - const char *status, - const char *result, - long timeout) -{ - char buf[SSL_SESSION_ID_STRING_LEN]; - char timeout_str[56] = {'\0'}; - - if (s->loglevel < APLOG_DEBUG) { - return; - } - - if (timeout) { - apr_snprintf(timeout_str, sizeof(timeout_str), - "timeout=%lds ", (timeout - time(NULL))); - } - - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "Inter-Process Session Cache: " - "request=%s status=%s id=%s %s(session %s)", - request, status, - SSL_SESSION_id2sz(id, idlen, buf, sizeof(buf)), - timeout_str, result); -} - -/* - * This callback function is executed by OpenSSL whenever a new SSL_SESSION is - * added to the internal OpenSSL session cache. We use this hook to spread the - * SSL_SESSION also to the inter-process disk-cache to make share it with our - * other Apache pre-forked server processes. - */ -int ssl_callback_NewSessionCacheEntry(SSL *ssl, SSL_SESSION *session) -{ - /* Get Apache context back through OpenSSL context */ - conn_rec *conn = (conn_rec *)SSL_get_app_data(ssl); - server_rec *s = conn->base_server; - SSLSrvConfigRec *sc = mySrvConfig(s); - long timeout = sc->session_cache_timeout; - BOOL rc; - unsigned char *id; - unsigned int idlen; - - /* - * Set the timeout also for the internal OpenSSL cache, because this way - * our inter-process cache is consulted only when it's really necessary. - */ - SSL_set_timeout(session, timeout); - - /* - * Store the SSL_SESSION in the inter-process cache with the - * same expire time, so it expires automatically there, too. - */ - id = SSL_SESSION_get_session_id(session); - idlen = SSL_SESSION_get_session_id_length(session); - - timeout += modssl_session_get_time(session); - - rc = ssl_scache_store(s, id, idlen, timeout, session); - - ssl_session_log(s, "SET", id, idlen, - rc == TRUE ? "OK" : "BAD", - "caching", timeout); - - /* - * return 0 which means to OpenSSL that the session is still - * valid and was not freed by us with SSL_SESSION_free(). - */ - return 0; -} - -/* - * This callback function is executed by OpenSSL whenever a - * SSL_SESSION is looked up in the internal OpenSSL cache and it - * was not found. We use this to lookup the SSL_SESSION in the - * inter-process disk-cache where it was perhaps stored by one - * of our other Apache pre-forked server processes. - */ -SSL_SESSION *ssl_callback_GetSessionCacheEntry(SSL *ssl, - unsigned char *id, - int idlen, int *do_copy) -{ - /* Get Apache context back through OpenSSL context */ - conn_rec *conn = (conn_rec *)SSL_get_app_data(ssl); - server_rec *s = conn->base_server; - SSL_SESSION *session; - - /* - * Try to retrieve the SSL_SESSION from the inter-process cache - */ - session = ssl_scache_retrieve(s, id, idlen); - - ssl_session_log(s, "GET", id, idlen, - session ? "FOUND" : "MISSED", - session ? "reuse" : "renewal", 0); - - /* - * Return NULL or the retrieved SSL_SESSION. But indicate (by - * setting do_copy to 0) that the reference count on the - * SSL_SESSION should not be incremented by the SSL library, - * because we will no longer hold a reference to it ourself. - */ - *do_copy = 0; - - return session; -} - -/* - * This callback function is executed by OpenSSL whenever a - * SSL_SESSION is removed from the the internal OpenSSL cache. - * We use this to remove the SSL_SESSION in the inter-process - * disk-cache, too. - */ -void ssl_callback_DelSessionCacheEntry(SSL_CTX *ctx, - SSL_SESSION *session) -{ - server_rec *s; - SSLSrvConfigRec *sc; - unsigned char *id; - unsigned int idlen; - - /* - * Get Apache context back through OpenSSL context - */ - if (!(s = (server_rec *)SSL_CTX_get_app_data(ctx))) { - return; /* on server shutdown Apache is already gone */ - } - - sc = mySrvConfig(s); - - /* - * Remove the SSL_SESSION from the inter-process cache - */ - id = SSL_SESSION_get_session_id(session); - idlen = SSL_SESSION_get_session_id_length(session); - - ssl_scache_remove(s, id, idlen); - - ssl_session_log(s, "REM", id, idlen, - "OK", "dead", 0); - - return; -} - -/* - * This callback function is executed while OpenSSL processes the - * SSL handshake and does SSL record layer stuff. We use it to - * trace OpenSSL's processing in out SSL logfile. - */ -void ssl_callback_LogTracingState(MODSSL_INFO_CB_ARG_TYPE ssl, int where, int rc) -{ - conn_rec *c; - server_rec *s; - SSLSrvConfigRec *sc; - - /* - * find corresponding server - */ - if (!(c = (conn_rec *)SSL_get_app_data((SSL *)ssl))) { - return; - } - - s = c->base_server; - if (!(sc = mySrvConfig(s))) { - return; - } - - /* - * create the various trace messages - */ - if (s->loglevel >= APLOG_DEBUG) { - if (where & SSL_CB_HANDSHAKE_START) { - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "%s: Handshake: start", SSL_LIBRARY_NAME); - } - else if (where & SSL_CB_HANDSHAKE_DONE) { - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "%s: Handshake: done", SSL_LIBRARY_NAME); - } - else if (where & SSL_CB_LOOP) { - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "%s: Loop: %s", - SSL_LIBRARY_NAME, SSL_state_string_long(ssl)); - } - else if (where & SSL_CB_READ) { - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "%s: Read: %s", - SSL_LIBRARY_NAME, SSL_state_string_long(ssl)); - } - else if (where & SSL_CB_WRITE) { - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "%s: Write: %s", - SSL_LIBRARY_NAME, SSL_state_string_long(ssl)); - } - else if (where & SSL_CB_ALERT) { - char *str = (where & SSL_CB_READ) ? "read" : "write"; - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "%s: Alert: %s:%s:%s", - SSL_LIBRARY_NAME, str, - SSL_alert_type_string_long(rc), - SSL_alert_desc_string_long(rc)); - } - else if (where & SSL_CB_EXIT) { - if (rc == 0) { - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "%s: Exit: failed in %s", - SSL_LIBRARY_NAME, SSL_state_string_long(ssl)); - } - else if (rc < 0) { - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "%s: Exit: error in %s", - SSL_LIBRARY_NAME, SSL_state_string_long(ssl)); - } - } - } - - /* - * Because SSL renegotations can happen at any time (not only after - * SSL_accept()), the best way to log the current connection details is - * right after a finished handshake. - */ - if (where & SSL_CB_HANDSHAKE_DONE) { - ap_log_error(APLOG_MARK, APLOG_INFO, 0, s, - "Connection: Client IP: %s, Protocol: %s, " - "Cipher: %s (%s/%s bits)", - ssl_var_lookup(NULL, s, c, NULL, "REMOTE_ADDR"), - ssl_var_lookup(NULL, s, c, NULL, "SSL_PROTOCOL"), - ssl_var_lookup(NULL, s, c, NULL, "SSL_CIPHER"), - ssl_var_lookup(NULL, s, c, NULL, "SSL_CIPHER_USEKEYSIZE"), - ssl_var_lookup(NULL, s, c, NULL, "SSL_CIPHER_ALGKEYSIZE")); - } -} - diff --git a/trunk/modules/ssl/ssl_engine_log.c b/trunk/modules/ssl/ssl_engine_log.c deleted file mode 100644 index 0c1d1cc2d07fe86db17dfacc3b23d92351d3b7b5..0000000000000000000000000000000000000000 --- a/trunk/modules/ssl/ssl_engine_log.c +++ /dev/null @@ -1,101 +0,0 @@ -/* Copyright 2001-2005 The Apache Software Foundation or its licensors, as - * applicable. - * - * 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_ssl - * | '_ ` _ \ / _ \ / _` | / __/ __| | Apache Interface to OpenSSL - * | | | | | | (_) | (_| | \__ \__ \ | - * |_| |_| |_|\___/ \__,_|___|___/___/_| - * |_____| - * ssl_engine_log.c - * Logging Facility - */ - /* ``The difference between a computer - industry job and open-source software - hacking is about 30 hours a week.'' - -- Ralf S. Engelschall */ -#include "ssl_private.h" - -/* _________________________________________________________________ -** -** Logfile Support -** _________________________________________________________________ -*/ - -static const struct { - const char *cpPattern; - const char *cpAnnotation; -} ssl_log_annotate[] = { - { "*envelope*bad*decrypt*", "wrong pass phrase!?" }, - { "*CLIENT_HELLO*unknown*protocol*", "speaking not SSL to HTTPS port!?" }, - { "*CLIENT_HELLO*http*request*", "speaking HTTP to HTTPS port!?" }, - { "*SSL3_READ_BYTES:sslv3*alert*bad*certificate*", "Subject CN in certificate not server name or identical to CA!?" }, - { "*self signed certificate in certificate chain*", "Client certificate signed by CA not known to server?" }, - { "*peer did not return a certificate*", "No CAs known to server for verification?" }, - { "*no shared cipher*", "Too restrictive SSLCipherSuite or using DSA server certificate?" }, - { "*no start line*", "Bad file contents or format - or even just a forgotten SSLCertificateKeyFile?" }, - { "*bad password read*", "You entered an incorrect pass phrase!?" }, - { "*bad mac decode*", "Browser still remembered details of a re-created server certificate?" }, - { NULL, NULL } -}; - -static const char *ssl_log_annotation(const char *error) -{ - int i = 0; - - while (ssl_log_annotate[i].cpPattern != NULL - && ap_strcmp_match(error, ssl_log_annotate[i].cpPattern) != 0) - i++; - - return ssl_log_annotate[i].cpAnnotation; -} - -void ssl_die(void) -{ - /* - * This is used for fatal errors and here - * it is common module practice to really - * exit from the complete program. - */ - exit(1); -} - -/* - * Prints the SSL library error information. - */ -void ssl_log_ssl_error(const char *file, int line, int level, server_rec *s) -{ - unsigned long e; - - while ((e = ERR_get_error())) { - const char *annotation; - char err[256]; - - ERR_error_string_n(e, err, sizeof err); - annotation = ssl_log_annotation(err); - - if (annotation) { - ap_log_error(file, line, level, 0, s, - "SSL Library Error: %lu %s %s", - e, err, annotation); - } - else { - ap_log_error(file, line, level, 0, s, - "SSL Library Error: %lu %s", - e, err); - } - } -} diff --git a/trunk/modules/ssl/ssl_engine_mutex.c b/trunk/modules/ssl/ssl_engine_mutex.c deleted file mode 100644 index 65924d269ea779f31d913d2f7b2c949aa0753495..0000000000000000000000000000000000000000 --- a/trunk/modules/ssl/ssl_engine_mutex.c +++ /dev/null @@ -1,124 +0,0 @@ -/* Copyright 2001-2005 The Apache Software Foundation or its licensors, as - * applicable. - * - * 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_ssl - * | '_ ` _ \ / _ \ / _` | / __/ __| | Apache Interface to OpenSSL - * | | | | | | (_) | (_| | \__ \__ \ | - * |_| |_| |_|\___/ \__,_|___|___/___/_| - * |_____| - * ssl_engine_mutex.c - * Semaphore for Mutual Exclusion - */ - /* ``Real programmers confuse - Christmas and Halloween - because DEC 25 = OCT 31.'' - -- Unknown */ - -#include "ssl_private.h" - -#ifdef AP_NEED_SET_MUTEX_PERMS -#include "unixd.h" -#endif - -int ssl_mutex_init(server_rec *s, apr_pool_t *p) -{ - SSLModConfigRec *mc = myModConfig(s); - apr_status_t rv; - - if (mc->nMutexMode == SSL_MUTEXMODE_NONE) - return TRUE; - - if (mc->pMutex) { - return TRUE; - } - if ((rv = apr_global_mutex_create(&mc->pMutex, mc->szMutexFile, - mc->nMutexMech, s->process->pool)) - != APR_SUCCESS) { - if (mc->szMutexFile) - ap_log_error(APLOG_MARK, APLOG_ERR, rv, s, - "Cannot create SSLMutex with file `%s'", - mc->szMutexFile); - else - ap_log_error(APLOG_MARK, APLOG_ERR, rv, s, - "Cannot create SSLMutex"); - return FALSE; - } - -#ifdef AP_NEED_SET_MUTEX_PERMS - rv = unixd_set_global_mutex_perms(mc->pMutex); - if (rv != APR_SUCCESS) { - ap_log_error(APLOG_MARK, APLOG_ERR, rv, s, - "Could not set permissions on ssl_mutex; check User " - "and Group directives"); - return FALSE; - } -#endif - return TRUE; -} - -int ssl_mutex_reinit(server_rec *s, apr_pool_t *p) -{ - SSLModConfigRec *mc = myModConfig(s); - apr_status_t rv; - - if (mc->nMutexMode == SSL_MUTEXMODE_NONE) - return TRUE; - - if ((rv = apr_global_mutex_child_init(&mc->pMutex, - mc->szMutexFile, p)) != APR_SUCCESS) { - if (mc->szMutexFile) - ap_log_error(APLOG_MARK, APLOG_ERR, rv, s, - "Cannot reinit SSLMutex with file `%s'", - mc->szMutexFile); - else - ap_log_error(APLOG_MARK, APLOG_WARNING, rv, s, - "Cannot reinit SSLMutex"); - return FALSE; - } - return TRUE; -} - -int ssl_mutex_on(server_rec *s) -{ - SSLModConfigRec *mc = myModConfig(s); - apr_status_t rv; - - if (mc->nMutexMode == SSL_MUTEXMODE_NONE) - return TRUE; - if ((rv = apr_global_mutex_lock(mc->pMutex)) != APR_SUCCESS) { - ap_log_error(APLOG_MARK, APLOG_WARNING, rv, s, - "Failed to acquire SSL session cache lock"); - return FALSE; - } - return TRUE; -} - -int ssl_mutex_off(server_rec *s) -{ - SSLModConfigRec *mc = myModConfig(s); - apr_status_t rv; - - if (mc->nMutexMode == SSL_MUTEXMODE_NONE) - return TRUE; - if ((rv = apr_global_mutex_unlock(mc->pMutex)) != APR_SUCCESS) { - ap_log_error(APLOG_MARK, APLOG_WARNING, rv, s, - "Failed to release SSL session cache lock"); - return FALSE; - } - return TRUE; -} - diff --git a/trunk/modules/ssl/ssl_engine_pphrase.c b/trunk/modules/ssl/ssl_engine_pphrase.c deleted file mode 100644 index 7f0e4b6949e64565a65b723312d09286271eaa7c..0000000000000000000000000000000000000000 --- a/trunk/modules/ssl/ssl_engine_pphrase.c +++ /dev/null @@ -1,789 +0,0 @@ -/* Copyright 2001-2005 The Apache Software Foundation or its licensors, as - * applicable. - * - * 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_ssl - * | '_ ` _ \ / _ \ / _` | / __/ __| | Apache Interface to OpenSSL - * | | | | | | (_) | (_| | \__ \__ \ | - * |_| |_| |_|\___/ \__,_|___|___/___/_| - * |_____| - * ssl_engine_pphrase.c - * Pass Phrase Dialog - */ - /* ``Treat your password like your - toothbrush. Don't let anybody - else use it, and get a new one - every six months.'' - -- Clifford Stoll */ -#include "ssl_private.h" - -/* - * Return true if the named file exists and is readable - */ - -static apr_status_t exists_and_readable(char *fname, apr_pool_t *pool, apr_time_t *mtime) -{ - apr_status_t stat; - apr_finfo_t sbuf; - apr_file_t *fd; - - if ((stat = apr_stat(&sbuf, fname, APR_FINFO_MIN, pool)) != APR_SUCCESS) - return stat; - - if (sbuf.filetype != APR_REG) - return APR_EGENERAL; - - if ((stat = apr_file_open(&fd, fname, APR_READ, 0, pool)) != APR_SUCCESS) - return stat; - - if (mtime) { - *mtime = sbuf.mtime; - } - - apr_file_close(fd); - return APR_SUCCESS; -} - -/* - * reuse vhost keys for asn1 tables where keys are allocated out - * of s->process->pool to prevent "leaking" each time we format - * a vhost key. since the key is stored in a table with lifetime - * of s->process->pool, the key needs to have the same lifetime. - * - * XXX: probably seems silly to use a hash table with keys and values - * being the same, but it is easier than doing a linear search - * and will make it easier to remove keys if needed in the future. - * also have the problem with apr_array_header_t that if we - * underestimate the number of vhost keys when we apr_array_make(), - * the array will get resized when we push past the initial number - * of elts. this resizing in the s->process->pool means "leaking" - * since apr_array_push() will apr_alloc arr->nalloc * 2 elts, - * leaving the original arr->elts to waste. - */ -static char *asn1_table_vhost_key(SSLModConfigRec *mc, apr_pool_t *p, - char *id, char *an) -{ - /* 'p' pool used here is cleared on restarts (or sooner) */ - char *key = apr_psprintf(p, "%s:%s", id, an); - void *keyptr = apr_hash_get(mc->tVHostKeys, key, - APR_HASH_KEY_STRING); - - if (!keyptr) { - /* make a copy out of s->process->pool */ - keyptr = apr_pstrdup(mc->pPool, key); - apr_hash_set(mc->tVHostKeys, keyptr, - APR_HASH_KEY_STRING, keyptr); - } - - return (char *)keyptr; -} - -/* _________________________________________________________________ -** -** Pass Phrase and Private Key Handling -** _________________________________________________________________ -*/ - -#define BUILTIN_DIALOG_BACKOFF 2 -#define BUILTIN_DIALOG_RETRIES 5 - -static apr_file_t *writetty = NULL; -static apr_file_t *readtty = NULL; - -/* - * sslc has a nasty flaw where its - * PEM_read_bio_PrivateKey does not take a callback arg. - */ -static server_rec *ssl_pphrase_server_rec = NULL; - -#ifdef SSLC_VERSION_NUMBER -int ssl_pphrase_Handle_CB(char *, int, int); -#else -int ssl_pphrase_Handle_CB(char *, int, int, void *); -#endif - -static char *pphrase_array_get(apr_array_header_t *arr, int idx) -{ - if ((idx < 0) || (idx >= arr->nelts)) { - return NULL; - } - - return ((char **)arr->elts)[idx]; -} - -static void pphrase_array_clear(apr_array_header_t *arr) -{ - if (arr->nelts > 0) { - memset(arr->elts, 0, arr->elt_size * arr->nelts); - } - arr->nelts = 0; -} - -void ssl_pphrase_Handle(server_rec *s, apr_pool_t *p) -{ - SSLModConfigRec *mc = myModConfig(s); - SSLSrvConfigRec *sc; - server_rec *pServ; - char *cpVHostID; - char szPath[MAX_STRING_LEN]; - EVP_PKEY *pPrivateKey; - ssl_asn1_t *asn1; - unsigned char *ucp; - long int length; - X509 *pX509Cert; - BOOL bReadable; - apr_array_header_t *aPassPhrase; - int nPassPhrase; - int nPassPhraseCur; - char *cpPassPhraseCur; - int nPassPhraseRetry; - int nPassPhraseDialog; - int nPassPhraseDialogCur; - BOOL bPassPhraseDialogOnce; - char **cpp; - int i, j; - ssl_algo_t algoCert, algoKey, at; - char *an; - char *cp; - apr_time_t pkey_mtime = 0; - int isterm = 1; - apr_status_t rv; - /* - * Start with a fresh pass phrase array - */ - aPassPhrase = apr_array_make(p, 2, sizeof(char *)); - nPassPhrase = 0; - nPassPhraseDialog = 0; - - /* - * Walk through all configured servers - */ - for (pServ = s; pServ != NULL; pServ = pServ->next) { - sc = mySrvConfig(pServ); - - if (!sc->enabled) - continue; - - cpVHostID = ssl_util_vhostid(p, pServ); - ap_log_error(APLOG_MARK, APLOG_INFO, 0, pServ, - "Loading certificate & private key of SSL-aware server"); - - /* - * Read in server certificate(s): This is the easy part - * because this file isn't encrypted in any way. - */ - if (sc->server->pks->cert_files[0] == NULL) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, pServ, - "Server should be SSL-aware but has no certificate " - "configured [Hint: SSLCertificateFile]"); - ssl_die(); - } - algoCert = SSL_ALGO_UNKNOWN; - algoKey = SSL_ALGO_UNKNOWN; - for (i = 0, j = 0; i < SSL_AIDX_MAX && sc->server->pks->cert_files[i] != NULL; i++) { - - apr_cpystrn(szPath, sc->server->pks->cert_files[i], sizeof(szPath)); - if ((rv = exists_and_readable(szPath, p, NULL)) != APR_SUCCESS) { - ap_log_error(APLOG_MARK, APLOG_ERR, rv, s, - "Init: Can't open server certificate file %s", - szPath); - ssl_die(); - } - if ((pX509Cert = SSL_read_X509(szPath, NULL, NULL)) == NULL) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, - "Init: Unable to read server certificate from file %s", szPath); - ssl_log_ssl_error(APLOG_MARK, APLOG_ERR, s); - ssl_die(); - } - - /* - * check algorithm type of certificate and make - * sure only one certificate per type is used. - */ - at = ssl_util_algotypeof(pX509Cert, NULL); - an = ssl_util_algotypestr(at); - if (algoCert & at) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, - "Init: Multiple %s server certificates not " - "allowed", an); - ssl_log_ssl_error(APLOG_MARK, APLOG_ERR, s); - ssl_die(); - } - algoCert |= at; - - /* - * Insert the certificate into global module configuration to let it - * survive the processing between the 1st Apache API init round (where - * we operate here) and the 2nd Apache init round (where the - * certificate is actually used to configure mod_ssl's per-server - * configuration structures). - */ - cp = asn1_table_vhost_key(mc, p, cpVHostID, an); - length = i2d_X509(pX509Cert, NULL); - ucp = ssl_asn1_table_set(mc->tPublicCert, cp, length); - (void)i2d_X509(pX509Cert, &ucp); /* 2nd arg increments */ - - /* - * Free the X509 structure - */ - X509_free(pX509Cert); - - /* - * Read in the private key: This is the non-trivial part, because the - * key is typically encrypted, so a pass phrase dialog has to be used - * to request it from the user (or it has to be alternatively gathered - * from a dialog program). The important point here is that ISPs - * usually have hundrets of virtual servers configured and a lot of - * them use SSL, so really we have to minimize the pass phrase - * dialogs. - * - * The idea is this: When N virtual hosts are configured and all of - * them use encrypted private keys with different pass phrases, we - * have no chance and have to pop up N pass phrase dialogs. But - * usually the admin is clever enough and uses the same pass phrase - * for more private key files (typically he even uses one single pass - * phrase for all). When this is the case we can minimize the dialogs - * by trying to re-use already known/entered pass phrases. - */ - if (sc->server->pks->key_files[j] != NULL) - apr_cpystrn(szPath, sc->server->pks->key_files[j++], sizeof(szPath)); - - /* - * Try to read the private key file with the help of - * the callback function which serves the pass - * phrases to OpenSSL - */ - myCtxVarSet(mc, 1, pServ); - myCtxVarSet(mc, 2, p); - myCtxVarSet(mc, 3, aPassPhrase); - myCtxVarSet(mc, 4, &nPassPhraseCur); - myCtxVarSet(mc, 5, &cpPassPhraseCur); - myCtxVarSet(mc, 6, cpVHostID); - myCtxVarSet(mc, 7, an); - myCtxVarSet(mc, 8, &nPassPhraseDialog); - myCtxVarSet(mc, 9, &nPassPhraseDialogCur); - myCtxVarSet(mc, 10, &bPassPhraseDialogOnce); - - nPassPhraseCur = 0; - nPassPhraseRetry = 0; - nPassPhraseDialogCur = 0; - bPassPhraseDialogOnce = TRUE; - - pPrivateKey = NULL; - - for (;;) { - /* - * Try to read the private key file with the help of - * the callback function which serves the pass - * phrases to OpenSSL - */ - if ((rv = exists_and_readable(szPath, p, - &pkey_mtime)) != APR_SUCCESS ) { - ap_log_error(APLOG_MARK, APLOG_ERR, rv, s, - "Init: Can't open server private key file " - "%s",szPath); - ssl_die(); - } - - /* - * if the private key is encrypted and SSLPassPhraseDialog - * is configured to "builtin" it isn't possible to prompt for - * a password after httpd has detached from the tty. - * in this case if we already have a private key and the - * file name/mtime hasn't changed, then reuse the existing key. - * we also reuse existing private keys that were encrypted for - * exec: and pipe: dialogs to minimize chances to snoop the - * password. that and pipe: dialogs might prompt the user - * for password, which on win32 for example could happen 4 - * times at startup. twice for each child and twice within - * each since apache "restarts itself" on startup. - * of course this will not work for the builtin dialog if - * the server was started without LoadModule ssl_module - * configured, then restarted with it configured. - * but we fall through with a chance of success if the key - * is not encrypted or can be handled via exec or pipe dialog. - * and in the case of fallthrough, pkey_mtime and isatty() - * are used to give a better idea as to what failed. - */ - if (pkey_mtime) { - int i; - - for (i=0; i < SSL_AIDX_MAX; i++) { - const char *key_id = - ssl_asn1_table_keyfmt(p, cpVHostID, i); - ssl_asn1_t *asn1 = - ssl_asn1_table_get(mc->tPrivateKey, key_id); - - if (asn1 && (asn1->source_mtime == pkey_mtime)) { - ap_log_error(APLOG_MARK, APLOG_INFO, - 0, pServ, - "%s reusing existing " - "%s private key on restart", - cpVHostID, ssl_asn1_keystr(i)); - return; - } - } - } - - cpPassPhraseCur = NULL; - ssl_pphrase_server_rec = s; /* to make up for sslc flaw */ - - /* Ensure that the error stack is empty; some SSL - * functions will fail spuriously if the error stack - * is not empty. */ - ERR_clear_error(); - - bReadable = ((pPrivateKey = SSL_read_PrivateKey(szPath, NULL, - ssl_pphrase_Handle_CB, s)) != NULL ? TRUE : FALSE); - - /* - * when the private key file now was readable, - * it's fine and we go out of the loop - */ - if (bReadable) - break; - - /* - * when we have more remembered pass phrases - * try to reuse these first. - */ - if (nPassPhraseCur < nPassPhrase) { - nPassPhraseCur++; - continue; - } - - /* - * else it's not readable and we have no more - * remembered pass phrases. Then this has to mean - * that the callback function popped up the dialog - * but a wrong pass phrase was entered. We give the - * user (but not the dialog program) a few more - * chances... - */ -#ifndef WIN32 - if ((sc->server->pphrase_dialog_type == SSL_PPTYPE_BUILTIN - || sc->server->pphrase_dialog_type == SSL_PPTYPE_PIPE) -#else - if (sc->server->pphrase_dialog_type == SSL_PPTYPE_PIPE -#endif - && cpPassPhraseCur != NULL - && nPassPhraseRetry < BUILTIN_DIALOG_RETRIES ) { - apr_file_printf(writetty, "Apache:mod_ssl:Error: Pass phrase incorrect " - "(%d more retr%s permitted).\n", - (BUILTIN_DIALOG_RETRIES-nPassPhraseRetry), - (BUILTIN_DIALOG_RETRIES-nPassPhraseRetry) == 1 ? "y" : "ies"); - nPassPhraseRetry++; - if (nPassPhraseRetry > BUILTIN_DIALOG_BACKOFF) - apr_sleep((nPassPhraseRetry-BUILTIN_DIALOG_BACKOFF) - * 5 * APR_USEC_PER_SEC); - continue; - } -#ifdef WIN32 - if (sc->server->pphrase_dialog_type == SSL_PPTYPE_BUILTIN) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, - "Init: SSLPassPhraseDialog builtin is not " - "supported on Win32 (key file " - "%s)", szPath); - ssl_die(); - } -#endif /* WIN32 */ - - /* - * Ok, anything else now means a fatal error. - */ - if (cpPassPhraseCur == NULL) { - if (nPassPhraseDialogCur && pkey_mtime && - !(isterm = isatty(fileno(stdout)))) /* XXX: apr_isatty() */ - { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, - pServ, - "Init: Unable to read pass phrase " - "[Hint: key introduced or changed " - "before restart?]"); - ssl_log_ssl_error(APLOG_MARK, APLOG_ERR, pServ); - } - else { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, - pServ, "Init: Private key not found"); - ssl_log_ssl_error(APLOG_MARK, APLOG_ERR, pServ); - } - if (writetty) { - apr_file_printf(writetty, "Apache:mod_ssl:Error: Private key not found.\n"); - apr_file_printf(writetty, "**Stopped\n"); - } - } - else { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, - pServ, "Init: Pass phrase incorrect"); - ssl_log_ssl_error(APLOG_MARK, APLOG_ERR, pServ); - - if (writetty) { - apr_file_printf(writetty, "Apache:mod_ssl:Error: Pass phrase incorrect.\n"); - apr_file_printf(writetty, "**Stopped\n"); - } - } - ssl_die(); - } - - if (pPrivateKey == NULL) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, - "Init: Unable to read server private key from " - "file %s [Hint: Perhaps it is in a separate file? " - " See SSLCertificateKeyFile]", szPath); - ssl_log_ssl_error(APLOG_MARK, APLOG_ERR, s); - ssl_die(); - } - - /* - * check algorithm type of private key and make - * sure only one private key per type is used. - */ - at = ssl_util_algotypeof(NULL, pPrivateKey); - an = ssl_util_algotypestr(at); - if (algoKey & at) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, - "Init: Multiple %s server private keys not " - "allowed", an); - ssl_log_ssl_error(APLOG_MARK, APLOG_ERR, s); - ssl_die(); - } - algoKey |= at; - - /* - * Log the type of reading - */ - if (nPassPhraseDialogCur == 0) { - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, pServ, - "unencrypted %s private key - pass phrase not " - "required", an); - } - else { - if (cpPassPhraseCur != NULL) { - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, - pServ, - "encrypted %s private key - pass phrase " - "requested", an); - } - else { - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, - pServ, - "encrypted %s private key - pass phrase" - " reused", an); - } - } - - /* - * Ok, when we have one more pass phrase store it - */ - if (cpPassPhraseCur != NULL) { - cpp = (char **)apr_array_push(aPassPhrase); - *cpp = cpPassPhraseCur; - nPassPhrase++; - } - - /* - * Insert private key into the global module configuration - * (we convert it to a stand-alone DER byte sequence - * because the SSL library uses static variables inside a - * RSA structure which do not survive DSO reloads!) - */ - cp = asn1_table_vhost_key(mc, p, cpVHostID, an); - length = i2d_PrivateKey(pPrivateKey, NULL); - ucp = ssl_asn1_table_set(mc->tPrivateKey, cp, length); - (void)i2d_PrivateKey(pPrivateKey, &ucp); /* 2nd arg increments */ - - if (nPassPhraseDialogCur != 0) { - /* remember mtime of encrypted keys */ - asn1 = ssl_asn1_table_get(mc->tPrivateKey, cp); - asn1->source_mtime = pkey_mtime; - } - - /* - * Free the private key structure - */ - EVP_PKEY_free(pPrivateKey); - } - } - - /* - * Let the user know when we're successful. - */ - if (nPassPhraseDialog > 0) { - sc = mySrvConfig(s); - if (writetty) { - apr_file_printf(writetty, "\n" - "OK: Pass Phrase Dialog successful.\n"); - } - } - - /* - * Wipe out the used memory from the - * pass phrase array and then deallocate it - */ - if (aPassPhrase->nelts) { - pphrase_array_clear(aPassPhrase); - ap_log_error(APLOG_MARK, APLOG_INFO, 0, s, - "Init: Wiped out the queried pass phrases from memory"); - } - - /* Close the pipes if they were opened - */ - if (readtty) { - apr_file_close(readtty); - apr_file_close(writetty); - readtty = writetty = NULL; - } - return; -} - -static apr_status_t ssl_pipe_child_create(apr_pool_t *p, const char *progname) -{ - /* Child process code for 'ErrorLog "|..."'; - * may want a common framework for this, since I expect it will - * be common for other foo-loggers to want this sort of thing... - */ - apr_status_t rc; - apr_procattr_t *procattr; - apr_proc_t *procnew; - - if (((rc = apr_procattr_create(&procattr, p)) == APR_SUCCESS) && - ((rc = apr_procattr_io_set(procattr, - APR_FULL_BLOCK, - APR_FULL_BLOCK, - APR_NO_PIPE)) == APR_SUCCESS)) { - char **args; - const char *pname; - - apr_tokenize_to_argv(progname, &args, p); - pname = apr_pstrdup(p, args[0]); - procnew = (apr_proc_t *)apr_pcalloc(p, sizeof(*procnew)); - rc = apr_proc_create(procnew, pname, (const char * const *)args, - NULL, procattr, p); - if (rc == APR_SUCCESS) { - /* XXX: not sure if we aught to... - * apr_pool_note_subprocess(p, procnew, APR_KILL_AFTER_TIMEOUT); - */ - writetty = procnew->in; - readtty = procnew->out; - } - } - - return rc; -} - -static int pipe_get_passwd_cb(char *buf, int length, char *prompt, int verify) -{ - apr_status_t rc; - char *p; - - apr_file_puts(prompt, writetty); - - buf[0]='\0'; - rc = apr_file_gets(buf, length, readtty); - apr_file_puts(APR_EOL_STR, writetty); - - if (rc != APR_SUCCESS || apr_file_eof(readtty)) { - memset(buf, 0, length); - return 1; /* failure */ - } - if ((p = strchr(buf, '\n')) != NULL) { - *p = '\0'; - } -#ifdef WIN32 - /* XXX: apr_sometest */ - if ((p = strchr(buf, '\r')) != NULL) { - *p = '\0'; - } -#endif - return 0; -} - -#ifdef SSLC_VERSION_NUMBER -int ssl_pphrase_Handle_CB(char *buf, int bufsize, int verify) -{ - void *srv = ssl_pphrase_server_rec; -#else -int ssl_pphrase_Handle_CB(char *buf, int bufsize, int verify, void *srv) -{ -#endif - SSLModConfigRec *mc; - server_rec *s; - apr_pool_t *p; - apr_array_header_t *aPassPhrase; - SSLSrvConfigRec *sc; - int *pnPassPhraseCur; - char **cppPassPhraseCur; - char *cpVHostID; - char *cpAlgoType; - int *pnPassPhraseDialog; - int *pnPassPhraseDialogCur; - BOOL *pbPassPhraseDialogOnce; - char *cpp; - int len = -1; - - mc = myModConfig((server_rec *)srv); - - /* - * Reconnect to the context of ssl_phrase_Handle() - */ - s = myCtxVarGet(mc, 1, server_rec *); - p = myCtxVarGet(mc, 2, apr_pool_t *); - aPassPhrase = myCtxVarGet(mc, 3, apr_array_header_t *); - pnPassPhraseCur = myCtxVarGet(mc, 4, int *); - cppPassPhraseCur = myCtxVarGet(mc, 5, char **); - cpVHostID = myCtxVarGet(mc, 6, char *); - cpAlgoType = myCtxVarGet(mc, 7, char *); - pnPassPhraseDialog = myCtxVarGet(mc, 8, int *); - pnPassPhraseDialogCur = myCtxVarGet(mc, 9, int *); - pbPassPhraseDialogOnce = myCtxVarGet(mc, 10, BOOL *); - sc = mySrvConfig(s); - - (*pnPassPhraseDialog)++; - (*pnPassPhraseDialogCur)++; - - /* - * When remembered pass phrases are available use them... - */ - if ((cpp = pphrase_array_get(aPassPhrase, *pnPassPhraseCur)) != NULL) { - apr_cpystrn(buf, cpp, bufsize); - len = strlen(buf); - return len; - } - - /* - * Builtin or Pipe dialog - */ - if (sc->server->pphrase_dialog_type == SSL_PPTYPE_BUILTIN - || sc->server->pphrase_dialog_type == SSL_PPTYPE_PIPE) { - char *prompt; - int i; - - if (sc->server->pphrase_dialog_type == SSL_PPTYPE_PIPE) { - if (!readtty) { - ap_log_error(APLOG_MARK, APLOG_INFO, 0, s, - "Init: Creating pass phrase dialog pipe child " - "'%s'", sc->server->pphrase_dialog_path); - if (ssl_pipe_child_create(p, sc->server->pphrase_dialog_path) - != APR_SUCCESS) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, - "Init: Failed to create pass phrase pipe '%s'", - sc->server->pphrase_dialog_path); - PEMerr(PEM_F_DEF_CALLBACK,PEM_R_PROBLEMS_GETTING_PASSWORD); - memset(buf, 0, (unsigned int)bufsize); - return (-1); - } - } - ap_log_error(APLOG_MARK, APLOG_INFO, 0, s, - "Init: Requesting pass phrase via piped dialog"); - } - else { /* sc->server->pphrase_dialog_type == SSL_PPTYPE_BUILTIN */ -#ifdef WIN32 - PEMerr(PEM_F_DEF_CALLBACK,PEM_R_PROBLEMS_GETTING_PASSWORD); - memset(buf, 0, (unsigned int)bufsize); - return (-1); -#else - /* - * stderr has already been redirected to the error_log. - * rather than attempting to temporarily rehook it to the terminal, - * we print the prompt to stdout before EVP_read_pw_string turns - * off tty echo - */ - apr_file_open_stdout(&writetty, p); - - ap_log_error(APLOG_MARK, APLOG_INFO, 0, s, - "Init: Requesting pass phrase via builtin terminal " - "dialog"); -#endif - } - - /* - * The first time display a header to inform the user about what - * program he actually speaks to, which module is responsible for - * this terminal dialog and why to the hell he has to enter - * something... - */ - if (*pnPassPhraseDialog == 1) { - apr_file_printf(writetty, "%s mod_ssl/%s (Pass Phrase Dialog)\n", - AP_SERVER_BASEVERSION, MOD_SSL_VERSION); - apr_file_printf(writetty, "Some of your private key files are encrypted for security reasons.\n"); - apr_file_printf(writetty, "In order to read them you have to provide the pass phrases.\n"); - } - if (*pbPassPhraseDialogOnce) { - *pbPassPhraseDialogOnce = FALSE; - apr_file_printf(writetty, "\n"); - apr_file_printf(writetty, "Server %s (%s)\n", cpVHostID, cpAlgoType); - } - - /* - * Emulate the OpenSSL internal pass phrase dialog - * (see crypto/pem/pem_lib.c:def_callback() for details) - */ - prompt = "Enter pass phrase:"; - - for (;;) { - apr_file_puts(prompt, writetty); - if (sc->server->pphrase_dialog_type == SSL_PPTYPE_PIPE) { - i = pipe_get_passwd_cb(buf, bufsize, "", FALSE); - } - else { /* sc->server->pphrase_dialog_type == SSL_PPTYPE_BUILTIN */ - i = EVP_read_pw_string(buf, bufsize, "", FALSE); - } - if (i != 0) { - PEMerr(PEM_F_DEF_CALLBACK,PEM_R_PROBLEMS_GETTING_PASSWORD); - memset(buf, 0, (unsigned int)bufsize); - return (-1); - } - len = strlen(buf); - if (len < 1) - apr_file_printf(writetty, "Apache:mod_ssl:Error: Pass phrase empty (needs to be at least 1 character).\n"); - else - break; - } - } - - /* - * Filter program - */ - else if (sc->server->pphrase_dialog_type == SSL_PPTYPE_FILTER) { - const char *cmd = sc->server->pphrase_dialog_path; - const char **argv = apr_palloc(p, sizeof(char *) * 4); - char *result; - - ap_log_error(APLOG_MARK, APLOG_INFO, 0, s, - "Init: Requesting pass phrase from dialog filter " - "program (%s)", cmd); - - argv[0] = cmd; - argv[1] = cpVHostID; - argv[2] = cpAlgoType; - argv[3] = NULL; - - result = ssl_util_readfilter(s, p, cmd, argv); - apr_cpystrn(buf, result, bufsize); - len = strlen(buf); - } - - /* - * Ok, we now have the pass phrase, so give it back - */ - *cppPassPhraseCur = apr_pstrdup(p, buf); - - /* - * And return it's length to OpenSSL... - */ - return (len); -} - diff --git a/trunk/modules/ssl/ssl_engine_rand.c b/trunk/modules/ssl/ssl_engine_rand.c deleted file mode 100644 index 486759c702887daa10849223f8909b015dd09b09..0000000000000000000000000000000000000000 --- a/trunk/modules/ssl/ssl_engine_rand.c +++ /dev/null @@ -1,179 +0,0 @@ -/* Copyright 2001-2005 The Apache Software Foundation or its licensors, as - * applicable. - * - * 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_ssl - * | '_ ` _ \ / _ \ / _` | / __/ __| | Apache Interface to OpenSSL - * | | | | | | (_) | (_| | \__ \__ \ | - * |_| |_| |_|\___/ \__,_|___|___/___/_| - * |_____| - * ssl_engine_rand.c - * Random Number Generator Seeding - */ - /* ``The generation of random - numbers is too important - to be left to chance.'' */ - -#include "ssl_private.h" - -/* _________________________________________________________________ -** -** Support for better seeding of SSL library's RNG -** _________________________________________________________________ -*/ - -static int ssl_rand_choosenum(int, int); -static int ssl_rand_feedfp(apr_pool_t *, apr_file_t *, int); - -int ssl_rand_seed(server_rec *s, apr_pool_t *p, ssl_rsctx_t nCtx, char *prefix) -{ - SSLModConfigRec *mc; - apr_array_header_t *apRandSeed; - ssl_randseed_t *pRandSeeds; - ssl_randseed_t *pRandSeed; - unsigned char stackdata[256]; - int nReq, nDone; - apr_file_t *fp; - int i, n, l; - - mc = myModConfig(s); - nReq = 0; - nDone = 0; - apRandSeed = mc->aRandSeed; - pRandSeeds = (ssl_randseed_t *)apRandSeed->elts; - for (i = 0; i < apRandSeed->nelts; i++) { - pRandSeed = &pRandSeeds[i]; - if (pRandSeed->nCtx == nCtx) { - nReq += pRandSeed->nBytes; - if (pRandSeed->nSrc == SSL_RSSRC_FILE) { - /* - * seed in contents of an external file - */ - if (apr_file_open(&fp, pRandSeed->cpPath, - APR_READ, APR_OS_DEFAULT, p) != APR_SUCCESS) - continue; - nDone += ssl_rand_feedfp(p, fp, pRandSeed->nBytes); - apr_file_close(fp); - } - else if (pRandSeed->nSrc == SSL_RSSRC_EXEC) { - const char *cmd = pRandSeed->cpPath; - const char **argv = apr_palloc(p, sizeof(char *) * 3); - /* - * seed in contents generated by an external program - */ - argv[0] = cmd; - argv[1] = apr_itoa(p, pRandSeed->nBytes); - argv[2] = NULL; - - if ((fp = ssl_util_ppopen(s, p, cmd, argv)) == NULL) - continue; - nDone += ssl_rand_feedfp(p, fp, pRandSeed->nBytes); - ssl_util_ppclose(s, p, fp); - } -#ifdef HAVE_SSL_RAND_EGD - else if (pRandSeed->nSrc == SSL_RSSRC_EGD) { - /* - * seed in contents provided by the external - * Entropy Gathering Daemon (EGD) - */ - if ((n = RAND_egd(pRandSeed->cpPath)) == -1) - continue; - nDone += n; - } -#endif - else if (pRandSeed->nSrc == SSL_RSSRC_BUILTIN) { - struct { - time_t t; - pid_t pid; - } my_seed; - - /* - * seed in the current time (usually just 4 bytes) - */ - my_seed.t = time(NULL); - - /* - * seed in the current process id (usually just 4 bytes) - */ - my_seed.pid = mc->pid; - - l = sizeof(my_seed); - RAND_seed((unsigned char *)&my_seed, l); - nDone += l; - - /* - * seed in some current state of the run-time stack (128 bytes) - */ - n = ssl_rand_choosenum(0, sizeof(stackdata)-128-1); - RAND_seed(stackdata+n, 128); - nDone += 128; - - } - } - } - ap_log_error(APLOG_MARK, APLOG_INFO, 0, s, - "%sSeeding PRNG with %d bytes of entropy", prefix, nDone); - - if (RAND_status() == 0) - ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s, - "%sPRNG still contains insufficient entropy!", prefix); - - return nDone; -} - -#define BUFSIZE 8192 - -static int ssl_rand_feedfp(apr_pool_t *p, apr_file_t *fp, int nReq) -{ - apr_size_t nDone; - unsigned char caBuf[BUFSIZE]; - apr_size_t nBuf; - apr_size_t nRead; - apr_size_t nTodo; - - nDone = 0; - nRead = BUFSIZE; - nTodo = nReq; - while (1) { - if (nReq > 0) - nRead = (nTodo < BUFSIZE ? nTodo : BUFSIZE); - nBuf = nRead; - if (apr_file_read(fp, caBuf, &nBuf) != APR_SUCCESS) - break; - RAND_seed(caBuf, nBuf); - nDone += nBuf; - if (nReq > 0) { - nTodo -= nBuf; - if (nTodo <= 0) - break; - } - } - return nDone; -} - -static int ssl_rand_choosenum(int l, int h) -{ - int i; - char buf[50]; - - apr_snprintf(buf, sizeof(buf), "%.0f", - (((double)(rand()%RAND_MAX)/RAND_MAX)*(h-l))); - i = atoi(buf)+1; - if (i < l) i = l; - if (i > h) i = h; - return i; -} - diff --git a/trunk/modules/ssl/ssl_engine_vars.c b/trunk/modules/ssl/ssl_engine_vars.c deleted file mode 100644 index 69d4b098c3dfdf1da80c6b55c6eac1cd0f801dea..0000000000000000000000000000000000000000 --- a/trunk/modules/ssl/ssl_engine_vars.c +++ /dev/null @@ -1,784 +0,0 @@ -/* Copyright 2001-2005 The Apache Software Foundation or its licensors, as - * applicable. - * - * 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_ssl - * | '_ ` _ \ / _ \ / _` | / __/ __| | Apache Interface to OpenSSL - * | | | | | | (_) | (_| | \__ \__ \ | - * |_| |_| |_|\___/ \__,_|___|___/___/_| - * |_____| - * ssl_engine_vars.c - * Variable Lookup Facility - */ - /* ``Those of you who think they - know everything are very annoying - to those of us who do.'' - -- Unknown */ -#include "ssl_private.h" -#include "mod_ssl.h" - -#include "apr_time.h" - -/* _________________________________________________________________ -** -** Variable Lookup -** _________________________________________________________________ -*/ - -static char *ssl_var_lookup_ssl(apr_pool_t *p, conn_rec *c, char *var); -static char *ssl_var_lookup_ssl_cert(apr_pool_t *p, X509 *xs, char *var); -static char *ssl_var_lookup_ssl_cert_dn(apr_pool_t *p, X509_NAME *xsname, char *var); -static char *ssl_var_lookup_ssl_cert_valid(apr_pool_t *p, ASN1_UTCTIME *tm); -static char *ssl_var_lookup_ssl_cert_remain(apr_pool_t *p, ASN1_UTCTIME *tm); -static char *ssl_var_lookup_ssl_cert_serial(apr_pool_t *p, X509 *xs); -static char *ssl_var_lookup_ssl_cert_chain(apr_pool_t *p, STACK_OF(X509) *sk, char *var); -static char *ssl_var_lookup_ssl_cert_PEM(apr_pool_t *p, X509 *xs); -static char *ssl_var_lookup_ssl_cert_verify(apr_pool_t *p, conn_rec *c); -static char *ssl_var_lookup_ssl_cipher(apr_pool_t *p, conn_rec *c, char *var); -static void ssl_var_lookup_ssl_cipher_bits(SSL *ssl, int *usekeysize, int *algkeysize); -static char *ssl_var_lookup_ssl_version(apr_pool_t *p, char *var); - -static int ssl_is_https(conn_rec *c) -{ - SSLConnRec *sslconn = myConnConfig(c); - return sslconn && sslconn->ssl; -} - -void ssl_var_register(void) -{ - APR_REGISTER_OPTIONAL_FN(ssl_is_https); - APR_REGISTER_OPTIONAL_FN(ssl_var_lookup); - APR_REGISTER_OPTIONAL_FN(ssl_ext_lookup); - return; -} - -/* This function must remain safe to use for a non-SSL connection. */ -char *ssl_var_lookup(apr_pool_t *p, server_rec *s, conn_rec *c, request_rec *r, char *var) -{ - SSLModConfigRec *mc = myModConfig(s); - const char *result; - BOOL resdup; - apr_time_exp_t tm; - - result = NULL; - resdup = TRUE; - - /* - * When no pool is given try to find one - */ - if (p == NULL) { - if (r != NULL) - p = r->pool; - else if (c != NULL) - p = c->pool; - else - p = mc->pPool; - } - - /* - * Request dependent stuff - */ - if (r != NULL) { - switch (var[0]) { - case 'H': - case 'h': - if (strcEQ(var, "HTTP_USER_AGENT")) - result = apr_table_get(r->headers_in, "User-Agent"); - else if (strcEQ(var, "HTTP_REFERER")) - result = apr_table_get(r->headers_in, "Referer"); - else if (strcEQ(var, "HTTP_COOKIE")) - result = apr_table_get(r->headers_in, "Cookie"); - else if (strcEQ(var, "HTTP_FORWARDED")) - result = apr_table_get(r->headers_in, "Forwarded"); - else if (strcEQ(var, "HTTP_HOST")) - result = apr_table_get(r->headers_in, "Host"); - else if (strcEQ(var, "HTTP_PROXY_CONNECTION")) - result = apr_table_get(r->headers_in, "Proxy-Connection"); - else if (strcEQ(var, "HTTP_ACCEPT")) - result = apr_table_get(r->headers_in, "Accept"); - else if (strlen(var) > 5 && strcEQn(var, "HTTP:", 5)) - /* all other headers from which we are still not know about */ - result = apr_table_get(r->headers_in, var+5); - break; - - case 'R': - case 'r': - if (strcEQ(var, "REQUEST_METHOD")) - result = r->method; - else if (strcEQ(var, "REQUEST_SCHEME")) - result = ap_http_scheme(r); - else if (strcEQ(var, "REQUEST_URI")) - result = r->uri; - else if (strcEQ(var, "REQUEST_FILENAME")) - result = r->filename; - else if (strcEQ(var, "REMOTE_HOST")) - result = ap_get_remote_host(r->connection, r->per_dir_config, - REMOTE_NAME, NULL); - else if (strcEQ(var, "REMOTE_IDENT")) - result = ap_get_remote_logname(r); - else if (strcEQ(var, "REMOTE_USER")) - result = r->user; - break; - - case 'S': - case 's': - if (strcEQn(var, "SSL", 3)) break; /* shortcut common case */ - - if (strcEQ(var, "SERVER_ADMIN")) - result = r->server->server_admin; - else if (strcEQ(var, "SERVER_NAME")) - result = ap_get_server_name(r); - else if (strcEQ(var, "SERVER_PORT")) - result = apr_psprintf(p, "%u", ap_get_server_port(r)); - else if (strcEQ(var, "SERVER_PROTOCOL")) - result = r->protocol; - else if (strcEQ(var, "SCRIPT_FILENAME")) - result = r->filename; - break; - - default: - if (strcEQ(var, "PATH_INFO")) - result = r->path_info; - else if (strcEQ(var, "QUERY_STRING")) - result = r->args; - else if (strcEQ(var, "IS_SUBREQ")) - result = (r->main != NULL ? "true" : "false"); - else if (strcEQ(var, "DOCUMENT_ROOT")) - result = ap_document_root(r); - else if (strcEQ(var, "AUTH_TYPE")) - result = r->ap_auth_type; - else if (strcEQ(var, "THE_REQUEST")) - result = r->the_request; - break; - } - } - - /* - * Connection stuff - */ - if (result == NULL && c != NULL) { - SSLConnRec *sslconn = myConnConfig(c); - if (strlen(var) > 4 && strcEQn(var, "SSL_", 4) - && sslconn && sslconn->ssl) - result = ssl_var_lookup_ssl(p, c, var+4); - else if (strcEQ(var, "REMOTE_ADDR")) - result = c->remote_ip; - else if (strcEQ(var, "HTTPS")) { - if (sslconn && sslconn->ssl) - result = "on"; - else - result = "off"; - } - } - - /* - * Totally independent stuff - */ - if (result == NULL) { - if (strlen(var) > 12 && strcEQn(var, "SSL_VERSION_", 12)) - result = ssl_var_lookup_ssl_version(p, var+12); - else if (strcEQ(var, "SERVER_SOFTWARE")) - result = ap_get_server_version(); - else if (strcEQ(var, "API_VERSION")) { - result = apr_itoa(p, MODULE_MAGIC_NUMBER); - resdup = FALSE; - } - else if (strcEQ(var, "TIME_YEAR")) { - apr_time_exp_lt(&tm, apr_time_now()); - result = apr_psprintf(p, "%02d%02d", - (tm.tm_year / 100) + 19, tm.tm_year % 100); - resdup = FALSE; - } -#define MKTIMESTR(format, tmfield) \ - apr_time_exp_lt(&tm, apr_time_now()); \ - result = apr_psprintf(p, format, tm.tmfield); \ - resdup = FALSE; - else if (strcEQ(var, "TIME_MON")) { - MKTIMESTR("%02d", tm_mon+1) - } - else if (strcEQ(var, "TIME_DAY")) { - MKTIMESTR("%02d", tm_mday) - } - else if (strcEQ(var, "TIME_HOUR")) { - MKTIMESTR("%02d", tm_hour) - } - else if (strcEQ(var, "TIME_MIN")) { - MKTIMESTR("%02d", tm_min) - } - else if (strcEQ(var, "TIME_SEC")) { - MKTIMESTR("%02d", tm_sec) - } - else if (strcEQ(var, "TIME_WDAY")) { - MKTIMESTR("%d", tm_wday) - } - else if (strcEQ(var, "TIME")) { - apr_time_exp_lt(&tm, apr_time_now()); - result = apr_psprintf(p, - "%02d%02d%02d%02d%02d%02d%02d", (tm.tm_year / 100) + 19, - (tm.tm_year % 100), tm.tm_mon+1, tm.tm_mday, - tm.tm_hour, tm.tm_min, tm.tm_sec); - resdup = FALSE; - } - /* all other env-variables from the parent Apache process */ - else if (strlen(var) > 4 && strcEQn(var, "ENV:", 4)) { - result = apr_table_get(r->notes, var+4); - if (result == NULL) - result = apr_table_get(r->subprocess_env, var+4); - if (result == NULL) - result = getenv(var+4); - } - } - - if (result != NULL && resdup) - result = apr_pstrdup(p, result); - if (result == NULL) - result = ""; - return (char *)result; -} - -static char *ssl_var_lookup_ssl(apr_pool_t *p, conn_rec *c, char *var) -{ - SSLConnRec *sslconn = myConnConfig(c); - char *result; - X509 *xs; - STACK_OF(X509) *sk; - SSL *ssl; - - result = NULL; - - ssl = sslconn->ssl; - if (strlen(var) > 8 && strcEQn(var, "VERSION_", 8)) { - result = ssl_var_lookup_ssl_version(p, var+8); - } - else if (ssl != NULL && strcEQ(var, "PROTOCOL")) { - result = (char *)SSL_get_version(ssl); - } - else if (ssl != NULL && strcEQ(var, "SESSION_ID")) { - char buf[SSL_SESSION_ID_STRING_LEN]; - SSL_SESSION *pSession = SSL_get_session(ssl); - if (pSession) { - result = apr_pstrdup(p, SSL_SESSION_id2sz( - SSL_SESSION_get_session_id(pSession), - SSL_SESSION_get_session_id_length(pSession), - buf, sizeof(buf))); - } - } - else if (ssl != NULL && strlen(var) >= 6 && strcEQn(var, "CIPHER", 6)) { - result = ssl_var_lookup_ssl_cipher(p, c, var+6); - } - else if (ssl != NULL && strlen(var) > 18 && strcEQn(var, "CLIENT_CERT_CHAIN_", 18)) { - sk = SSL_get_peer_cert_chain(ssl); - result = ssl_var_lookup_ssl_cert_chain(p, sk, var+18); - } - else if (ssl != NULL && strcEQ(var, "CLIENT_VERIFY")) { - result = ssl_var_lookup_ssl_cert_verify(p, c); - } - else if (ssl != NULL && strlen(var) > 7 && strcEQn(var, "CLIENT_", 7)) { - if ((xs = SSL_get_peer_certificate(ssl)) != NULL) { - result = ssl_var_lookup_ssl_cert(p, xs, var+7); - X509_free(xs); - } - } - else if (ssl != NULL && strlen(var) > 7 && strcEQn(var, "SERVER_", 7)) { - if ((xs = SSL_get_certificate(ssl)) != NULL) - result = ssl_var_lookup_ssl_cert(p, xs, var+7); - } - return result; -} - -static char *ssl_var_lookup_ssl_cert(apr_pool_t *p, X509 *xs, char *var) -{ - char *result; - BOOL resdup; - X509_NAME *xsname; - int nid; - char *cp; - - result = NULL; - resdup = TRUE; - - if (strcEQ(var, "M_VERSION")) { - result = apr_psprintf(p, "%lu", X509_get_version(xs)+1); - resdup = FALSE; - } - else if (strcEQ(var, "M_SERIAL")) { - result = ssl_var_lookup_ssl_cert_serial(p, xs); - } - else if (strcEQ(var, "V_START")) { - result = ssl_var_lookup_ssl_cert_valid(p, X509_get_notBefore(xs)); - } - else if (strcEQ(var, "V_END")) { - result = ssl_var_lookup_ssl_cert_valid(p, X509_get_notAfter(xs)); - } - else if (strcEQ(var, "V_REMAIN")) { - result = ssl_var_lookup_ssl_cert_remain(p, X509_get_notAfter(xs)); - resdup = FALSE; - } - else if (strcEQ(var, "S_DN")) { - xsname = X509_get_subject_name(xs); - cp = X509_NAME_oneline(xsname, NULL, 0); - result = apr_pstrdup(p, cp); - modssl_free(cp); - resdup = FALSE; - } - else if (strlen(var) > 5 && strcEQn(var, "S_DN_", 5)) { - xsname = X509_get_subject_name(xs); - result = ssl_var_lookup_ssl_cert_dn(p, xsname, var+5); - resdup = FALSE; - } - else if (strcEQ(var, "I_DN")) { - xsname = X509_get_issuer_name(xs); - cp = X509_NAME_oneline(xsname, NULL, 0); - result = apr_pstrdup(p, cp); - modssl_free(cp); - resdup = FALSE; - } - else if (strlen(var) > 5 && strcEQn(var, "I_DN_", 5)) { - xsname = X509_get_issuer_name(xs); - result = ssl_var_lookup_ssl_cert_dn(p, xsname, var+5); - resdup = FALSE; - } - else if (strcEQ(var, "A_SIG")) { - nid = OBJ_obj2nid((ASN1_OBJECT *)X509_get_signature_algorithm(xs)); - result = apr_pstrdup(p, - (nid == NID_undef) ? "UNKNOWN" : OBJ_nid2ln(nid)); - resdup = FALSE; - } - else if (strcEQ(var, "A_KEY")) { - nid = OBJ_obj2nid((ASN1_OBJECT *)X509_get_key_algorithm(xs)); - result = apr_pstrdup(p, - (nid == NID_undef) ? "UNKNOWN" : OBJ_nid2ln(nid)); - resdup = FALSE; - } - else if (strcEQ(var, "CERT")) { - result = ssl_var_lookup_ssl_cert_PEM(p, xs); - } - - if (result != NULL && resdup) - result = apr_pstrdup(p, result); - return result; -} - -static const struct { - char *name; - int nid; -} ssl_var_lookup_ssl_cert_dn_rec[] = { - { "C", NID_countryName }, - { "ST", NID_stateOrProvinceName }, /* officially (RFC2156) */ - { "SP", NID_stateOrProvinceName }, /* compatibility (SSLeay) */ - { "L", NID_localityName }, - { "O", NID_organizationName }, - { "OU", NID_organizationalUnitName }, - { "CN", NID_commonName }, - { "T", NID_title }, - { "I", NID_initials }, - { "G", NID_givenName }, - { "S", NID_surname }, - { "D", NID_description }, -#ifdef NID_x500UniqueIdentifier /* new name as of Openssl 0.9.7 */ - { "UID", NID_x500UniqueIdentifier }, -#else /* old name, OpenSSL < 0.9.7 */ - { "UID", NID_uniqueIdentifier }, -#endif - { "Email", NID_pkcs9_emailAddress }, - { NULL, 0 } -}; - -static char *ssl_var_lookup_ssl_cert_dn(apr_pool_t *p, X509_NAME *xsname, char *var) -{ - char *result, *ptr; - X509_NAME_ENTRY *xsne; - int i, j, n, idx = 0; - apr_size_t varlen; - - /* if an _N suffix is used, find the Nth attribute of given name */ - ptr = strchr(var, '_'); - if (ptr != NULL && strspn(ptr + 1, "0123456789") == strlen(ptr + 1)) { - idx = atoi(ptr + 1); - varlen = ptr - var; - } else { - varlen = strlen(var); - } - - result = NULL; - - for (i = 0; ssl_var_lookup_ssl_cert_dn_rec[i].name != NULL; i++) { - if (strEQn(var, ssl_var_lookup_ssl_cert_dn_rec[i].name, varlen) - && strlen(ssl_var_lookup_ssl_cert_dn_rec[i].name) == varlen) { - for (j = 0; j < sk_X509_NAME_ENTRY_num((STACK_OF(X509_NAME_ENTRY) *) - X509_NAME_get_entries(xsname)); - j++) { - xsne = sk_X509_NAME_ENTRY_value((STACK_OF(X509_NAME_ENTRY) *) - X509_NAME_get_entries(xsname), j); - - n =OBJ_obj2nid((ASN1_OBJECT *)X509_NAME_ENTRY_get_object(xsne)); - - if (n == ssl_var_lookup_ssl_cert_dn_rec[i].nid && idx-- == 0) { - result = apr_pstrmemdup(p, - X509_NAME_ENTRY_get_data_ptr(xsne), - X509_NAME_ENTRY_get_data_len(xsne)); -#if APR_CHARSET_EBCDIC - ap_xlate_proto_from_ascii(result, X509_NAME_ENTRY_get_data_len(xsne)); -#endif /* APR_CHARSET_EBCDIC */ - break; - } - } - break; - } - } - return result; -} - -static char *ssl_var_lookup_ssl_cert_valid(apr_pool_t *p, ASN1_UTCTIME *tm) -{ - char *result; - BIO* bio; - int n; - - if ((bio = BIO_new(BIO_s_mem())) == NULL) - return NULL; - ASN1_UTCTIME_print(bio, tm); - n = BIO_pending(bio); - result = apr_pcalloc(p, n+1); - n = BIO_read(bio, result, n); - result[n] = NUL; - BIO_free(bio); - return result; -} - -#define DIGIT2NUM(x) (((x)[0] - '0') * 10 + (x)[1] - '0') - -/* Return a string giving the number of days remaining until 'tm', or - * "0" if this can't be determined. */ -static char *ssl_var_lookup_ssl_cert_remain(apr_pool_t *p, ASN1_UTCTIME *tm) -{ - apr_time_t then, now = apr_time_now(); - apr_time_exp_t exp = {0}; - long diff; - - /* Fail if the time isn't a valid ASN.1 UTCTIME; RFC3280 mandates - * that the seconds digits are present even though ASN.1 - * doesn't. */ - if (tm->length < 11 || !ASN1_UTCTIME_check(tm)) { - return apr_pstrdup(p, "0"); - } - - exp.tm_year = DIGIT2NUM(tm->data); - exp.tm_mon = DIGIT2NUM(tm->data + 2) - 1; - exp.tm_mday = DIGIT2NUM(tm->data + 4) + 1; - exp.tm_hour = DIGIT2NUM(tm->data + 6); - exp.tm_min = DIGIT2NUM(tm->data + 8); - exp.tm_sec = DIGIT2NUM(tm->data + 10); - - if (exp.tm_year <= 50) exp.tm_year += 100; - - if (apr_time_exp_gmt_get(&then, &exp) != APR_SUCCESS) { - return apr_pstrdup(p, "0"); - } - - diff = (long)((apr_time_sec(then) - apr_time_sec(now)) / (60*60*24)); - - return diff > 0 ? apr_ltoa(p, diff) : apr_pstrdup(p, "0"); -} - -static char *ssl_var_lookup_ssl_cert_serial(apr_pool_t *p, X509 *xs) -{ - char *result; - BIO *bio; - int n; - - if ((bio = BIO_new(BIO_s_mem())) == NULL) - return NULL; - i2a_ASN1_INTEGER(bio, X509_get_serialNumber(xs)); - n = BIO_pending(bio); - result = apr_pcalloc(p, n+1); - n = BIO_read(bio, result, n); - result[n] = NUL; - BIO_free(bio); - return result; -} - -static char *ssl_var_lookup_ssl_cert_chain(apr_pool_t *p, STACK_OF(X509) *sk, char *var) -{ - char *result; - X509 *xs; - int n; - - result = NULL; - - if (strspn(var, "0123456789") == strlen(var)) { - n = atoi(var); - if (n < sk_X509_num(sk)) { - xs = sk_X509_value(sk, n); - result = ssl_var_lookup_ssl_cert_PEM(p, xs); - } - } - - return result; -} - -static char *ssl_var_lookup_ssl_cert_PEM(apr_pool_t *p, X509 *xs) -{ - char *result; - BIO *bio; - int n; - - if ((bio = BIO_new(BIO_s_mem())) == NULL) - return NULL; - PEM_write_bio_X509(bio, xs); - n = BIO_pending(bio); - result = apr_pcalloc(p, n+1); - n = BIO_read(bio, result, n); - result[n] = NUL; - BIO_free(bio); - return result; -} - -static char *ssl_var_lookup_ssl_cert_verify(apr_pool_t *p, conn_rec *c) -{ - SSLConnRec *sslconn = myConnConfig(c); - char *result; - long vrc; - const char *verr; - const char *vinfo; - SSL *ssl; - X509 *xs; - - result = NULL; - ssl = sslconn->ssl; - verr = sslconn->verify_error; - vinfo = sslconn->verify_info; - vrc = SSL_get_verify_result(ssl); - xs = SSL_get_peer_certificate(ssl); - - if (vrc == X509_V_OK && verr == NULL && vinfo == NULL && xs == NULL) - /* no client verification done at all */ - result = "NONE"; - else if (vrc == X509_V_OK && verr == NULL && vinfo == NULL && xs != NULL) - /* client verification done successful */ - result = "SUCCESS"; - else if (vrc == X509_V_OK && vinfo != NULL && strEQ(vinfo, "GENEROUS")) - /* client verification done in generous way */ - result = "GENEROUS"; - else - /* client verification failed */ - result = apr_psprintf(p, "FAILED:%s", verr); - - if (xs) - X509_free(xs); - return result; -} - -static char *ssl_var_lookup_ssl_cipher(apr_pool_t *p, conn_rec *c, char *var) -{ - SSLConnRec *sslconn = myConnConfig(c); - char *result; - BOOL resdup; - int usekeysize, algkeysize; - SSL *ssl; - - result = NULL; - resdup = TRUE; - - ssl = sslconn->ssl; - ssl_var_lookup_ssl_cipher_bits(ssl, &usekeysize, &algkeysize); - - if (ssl && strEQ(var, "")) { - SSL_CIPHER *cipher = SSL_get_current_cipher(ssl); - result = (cipher != NULL ? (char *)SSL_CIPHER_get_name(cipher) : NULL); - } - else if (strcEQ(var, "_EXPORT")) - result = (usekeysize < 56 ? "true" : "false"); - else if (strcEQ(var, "_USEKEYSIZE")) { - result = apr_itoa(p, usekeysize); - resdup = FALSE; - } - else if (strcEQ(var, "_ALGKEYSIZE")) { - result = apr_itoa(p, algkeysize); - resdup = FALSE; - } - - if (result != NULL && resdup) - result = apr_pstrdup(p, result); - return result; -} - -static void ssl_var_lookup_ssl_cipher_bits(SSL *ssl, int *usekeysize, int *algkeysize) -{ - SSL_CIPHER *cipher; - - *usekeysize = 0; - *algkeysize = 0; - if (ssl != NULL) - if ((cipher = SSL_get_current_cipher(ssl)) != NULL) - *usekeysize = SSL_CIPHER_get_bits(cipher, algkeysize); - return; -} - -static char *ssl_var_lookup_ssl_version(apr_pool_t *p, char *var) -{ - char *result; - char *cp, *cp2; - - result = NULL; - - if (strEQ(var, "PRODUCT")) { -#if defined(SSL_PRODUCT_NAME) && defined(SSL_PRODUCT_VERSION) - result = apr_psprintf(p, "%s/%s", SSL_PRODUCT_NAME, SSL_PRODUCT_VERSION); -#else - result = NULL; -#endif - } - else if (strEQ(var, "INTERFACE")) { - result = apr_psprintf(p, "mod_ssl/%s", MOD_SSL_VERSION); - } - else if (strEQ(var, "LIBRARY")) { - result = apr_pstrdup(p, SSLeay_version(SSLEAY_VERSION)); - if ((cp = strchr(result, ' ')) != NULL) { - *cp = '/'; - if ((cp2 = strchr(cp, ' ')) != NULL) - *cp2 = NUL; - } - } - return result; -} - -const char *ssl_ext_lookup(apr_pool_t *p, conn_rec *c, int peer, - const char *oidnum) -{ - SSLConnRec *sslconn = myConnConfig(c); - SSL *ssl; - X509 *xs = NULL; - ASN1_OBJECT *oid; - int count = 0, j; - char *result = NULL; - - if (!sslconn || !sslconn->ssl) { - return NULL; - } - ssl = sslconn->ssl; - - oid = OBJ_txt2obj(oidnum, 1); - if (!oid) { - ERR_clear_error(); - return NULL; - } - - xs = peer ? SSL_get_peer_certificate(ssl) : SSL_get_certificate(ssl); - if (xs == NULL) { - return NULL; - } - - count = X509_get_ext_count(xs); - - for (j = 0; j < count; j++) { - X509_EXTENSION *ext = X509_get_ext(xs, j); - - if (OBJ_cmp(ext->object, oid) == 0) { - BIO *bio = BIO_new(BIO_s_mem()); - - if (X509V3_EXT_print(bio, ext, 0, 0) == 1) { - BUF_MEM *buf; - - BIO_get_mem_ptr(bio, &buf); - result = apr_pstrmemdup(p, buf->data, buf->length); - } - - BIO_vfree(bio); - break; - } - } - - if (peer) { - /* only SSL_get_peer_certificate raises the refcount */ - X509_free(xs); - } - - ERR_clear_error(); - return result; -} - -/* _________________________________________________________________ -** -** SSL Extension to mod_log_config -** _________________________________________________________________ -*/ - -#include "../../modules/loggers/mod_log_config.h" - -static const char *ssl_var_log_handler_c(request_rec *r, char *a); -static const char *ssl_var_log_handler_x(request_rec *r, char *a); - -/* - * register us for the mod_log_config function registering phase - * to establish %{...}c and to be able to expand %{...}x variables. - */ -void ssl_var_log_config_register(apr_pool_t *p) -{ - static APR_OPTIONAL_FN_TYPE(ap_register_log_handler) *log_pfn_register; - - log_pfn_register = APR_RETRIEVE_OPTIONAL_FN(ap_register_log_handler); - - if (log_pfn_register) { - log_pfn_register(p, "c", ssl_var_log_handler_c, 0); - log_pfn_register(p, "x", ssl_var_log_handler_x, 0); - } - return; -} - -/* - * implement the %{..}c log function - * (we are the only function) - */ -static const char *ssl_var_log_handler_c(request_rec *r, char *a) -{ - SSLConnRec *sslconn = myConnConfig(r->connection); - char *result; - - if (sslconn == NULL || sslconn->ssl == NULL) - return NULL; - result = NULL; - if (strEQ(a, "version")) - result = ssl_var_lookup(r->pool, r->server, r->connection, r, "SSL_PROTOCOL"); - else if (strEQ(a, "cipher")) - result = ssl_var_lookup(r->pool, r->server, r->connection, r, "SSL_CIPHER"); - else if (strEQ(a, "subjectdn") || strEQ(a, "clientcert")) - result = ssl_var_lookup(r->pool, r->server, r->connection, r, "SSL_CLIENT_S_DN"); - else if (strEQ(a, "issuerdn") || strEQ(a, "cacert")) - result = ssl_var_lookup(r->pool, r->server, r->connection, r, "SSL_CLIENT_I_DN"); - else if (strEQ(a, "errcode")) - result = "-"; - else if (strEQ(a, "errstr")) - result = (char *)sslconn->verify_error; - if (result != NULL && result[0] == NUL) - result = NULL; - return result; -} - -/* - * extend the implementation of the %{..}x log function - * (there can be more functions) - */ -static const char *ssl_var_log_handler_x(request_rec *r, char *a) -{ - char *result; - - result = ssl_var_lookup(r->pool, r->server, r->connection, r, a); - if (result != NULL && result[0] == NUL) - result = NULL; - return result; -} - diff --git a/trunk/modules/ssl/ssl_expr.c b/trunk/modules/ssl/ssl_expr.c deleted file mode 100644 index f45d959d67839d9aee604cb6ecafb53e3f70e380..0000000000000000000000000000000000000000 --- a/trunk/modules/ssl/ssl_expr.c +++ /dev/null @@ -1,82 +0,0 @@ -/* Copyright 2001-2005 The Apache Software Foundation or its licensors, as - * applicable. - * - * 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_ssl - * | '_ ` _ \ / _ \ / _` | / __/ __| | Apache Interface to OpenSSL - * | | | | | | (_) | (_| | \__ \__ \ | - * |_| |_| |_|\___/ \__,_|___|___/___/_| - * |_____| - * ssl_expr.c - * Expression Handling - */ - /* ``It is hard to fly with - the eagles when you work - with the turkeys.'' - -- Unknown */ -#include "ssl_private.h" - -/* _________________________________________________________________ -** -** Expression Handling -** _________________________________________________________________ -*/ - -ssl_expr_info_type ssl_expr_info; -char *ssl_expr_error; - -ssl_expr *ssl_expr_comp(apr_pool_t *p, char *expr) -{ - ssl_expr_info.pool = p; - ssl_expr_info.inputbuf = expr; - ssl_expr_info.inputlen = strlen(expr); - ssl_expr_info.inputptr = ssl_expr_info.inputbuf; - ssl_expr_info.expr = FALSE; - - ssl_expr_error = NULL; - if (ssl_expr_yyparse()) - return NULL; - return ssl_expr_info.expr; -} - -char *ssl_expr_get_error(void) -{ - if (ssl_expr_error == NULL) - return ""; - return ssl_expr_error; -} - -ssl_expr *ssl_expr_make(ssl_expr_node_op op, void *a1, void *a2) -{ - ssl_expr *node; - - node = (ssl_expr *)apr_palloc(ssl_expr_info.pool, sizeof(ssl_expr)); - node->node_op = op; - node->node_arg1 = (char *)a1; - node->node_arg2 = (char *)a2; - return node; -} - -int ssl_expr_exec(request_rec *r, ssl_expr *expr) -{ - BOOL rc; - - rc = ssl_expr_eval(r, expr); - if (ssl_expr_error != NULL) - return (-1); - else - return (rc ? 1 : 0); -} diff --git a/trunk/modules/ssl/ssl_expr.h b/trunk/modules/ssl/ssl_expr.h deleted file mode 100644 index 55f2e182306ed9af03efebfbfb2f772aa4157f1c..0000000000000000000000000000000000000000 --- a/trunk/modules/ssl/ssl_expr.h +++ /dev/null @@ -1,104 +0,0 @@ -/* Copyright 2001-2005 The Apache Software Foundation or its licensors, as - * applicable. - * - * 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_ssl - * | '_ ` _ \ / _ \ / _` | / __/ __| | Apache Interface to OpenSSL - * | | | | | | (_) | (_| | \__ \__ \ | - * |_| |_| |_|\___/ \__,_|___|___/___/_| - * |_____| - * ssl_expr.h - * Expression Handling (Header) - */ - /* ``May all your PUSHes be POPed.'' */ - -#ifndef __SSL_EXPR_H__ -#define __SSL_EXPR_H__ - -#ifndef FALSE -#define FALSE 0 -#endif - -#ifndef TRUE -#define TRUE !FALSE -#endif - -#ifndef YY_NULL -#define YY_NULL 0 -#endif - -#ifndef MIN -#define MIN(a,b) (((a)<(b))?(a):(b)) -#endif - -#ifndef BOOL -#define BOOL unsigned int -#endif - -#ifndef NULL -#define NULL (void *)0 -#endif - -#ifndef NUL -#define NUL '\0' -#endif - -#ifndef YYDEBUG -#define YYDEBUG 0 -#endif - -typedef enum { - op_NOP, op_ListElement, - op_True, op_False, op_Not, op_Or, op_And, op_Comp, - op_EQ, op_NE, op_LT, op_LE, op_GT, op_GE, op_IN, op_REG, op_NRE, - op_Digit, op_String, op_Regex, op_Var, op_Func -} ssl_expr_node_op; - -typedef struct { - ssl_expr_node_op node_op; - void *node_arg1; - void *node_arg2; - apr_pool_t *p; -} ssl_expr_node; - -typedef ssl_expr_node ssl_expr; - -typedef struct { - apr_pool_t *pool; - char *inputbuf; - int inputlen; - char *inputptr; - ssl_expr *expr; -} ssl_expr_info_type; - -extern ssl_expr_info_type ssl_expr_info; -extern char *ssl_expr_error; - -#define yylval ssl_expr_yylval -#define yyerror ssl_expr_yyerror -#define yyinput ssl_expr_yyinput - -extern int ssl_expr_yyparse(void); -extern int ssl_expr_yyerror(char *); -extern int ssl_expr_yylex(void); - -extern ssl_expr *ssl_expr_comp(apr_pool_t *, char *); -extern int ssl_expr_exec(request_rec *, ssl_expr *); -extern char *ssl_expr_get_error(void); -extern ssl_expr *ssl_expr_make(ssl_expr_node_op, void *, void *); -extern BOOL ssl_expr_eval(request_rec *, ssl_expr *); - -#endif /* __SSL_EXPR_H__ */ diff --git a/trunk/modules/ssl/ssl_expr_eval.c b/trunk/modules/ssl/ssl_expr_eval.c deleted file mode 100644 index 2b3adc8402f4f9920bb4938976faa4ff15c55716..0000000000000000000000000000000000000000 --- a/trunk/modules/ssl/ssl_expr_eval.c +++ /dev/null @@ -1,254 +0,0 @@ -/* Copyright 2001-2005 The Apache Software Foundation or its licensors, as - * applicable. - * - * 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_ssl - * | '_ ` _ \ / _ \ / _` | / __/ __| | Apache Interface to OpenSSL - * | | | | | | (_) | (_| | \__ \__ \ | - * |_| |_| |_|\___/ \__,_|___|___/___/_| - * |_____| - * ssl_expr_eval.c - * Expression Evaluation - */ - /* ``Make love, - not software!'' - -- Unknown */ -#include "ssl_private.h" - -/* _________________________________________________________________ -** -** Expression Evaluation -** _________________________________________________________________ -*/ - -static BOOL ssl_expr_eval_comp(request_rec *, ssl_expr *); -static char *ssl_expr_eval_word(request_rec *, ssl_expr *); -static char *ssl_expr_eval_func_file(request_rec *, char *); -static int ssl_expr_eval_strcmplex(char *, char *); - -BOOL ssl_expr_eval(request_rec *r, ssl_expr *node) -{ - switch (node->node_op) { - case op_True: { - return TRUE; - } - case op_False: { - return FALSE; - } - case op_Not: { - ssl_expr *e = (ssl_expr *)node->node_arg1; - return (!ssl_expr_eval(r, e)); - } - case op_Or: { - ssl_expr *e1 = (ssl_expr *)node->node_arg1; - ssl_expr *e2 = (ssl_expr *)node->node_arg2; - return (ssl_expr_eval(r, e1) || ssl_expr_eval(r, e2)); - } - case op_And: { - ssl_expr *e1 = (ssl_expr *)node->node_arg1; - ssl_expr *e2 = (ssl_expr *)node->node_arg2; - return (ssl_expr_eval(r, e1) && ssl_expr_eval(r, e2)); - } - case op_Comp: { - ssl_expr *e = (ssl_expr *)node->node_arg1; - return ssl_expr_eval_comp(r, e); - } - default: { - ssl_expr_error = "Internal evaluation error: Unknown expression node"; - return FALSE; - } - } -} - -static BOOL ssl_expr_eval_comp(request_rec *r, ssl_expr *node) -{ - switch (node->node_op) { - case op_EQ: { - ssl_expr *e1 = (ssl_expr *)node->node_arg1; - ssl_expr *e2 = (ssl_expr *)node->node_arg2; - return (strcmp(ssl_expr_eval_word(r, e1), ssl_expr_eval_word(r, e2)) == 0); - } - case op_NE: { - ssl_expr *e1 = (ssl_expr *)node->node_arg1; - ssl_expr *e2 = (ssl_expr *)node->node_arg2; - return (strcmp(ssl_expr_eval_word(r, e1), ssl_expr_eval_word(r, e2)) != 0); - } - case op_LT: { - ssl_expr *e1 = (ssl_expr *)node->node_arg1; - ssl_expr *e2 = (ssl_expr *)node->node_arg2; - return (ssl_expr_eval_strcmplex(ssl_expr_eval_word(r, e1), ssl_expr_eval_word(r, e2)) < 0); - } - case op_LE: { - ssl_expr *e1 = (ssl_expr *)node->node_arg1; - ssl_expr *e2 = (ssl_expr *)node->node_arg2; - return (ssl_expr_eval_strcmplex(ssl_expr_eval_word(r, e1), ssl_expr_eval_word(r, e2)) <= 0); - } - case op_GT: { - ssl_expr *e1 = (ssl_expr *)node->node_arg1; - ssl_expr *e2 = (ssl_expr *)node->node_arg2; - return (ssl_expr_eval_strcmplex(ssl_expr_eval_word(r, e1), ssl_expr_eval_word(r, e2)) > 0); - } - case op_GE: { - ssl_expr *e1 = (ssl_expr *)node->node_arg1; - ssl_expr *e2 = (ssl_expr *)node->node_arg2; - return (ssl_expr_eval_strcmplex(ssl_expr_eval_word(r, e1), ssl_expr_eval_word(r, e2)) >= 0); - } - case op_IN: { - ssl_expr *e1 = (ssl_expr *)node->node_arg1; - ssl_expr *e2 = (ssl_expr *)node->node_arg2; - ssl_expr *e3; - char *w1 = ssl_expr_eval_word(r, e1); - BOOL found = FALSE; - do { - e3 = (ssl_expr *)e2->node_arg1; - e2 = (ssl_expr *)e2->node_arg2; - if (strcmp(w1, ssl_expr_eval_word(r, e3)) == 0) { - found = TRUE; - break; - } - } while (e2 != NULL); - return found; - } - case op_REG: { - ssl_expr *e1; - ssl_expr *e2; - char *word; - ap_regex_t *regex; - - e1 = (ssl_expr *)node->node_arg1; - e2 = (ssl_expr *)node->node_arg2; - word = ssl_expr_eval_word(r, e1); - regex = (ap_regex_t *)(e2->node_arg1); - return (ap_regexec(regex, word, 0, NULL, 0) == 0); - } - case op_NRE: { - ssl_expr *e1; - ssl_expr *e2; - char *word; - ap_regex_t *regex; - - e1 = (ssl_expr *)node->node_arg1; - e2 = (ssl_expr *)node->node_arg2; - word = ssl_expr_eval_word(r, e1); - regex = (ap_regex_t *)(e2->node_arg1); - return !(ap_regexec(regex, word, 0, NULL, 0) == 0); - } - default: { - ssl_expr_error = "Internal evaluation error: Unknown expression node"; - return FALSE; - } - } -} - -static char *ssl_expr_eval_word(request_rec *r, ssl_expr *node) -{ - switch (node->node_op) { - case op_Digit: { - char *string = (char *)node->node_arg1; - return string; - } - case op_String: { - char *string = (char *)node->node_arg1; - return string; - } - case op_Var: { - char *var = (char *)node->node_arg1; - char *val = ssl_var_lookup(r->pool, r->server, r->connection, r, var); - return (val == NULL ? "" : val); - } - case op_Func: { - char *name = (char *)node->node_arg1; - ssl_expr *args = (ssl_expr *)node->node_arg2; - if (strEQ(name, "file")) - return ssl_expr_eval_func_file(r, (char *)(args->node_arg1)); - else { - ssl_expr_error = "Internal evaluation error: Unknown function name"; - return ""; - } - } - default: { - ssl_expr_error = "Internal evaluation error: Unknown expression node"; - return FALSE; - } - } -} - -static char *ssl_expr_eval_func_file(request_rec *r, char *filename) -{ - apr_file_t *fp; - char *buf; - apr_off_t offset; - apr_size_t len; - apr_finfo_t finfo; - - if (apr_file_open(&fp, filename, APR_READ|APR_BUFFERED, - APR_OS_DEFAULT, r->pool) != APR_SUCCESS) { - ssl_expr_error = "Cannot open file"; - return ""; - } - apr_file_info_get(&finfo, APR_FINFO_SIZE, fp); - if ((finfo.size + 1) != ((apr_size_t)finfo.size + 1)) { - ssl_expr_error = "Huge file cannot be read"; - apr_file_close(fp); - return ""; - } - len = (apr_size_t)finfo.size; - if (len == 0) { - buf = (char *)apr_palloc(r->pool, sizeof(char) * 1); - *buf = NUL; - } - else { - if ((buf = (char *)apr_palloc(r->pool, sizeof(char)*(len+1))) == NULL) { - ssl_expr_error = "Cannot allocate memory"; - apr_file_close(fp); - return ""; - } - offset = 0; - apr_file_seek(fp, APR_SET, &offset); - if (apr_file_read(fp, buf, &len) != APR_SUCCESS) { - ssl_expr_error = "Cannot read from file"; - apr_file_close(fp); - return ""; - } - buf[len] = NUL; - } - apr_file_close(fp); - return buf; -} - -/* a variant of strcmp(3) which works correctly also for number strings */ -static int ssl_expr_eval_strcmplex(char *cpNum1, char *cpNum2) -{ - int i, n1, n2; - - if (cpNum1 == NULL) - return -1; - if (cpNum2 == NULL) - return +1; - n1 = strlen(cpNum1); - n2 = strlen(cpNum2); - if (n1 > n2) - return 1; - if (n1 < n2) - return -1; - for (i = 0; i < n1; i++) { - if (cpNum1[i] > cpNum2[i]) - return 1; - if (cpNum1[i] < cpNum2[i]) - return -1; - } - return 0; -} diff --git a/trunk/modules/ssl/ssl_expr_parse.c b/trunk/modules/ssl/ssl_expr_parse.c deleted file mode 100644 index 6abb56fdfdd8fbfd552f9af1b5334a43e9d6fc62..0000000000000000000000000000000000000000 --- a/trunk/modules/ssl/ssl_expr_parse.c +++ /dev/null @@ -1,1081 +0,0 @@ - -/* A Bison parser, made from ssl_expr_parse.y - by GNU Bison version 1.28 */ - -#define YYBISON 1 /* Identify Bison output. */ - -#define T_TRUE 257 -#define T_FALSE 258 -#define T_DIGIT 259 -#define T_ID 260 -#define T_STRING 261 -#define T_REGEX 262 -#define T_REGEX_I 263 -#define T_FUNC_FILE 264 -#define T_OP_EQ 265 -#define T_OP_NE 266 -#define T_OP_LT 267 -#define T_OP_LE 268 -#define T_OP_GT 269 -#define T_OP_GE 270 -#define T_OP_REG 271 -#define T_OP_NRE 272 -#define T_OP_IN 273 -#define T_OP_OR 274 -#define T_OP_AND 275 -#define T_OP_NOT 276 - -#line 68 "ssl_expr_parse.y" - -#include "ssl_private.h" - -#line 72 "ssl_expr_parse.y" -typedef union { - char *cpVal; - ssl_expr *exVal; -} YYSTYPE; -#include - -#ifndef __cplusplus -#ifndef __STDC__ -#define const -#endif -#endif - - - -#define YYFINAL 53 -#define YYFLAG -32768 -#define YYNTBASE 29 - -#define YYTRANSLATE(x) ((unsigned)(x) <= 276 ? ssl_expr_yytranslate[x] : 36) - -static const char ssl_expr_yytranslate[] = { 0, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 28, 2, 2, 23, - 24, 2, 2, 27, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 25, 2, 26, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 1, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22 -}; - -#if YYDEBUG != 0 -static const short ssl_expr_yyprhs[] = { 0, - 0, 2, 4, 6, 9, 13, 17, 19, 23, 27, - 31, 35, 39, 43, 47, 53, 57, 61, 63, 67, - 69, 71, 76, 78, 80, 82 -}; - -static const short ssl_expr_yyrhs[] = { 30, - 0, 3, 0, 4, 0, 22, 30, 0, 30, 20, - 30, 0, 30, 21, 30, 0, 31, 0, 23, 30, - 24, 0, 33, 11, 33, 0, 33, 12, 33, 0, - 33, 13, 33, 0, 33, 14, 33, 0, 33, 15, - 33, 0, 33, 16, 33, 0, 33, 19, 25, 32, - 26, 0, 33, 17, 34, 0, 33, 18, 34, 0, - 33, 0, 32, 27, 33, 0, 5, 0, 7, 0, - 28, 25, 6, 26, 0, 35, 0, 8, 0, 9, - 0, 10, 23, 7, 24, 0 -}; - -#endif - -#if YYDEBUG != 0 -static const short ssl_expr_yyrline[] = { 0, - 115, 118, 119, 120, 121, 122, 123, 124, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 138, 139, 142, - 143, 144, 145, 148, 158, 170 -}; -#endif - - -#if YYDEBUG != 0 || defined (YYERROR_VERBOSE) - -static const char * const ssl_expr_yytname[] = { "$","error","$undefined.","T_TRUE", -"T_FALSE","T_DIGIT","T_ID","T_STRING","T_REGEX","T_REGEX_I","T_FUNC_FILE","T_OP_EQ", -"T_OP_NE","T_OP_LT","T_OP_LE","T_OP_GT","T_OP_GE","T_OP_REG","T_OP_NRE","T_OP_IN", -"T_OP_OR","T_OP_AND","T_OP_NOT","'('","')'","'{'","'}'","','","'%'","root","expr", -"comparison","words","word","regex","funccall", NULL -}; -#endif - -static const short ssl_expr_yyr1[] = { 0, - 29, 30, 30, 30, 30, 30, 30, 30, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 32, 32, 33, - 33, 33, 33, 34, 34, 35 -}; - -static const short ssl_expr_yyr2[] = { 0, - 1, 1, 1, 2, 3, 3, 1, 3, 3, 3, - 3, 3, 3, 3, 5, 3, 3, 1, 3, 1, - 1, 4, 1, 1, 1, 4 -}; - -static const short ssl_expr_yydefact[] = { 0, - 2, 3, 20, 21, 0, 0, 0, 0, 1, 7, - 0, 23, 0, 4, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, - 5, 6, 9, 10, 11, 12, 13, 14, 24, 25, - 16, 17, 0, 26, 22, 0, 18, 15, 0, 19, - 0, 0, 0 -}; - -static const short ssl_expr_yydefgoto[] = { 51, - 9, 10, 46, 11, 41, 12 -}; - -static const short ssl_expr_yypact[] = { 3, --32768,-32768,-32768,-32768, -11, 3, 3, -10, 0,-32768, - 22,-32768, 16,-32768, -2, 23, 3, 3, 4, 4, - 4, 4, 4, 4, 34, 34, 21, 24,-32768, 25, - 26,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768, 4,-32768,-32768, 18,-32768,-32768, 4,-32768, - 49, 50,-32768 -}; - -static const short ssl_expr_yypgoto[] = {-32768, - 10,-32768,-32768, -19, 27,-32768 -}; - - -#define YYLAST 53 - - -static const short ssl_expr_yytable[] = { 33, - 34, 35, 36, 37, 38, 1, 2, 3, 3, 4, - 4, 13, 5, 5, 16, 14, 15, 17, 18, 17, - 18, 29, 28, 47, 6, 7, 31, 32, 30, 50, - 8, 8, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 39, 40, 48, 49, 43, 18, 44, 52, 53, - 45, 0, 42 -}; - -static const short ssl_expr_yycheck[] = { 19, - 20, 21, 22, 23, 24, 3, 4, 5, 5, 7, - 7, 23, 10, 10, 25, 6, 7, 20, 21, 20, - 21, 24, 7, 43, 22, 23, 17, 18, 6, 49, - 28, 28, 11, 12, 13, 14, 15, 16, 17, 18, - 19, 8, 9, 26, 27, 25, 21, 24, 0, 0, - 26, -1, 26 -}; -/* -*-C-*- Note some compilers choke on comments on `#line' lines. */ -#line 3 "/usr/local/share/bison.simple" -/* This file comes from bison-1.28. */ - -/* Skeleton output parser for bison, - Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -/* As a special exception, when this file is copied by Bison into a - Bison output file, you may use that output file without restriction. - This special exception was added by the Free Software Foundation - in version 1.24 of Bison. */ - -/* This is the parser code that is written into each bison parser - when the %semantic_parser declaration is not specified in the grammar. - It was written by Richard Stallman by simplifying the hairy parser - used when %semantic_parser is specified. */ - -#ifndef YYSTACK_USE_ALLOCA -#ifdef alloca -#define YYSTACK_USE_ALLOCA -#else /* alloca not defined */ -#ifdef __GNUC__ -#define YYSTACK_USE_ALLOCA -#define alloca __builtin_alloca -#else /* not GNU C. */ -#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) || (defined (__sun) && defined (__i386)) -#define YYSTACK_USE_ALLOCA -#include -#else /* not sparc */ -/* We think this test detects Watcom and Microsoft C. */ -/* This used to test MSDOS, but that is a bad idea - since that symbol is in the user namespace. */ -#if (defined (_MSDOS) || defined (_MSDOS_)) && !defined (__TURBOC__) -#if 0 /* No need for malloc.h, which pollutes the namespace; - instead, just don't use alloca. */ -#include -#endif -#else /* not MSDOS, or __TURBOC__ */ -#if defined(_AIX) -/* I don't know what this was needed for, but it pollutes the namespace. - So I turned it off. rms, 2 May 1997. */ -/* #include */ -#pragma alloca -#define YYSTACK_USE_ALLOCA -#else /* not MSDOS, or __TURBOC__, or _AIX */ -#if 0 -#ifdef __hpux /* haible@ilog.fr says this works for HPUX 9.05 and up, - and on HPUX 10. Eventually we can turn this on. */ -#define YYSTACK_USE_ALLOCA -#define alloca __builtin_alloca -#endif /* __hpux */ -#endif -#endif /* not _AIX */ -#endif /* not MSDOS, or __TURBOC__ */ -#endif /* not sparc */ -#endif /* not GNU C */ -#endif /* alloca not defined */ -#endif /* YYSTACK_USE_ALLOCA not defined */ - -#ifdef YYSTACK_USE_ALLOCA -#define YYSTACK_ALLOC alloca -#else -#define YYSTACK_ALLOC malloc -#endif - -/* Note: there must be only one dollar sign in this file. - It is replaced by the list of actions, each action - as one case of the switch. */ - -#define ssl_expr_yyerrok (ssl_expr_yyerrstatus = 0) -#define ssl_expr_yyclearin (ssl_expr_yychar = YYEMPTY) -#define YYEMPTY -2 -#define YYEOF 0 -#define YYACCEPT goto ssl_expr_yyacceptlab -#define YYABORT goto ssl_expr_yyabortlab -#define YYERROR goto ssl_expr_yyerrlab1 -/* Like YYERROR except do call ssl_expr_yyerror. - This remains here temporarily to ease the - transition to the new meaning of YYERROR, for GCC. - Once GCC version 2 has supplanted version 1, this can go. */ -#define YYFAIL goto ssl_expr_yyerrlab -#define YYRECOVERING() (!!ssl_expr_yyerrstatus) -#define YYBACKUP(token, value) \ -do \ - if (ssl_expr_yychar == YYEMPTY && ssl_expr_yylen == 1) \ - { ssl_expr_yychar = (token), ssl_expr_yylval = (value); \ - ssl_expr_yychar1 = YYTRANSLATE (ssl_expr_yychar); \ - YYPOPSTACK; \ - goto ssl_expr_yybackup; \ - } \ - else \ - { ssl_expr_yyerror ("syntax error: cannot back up"); YYERROR; } \ -while (0) - -#define YYTERROR 1 -#define YYERRCODE 256 - -#ifndef YYPURE -#define YYLEX ssl_expr_yylex() -#endif - -#ifdef YYPURE -#ifdef YYLSP_NEEDED -#ifdef YYLEX_PARAM -#define YYLEX ssl_expr_yylex(&ssl_expr_yylval, &ssl_expr_yylloc, YYLEX_PARAM) -#else -#define YYLEX ssl_expr_yylex(&ssl_expr_yylval, &ssl_expr_yylloc) -#endif -#else /* not YYLSP_NEEDED */ -#ifdef YYLEX_PARAM -#define YYLEX ssl_expr_yylex(&ssl_expr_yylval, YYLEX_PARAM) -#else -#define YYLEX ssl_expr_yylex(&ssl_expr_yylval) -#endif -#endif /* not YYLSP_NEEDED */ -#endif - -/* If nonreentrant, generate the variables here */ - -#ifndef YYPURE - -int ssl_expr_yychar; /* the lookahead symbol */ -YYSTYPE ssl_expr_yylval; /* the semantic value of the */ - /* lookahead symbol */ - -#ifdef YYLSP_NEEDED -YYLTYPE ssl_expr_yylloc; /* location data for the lookahead */ - /* symbol */ -#endif - -int ssl_expr_yynerrs; /* number of parse errors so far */ -#endif /* not YYPURE */ - -#if YYDEBUG != 0 -int ssl_expr_yydebug; /* nonzero means print parse trace */ -/* Since this is uninitialized, it does not stop multiple parsers - from coexisting. */ -#endif - -/* YYINITDEPTH indicates the initial size of the parser's stacks */ - -#ifndef YYINITDEPTH -#define YYINITDEPTH 200 -#endif - -/* YYMAXDEPTH is the maximum size the stacks can grow to - (effective only if the built-in stack extension method is used). */ - -#if YYMAXDEPTH == 0 -#undef YYMAXDEPTH -#endif - -#ifndef YYMAXDEPTH -#define YYMAXDEPTH 10000 -#endif - -/* Define __ssl_expr_yy_memcpy. Note that the size argument - should be passed with type unsigned int, because that is what the non-GCC - definitions require. With GCC, __builtin_memcpy takes an arg - of type size_t, but it can handle unsigned int. */ - -#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ -#define __ssl_expr_yy_memcpy(TO,FROM,COUNT) __builtin_memcpy(TO,FROM,COUNT) -#else /* not GNU C or C++ */ -#ifndef __cplusplus - -/* This is the most reliable way to avoid incompatibilities - in available built-in functions on various systems. */ -static void -__ssl_expr_yy_memcpy (to, from, count) - char *to; - char *from; - unsigned int count; -{ - register char *f = from; - register char *t = to; - register int i = count; - - while (i-- > 0) - *t++ = *f++; -} - -#else /* __cplusplus */ - -/* This is the most reliable way to avoid incompatibilities - in available built-in functions on various systems. */ -static void -__ssl_expr_yy_memcpy (char *to, char *from, unsigned int count) -{ - register char *t = to; - register char *f = from; - register int i = count; - - while (i-- > 0) - *t++ = *f++; -} - -#endif -#endif - -#line 217 "/usr/local/share/bison.simple" - -/* The user can define YYPARSE_PARAM as the name of an argument to be passed - into ssl_expr_yyparse. The argument should have type void *. - It should actually point to an object. - Grammar actions can access the variable by casting it - to the proper pointer type. */ - -#ifdef YYPARSE_PARAM -#ifdef __cplusplus -#define YYPARSE_PARAM_ARG void *YYPARSE_PARAM -#define YYPARSE_PARAM_DECL -#else /* not __cplusplus */ -#define YYPARSE_PARAM_ARG YYPARSE_PARAM -#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; -#endif /* not __cplusplus */ -#else /* not YYPARSE_PARAM */ -#define YYPARSE_PARAM_ARG -#define YYPARSE_PARAM_DECL -#endif /* not YYPARSE_PARAM */ - -/* Prevent warning if -Wstrict-prototypes. */ -#ifdef __GNUC__ -#ifdef YYPARSE_PARAM -int ssl_expr_yyparse (void *); -#else -int ssl_expr_yyparse (void); -#endif -#endif - -int -ssl_expr_yyparse(YYPARSE_PARAM_ARG) - YYPARSE_PARAM_DECL -{ - register int ssl_expr_yystate; - register int ssl_expr_yyn; - register short *ssl_expr_yyssp; - register YYSTYPE *ssl_expr_yyvsp; - int ssl_expr_yyerrstatus; /* number of tokens to shift before error messages enabled */ - int ssl_expr_yychar1 = 0; /* lookahead token as an internal (translated) token number */ - - short ssl_expr_yyssa[YYINITDEPTH]; /* the state stack */ - YYSTYPE ssl_expr_yyvsa[YYINITDEPTH]; /* the semantic value stack */ - - short *ssl_expr_yyss = ssl_expr_yyssa; /* refer to the stacks thru separate pointers */ - YYSTYPE *ssl_expr_yyvs = ssl_expr_yyvsa; /* to allow ssl_expr_yyoverflow to reallocate them elsewhere */ - -#ifdef YYLSP_NEEDED - YYLTYPE ssl_expr_yylsa[YYINITDEPTH]; /* the location stack */ - YYLTYPE *ssl_expr_yyls = ssl_expr_yylsa; - YYLTYPE *ssl_expr_yylsp; - -#define YYPOPSTACK (ssl_expr_yyvsp--, ssl_expr_yyssp--, ssl_expr_yylsp--) -#else -#define YYPOPSTACK (ssl_expr_yyvsp--, ssl_expr_yyssp--) -#endif - - int ssl_expr_yystacksize = YYINITDEPTH; - int ssl_expr_yyfree_stacks = 0; - -#ifdef YYPURE - int ssl_expr_yychar; - YYSTYPE ssl_expr_yylval; - int ssl_expr_yynerrs; -#ifdef YYLSP_NEEDED - YYLTYPE ssl_expr_yylloc; -#endif -#endif - - YYSTYPE ssl_expr_yyval; /* the variable used to return */ - /* semantic values from the action */ - /* routines */ - - int ssl_expr_yylen; - -#if YYDEBUG != 0 - if (ssl_expr_yydebug) - fprintf(stderr, "Starting parse\n"); -#endif - - ssl_expr_yystate = 0; - ssl_expr_yyerrstatus = 0; - ssl_expr_yynerrs = 0; - ssl_expr_yychar = YYEMPTY; /* Cause a token to be read. */ - - /* Initialize stack pointers. - Waste one element of value and location stack - so that they stay on the same level as the state stack. - The wasted elements are never initialized. */ - - ssl_expr_yyssp = ssl_expr_yyss - 1; - ssl_expr_yyvsp = ssl_expr_yyvs; -#ifdef YYLSP_NEEDED - ssl_expr_yylsp = ssl_expr_yyls; -#endif - -/* Push a new state, which is found in ssl_expr_yystate . */ -/* In all cases, when you get here, the value and location stacks - have just been pushed. so pushing a state here evens the stacks. */ -ssl_expr_yynewstate: - - *++ssl_expr_yyssp = ssl_expr_yystate; - - if (ssl_expr_yyssp >= ssl_expr_yyss + ssl_expr_yystacksize - 1) - { - /* Give user a chance to reallocate the stack */ - /* Use copies of these so that the &'s don't force the real ones into memory. */ - YYSTYPE *ssl_expr_yyvs1 = ssl_expr_yyvs; - short *ssl_expr_yyss1 = ssl_expr_yyss; -#ifdef YYLSP_NEEDED - YYLTYPE *ssl_expr_yyls1 = ssl_expr_yyls; -#endif - - /* Get the current used size of the three stacks, in elements. */ - int size = ssl_expr_yyssp - ssl_expr_yyss + 1; - -#ifdef ssl_expr_yyoverflow - /* Each stack pointer address is followed by the size of - the data in use in that stack, in bytes. */ -#ifdef YYLSP_NEEDED - /* This used to be a conditional around just the two extra args, - but that might be undefined if ssl_expr_yyoverflow is a macro. */ - ssl_expr_yyoverflow("parser stack overflow", - &ssl_expr_yyss1, size * sizeof (*ssl_expr_yyssp), - &ssl_expr_yyvs1, size * sizeof (*ssl_expr_yyvsp), - &ssl_expr_yyls1, size * sizeof (*ssl_expr_yylsp), - &ssl_expr_yystacksize); -#else - ssl_expr_yyoverflow("parser stack overflow", - &ssl_expr_yyss1, size * sizeof (*ssl_expr_yyssp), - &ssl_expr_yyvs1, size * sizeof (*ssl_expr_yyvsp), - &ssl_expr_yystacksize); -#endif - - ssl_expr_yyss = ssl_expr_yyss1; ssl_expr_yyvs = ssl_expr_yyvs1; -#ifdef YYLSP_NEEDED - ssl_expr_yyls = ssl_expr_yyls1; -#endif -#else /* no ssl_expr_yyoverflow */ - /* Extend the stack our own way. */ - if (ssl_expr_yystacksize >= YYMAXDEPTH) - { - ssl_expr_yyerror("parser stack overflow"); - if (ssl_expr_yyfree_stacks) - { - free (ssl_expr_yyss); - free (ssl_expr_yyvs); -#ifdef YYLSP_NEEDED - free (ssl_expr_yyls); -#endif - } - return 2; - } - ssl_expr_yystacksize *= 2; - if (ssl_expr_yystacksize > YYMAXDEPTH) - ssl_expr_yystacksize = YYMAXDEPTH; -#ifndef YYSTACK_USE_ALLOCA - ssl_expr_yyfree_stacks = 1; -#endif - ssl_expr_yyss = (short *) YYSTACK_ALLOC (ssl_expr_yystacksize * sizeof (*ssl_expr_yyssp)); - __ssl_expr_yy_memcpy ((char *)ssl_expr_yyss, (char *)ssl_expr_yyss1, - size * (unsigned int) sizeof (*ssl_expr_yyssp)); - ssl_expr_yyvs = (YYSTYPE *) YYSTACK_ALLOC (ssl_expr_yystacksize * sizeof (*ssl_expr_yyvsp)); - __ssl_expr_yy_memcpy ((char *)ssl_expr_yyvs, (char *)ssl_expr_yyvs1, - size * (unsigned int) sizeof (*ssl_expr_yyvsp)); -#ifdef YYLSP_NEEDED - ssl_expr_yyls = (YYLTYPE *) YYSTACK_ALLOC (ssl_expr_yystacksize * sizeof (*ssl_expr_yylsp)); - __ssl_expr_yy_memcpy ((char *)ssl_expr_yyls, (char *)ssl_expr_yyls1, - size * (unsigned int) sizeof (*ssl_expr_yylsp)); -#endif -#endif /* no ssl_expr_yyoverflow */ - - ssl_expr_yyssp = ssl_expr_yyss + size - 1; - ssl_expr_yyvsp = ssl_expr_yyvs + size - 1; -#ifdef YYLSP_NEEDED - ssl_expr_yylsp = ssl_expr_yyls + size - 1; -#endif - -#if YYDEBUG != 0 - if (ssl_expr_yydebug) - fprintf(stderr, "Stack size increased to %d\n", ssl_expr_yystacksize); -#endif - - if (ssl_expr_yyssp >= ssl_expr_yyss + ssl_expr_yystacksize - 1) - YYABORT; - } - -#if YYDEBUG != 0 - if (ssl_expr_yydebug) - fprintf(stderr, "Entering state %d\n", ssl_expr_yystate); -#endif - - goto ssl_expr_yybackup; - ssl_expr_yybackup: - -/* Do appropriate processing given the current state. */ -/* Read a lookahead token if we need one and don't already have one. */ -/* ssl_expr_yyresume: */ - - /* First try to decide what to do without reference to lookahead token. */ - - ssl_expr_yyn = ssl_expr_yypact[ssl_expr_yystate]; - if (ssl_expr_yyn == YYFLAG) - goto ssl_expr_yydefault; - - /* Not known => get a lookahead token if don't already have one. */ - - /* ssl_expr_yychar is either YYEMPTY or YYEOF - or a valid token in external form. */ - - if (ssl_expr_yychar == YYEMPTY) - { -#if YYDEBUG != 0 - if (ssl_expr_yydebug) - fprintf(stderr, "Reading a token: "); -#endif - ssl_expr_yychar = YYLEX; - } - - /* Convert token to internal form (in ssl_expr_yychar1) for indexing tables with */ - - if (ssl_expr_yychar <= 0) /* This means end of input. */ - { - ssl_expr_yychar1 = 0; - ssl_expr_yychar = YYEOF; /* Don't call YYLEX any more */ - -#if YYDEBUG != 0 - if (ssl_expr_yydebug) - fprintf(stderr, "Now at end of input.\n"); -#endif - } - else - { - ssl_expr_yychar1 = YYTRANSLATE(ssl_expr_yychar); - -#if YYDEBUG != 0 - if (ssl_expr_yydebug) - { - fprintf (stderr, "Next token is %d (%s", ssl_expr_yychar, ssl_expr_yytname[ssl_expr_yychar1]); - /* Give the individual parser a way to print the precise meaning - of a token, for further debugging info. */ -#ifdef YYPRINT - YYPRINT (stderr, ssl_expr_yychar, ssl_expr_yylval); -#endif - fprintf (stderr, ")\n"); - } -#endif - } - - ssl_expr_yyn += ssl_expr_yychar1; - if (ssl_expr_yyn < 0 || ssl_expr_yyn > YYLAST || ssl_expr_yycheck[ssl_expr_yyn] != ssl_expr_yychar1) - goto ssl_expr_yydefault; - - ssl_expr_yyn = ssl_expr_yytable[ssl_expr_yyn]; - - /* ssl_expr_yyn is what to do for this token type in this state. - Negative => reduce, -ssl_expr_yyn is rule number. - Positive => shift, ssl_expr_yyn is new state. - New state is final state => don't bother to shift, - just return success. - 0, or most negative number => error. */ - - if (ssl_expr_yyn < 0) - { - if (ssl_expr_yyn == YYFLAG) - goto ssl_expr_yyerrlab; - ssl_expr_yyn = -ssl_expr_yyn; - goto ssl_expr_yyreduce; - } - else if (ssl_expr_yyn == 0) - goto ssl_expr_yyerrlab; - - if (ssl_expr_yyn == YYFINAL) - YYACCEPT; - - /* Shift the lookahead token. */ - -#if YYDEBUG != 0 - if (ssl_expr_yydebug) - fprintf(stderr, "Shifting token %d (%s), ", ssl_expr_yychar, ssl_expr_yytname[ssl_expr_yychar1]); -#endif - - /* Discard the token being shifted unless it is eof. */ - if (ssl_expr_yychar != YYEOF) - ssl_expr_yychar = YYEMPTY; - - *++ssl_expr_yyvsp = ssl_expr_yylval; -#ifdef YYLSP_NEEDED - *++ssl_expr_yylsp = ssl_expr_yylloc; -#endif - - /* count tokens shifted since error; after three, turn off error status. */ - if (ssl_expr_yyerrstatus) ssl_expr_yyerrstatus--; - - ssl_expr_yystate = ssl_expr_yyn; - goto ssl_expr_yynewstate; - -/* Do the default action for the current state. */ -ssl_expr_yydefault: - - ssl_expr_yyn = ssl_expr_yydefact[ssl_expr_yystate]; - if (ssl_expr_yyn == 0) - goto ssl_expr_yyerrlab; - -/* Do a reduction. ssl_expr_yyn is the number of a rule to reduce with. */ -ssl_expr_yyreduce: - ssl_expr_yylen = ssl_expr_yyr2[ssl_expr_yyn]; - if (ssl_expr_yylen > 0) - ssl_expr_yyval = ssl_expr_yyvsp[1-ssl_expr_yylen]; /* implement default value of the action */ - -#if YYDEBUG != 0 - if (ssl_expr_yydebug) - { - int i; - - fprintf (stderr, "Reducing via rule %d (line %d), ", - ssl_expr_yyn, ssl_expr_yyrline[ssl_expr_yyn]); - - /* Print the symbols being reduced, and their result. */ - for (i = ssl_expr_yyprhs[ssl_expr_yyn]; ssl_expr_yyrhs[i] > 0; i++) - fprintf (stderr, "%s ", ssl_expr_yytname[ssl_expr_yyrhs[i]]); - fprintf (stderr, " -> %s\n", ssl_expr_yytname[ssl_expr_yyr1[ssl_expr_yyn]]); - } -#endif - - - switch (ssl_expr_yyn) { - -case 1: -#line 115 "ssl_expr_parse.y" -{ ssl_expr_info.expr = ssl_expr_yyvsp[0].exVal; ; - break;} -case 2: -#line 118 "ssl_expr_parse.y" -{ ssl_expr_yyval.exVal = ssl_expr_make(op_True, NULL, NULL); ; - break;} -case 3: -#line 119 "ssl_expr_parse.y" -{ ssl_expr_yyval.exVal = ssl_expr_make(op_False, NULL, NULL); ; - break;} -case 4: -#line 120 "ssl_expr_parse.y" -{ ssl_expr_yyval.exVal = ssl_expr_make(op_Not, ssl_expr_yyvsp[0].exVal, NULL); ; - break;} -case 5: -#line 121 "ssl_expr_parse.y" -{ ssl_expr_yyval.exVal = ssl_expr_make(op_Or, ssl_expr_yyvsp[-2].exVal, ssl_expr_yyvsp[0].exVal); ; - break;} -case 6: -#line 122 "ssl_expr_parse.y" -{ ssl_expr_yyval.exVal = ssl_expr_make(op_And, ssl_expr_yyvsp[-2].exVal, ssl_expr_yyvsp[0].exVal); ; - break;} -case 7: -#line 123 "ssl_expr_parse.y" -{ ssl_expr_yyval.exVal = ssl_expr_make(op_Comp, ssl_expr_yyvsp[0].exVal, NULL); ; - break;} -case 8: -#line 124 "ssl_expr_parse.y" -{ ssl_expr_yyval.exVal = ssl_expr_yyvsp[-1].exVal; ; - break;} -case 9: -#line 127 "ssl_expr_parse.y" -{ ssl_expr_yyval.exVal = ssl_expr_make(op_EQ, ssl_expr_yyvsp[-2].exVal, ssl_expr_yyvsp[0].exVal); ; - break;} -case 10: -#line 128 "ssl_expr_parse.y" -{ ssl_expr_yyval.exVal = ssl_expr_make(op_NE, ssl_expr_yyvsp[-2].exVal, ssl_expr_yyvsp[0].exVal); ; - break;} -case 11: -#line 129 "ssl_expr_parse.y" -{ ssl_expr_yyval.exVal = ssl_expr_make(op_LT, ssl_expr_yyvsp[-2].exVal, ssl_expr_yyvsp[0].exVal); ; - break;} -case 12: -#line 130 "ssl_expr_parse.y" -{ ssl_expr_yyval.exVal = ssl_expr_make(op_LE, ssl_expr_yyvsp[-2].exVal, ssl_expr_yyvsp[0].exVal); ; - break;} -case 13: -#line 131 "ssl_expr_parse.y" -{ ssl_expr_yyval.exVal = ssl_expr_make(op_GT, ssl_expr_yyvsp[-2].exVal, ssl_expr_yyvsp[0].exVal); ; - break;} -case 14: -#line 132 "ssl_expr_parse.y" -{ ssl_expr_yyval.exVal = ssl_expr_make(op_GE, ssl_expr_yyvsp[-2].exVal, ssl_expr_yyvsp[0].exVal); ; - break;} -case 15: -#line 133 "ssl_expr_parse.y" -{ ssl_expr_yyval.exVal = ssl_expr_make(op_IN, ssl_expr_yyvsp[-4].exVal, ssl_expr_yyvsp[-1].exVal); ; - break;} -case 16: -#line 134 "ssl_expr_parse.y" -{ ssl_expr_yyval.exVal = ssl_expr_make(op_REG, ssl_expr_yyvsp[-2].exVal, ssl_expr_yyvsp[0].exVal); ; - break;} -case 17: -#line 135 "ssl_expr_parse.y" -{ ssl_expr_yyval.exVal = ssl_expr_make(op_NRE, ssl_expr_yyvsp[-2].exVal, ssl_expr_yyvsp[0].exVal); ; - break;} -case 18: -#line 138 "ssl_expr_parse.y" -{ ssl_expr_yyval.exVal = ssl_expr_make(op_ListElement, ssl_expr_yyvsp[0].exVal, NULL); ; - break;} -case 19: -#line 139 "ssl_expr_parse.y" -{ ssl_expr_yyval.exVal = ssl_expr_make(op_ListElement, ssl_expr_yyvsp[0].exVal, ssl_expr_yyvsp[-2].exVal); ; - break;} -case 20: -#line 142 "ssl_expr_parse.y" -{ ssl_expr_yyval.exVal = ssl_expr_make(op_Digit, ssl_expr_yyvsp[0].cpVal, NULL); ; - break;} -case 21: -#line 143 "ssl_expr_parse.y" -{ ssl_expr_yyval.exVal = ssl_expr_make(op_String, ssl_expr_yyvsp[0].cpVal, NULL); ; - break;} -case 22: -#line 144 "ssl_expr_parse.y" -{ ssl_expr_yyval.exVal = ssl_expr_make(op_Var, ssl_expr_yyvsp[-1].cpVal, NULL); ; - break;} -case 23: -#line 145 "ssl_expr_parse.y" -{ ssl_expr_yyval.exVal = ssl_expr_yyvsp[0].exVal; ; - break;} -case 24: -#line 148 "ssl_expr_parse.y" -{ - ap_regex_t *regex; - if ((regex = ap_pregcomp(ssl_expr_info.pool, ssl_expr_yyvsp[0].cpVal, - AP_REG_EXTENDED|AP_REG_NOSUB)) == NULL) { - ssl_expr_error = "Failed to compile regular expression"; - YYERROR; - regex = NULL; - } - ssl_expr_yyval.exVal = ssl_expr_make(op_Regex, regex, NULL); - ; - break;} -case 25: -#line 158 "ssl_expr_parse.y" -{ - ap_regex_t *regex; - if ((regex = ap_pregcomp(ssl_expr_info.pool, ssl_expr_yyvsp[0].cpVal, - AP_REG_EXTENDED|AP_REG_NOSUB|AP_REG_ICASE)) == NULL) { - ssl_expr_error = "Failed to compile regular expression"; - YYERROR; - regex = NULL; - } - ssl_expr_yyval.exVal = ssl_expr_make(op_Regex, regex, NULL); - ; - break;} -case 26: -#line 170 "ssl_expr_parse.y" -{ - ssl_expr *args = ssl_expr_make(op_ListElement, ssl_expr_yyvsp[-1].cpVal, NULL); - ssl_expr_yyval.exVal = ssl_expr_make(op_Func, "file", args); - ; - break;} -} - /* the action file gets copied in in place of this dollarsign */ -#line 543 "/usr/local/share/bison.simple" - - ssl_expr_yyvsp -= ssl_expr_yylen; - ssl_expr_yyssp -= ssl_expr_yylen; -#ifdef YYLSP_NEEDED - ssl_expr_yylsp -= ssl_expr_yylen; -#endif - -#if YYDEBUG != 0 - if (ssl_expr_yydebug) - { - short *ssp1 = ssl_expr_yyss - 1; - fprintf (stderr, "state stack now"); - while (ssp1 != ssl_expr_yyssp) - fprintf (stderr, " %d", *++ssp1); - fprintf (stderr, "\n"); - } -#endif - - *++ssl_expr_yyvsp = ssl_expr_yyval; - -#ifdef YYLSP_NEEDED - ssl_expr_yylsp++; - if (ssl_expr_yylen == 0) - { - ssl_expr_yylsp->first_line = ssl_expr_yylloc.first_line; - ssl_expr_yylsp->first_column = ssl_expr_yylloc.first_column; - ssl_expr_yylsp->last_line = (ssl_expr_yylsp-1)->last_line; - ssl_expr_yylsp->last_column = (ssl_expr_yylsp-1)->last_column; - ssl_expr_yylsp->text = 0; - } - else - { - ssl_expr_yylsp->last_line = (ssl_expr_yylsp+ssl_expr_yylen-1)->last_line; - ssl_expr_yylsp->last_column = (ssl_expr_yylsp+ssl_expr_yylen-1)->last_column; - } -#endif - - /* Now "shift" the result of the reduction. - Determine what state that goes to, - based on the state we popped back to - and the rule number reduced by. */ - - ssl_expr_yyn = ssl_expr_yyr1[ssl_expr_yyn]; - - ssl_expr_yystate = ssl_expr_yypgoto[ssl_expr_yyn - YYNTBASE] + *ssl_expr_yyssp; - if (ssl_expr_yystate >= 0 && ssl_expr_yystate <= YYLAST && ssl_expr_yycheck[ssl_expr_yystate] == *ssl_expr_yyssp) - ssl_expr_yystate = ssl_expr_yytable[ssl_expr_yystate]; - else - ssl_expr_yystate = ssl_expr_yydefgoto[ssl_expr_yyn - YYNTBASE]; - - goto ssl_expr_yynewstate; - -ssl_expr_yyerrlab: /* here on detecting error */ - - if (! ssl_expr_yyerrstatus) - /* If not already recovering from an error, report this error. */ - { - ++ssl_expr_yynerrs; - -#ifdef YYERROR_VERBOSE - ssl_expr_yyn = ssl_expr_yypact[ssl_expr_yystate]; - - if (ssl_expr_yyn > YYFLAG && ssl_expr_yyn < YYLAST) - { - int size = 0; - char *msg; - int x, count; - - count = 0; - /* Start X at -ssl_expr_yyn if nec to avoid negative indexes in ssl_expr_yycheck. */ - for (x = (ssl_expr_yyn < 0 ? -ssl_expr_yyn : 0); - x < (sizeof(ssl_expr_yytname) / sizeof(char *)); x++) - if (ssl_expr_yycheck[x + ssl_expr_yyn] == x) - size += strlen(ssl_expr_yytname[x]) + 15, count++; - msg = (char *) malloc(size + 15); - if (msg != 0) - { - strcpy(msg, "parse error"); - - if (count < 5) - { - count = 0; - for (x = (ssl_expr_yyn < 0 ? -ssl_expr_yyn : 0); - x < (sizeof(ssl_expr_yytname) / sizeof(char *)); x++) - if (ssl_expr_yycheck[x + ssl_expr_yyn] == x) - { - strcat(msg, count == 0 ? ", expecting `" : " or `"); - strcat(msg, ssl_expr_yytname[x]); - strcat(msg, "'"); - count++; - } - } - ssl_expr_yyerror(msg); - free(msg); - } - else - ssl_expr_yyerror ("parse error; also virtual memory exceeded"); - } - else -#endif /* YYERROR_VERBOSE */ - ssl_expr_yyerror("parse error"); - } - - goto ssl_expr_yyerrlab1; -ssl_expr_yyerrlab1: /* here on error raised explicitly by an action */ - - if (ssl_expr_yyerrstatus == 3) - { - /* if just tried and failed to reuse lookahead token after an error, discard it. */ - - /* return failure if at end of input */ - if (ssl_expr_yychar == YYEOF) - YYABORT; - -#if YYDEBUG != 0 - if (ssl_expr_yydebug) - fprintf(stderr, "Discarding token %d (%s).\n", ssl_expr_yychar, ssl_expr_yytname[ssl_expr_yychar1]); -#endif - - ssl_expr_yychar = YYEMPTY; - } - - /* Else will try to reuse lookahead token - after shifting the error token. */ - - ssl_expr_yyerrstatus = 3; /* Each real token shifted decrements this */ - - goto ssl_expr_yyerrhandle; - -ssl_expr_yyerrdefault: /* current state does not do anything special for the error token. */ - -#if 0 - /* This is wrong; only states that explicitly want error tokens - should shift them. */ - ssl_expr_yyn = ssl_expr_yydefact[ssl_expr_yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/ - if (ssl_expr_yyn) goto ssl_expr_yydefault; -#endif - -ssl_expr_yyerrpop: /* pop the current state because it cannot handle the error token */ - - if (ssl_expr_yyssp == ssl_expr_yyss) YYABORT; - ssl_expr_yyvsp--; - ssl_expr_yystate = *--ssl_expr_yyssp; -#ifdef YYLSP_NEEDED - ssl_expr_yylsp--; -#endif - -#if YYDEBUG != 0 - if (ssl_expr_yydebug) - { - short *ssp1 = ssl_expr_yyss - 1; - fprintf (stderr, "Error: state stack now"); - while (ssp1 != ssl_expr_yyssp) - fprintf (stderr, " %d", *++ssp1); - fprintf (stderr, "\n"); - } -#endif - -ssl_expr_yyerrhandle: - - ssl_expr_yyn = ssl_expr_yypact[ssl_expr_yystate]; - if (ssl_expr_yyn == YYFLAG) - goto ssl_expr_yyerrdefault; - - ssl_expr_yyn += YYTERROR; - if (ssl_expr_yyn < 0 || ssl_expr_yyn > YYLAST || ssl_expr_yycheck[ssl_expr_yyn] != YYTERROR) - goto ssl_expr_yyerrdefault; - - ssl_expr_yyn = ssl_expr_yytable[ssl_expr_yyn]; - if (ssl_expr_yyn < 0) - { - if (ssl_expr_yyn == YYFLAG) - goto ssl_expr_yyerrpop; - ssl_expr_yyn = -ssl_expr_yyn; - goto ssl_expr_yyreduce; - } - else if (ssl_expr_yyn == 0) - goto ssl_expr_yyerrpop; - - if (ssl_expr_yyn == YYFINAL) - YYACCEPT; - -#if YYDEBUG != 0 - if (ssl_expr_yydebug) - fprintf(stderr, "Shifting error token, "); -#endif - - *++ssl_expr_yyvsp = ssl_expr_yylval; -#ifdef YYLSP_NEEDED - *++ssl_expr_yylsp = ssl_expr_yylloc; -#endif - - ssl_expr_yystate = ssl_expr_yyn; - goto ssl_expr_yynewstate; - - ssl_expr_yyacceptlab: - /* YYACCEPT comes here. */ - if (ssl_expr_yyfree_stacks) - { - free (ssl_expr_yyss); - free (ssl_expr_yyvs); -#ifdef YYLSP_NEEDED - free (ssl_expr_yyls); -#endif - } - return 0; - - ssl_expr_yyabortlab: - /* YYABORT comes here. */ - if (ssl_expr_yyfree_stacks) - { - free (ssl_expr_yyss); - free (ssl_expr_yyvs); -#ifdef YYLSP_NEEDED - free (ssl_expr_yyls); -#endif - } - return 1; -} -#line 176 "ssl_expr_parse.y" - - -int ssl_expr_yyerror(char *s) -{ - ssl_expr_error = s; - return 2; -} - diff --git a/trunk/modules/ssl/ssl_expr_parse.h b/trunk/modules/ssl/ssl_expr_parse.h deleted file mode 100644 index 5378e2874c5271d4c23c0fe9e8d909b784591b54..0000000000000000000000000000000000000000 --- a/trunk/modules/ssl/ssl_expr_parse.h +++ /dev/null @@ -1,27 +0,0 @@ -typedef union { - char *cpVal; - ssl_expr *exVal; -} YYSTYPE; -#define T_TRUE 257 -#define T_FALSE 258 -#define T_DIGIT 259 -#define T_ID 260 -#define T_STRING 261 -#define T_REGEX 262 -#define T_REGEX_I 263 -#define T_FUNC_FILE 264 -#define T_OP_EQ 265 -#define T_OP_NE 266 -#define T_OP_LT 267 -#define T_OP_LE 268 -#define T_OP_GT 269 -#define T_OP_GE 270 -#define T_OP_REG 271 -#define T_OP_NRE 272 -#define T_OP_IN 273 -#define T_OP_OR 274 -#define T_OP_AND 275 -#define T_OP_NOT 276 - - -extern YYSTYPE ssl_expr_yylval; diff --git a/trunk/modules/ssl/ssl_expr_parse.y b/trunk/modules/ssl/ssl_expr_parse.y deleted file mode 100644 index 3daf31ac4ecf26f719990e888593cec00003dba3..0000000000000000000000000000000000000000 --- a/trunk/modules/ssl/ssl_expr_parse.y +++ /dev/null @@ -1,147 +0,0 @@ -/* Copyright 2001-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_ssl - Apache Interface to OpenSSL - * |_| |_| |_|\___/ \__,_|___|___/___/_| http://www.modssl.org/ - * |_____| - * ssl_expr_parse.y - * Expression LR(1) Parser - */ - /* ``What you see is all you get.'' - -- Brian Kernighan */ - -/* _________________________________________________________________ -** -** Expression Parser -** _________________________________________________________________ -*/ - -%{ -#include "ssl_private.h" -%} - -%union { - char *cpVal; - ssl_expr *exVal; -} - -%token T_TRUE -%token T_FALSE - -%token T_DIGIT -%token T_ID -%token T_STRING -%token T_REGEX -%token T_REGEX_I - -%token T_FUNC_FILE - -%token T_OP_EQ -%token T_OP_NE -%token T_OP_LT -%token T_OP_LE -%token T_OP_GT -%token T_OP_GE -%token T_OP_REG -%token T_OP_NRE -%token T_OP_IN - -%token T_OP_OR -%token T_OP_AND -%token T_OP_NOT - -%left T_OP_OR -%left T_OP_AND -%left T_OP_NOT - -%type expr -%type comparison -%type funccall -%type regex -%type words -%type word - -%% - -root : expr { ssl_expr_info.expr = $1; } - ; - -expr : T_TRUE { $$ = ssl_expr_make(op_True, NULL, NULL); } - | T_FALSE { $$ = ssl_expr_make(op_False, NULL, NULL); } - | T_OP_NOT expr { $$ = ssl_expr_make(op_Not, $2, NULL); } - | expr T_OP_OR expr { $$ = ssl_expr_make(op_Or, $1, $3); } - | expr T_OP_AND expr { $$ = ssl_expr_make(op_And, $1, $3); } - | comparison { $$ = ssl_expr_make(op_Comp, $1, NULL); } - | '(' expr ')' { $$ = $2; } - ; - -comparison: word T_OP_EQ word { $$ = ssl_expr_make(op_EQ, $1, $3); } - | word T_OP_NE word { $$ = ssl_expr_make(op_NE, $1, $3); } - | word T_OP_LT word { $$ = ssl_expr_make(op_LT, $1, $3); } - | word T_OP_LE word { $$ = ssl_expr_make(op_LE, $1, $3); } - | word T_OP_GT word { $$ = ssl_expr_make(op_GT, $1, $3); } - | word T_OP_GE word { $$ = ssl_expr_make(op_GE, $1, $3); } - | word T_OP_IN '{' words '}' { $$ = ssl_expr_make(op_IN, $1, $4); } - | word T_OP_REG regex { $$ = ssl_expr_make(op_REG, $1, $3); } - | word T_OP_NRE regex { $$ = ssl_expr_make(op_NRE, $1, $3); } - ; - -words : word { $$ = ssl_expr_make(op_ListElement, $1, NULL); } - | words ',' word { $$ = ssl_expr_make(op_ListElement, $3, $1); } - ; - -word : T_DIGIT { $$ = ssl_expr_make(op_Digit, $1, NULL); } - | T_STRING { $$ = ssl_expr_make(op_String, $1, NULL); } - | '%' '{' T_ID '}' { $$ = ssl_expr_make(op_Var, $3, NULL); } - | funccall { $$ = $1; } - ; - -regex : T_REGEX { - ap_regex_t *regex; - if ((regex = ap_pregcomp(ssl_expr_info.pool, $1, - AP_REG_EXTENDED|AP_REG_NOSUB)) == NULL) { - ssl_expr_error = "Failed to compile regular expression"; - YYERROR; - } - $$ = ssl_expr_make(op_Regex, regex, NULL); - } - | T_REGEX_I { - ap_regex_t *regex; - if ((regex = ap_pregcomp(ssl_expr_info.pool, $1, - AP_REG_EXTENDED|AP_REG_NOSUB|AP_REG_ICASE)) == NULL) { - ssl_expr_error = "Failed to compile regular expression"; - YYERROR; - } - $$ = ssl_expr_make(op_Regex, regex, NULL); - } - ; - -funccall : T_FUNC_FILE '(' T_STRING ')' { - ssl_expr *args = ssl_expr_make(op_ListElement, $3, NULL); - $$ = ssl_expr_make(op_Func, "file", args); - } - ; - -%% - -int yyerror(char *s) -{ - ssl_expr_error = s; - return 2; -} - diff --git a/trunk/modules/ssl/ssl_expr_scan.c b/trunk/modules/ssl/ssl_expr_scan.c deleted file mode 100644 index d535c07b13279551900c87a1522262a16b990960..0000000000000000000000000000000000000000 --- a/trunk/modules/ssl/ssl_expr_scan.c +++ /dev/null @@ -1,1970 +0,0 @@ -#define yy_create_buffer ssl_expr_yy_create_buffer -#define yy_delete_buffer ssl_expr_yy_delete_buffer -#define yy_scan_buffer ssl_expr_yy_scan_buffer -#define yy_scan_string ssl_expr_yy_scan_string -#define yy_scan_bytes ssl_expr_yy_scan_bytes -#define yy_flex_debug ssl_expr_yy_flex_debug -#define yy_init_buffer ssl_expr_yy_init_buffer -#define yy_flush_buffer ssl_expr_yy_flush_buffer -#define yy_load_buffer_state ssl_expr_yy_load_buffer_state -#define yy_switch_to_buffer ssl_expr_yy_switch_to_buffer -#define yyin ssl_expr_yyin -#define yyleng ssl_expr_yyleng -#define yylex ssl_expr_yylex -#define yyout ssl_expr_yyout -#define yyrestart ssl_expr_yyrestart -#define yytext ssl_expr_yytext - -/* A lexical scanner generated by flex */ - -/* Scanner skeleton version: - * $Header: /home/striker/cvs2svn/dumps/httpd-2.0/../../httpd-2.0/modules/ssl/ssl_expr_scan.c,v 1.19 2004/02/28 18:06:35 jorton Exp $ - */ - -#define FLEX_SCANNER -#define YY_FLEX_MAJOR_VERSION 2 -#define YY_FLEX_MINOR_VERSION 5 - -#include - - -/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */ -#ifdef c_plusplus -#ifndef __cplusplus -#define __cplusplus -#endif -#endif - - -#ifdef __cplusplus - -#include -#include - -/* Use prototypes in function declarations. */ -#define YY_USE_PROTOS - -/* The "const" storage-class-modifier is valid. */ -#define YY_USE_CONST - -#else /* ! __cplusplus */ - -#if __STDC__ - -#define YY_USE_PROTOS -#define YY_USE_CONST - -#endif /* __STDC__ */ -#endif /* ! __cplusplus */ - -#ifdef __TURBOC__ -#pragma warn -rch -#pragma warn -use -#include -#include -#define YY_USE_CONST -#define YY_USE_PROTOS -#endif - -#ifdef YY_USE_CONST -#define yyconst const -#else -#define yyconst -#endif - - -#ifdef YY_USE_PROTOS -#define YY_PROTO(proto) proto -#else -#define YY_PROTO(proto) () -#endif - -/* Returned upon end-of-file. */ -#define YY_NULL 0 - -/* Promotes a possibly negative, possibly signed char to an unsigned - * integer for use as an array index. If the signed char is negative, - * we want to instead treat it as an 8-bit unsigned char, hence the - * double cast. - */ -#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) - -/* Enter a start condition. This macro really ought to take a parameter, - * but we do it the disgusting crufty way forced on us by the ()-less - * definition of BEGIN. - */ -#define BEGIN yy_start = 1 + 2 * - -/* Translate the current start state into a value that can be later handed - * to BEGIN to return to the state. The YYSTATE alias is for lex - * compatibility. - */ -#define YY_START ((yy_start - 1) / 2) -#define YYSTATE YY_START - -/* Action number for EOF rule of a given start state. */ -#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) - -/* Special action meaning "start processing a new file". */ -#define YY_NEW_FILE yyrestart( yyin ) - -#define YY_END_OF_BUFFER_CHAR 0 - -/* Size of default input buffer. */ -#define YY_BUF_SIZE 16384 - -typedef struct yy_buffer_state *YY_BUFFER_STATE; - -extern int yyleng; -extern FILE *yyin, *yyout; - -#define EOB_ACT_CONTINUE_SCAN 0 -#define EOB_ACT_END_OF_FILE 1 -#define EOB_ACT_LAST_MATCH 2 - -/* The funky do-while in the following #define is used to turn the definition - * int a single C statement (which needs a semi-colon terminator). This - * avoids problems with code like: - * - * if ( condition_holds ) - * yyless( 5 ); - * else - * do_something_else(); - * - * Prior to using the do-while the compiler would get upset at the - * "else" because it interpreted the "if" statement as being all - * done when it reached the ';' after the yyless() call. - */ - -/* Return all but the first 'n' matched characters back to the input stream. */ - -#define yyless(n) \ - do \ - { \ - /* Undo effects of setting up yytext. */ \ - *yy_cp = yy_hold_char; \ - YY_RESTORE_YY_MORE_OFFSET \ - yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \ - YY_DO_BEFORE_ACTION; /* set up yytext again */ \ - } \ - while ( 0 ) - -#define unput(c) yyunput( c, yytext_ptr ) - -/* The following is because we cannot portably get our hands on size_t - * (without autoconf's help, which isn't available because we want - * flex-generated scanners to compile on their own). - */ -typedef unsigned int yy_size_t; - - -struct yy_buffer_state - { - FILE *yy_input_file; - - char *yy_ch_buf; /* input buffer */ - char *yy_buf_pos; /* current position in input buffer */ - - /* Size of input buffer in bytes, not including room for EOB - * characters. - */ - yy_size_t yy_buf_size; - - /* Number of characters read into yy_ch_buf, not including EOB - * characters. - */ - int yy_n_chars; - - /* Whether we "own" the buffer - i.e., we know we created it, - * and can realloc() it to grow it, and should free() it to - * delete it. - */ - int yy_is_our_buffer; - - /* Whether this is an "interactive" input source; if so, and - * if we're using stdio for input, then we want to use getc() - * instead of fread(), to make sure we stop fetching input after - * each newline. - */ - int yy_is_interactive; - - /* Whether we're considered to be at the beginning of a line. - * If so, '^' rules will be active on the next match, otherwise - * not. - */ - int yy_at_bol; - - /* Whether to try to fill the input buffer when we reach the - * end of it. - */ - int yy_fill_buffer; - - int yy_buffer_status; -#define YY_BUFFER_NEW 0 -#define YY_BUFFER_NORMAL 1 - /* When an EOF's been seen but there's still some text to process - * then we mark the buffer as YY_EOF_PENDING, to indicate that we - * shouldn't try reading from the input source any more. We might - * still have a bunch of tokens to match, though, because of - * possible backing-up. - * - * When we actually see the EOF, we change the status to "new" - * (via yyrestart()), so that the user can continue scanning by - * just pointing yyin at a new input file. - */ -#define YY_BUFFER_EOF_PENDING 2 - }; - -static YY_BUFFER_STATE yy_current_buffer = 0; - -/* We provide macros for accessing buffer states in case in the - * future we want to put the buffer states in a more general - * "scanner state". - */ -#define YY_CURRENT_BUFFER yy_current_buffer - - -/* yy_hold_char holds the character lost when yytext is formed. */ -static char yy_hold_char; - -static int yy_n_chars; /* number of characters read into yy_ch_buf */ - - -int yyleng; - -/* Points to current character in buffer. */ -static char *yy_c_buf_p = (char *) 0; -static int yy_init = 1; /* whether we need to initialize */ -static int yy_start = 0; /* start state number */ - -/* Flag which is used to allow yywrap()'s to do buffer switches - * instead of setting up a fresh yyin. A bit of a hack ... - */ -static int yy_did_buffer_switch_on_eof; - -void yyrestart YY_PROTO(( FILE *input_file )); - -void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer )); -void yy_load_buffer_state YY_PROTO(( void )); -YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size )); -void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b )); -void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file )); -void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b )); -#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer ) - -YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size )); -YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str )); -YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len )); - -static void *yy_flex_alloc YY_PROTO(( yy_size_t )); -static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t )); -static void yy_flex_free YY_PROTO(( void * )); - -#define yy_new_buffer yy_create_buffer - -#define yy_set_interactive(is_interactive) \ - { \ - if ( ! yy_current_buffer ) \ - yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ - yy_current_buffer->yy_is_interactive = is_interactive; \ - } - -#define yy_set_bol(at_bol) \ - { \ - if ( ! yy_current_buffer ) \ - yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ - yy_current_buffer->yy_at_bol = at_bol; \ - } - -#define YY_AT_BOL() (yy_current_buffer->yy_at_bol) - - -#define yywrap() 1 -#define YY_SKIP_YYWRAP -typedef unsigned char YY_CHAR; -FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; -typedef int yy_state_type; -extern char *yytext; -#define yytext_ptr yytext - -static yy_state_type yy_get_previous_state YY_PROTO(( void )); -static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state )); -static int yy_get_next_buffer YY_PROTO(( void )); -static void yy_fatal_error YY_PROTO(( yyconst char msg[] )); - -/* Done after the current pattern has been matched and before the - * corresponding action - sets up yytext. - */ -#define YY_DO_BEFORE_ACTION \ - yytext_ptr = yy_bp; \ - yyleng = (int) (yy_cp - yy_bp); \ - yy_hold_char = *yy_cp; \ - *yy_cp = '\0'; \ - yy_c_buf_p = yy_cp; - -#define YY_NUM_RULES 46 -#define YY_END_OF_BUFFER 47 -static yyconst short int yy_accept[86] = - { 0, - 0, 0, 0, 0, 0, 0, 0, 0, 47, 45, - 1, 38, 2, 45, 43, 24, 45, 28, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 45, - 13, 4, 3, 14, 16, 18, 17, 1, 22, 32, - 34, 43, 26, 20, 31, 30, 44, 44, 19, 44, - 44, 29, 27, 39, 25, 23, 15, 15, 21, 44, - 35, 44, 36, 13, 12, 5, 6, 10, 11, 7, - 8, 9, 33, 44, 44, 37, 44, 5, 6, 44, - 40, 41, 5, 42, 0 - } ; - -static yyconst int yy_ec[256] = - { 0, - 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 2, 4, 5, 1, 1, 1, 6, 1, 1, - 1, 1, 1, 1, 7, 1, 1, 8, 8, 8, - 8, 8, 8, 8, 8, 9, 9, 7, 1, 10, - 11, 12, 1, 1, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 1, 14, 1, 1, 7, 1, 15, 16, 13, 17, - - 18, 19, 20, 13, 21, 13, 13, 22, 23, 24, - 25, 13, 26, 27, 28, 29, 30, 13, 13, 13, - 13, 13, 1, 31, 1, 32, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1 - } ; - -static yyconst int yy_meta[33] = - { 0, - 1, 1, 2, 1, 3, 1, 4, 4, 4, 1, - 1, 1, 4, 3, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 1, 1 - } ; - -static yyconst short int yy_base[93] = - { 0, - 0, 0, 30, 31, 0, 0, 82, 81, 101, 142, - 35, 28, 142, 94, 32, 88, 31, 87, 0, 69, - 66, 28, 28, 67, 29, 63, 30, 63, 62, 57, - 0, 142, 142, 88, 142, 142, 142, 48, 142, 142, - 142, 44, 142, 142, 142, 142, 0, 70, 0, 64, - 63, 0, 0, 0, 0, 0, 142, 0, 0, 55, - 0, 46, 142, 0, 142, 53, 62, 142, 142, 142, - 142, 142, 0, 44, 48, 0, 41, 70, 72, 38, - 0, 0, 74, 0, 142, 117, 121, 125, 50, 129, - 133, 137 - - } ; - -static yyconst short int yy_def[93] = - { 0, - 85, 1, 86, 86, 87, 87, 88, 88, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 89, 89, - 89, 89, 89, 89, 89, 90, 89, 89, 89, 85, - 91, 85, 85, 92, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 89, 89, 89, 89, - 89, 89, 89, 89, 89, 89, 85, 89, 89, 89, - 89, 89, 85, 91, 85, 85, 85, 85, 85, 85, - 85, 85, 89, 89, 89, 89, 89, 85, 85, 89, - 89, 89, 85, 89, 0, 85, 85, 85, 85, 85, - 85, 85 - - } ; - -static yyconst short int yy_nxt[175] = - { 0, - 10, 11, 11, 12, 13, 14, 10, 15, 15, 16, - 17, 18, 19, 10, 20, 19, 19, 21, 22, 23, - 24, 25, 26, 27, 28, 19, 19, 19, 29, 19, - 30, 10, 32, 32, 33, 33, 38, 38, 39, 42, - 42, 44, 50, 34, 34, 52, 55, 59, 51, 38, - 38, 42, 42, 47, 60, 84, 53, 56, 82, 40, - 78, 79, 45, 57, 57, 81, 57, 57, 57, 79, - 79, 80, 57, 57, 57, 77, 57, 83, 79, 79, - 79, 79, 79, 76, 75, 74, 73, 63, 62, 61, - 54, 49, 48, 57, 57, 66, 67, 46, 43, 41, - - 85, 37, 37, 68, 85, 85, 69, 85, 85, 85, - 85, 70, 85, 85, 71, 85, 72, 31, 31, 31, - 31, 35, 35, 35, 35, 36, 36, 36, 36, 58, - 85, 58, 58, 64, 85, 85, 64, 65, 65, 65, - 65, 9, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85 - } ; - -static yyconst short int yy_chk[175] = - { 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 3, 4, 3, 4, 11, 11, 12, 15, - 15, 17, 22, 3, 4, 23, 25, 27, 22, 38, - 38, 42, 42, 89, 27, 80, 23, 25, 77, 12, - 66, 66, 17, 26, 26, 75, 26, 26, 26, 67, - 67, 74, 26, 26, 26, 62, 26, 78, 78, 79, - 79, 83, 83, 60, 51, 50, 48, 30, 29, 28, - 24, 21, 20, 26, 26, 34, 34, 18, 16, 14, - - 9, 8, 7, 34, 0, 0, 34, 0, 0, 0, - 0, 34, 0, 0, 34, 0, 34, 86, 86, 86, - 86, 87, 87, 87, 87, 88, 88, 88, 88, 90, - 0, 90, 90, 91, 0, 0, 91, 92, 92, 92, - 92, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85 - } ; - -static yy_state_type yy_last_accepting_state; -static char *yy_last_accepting_cpos; - -/* The intent behind this definition is that it'll catch - * any uses of REJECT which flex missed. - */ -#define REJECT reject_used_but_not_detected -#define yymore() yymore_used_but_not_detected -#define YY_MORE_ADJ 0 -#define YY_RESTORE_YY_MORE_OFFSET -char *yytext; -#line 1 "ssl_expr_scan.l" -#define INITIAL 0 -/* Copyright 2001-2005 The Apache Software Foundation or its licensors, as - * applicable. - * - * 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_ssl - Apache Interface to OpenSSL - * |_| |_| |_|\___/ \__,_|___|___/___/_| http://www.modssl.org/ - * |_____| - * ssl_expr_scan.l - * Expression Scanner - */ - /* ``Killing for peace is - like fucking for virginity.'' - -- Unknown */ - -/* _________________________________________________________________ -** -** Expression Scanner -** _________________________________________________________________ -*/ -#line 38 "ssl_expr_scan.l" -#include "ssl_private.h" - -#include "ssl_expr_parse.h" - -#define YY_NO_UNPUT 1 -int yyinput(char *buf, int max_size); - -#undef YY_INPUT -#define YY_INPUT(buf,result,max_size) \ - (result = yyinput(buf, max_size)) - -#define MAX_STR_LEN 2048 -/* %option stack */ -#define YY_NEVER_INTERACTIVE 1 -#define str 1 - -#define regex 2 -#define regex_flags 3 - -#line 535 "lex.ssl_expr_yy.c" - -/* Macros after this point can all be overridden by user definitions in - * section 1. - */ - -#ifndef YY_SKIP_YYWRAP -#ifdef __cplusplus -extern "C" int yywrap YY_PROTO(( void )); -#else -extern int yywrap YY_PROTO(( void )); -#endif -#endif - -#ifndef YY_NO_UNPUT -static void yyunput YY_PROTO(( int c, char *buf_ptr )); -#endif - -#ifndef yytext_ptr -static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int )); -#endif - -#ifdef YY_NEED_STRLEN -static int yy_flex_strlen YY_PROTO(( yyconst char * )); -#endif - -#ifndef YY_NO_INPUT -#ifdef __cplusplus -static int yyinput YY_PROTO(( void )); -#else -static int input YY_PROTO(( void )); -#endif -#endif - -#if YY_STACK_USED -static int yy_start_stack_ptr = 0; -static int yy_start_stack_depth = 0; -static int *yy_start_stack = 0; -#ifndef YY_NO_PUSH_STATE -static void yy_push_state YY_PROTO(( int new_state )); -#endif -#ifndef YY_NO_POP_STATE -static void yy_pop_state YY_PROTO(( void )); -#endif -#ifndef YY_NO_TOP_STATE -static int yy_top_state YY_PROTO(( void )); -#endif - -#else -#define YY_NO_PUSH_STATE 1 -#define YY_NO_POP_STATE 1 -#define YY_NO_TOP_STATE 1 -#endif - -#ifdef YY_MALLOC_DECL -YY_MALLOC_DECL -#else -#if __STDC__ -#ifndef __cplusplus -#include -#endif -#else -/* Just try to get by without declaring the routines. This will fail - * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int) - * or sizeof(void*) != sizeof(int). - */ -#endif -#endif - -/* Amount of stuff to slurp up with each read. */ -#ifndef YY_READ_BUF_SIZE -#define YY_READ_BUF_SIZE 8192 -#endif - -/* Copy whatever the last rule matched to the standard output. */ - -#ifndef ECHO -/* This used to be an fputs(), but since the string might contain NUL's, - * we now use fwrite(). - */ -#define ECHO (void) fwrite( yytext, yyleng, 1, yyout ) -#endif - -/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, - * is returned in "result". - */ -#ifndef YY_INPUT -#define YY_INPUT(buf,result,max_size) \ - if ( yy_current_buffer->yy_is_interactive ) \ - { \ - int c = '*', n; \ - for ( n = 0; n < max_size && \ - (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ - buf[n] = (char) c; \ - if ( c == '\n' ) \ - buf[n++] = (char) c; \ - if ( c == EOF && ferror( yyin ) ) \ - YY_FATAL_ERROR( "input in flex scanner failed" ); \ - result = n; \ - } \ - else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \ - && ferror( yyin ) ) \ - YY_FATAL_ERROR( "input in flex scanner failed" ); -#endif - -/* No semi-colon after return; correct usage is to write "yyterminate();" - - * we don't want an extra ';' after the "return" because that will cause - * some compilers to complain about unreachable statements. - */ -#ifndef yyterminate -#define yyterminate() return YY_NULL -#endif - -/* Number of entries by which start-condition stack grows. */ -#ifndef YY_START_STACK_INCR -#define YY_START_STACK_INCR 25 -#endif - -/* Report a fatal error. */ -#ifndef YY_FATAL_ERROR -#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) -#endif - -/* Default declaration of generated scanner - a define so the user can - * easily add parameters. - */ -#ifndef YY_DECL -#define YY_DECL int yylex YY_PROTO(( void )) -#endif - -/* Code executed at the beginning of each rule, after yytext and yyleng - * have been set up. - */ -#ifndef YY_USER_ACTION -#define YY_USER_ACTION -#endif - -/* Code executed at the end of each rule. */ -#ifndef YY_BREAK -#define YY_BREAK break; -#endif - -#define YY_RULE_SETUP \ - YY_USER_ACTION - -YY_DECL - { - register yy_state_type yy_current_state; - register char *yy_cp, *yy_bp; - register int yy_act; - -#line 91 "ssl_expr_scan.l" - - - char caStr[MAX_STR_LEN]; - char *cpStr = NULL; - char caRegex[MAX_STR_LEN]; - char *cpRegex = NULL; - char cRegexDel = NUL; - - /* - * Whitespaces - */ -#line 698 "lex.ssl_expr_yy.c" - - if ( yy_init ) - { - yy_init = 0; - -#ifdef YY_USER_INIT - YY_USER_INIT; -#endif - - if ( ! yy_start ) - yy_start = 1; /* first start state */ - - if ( ! yyin ) - yyin = stdin; - - if ( ! yyout ) - yyout = stdout; - - if ( ! yy_current_buffer ) - yy_current_buffer = - yy_create_buffer( yyin, YY_BUF_SIZE ); - - yy_load_buffer_state(); - } - - while ( 1 ) /* loops until end-of-file is reached */ - { - yy_cp = yy_c_buf_p; - - /* Support of yytext. */ - *yy_cp = yy_hold_char; - - /* yy_bp points to the position in yy_ch_buf of the start of - * the current run. - */ - yy_bp = yy_cp; - - yy_current_state = yy_start; -yy_match: - do - { - register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; - if ( yy_accept[yy_current_state] ) - { - yy_last_accepting_state = yy_current_state; - yy_last_accepting_cpos = yy_cp; - } - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) - { - yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 86 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - ++yy_cp; - } - while ( yy_current_state != 85 ); - yy_cp = yy_last_accepting_cpos; - yy_current_state = yy_last_accepting_state; - -yy_find_action: - yy_act = yy_accept[yy_current_state]; - - YY_DO_BEFORE_ACTION; - - -do_action: /* This label is used only to access EOF actions. */ - - - switch ( yy_act ) - { /* beginning of action switch */ - case 0: /* must back up */ - /* undo the effects of YY_DO_BEFORE_ACTION */ - *yy_cp = yy_hold_char; - yy_cp = yy_last_accepting_cpos; - yy_current_state = yy_last_accepting_state; - goto yy_find_action; - -case 1: -YY_RULE_SETUP -#line 102 "ssl_expr_scan.l" -{ - /* NOP */ -} - YY_BREAK -/* - * C-style strings ("...") - */ -case 2: -YY_RULE_SETUP -#line 109 "ssl_expr_scan.l" -{ - cpStr = caStr; - BEGIN(str); -} - YY_BREAK -case 3: -YY_RULE_SETUP -#line 113 "ssl_expr_scan.l" -{ - BEGIN(INITIAL); - *cpStr = NUL; - yylval.cpVal = apr_pstrdup(ssl_expr_info.pool, caStr); - return T_STRING; -} - YY_BREAK -case 4: -YY_RULE_SETUP -#line 119 "ssl_expr_scan.l" -{ - yyerror("Unterminated string"); -} - YY_BREAK -case 5: -YY_RULE_SETUP -#line 122 "ssl_expr_scan.l" -{ - int result; - - (void)sscanf(yytext+1, "%o", &result); - if (result > 0xff) - yyerror("Escape sequence out of bound"); - else - *cpStr++ = result; -} - YY_BREAK -case 6: -YY_RULE_SETUP -#line 131 "ssl_expr_scan.l" -{ - yyerror("Bad escape sequence"); -} - YY_BREAK -case 7: -YY_RULE_SETUP -#line 134 "ssl_expr_scan.l" -{ *cpStr++ = '\n'; } - YY_BREAK -case 8: -YY_RULE_SETUP -#line 135 "ssl_expr_scan.l" -{ *cpStr++ = '\r'; } - YY_BREAK -case 9: -YY_RULE_SETUP -#line 136 "ssl_expr_scan.l" -{ *cpStr++ = '\t'; } - YY_BREAK -case 10: -YY_RULE_SETUP -#line 137 "ssl_expr_scan.l" -{ *cpStr++ = '\b'; } - YY_BREAK -case 11: -YY_RULE_SETUP -#line 138 "ssl_expr_scan.l" -{ *cpStr++ = '\f'; } - YY_BREAK -case 12: -YY_RULE_SETUP -#line 139 "ssl_expr_scan.l" -{ - *cpStr++ = yytext[1]; -} - YY_BREAK -case 13: -YY_RULE_SETUP -#line 142 "ssl_expr_scan.l" -{ - char *cp = yytext; - while (*cp != NUL) - *cpStr++ = *cp++; -} - YY_BREAK -case 14: -YY_RULE_SETUP -#line 147 "ssl_expr_scan.l" -{ - *cpStr++ = yytext[1]; -} - YY_BREAK -/* - * Regular Expression - */ -case 15: -YY_RULE_SETUP -#line 154 "ssl_expr_scan.l" -{ - cRegexDel = yytext[1]; - cpRegex = caRegex; - BEGIN(regex); -} - YY_BREAK -case 16: -YY_RULE_SETUP -#line 159 "ssl_expr_scan.l" -{ - if (yytext[0] == cRegexDel) { - *cpRegex = NUL; - BEGIN(regex_flags); - } - else { - *cpRegex++ = yytext[0]; - } -} - YY_BREAK -case 17: -YY_RULE_SETUP -#line 168 "ssl_expr_scan.l" -{ - yylval.cpVal = apr_pstrdup(ssl_expr_info.pool, caRegex); - BEGIN(INITIAL); - return T_REGEX_I; -} - YY_BREAK -case 18: -YY_RULE_SETUP -#line 173 "ssl_expr_scan.l" -{ - yylval.cpVal = apr_pstrdup(ssl_expr_info.pool, caRegex); - yyless(0); - BEGIN(INITIAL); - return T_REGEX; -} - YY_BREAK -case YY_STATE_EOF(regex_flags): -#line 179 "ssl_expr_scan.l" -{ - yylval.cpVal = apr_pstrdup(ssl_expr_info.pool, caRegex); - BEGIN(INITIAL); - return T_REGEX; -} - YY_BREAK -/* - * Operators - */ -case 19: -YY_RULE_SETUP -#line 188 "ssl_expr_scan.l" -{ return T_OP_EQ; } - YY_BREAK -case 20: -YY_RULE_SETUP -#line 189 "ssl_expr_scan.l" -{ return T_OP_EQ; } - YY_BREAK -case 21: -YY_RULE_SETUP -#line 190 "ssl_expr_scan.l" -{ return T_OP_NE; } - YY_BREAK -case 22: -YY_RULE_SETUP -#line 191 "ssl_expr_scan.l" -{ return T_OP_NE; } - YY_BREAK -case 23: -YY_RULE_SETUP -#line 192 "ssl_expr_scan.l" -{ return T_OP_LT; } - YY_BREAK -case 24: -YY_RULE_SETUP -#line 193 "ssl_expr_scan.l" -{ return T_OP_LT; } - YY_BREAK -case 25: -YY_RULE_SETUP -#line 194 "ssl_expr_scan.l" -{ return T_OP_LE; } - YY_BREAK -case 26: -YY_RULE_SETUP -#line 195 "ssl_expr_scan.l" -{ return T_OP_LE; } - YY_BREAK -case 27: -YY_RULE_SETUP -#line 196 "ssl_expr_scan.l" -{ return T_OP_GT; } - YY_BREAK -case 28: -YY_RULE_SETUP -#line 197 "ssl_expr_scan.l" -{ return T_OP_GT; } - YY_BREAK -case 29: -YY_RULE_SETUP -#line 198 "ssl_expr_scan.l" -{ return T_OP_GE; } - YY_BREAK -case 30: -YY_RULE_SETUP -#line 199 "ssl_expr_scan.l" -{ return T_OP_GE; } - YY_BREAK -case 31: -YY_RULE_SETUP -#line 200 "ssl_expr_scan.l" -{ return T_OP_REG; } - YY_BREAK -case 32: -YY_RULE_SETUP -#line 201 "ssl_expr_scan.l" -{ return T_OP_NRE; } - YY_BREAK -case 33: -YY_RULE_SETUP -#line 202 "ssl_expr_scan.l" -{ return T_OP_AND; } - YY_BREAK -case 34: -YY_RULE_SETUP -#line 203 "ssl_expr_scan.l" -{ return T_OP_AND; } - YY_BREAK -case 35: -YY_RULE_SETUP -#line 204 "ssl_expr_scan.l" -{ return T_OP_OR; } - YY_BREAK -case 36: -YY_RULE_SETUP -#line 205 "ssl_expr_scan.l" -{ return T_OP_OR; } - YY_BREAK -case 37: -YY_RULE_SETUP -#line 206 "ssl_expr_scan.l" -{ return T_OP_NOT; } - YY_BREAK -case 38: -YY_RULE_SETUP -#line 207 "ssl_expr_scan.l" -{ return T_OP_NOT; } - YY_BREAK -case 39: -YY_RULE_SETUP -#line 208 "ssl_expr_scan.l" -{ return T_OP_IN; } - YY_BREAK -/* - * Functions - */ -case 40: -YY_RULE_SETUP -#line 213 "ssl_expr_scan.l" -{ return T_FUNC_FILE; } - YY_BREAK -/* - * Specials - */ -case 41: -YY_RULE_SETUP -#line 218 "ssl_expr_scan.l" -{ return T_TRUE; } - YY_BREAK -case 42: -YY_RULE_SETUP -#line 219 "ssl_expr_scan.l" -{ return T_FALSE; } - YY_BREAK -/* - * Digits - */ -case 43: -YY_RULE_SETUP -#line 224 "ssl_expr_scan.l" -{ - yylval.cpVal = apr_pstrdup(ssl_expr_info.pool, yytext); - return T_DIGIT; -} - YY_BREAK -/* - * Identifiers - */ -case 44: -YY_RULE_SETUP -#line 232 "ssl_expr_scan.l" -{ - yylval.cpVal = apr_pstrdup(ssl_expr_info.pool, yytext); - return T_ID; -} - YY_BREAK -/* - * Anything else is returned as is... - */ -case 45: -YY_RULE_SETUP -#line 240 "ssl_expr_scan.l" -{ - return yytext[0]; -} - YY_BREAK -case 46: -YY_RULE_SETUP -#line 244 "ssl_expr_scan.l" -YY_FATAL_ERROR( "flex scanner jammed" ); - YY_BREAK -#line 1098 "lex.ssl_expr_yy.c" -case YY_STATE_EOF(INITIAL): -case YY_STATE_EOF(str): -case YY_STATE_EOF(regex): - yyterminate(); - - case YY_END_OF_BUFFER: - { - /* Amount of text matched not including the EOB char. */ - int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1; - - /* Undo the effects of YY_DO_BEFORE_ACTION. */ - *yy_cp = yy_hold_char; - YY_RESTORE_YY_MORE_OFFSET - - if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW ) - { - /* We're scanning a new file or input source. It's - * possible that this happened because the user - * just pointed yyin at a new source and called - * yylex(). If so, then we have to assure - * consistency between yy_current_buffer and our - * globals. Here is the right place to do so, because - * this is the first action (other than possibly a - * back-up) that will match for the new input source. - */ - yy_n_chars = yy_current_buffer->yy_n_chars; - yy_current_buffer->yy_input_file = yyin; - yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL; - } - - /* Note that here we test for yy_c_buf_p "<=" to the position - * of the first EOB in the buffer, since yy_c_buf_p will - * already have been incremented past the NUL character - * (since all states make transitions on EOB to the - * end-of-buffer state). Contrast this with the test - * in input(). - */ - if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] ) - { /* This was really a NUL. */ - yy_state_type yy_next_state; - - yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text; - - yy_current_state = yy_get_previous_state(); - - /* Okay, we're now positioned to make the NUL - * transition. We couldn't have - * yy_get_previous_state() go ahead and do it - * for us because it doesn't know how to deal - * with the possibility of jamming (and we don't - * want to build jamming into it because then it - * will run more slowly). - */ - - yy_next_state = yy_try_NUL_trans( yy_current_state ); - - yy_bp = yytext_ptr + YY_MORE_ADJ; - - if ( yy_next_state ) - { - /* Consume the NUL. */ - yy_cp = ++yy_c_buf_p; - yy_current_state = yy_next_state; - goto yy_match; - } - - else - { - yy_cp = yy_last_accepting_cpos; - yy_current_state = yy_last_accepting_state; - goto yy_find_action; - } - } - - else switch ( yy_get_next_buffer() ) - { - case EOB_ACT_END_OF_FILE: - { - yy_did_buffer_switch_on_eof = 0; - - if ( yywrap() ) - { - /* Note: because we've taken care in - * yy_get_next_buffer() to have set up - * yytext, we can now set up - * yy_c_buf_p so that if some total - * hoser (like flex itself) wants to - * call the scanner after we return the - * YY_NULL, it'll still work - another - * YY_NULL will get returned. - */ - yy_c_buf_p = yytext_ptr + YY_MORE_ADJ; - - yy_act = YY_STATE_EOF(YY_START); - goto do_action; - } - - else - { - if ( ! yy_did_buffer_switch_on_eof ) - YY_NEW_FILE; - } - break; - } - - case EOB_ACT_CONTINUE_SCAN: - yy_c_buf_p = - yytext_ptr + yy_amount_of_matched_text; - - yy_current_state = yy_get_previous_state(); - - yy_cp = yy_c_buf_p; - yy_bp = yytext_ptr + YY_MORE_ADJ; - goto yy_match; - - case EOB_ACT_LAST_MATCH: - yy_c_buf_p = - &yy_current_buffer->yy_ch_buf[yy_n_chars]; - - yy_current_state = yy_get_previous_state(); - - yy_cp = yy_c_buf_p; - yy_bp = yytext_ptr + YY_MORE_ADJ; - goto yy_find_action; - } - break; - } - - default: - YY_FATAL_ERROR( - "fatal flex scanner internal error--no action found" ); - } /* end of action switch */ - } /* end of scanning one token */ - } /* end of yylex */ - - -/* yy_get_next_buffer - try to read in a new buffer - * - * Returns a code representing an action: - * EOB_ACT_LAST_MATCH - - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position - * EOB_ACT_END_OF_FILE - end of file - */ - -static int yy_get_next_buffer() - { - register char *dest = yy_current_buffer->yy_ch_buf; - register char *source = yytext_ptr; - register int number_to_move, i; - int ret_val; - - if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] ) - YY_FATAL_ERROR( - "fatal flex scanner internal error--end of buffer missed" ); - - if ( yy_current_buffer->yy_fill_buffer == 0 ) - { /* Don't try to fill the buffer, so this is an EOF. */ - if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 ) - { - /* We matched a single character, the EOB, so - * treat this as a final EOF. - */ - return EOB_ACT_END_OF_FILE; - } - - else - { - /* We matched some text prior to the EOB, first - * process it. - */ - return EOB_ACT_LAST_MATCH; - } - } - - /* Try to read more data. */ - - /* First move last chars to start of buffer. */ - number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1; - - for ( i = 0; i < number_to_move; ++i ) - *(dest++) = *(source++); - - if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING ) - /* don't do the read, it's not guaranteed to return an EOF, - * just force an EOF - */ - yy_current_buffer->yy_n_chars = yy_n_chars = 0; - - else - { - int num_to_read = - yy_current_buffer->yy_buf_size - number_to_move - 1; - - while ( num_to_read <= 0 ) - { /* Not enough room in the buffer - grow it. */ -#ifdef YY_USES_REJECT - YY_FATAL_ERROR( -"input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); -#else - - /* just a shorter name for the current buffer */ - YY_BUFFER_STATE b = yy_current_buffer; - - int yy_c_buf_p_offset = - (int) (yy_c_buf_p - b->yy_ch_buf); - - if ( b->yy_is_our_buffer ) - { - int new_size = b->yy_buf_size * 2; - - if ( new_size <= 0 ) - b->yy_buf_size += b->yy_buf_size / 8; - else - b->yy_buf_size *= 2; - - b->yy_ch_buf = (char *) - /* Include room in for 2 EOB chars. */ - yy_flex_realloc( (void *) b->yy_ch_buf, - b->yy_buf_size + 2 ); - } - else - /* Can't grow it, we don't own it. */ - b->yy_ch_buf = 0; - - if ( ! b->yy_ch_buf ) - YY_FATAL_ERROR( - "fatal error - scanner input buffer overflow" ); - - yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; - - num_to_read = yy_current_buffer->yy_buf_size - - number_to_move - 1; -#endif - } - - if ( num_to_read > YY_READ_BUF_SIZE ) - num_to_read = YY_READ_BUF_SIZE; - - /* Read in more data. */ - YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]), - yy_n_chars, num_to_read ); - - yy_current_buffer->yy_n_chars = yy_n_chars; - } - - if ( yy_n_chars == 0 ) - { - if ( number_to_move == YY_MORE_ADJ ) - { - ret_val = EOB_ACT_END_OF_FILE; - yyrestart( yyin ); - } - - else - { - ret_val = EOB_ACT_LAST_MATCH; - yy_current_buffer->yy_buffer_status = - YY_BUFFER_EOF_PENDING; - } - } - - else - ret_val = EOB_ACT_CONTINUE_SCAN; - - yy_n_chars += number_to_move; - yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR; - yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; - - yytext_ptr = &yy_current_buffer->yy_ch_buf[0]; - - return ret_val; - } - - -/* yy_get_previous_state - get the state just before the EOB char was reached */ - -static yy_state_type yy_get_previous_state() - { - register yy_state_type yy_current_state; - register char *yy_cp; - - yy_current_state = yy_start; - - for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp ) - { - register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); - if ( yy_accept[yy_current_state] ) - { - yy_last_accepting_state = yy_current_state; - yy_last_accepting_cpos = yy_cp; - } - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) - { - yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 86 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - } - - return yy_current_state; - } - - -/* yy_try_NUL_trans - try to make a transition on the NUL character - * - * synopsis - * next_state = yy_try_NUL_trans( current_state ); - */ - -#ifdef YY_USE_PROTOS -static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state ) -#else -static yy_state_type yy_try_NUL_trans( yy_current_state ) -yy_state_type yy_current_state; -#endif - { - register int yy_is_jam; - register char *yy_cp = yy_c_buf_p; - - register YY_CHAR yy_c = 1; - if ( yy_accept[yy_current_state] ) - { - yy_last_accepting_state = yy_current_state; - yy_last_accepting_cpos = yy_cp; - } - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) - { - yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 86 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - yy_is_jam = (yy_current_state == 85); - - return yy_is_jam ? 0 : yy_current_state; - } - - -#ifndef YY_NO_UNPUT -#ifdef YY_USE_PROTOS -static void yyunput( int c, register char *yy_bp ) -#else -static void yyunput( c, yy_bp ) -int c; -register char *yy_bp; -#endif - { - register char *yy_cp = yy_c_buf_p; - - /* undo effects of setting up yytext */ - *yy_cp = yy_hold_char; - - if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) - { /* need to shift things up to make room */ - /* +2 for EOB chars. */ - register int number_to_move = yy_n_chars + 2; - register char *dest = &yy_current_buffer->yy_ch_buf[ - yy_current_buffer->yy_buf_size + 2]; - register char *source = - &yy_current_buffer->yy_ch_buf[number_to_move]; - - while ( source > yy_current_buffer->yy_ch_buf ) - *--dest = *--source; - - yy_cp += (int) (dest - source); - yy_bp += (int) (dest - source); - yy_current_buffer->yy_n_chars = - yy_n_chars = yy_current_buffer->yy_buf_size; - - if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) - YY_FATAL_ERROR( "flex scanner push-back overflow" ); - } - - *--yy_cp = (char) c; - - - yytext_ptr = yy_bp; - yy_hold_char = *yy_cp; - yy_c_buf_p = yy_cp; - } -#endif /* ifndef YY_NO_UNPUT */ - - -#ifdef __cplusplus -static int yyinput() -#else -static int input() -#endif - { - int c; - - *yy_c_buf_p = yy_hold_char; - - if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) - { - /* yy_c_buf_p now points to the character we want to return. - * If this occurs *before* the EOB characters, then it's a - * valid NUL; if not, then we've hit the end of the buffer. - */ - if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] ) - /* This was really a NUL. */ - *yy_c_buf_p = '\0'; - - else - { /* need more input */ - int offset = yy_c_buf_p - yytext_ptr; - ++yy_c_buf_p; - - switch ( yy_get_next_buffer() ) - { - case EOB_ACT_LAST_MATCH: - /* This happens because yy_g_n_b() - * sees that we've accumulated a - * token and flags that we need to - * try matching the token before - * proceeding. But for input(), - * there's no matching to consider. - * So convert the EOB_ACT_LAST_MATCH - * to EOB_ACT_END_OF_FILE. - */ - - /* Reset buffer status. */ - yyrestart( yyin ); - - /* fall through */ - - case EOB_ACT_END_OF_FILE: - { - if ( yywrap() ) - return EOF; - - if ( ! yy_did_buffer_switch_on_eof ) - YY_NEW_FILE; -#ifdef __cplusplus - return yyinput(); -#else - return input(); -#endif - } - - case EOB_ACT_CONTINUE_SCAN: - yy_c_buf_p = yytext_ptr + offset; - break; - } - } - } - - c = *(unsigned char *) yy_c_buf_p; /* cast for 8-bit char's */ - *yy_c_buf_p = '\0'; /* preserve yytext */ - yy_hold_char = *++yy_c_buf_p; - - - return c; - } - - -#ifdef YY_USE_PROTOS -void yyrestart( FILE *input_file ) -#else -void yyrestart( input_file ) -FILE *input_file; -#endif - { - if ( ! yy_current_buffer ) - yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); - - yy_init_buffer( yy_current_buffer, input_file ); - yy_load_buffer_state(); - } - - -#ifdef YY_USE_PROTOS -void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) -#else -void yy_switch_to_buffer( new_buffer ) -YY_BUFFER_STATE new_buffer; -#endif - { - if ( yy_current_buffer == new_buffer ) - return; - - if ( yy_current_buffer ) - { - /* Flush out information for old buffer. */ - *yy_c_buf_p = yy_hold_char; - yy_current_buffer->yy_buf_pos = yy_c_buf_p; - yy_current_buffer->yy_n_chars = yy_n_chars; - } - - yy_current_buffer = new_buffer; - yy_load_buffer_state(); - - /* We don't actually know whether we did this switch during - * EOF (yywrap()) processing, but the only time this flag - * is looked at is after yywrap() is called, so it's safe - * to go ahead and always set it. - */ - yy_did_buffer_switch_on_eof = 1; - } - - -#ifdef YY_USE_PROTOS -void yy_load_buffer_state( void ) -#else -void yy_load_buffer_state() -#endif - { - yy_n_chars = yy_current_buffer->yy_n_chars; - yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos; - yyin = yy_current_buffer->yy_input_file; - yy_hold_char = *yy_c_buf_p; - } - - -#ifdef YY_USE_PROTOS -YY_BUFFER_STATE yy_create_buffer( FILE *file, int size ) -#else -YY_BUFFER_STATE yy_create_buffer( file, size ) -FILE *file; -int size; -#endif - { - YY_BUFFER_STATE b; - - b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); - if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); - - b->yy_buf_size = size; - - /* yy_ch_buf has to be 2 characters longer than the size given because - * we need to put in 2 end-of-buffer characters. - */ - b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 ); - if ( ! b->yy_ch_buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); - - b->yy_is_our_buffer = 1; - - yy_init_buffer( b, file ); - - return b; - } - - -#ifdef YY_USE_PROTOS -void yy_delete_buffer( YY_BUFFER_STATE b ) -#else -void yy_delete_buffer( b ) -YY_BUFFER_STATE b; -#endif - { - if ( ! b ) - return; - - if ( b == yy_current_buffer ) - yy_current_buffer = (YY_BUFFER_STATE) 0; - - if ( b->yy_is_our_buffer ) - yy_flex_free( (void *) b->yy_ch_buf ); - - yy_flex_free( (void *) b ); - } - - -#ifndef YY_ALWAYS_INTERACTIVE -#ifndef YY_NEVER_INTERACTIVE -extern int isatty YY_PROTO(( int )); -#endif -#endif - -#ifdef YY_USE_PROTOS -void yy_init_buffer( YY_BUFFER_STATE b, FILE *file ) -#else -void yy_init_buffer( b, file ) -YY_BUFFER_STATE b; -FILE *file; -#endif - - - { - yy_flush_buffer( b ); - - b->yy_input_file = file; - b->yy_fill_buffer = 1; - -#if YY_ALWAYS_INTERACTIVE - b->yy_is_interactive = 1; -#else -#if YY_NEVER_INTERACTIVE - b->yy_is_interactive = 0; -#else - b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; -#endif -#endif - } - - -#ifdef YY_USE_PROTOS -void yy_flush_buffer( YY_BUFFER_STATE b ) -#else -void yy_flush_buffer( b ) -YY_BUFFER_STATE b; -#endif - - { - if ( ! b ) - return; - - b->yy_n_chars = 0; - - /* We always need two end-of-buffer characters. The first causes - * a transition to the end-of-buffer state. The second causes - * a jam in that state. - */ - b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; - b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; - - b->yy_buf_pos = &b->yy_ch_buf[0]; - - b->yy_at_bol = 1; - b->yy_buffer_status = YY_BUFFER_NEW; - - if ( b == yy_current_buffer ) - yy_load_buffer_state(); - } - - -#ifndef YY_NO_SCAN_BUFFER -#ifdef YY_USE_PROTOS -YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size ) -#else -YY_BUFFER_STATE yy_scan_buffer( base, size ) -char *base; -yy_size_t size; -#endif - { - YY_BUFFER_STATE b; - - if ( size < 2 || - base[size-2] != YY_END_OF_BUFFER_CHAR || - base[size-1] != YY_END_OF_BUFFER_CHAR ) - /* They forgot to leave room for the EOB's. */ - return 0; - - b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); - if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); - - b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ - b->yy_buf_pos = b->yy_ch_buf = base; - b->yy_is_our_buffer = 0; - b->yy_input_file = 0; - b->yy_n_chars = b->yy_buf_size; - b->yy_is_interactive = 0; - b->yy_at_bol = 1; - b->yy_fill_buffer = 0; - b->yy_buffer_status = YY_BUFFER_NEW; - - yy_switch_to_buffer( b ); - - return b; - } -#endif - - -#ifndef YY_NO_SCAN_STRING -#ifdef YY_USE_PROTOS -YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str ) -#else -YY_BUFFER_STATE yy_scan_string( yy_str ) -yyconst char *yy_str; -#endif - { - int len; - for ( len = 0; yy_str[len]; ++len ) - ; - - return yy_scan_bytes( yy_str, len ); - } -#endif - - -#ifndef YY_NO_SCAN_BYTES -#ifdef YY_USE_PROTOS -YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len ) -#else -YY_BUFFER_STATE yy_scan_bytes( bytes, len ) -yyconst char *bytes; -int len; -#endif - { - YY_BUFFER_STATE b; - char *buf; - yy_size_t n; - int i; - - /* Get memory for full buffer, including space for trailing EOB's. */ - n = len + 2; - buf = (char *) yy_flex_alloc( n ); - if ( ! buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); - - for ( i = 0; i < len; ++i ) - buf[i] = bytes[i]; - - buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR; - - b = yy_scan_buffer( buf, n ); - if ( ! b ) - YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); - - /* It's okay to grow etc. this buffer, and we should throw it - * away when we're done. - */ - b->yy_is_our_buffer = 1; - - return b; - } -#endif - - -#ifndef YY_NO_PUSH_STATE -#ifdef YY_USE_PROTOS -static void yy_push_state( int new_state ) -#else -static void yy_push_state( new_state ) -int new_state; -#endif - { - if ( yy_start_stack_ptr >= yy_start_stack_depth ) - { - yy_size_t new_size; - - yy_start_stack_depth += YY_START_STACK_INCR; - new_size = yy_start_stack_depth * sizeof( int ); - - if ( ! yy_start_stack ) - yy_start_stack = (int *) yy_flex_alloc( new_size ); - - else - yy_start_stack = (int *) yy_flex_realloc( - (void *) yy_start_stack, new_size ); - - if ( ! yy_start_stack ) - YY_FATAL_ERROR( - "out of memory expanding start-condition stack" ); - } - - yy_start_stack[yy_start_stack_ptr++] = YY_START; - - BEGIN(new_state); - } -#endif - - -#ifndef YY_NO_POP_STATE -static void yy_pop_state() - { - if ( --yy_start_stack_ptr < 0 ) - YY_FATAL_ERROR( "start-condition stack underflow" ); - - BEGIN(yy_start_stack[yy_start_stack_ptr]); - } -#endif - - -#ifndef YY_NO_TOP_STATE -static int yy_top_state() - { - return yy_start_stack[yy_start_stack_ptr - 1]; - } -#endif - -#ifndef YY_EXIT_FAILURE -#define YY_EXIT_FAILURE 2 -#endif - -#ifdef YY_USE_PROTOS -static void yy_fatal_error( yyconst char msg[] ) -#else -static void yy_fatal_error( msg ) -char msg[]; -#endif - { - (void) fprintf( stderr, "%s\n", msg ); - exit( YY_EXIT_FAILURE ); - } - - - -/* Redefine yyless() so it works in section 3 code. */ - -#undef yyless -#define yyless(n) \ - do \ - { \ - /* Undo effects of setting up yytext. */ \ - yytext[yyleng] = yy_hold_char; \ - yy_c_buf_p = yytext + n; \ - yy_hold_char = *yy_c_buf_p; \ - *yy_c_buf_p = '\0'; \ - yyleng = n; \ - } \ - while ( 0 ) - - -/* Internal utility routines. */ - -#ifndef yytext_ptr -#ifdef YY_USE_PROTOS -static void yy_flex_strncpy( char *s1, yyconst char *s2, int n ) -#else -static void yy_flex_strncpy( s1, s2, n ) -char *s1; -yyconst char *s2; -int n; -#endif - { - register int i; - for ( i = 0; i < n; ++i ) - s1[i] = s2[i]; - } -#endif - -#ifdef YY_NEED_STRLEN -#ifdef YY_USE_PROTOS -static int yy_flex_strlen( yyconst char *s ) -#else -static int yy_flex_strlen( s ) -yyconst char *s; -#endif - { - register int n; - for ( n = 0; s[n]; ++n ) - ; - - return n; - } -#endif - - -#ifdef YY_USE_PROTOS -static void *yy_flex_alloc( yy_size_t size ) -#else -static void *yy_flex_alloc( size ) -yy_size_t size; -#endif - { - return (void *) malloc( size ); - } - -#ifdef YY_USE_PROTOS -static void *yy_flex_realloc( void *ptr, yy_size_t size ) -#else -static void *yy_flex_realloc( ptr, size ) -void *ptr; -yy_size_t size; -#endif - { - /* The cast to (char *) in the following accommodates both - * implementations that use char* generic pointers, and those - * that use void* generic pointers. It works with the latter - * because both ANSI C and C++ allow castless assignment from - * any pointer type to void*, and deal with argument conversions - * as though doing an assignment. - */ - return (void *) realloc( (char *) ptr, size ); - } - -#ifdef YY_USE_PROTOS -static void yy_flex_free( void *ptr ) -#else -static void yy_flex_free( ptr ) -void *ptr; -#endif - { - free( ptr ); - } - -#if YY_MAIN -int main() - { - yylex(); - return 0; - } -#endif -#line 244 "ssl_expr_scan.l" - - -int yyinput(char *buf, int max_size) -{ - int n; - - if ((n = MIN(max_size, ssl_expr_info.inputbuf - + ssl_expr_info.inputlen - - ssl_expr_info.inputptr)) <= 0) - return YY_NULL; - memcpy(buf, ssl_expr_info.inputptr, n); - ssl_expr_info.inputptr += n; - return n; -} - diff --git a/trunk/modules/ssl/ssl_expr_scan.l b/trunk/modules/ssl/ssl_expr_scan.l deleted file mode 100644 index da172fd3a59eab8df7291d270dd8eee456592cea..0000000000000000000000000000000000000000 --- a/trunk/modules/ssl/ssl_expr_scan.l +++ /dev/null @@ -1,224 +0,0 @@ -/* Copyright 2001-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_ssl - Apache Interface to OpenSSL - * |_| |_| |_|\___/ \__,_|___|___/___/_| http://www.modssl.org/ - * |_____| - * ssl_expr_scan.l - * Expression Scanner - */ - /* ``Killing for peace is - like fucking for virginity.'' - -- Unknown */ - -/* _________________________________________________________________ -** -** Expression Scanner -** _________________________________________________________________ -*/ - -%{ -#include "ssl_private.h" - -#include "ssl_expr_parse.h" - -#define YY_NO_UNPUT 1 -int yyinput(char *buf, int max_size); - -#undef YY_INPUT -#define YY_INPUT(buf,result,max_size) \ - (result = yyinput(buf, max_size)) - -#define MAX_STR_LEN 2048 -%} - -%pointer -/* %option stack */ -%option never-interactive -%option noyywrap -%x str -%x regex regex_flags - -%% - - char caStr[MAX_STR_LEN]; - char *cpStr = NULL; - char caRegex[MAX_STR_LEN]; - char *cpRegex = NULL; - char cRegexDel = NUL; - - /* - * Whitespaces - */ -[ \t\n]+ { - /* NOP */ -} - - /* - * C-style strings ("...") - */ -\" { - cpStr = caStr; - BEGIN(str); -} -\" { - BEGIN(INITIAL); - *cpStr = NUL; - yylval.cpVal = apr_pstrdup(ssl_expr_info.pool, caStr); - return T_STRING; -} -\n { - yyerror("Unterminated string"); -} -\\[0-7]{1,3} { - int result; - - (void)sscanf(yytext+1, "%o", &result); - if (result > 0xff) - yyerror("Escape sequence out of bound"); - else - *cpStr++ = result; -} -\\[0-9]+ { - yyerror("Bad escape sequence"); -} -\\n { *cpStr++ = '\n'; } -\\r { *cpStr++ = '\r'; } -\\t { *cpStr++ = '\t'; } -\\b { *cpStr++ = '\b'; } -\\f { *cpStr++ = '\f'; } -\\(.|\n) { - *cpStr++ = yytext[1]; -} -[^\\\n\"]+ { - char *cp = yytext; - while (*cp != NUL) - *cpStr++ = *cp++; -} -. { - *cpStr++ = yytext[1]; -} - - /* - * Regular Expression - */ -"m". { - cRegexDel = yytext[1]; - cpRegex = caRegex; - BEGIN(regex); -} -.|\n { - if (yytext[0] == cRegexDel) { - *cpRegex = NUL; - BEGIN(regex_flags); - } - else { - *cpRegex++ = yytext[0]; - } -} -i { - yylval.cpVal = apr_pstrdup(ssl_expr_info.pool, caRegex); - BEGIN(INITIAL); - return T_REGEX_I; -} -.|\n { - yylval.cpVal = apr_pstrdup(ssl_expr_info.pool, caRegex); - yyless(0); - BEGIN(INITIAL); - return T_REGEX; -} -<> { - yylval.cpVal = apr_pstrdup(ssl_expr_info.pool, caRegex); - BEGIN(INITIAL); - return T_REGEX; -} - - /* - * Operators - */ -"eq" { return T_OP_EQ; } -"==" { return T_OP_EQ; } -"ne" { return T_OP_NE; } -"!=" { return T_OP_NE; } -"lt" { return T_OP_LT; } -"<" { return T_OP_LT; } -"le" { return T_OP_LE; } -"<=" { return T_OP_LE; } -"gt" { return T_OP_GT; } -">" { return T_OP_GT; } -"ge" { return T_OP_GE; } -">=" { return T_OP_GE; } -"=~" { return T_OP_REG; } -"!~" { return T_OP_NRE; } -"and" { return T_OP_AND; } -"&&" { return T_OP_AND; } -"or" { return T_OP_OR; } -"||" { return T_OP_OR; } -"not" { return T_OP_NOT; } -"!" { return T_OP_NOT; } -"in" { return T_OP_IN; } - - /* - * Functions - */ -"file" { return T_FUNC_FILE; } - - /* - * Specials - */ -"true" { return T_TRUE; } -"false" { return T_FALSE; } - - /* - * Digits - */ -[0-9]+ { - yylval.cpVal = apr_pstrdup(ssl_expr_info.pool, yytext); - return T_DIGIT; -} - - /* - * Identifiers - */ -[a-zA-Z][a-zA-Z0-9_:-]* { - yylval.cpVal = apr_pstrdup(ssl_expr_info.pool, yytext); - return T_ID; -} - - /* - * Anything else is returned as is... - */ -.|\n { - return yytext[0]; -} - -%% - -int yyinput(char *buf, int max_size) -{ - int n; - - if ((n = MIN(max_size, ssl_expr_info.inputbuf - + ssl_expr_info.inputlen - - ssl_expr_info.inputptr)) <= 0) - return YY_NULL; - memcpy(buf, ssl_expr_info.inputptr, n); - ssl_expr_info.inputptr += n; - return n; -} - diff --git a/trunk/modules/ssl/ssl_private.h b/trunk/modules/ssl/ssl_private.h deleted file mode 100644 index 71db2d1fd5eff73b0a7c7c2deb4aa721f62c95f0..0000000000000000000000000000000000000000 --- a/trunk/modules/ssl/ssl_private.h +++ /dev/null @@ -1,649 +0,0 @@ -/* Copyright 2001-2005 The Apache Software Foundation or its licensors, as - * applicable. - * - * 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. - */ - -#ifndef SSL_PRIVATE_H -#define SSL_PRIVATE_H - -/* - * Internal interfaces private to mod_ssl. - */ - -/* Apache headers */ -#include "httpd.h" -#include "http_config.h" -#include "http_core.h" -#include "http_log.h" -#include "http_main.h" -#include "http_connection.h" -#include "http_request.h" -#include "http_protocol.h" -#include "util_script.h" -#include "util_filter.h" -#include "util_ebcdic.h" -#include "mpm.h" -#include "apr.h" -#include "apr_strings.h" -#define APR_WANT_STRFUNC -#include "apr_want.h" -#include "apr_tables.h" -#include "apr_lib.h" -#include "apr_fnmatch.h" -#include "apr_strings.h" -#include "apr_dbm.h" -#include "apr_rmm.h" -#include "apr_shm.h" -#include "apr_global_mutex.h" -#include "apr_optional.h" - -#define MOD_SSL_VERSION AP_SERVER_BASEREVISION - -/* mod_ssl headers */ -#include "ssl_toolkit_compat.h" -#include "ssl_expr.h" -#include "ssl_util_ssl.h" - -/* The #ifdef macros are only defined AFTER including the above - * therefore we cannot include these system files at the top :-( - */ -#if APR_HAVE_SYS_TIME_H -#include -#endif -#if APR_HAVE_UNISTD_H -#include /* needed for STDIN_FILENO et.al., at least on FreeBSD */ -#endif - -/* - * Provide reasonable default for some defines - */ -#ifndef FALSE -#define FALSE (0) -#endif -#ifndef TRUE -#define TRUE (!FALSE) -#endif -#ifndef PFALSE -#define PFALSE ((void *)FALSE) -#endif -#ifndef PTRUE -#define PTRUE ((void *)TRUE) -#endif -#ifndef UNSET -#define UNSET (-1) -#endif -#ifndef NUL -#define NUL '\0' -#endif -#ifndef RAND_MAX -#include -#define RAND_MAX INT_MAX -#endif - -/* - * Provide reasonable defines for some types - */ -#ifndef BOOL -#define BOOL unsigned int -#endif -#ifndef UCHAR -#define UCHAR unsigned char -#endif - -/* - * Provide useful shorthands - */ -#define strEQ(s1,s2) (strcmp(s1,s2) == 0) -#define strNE(s1,s2) (strcmp(s1,s2) != 0) -#define strEQn(s1,s2,n) (strncmp(s1,s2,n) == 0) -#define strNEn(s1,s2,n) (strncmp(s1,s2,n) != 0) - -#define strcEQ(s1,s2) (strcasecmp(s1,s2) == 0) -#define strcNE(s1,s2) (strcasecmp(s1,s2) != 0) -#define strcEQn(s1,s2,n) (strncasecmp(s1,s2,n) == 0) -#define strcNEn(s1,s2,n) (strncasecmp(s1,s2,n) != 0) - -#define strIsEmpty(s) (s == NULL || s[0] == NUL) - -#define myConnConfig(c) \ -(SSLConnRec *)ap_get_module_config(c->conn_config, &ssl_module) -#define myCtxConfig(sslconn, sc) (sslconn->is_proxy ? sc->proxy : sc->server) -#define myConnConfigSet(c, val) \ -ap_set_module_config(c->conn_config, &ssl_module, val) -#define mySrvConfig(srv) (SSLSrvConfigRec *)ap_get_module_config(srv->module_config, &ssl_module) -#define myDirConfig(req) (SSLDirConfigRec *)ap_get_module_config(req->per_dir_config, &ssl_module) -#define myModConfig(srv) (mySrvConfig((srv)))->mc - -#define myCtxVarSet(mc,num,val) mc->rCtx.pV##num = val -#define myCtxVarGet(mc,num,type) (type)(mc->rCtx.pV##num) - -/* - * Defaults for the configuration - */ -#ifndef SSL_SESSION_CACHE_TIMEOUT -#define SSL_SESSION_CACHE_TIMEOUT 300 -#endif - -/* - * Support for MM library - */ -#define SSL_MM_FILE_MODE ( APR_UREAD | APR_UWRITE | APR_GREAD | APR_WREAD ) - -/* - * Support for DBM library - */ -#define SSL_DBM_FILE_MODE ( APR_UREAD | APR_UWRITE | APR_GREAD | APR_WREAD ) - -#if !defined(SSL_DBM_FILE_SUFFIX_DIR) && !defined(SSL_DBM_FILE_SUFFIX_PAG) -#if defined(DBM_SUFFIX) -#define SSL_DBM_FILE_SUFFIX_DIR DBM_SUFFIX -#define SSL_DBM_FILE_SUFFIX_PAG DBM_SUFFIX -#elif defined(__FreeBSD__) || (defined(DB_LOCK) && defined(DB_SHMEM)) -#define SSL_DBM_FILE_SUFFIX_DIR ".db" -#define SSL_DBM_FILE_SUFFIX_PAG ".db" -#else -#define SSL_DBM_FILE_SUFFIX_DIR ".dir" -#define SSL_DBM_FILE_SUFFIX_PAG ".pag" -#endif -#endif - -/* - * Define the certificate algorithm types - */ - -typedef int ssl_algo_t; - -#define SSL_ALGO_UNKNOWN (0) -#define SSL_ALGO_RSA (1<<0) -#define SSL_ALGO_DSA (1<<1) -#define SSL_ALGO_ALL (SSL_ALGO_RSA|SSL_ALGO_DSA) - -#define SSL_AIDX_RSA (0) -#define SSL_AIDX_DSA (1) -#define SSL_AIDX_MAX (2) - - -/* - * Define IDs for the temporary RSA keys and DH params - */ - -#define SSL_TMP_KEY_RSA_512 (0) -#define SSL_TMP_KEY_RSA_1024 (1) -#define SSL_TMP_KEY_DH_512 (2) -#define SSL_TMP_KEY_DH_1024 (3) -#define SSL_TMP_KEY_MAX (4) - -/* - * Define the SSL options - */ -#define SSL_OPT_NONE (0) -#define SSL_OPT_RELSET (1<<0) -#define SSL_OPT_STDENVVARS (1<<1) -#define SSL_OPT_EXPORTCERTDATA (1<<3) -#define SSL_OPT_FAKEBASICAUTH (1<<4) -#define SSL_OPT_STRICTREQUIRE (1<<5) -#define SSL_OPT_OPTRENEGOTIATE (1<<6) -#define SSL_OPT_ALL (SSL_OPT_STDENVVARS|SSL_OPT_EXPORTCERTDATA|SSL_OPT_FAKEBASICAUTH|SSL_OPT_STRICTREQUIRE|SSL_OPT_OPTRENEGOTIATE) -typedef int ssl_opt_t; - -/* - * Define the SSL Protocol options - */ -#define SSL_PROTOCOL_NONE (0) -#define SSL_PROTOCOL_SSLV2 (1<<0) -#define SSL_PROTOCOL_SSLV3 (1<<1) -#define SSL_PROTOCOL_TLSV1 (1<<2) -#define SSL_PROTOCOL_ALL (SSL_PROTOCOL_SSLV2|SSL_PROTOCOL_SSLV3|SSL_PROTOCOL_TLSV1) -typedef int ssl_proto_t; - -/* - * Define the SSL verify levels - */ -typedef enum { - SSL_CVERIFY_UNSET = UNSET, - SSL_CVERIFY_NONE = 0, - SSL_CVERIFY_OPTIONAL = 1, - SSL_CVERIFY_REQUIRE = 2, - SSL_CVERIFY_OPTIONAL_NO_CA = 3 -} ssl_verify_t; - -#define SSL_VERIFY_PEER_STRICT \ - (SSL_VERIFY_PEER|SSL_VERIFY_FAIL_IF_NO_PEER_CERT) - -#ifndef X509_V_ERR_CERT_UNTRUSTED -#define X509_V_ERR_CERT_UNTRUSTED 27 -#endif - -#define ssl_verify_error_is_optional(errnum) \ - ((errnum == X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT) \ - || (errnum == X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN) \ - || (errnum == X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY) \ - || (errnum == X509_V_ERR_CERT_UNTRUSTED) \ - || (errnum == X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE)) - -/* - * Define the SSL pass phrase dialog types - */ -typedef enum { - SSL_PPTYPE_UNSET = UNSET, - SSL_PPTYPE_BUILTIN = 0, - SSL_PPTYPE_FILTER = 1, - SSL_PPTYPE_PIPE = 2 -} ssl_pphrase_t; - -/* - * Define the Path Checking modes - */ -#define SSL_PCM_EXISTS 1 -#define SSL_PCM_ISREG 2 -#define SSL_PCM_ISDIR 4 -#define SSL_PCM_ISNONZERO 8 -typedef unsigned int ssl_pathcheck_t; - -/* - * Define the SSL session cache modes and structures - */ -typedef enum { - SSL_SCMODE_UNSET = UNSET, - SSL_SCMODE_NONE = 0, - SSL_SCMODE_DBM = 1, - SSL_SCMODE_SHMCB = 3, - SSL_SCMODE_DC = 4 -} ssl_scmode_t; - -/* - * Define the SSL mutex modes - */ -typedef enum { - SSL_MUTEXMODE_UNSET = UNSET, - SSL_MUTEXMODE_NONE = 0, - SSL_MUTEXMODE_USED = 1 -} ssl_mutexmode_t; - -/* - * Define the SSL enabled state - */ -typedef enum { - SSL_ENABLED_UNSET = UNSET, - SSL_ENABLED_FALSE = 0, - SSL_ENABLED_TRUE = 1, - SSL_ENABLED_OPTIONAL = 3 -} ssl_enabled_t; - -/* - * Define the SSL requirement structure - */ -typedef struct { - char *cpExpr; - ssl_expr *mpExpr; -} ssl_require_t; - -/* - * Define the SSL random number generator seeding source - */ -typedef enum { - SSL_RSCTX_STARTUP = 1, - SSL_RSCTX_CONNECT = 2 -} ssl_rsctx_t; -typedef enum { - SSL_RSSRC_BUILTIN = 1, - SSL_RSSRC_FILE = 2, - SSL_RSSRC_EXEC = 3, - SSL_RSSRC_EGD = 4 -} ssl_rssrc_t; -typedef struct { - ssl_rsctx_t nCtx; - ssl_rssrc_t nSrc; - char *cpPath; - int nBytes; -} ssl_randseed_t; - -/* - * Define the structure of an ASN.1 anything - */ -typedef struct { - long int nData; - unsigned char *cpData; - apr_time_t source_mtime; -} ssl_asn1_t; - -/* - * Define the mod_ssl per-module configuration structure - * (i.e. the global configuration for each httpd process) - */ - -typedef enum { - SSL_SHUTDOWN_TYPE_UNSET, - SSL_SHUTDOWN_TYPE_STANDARD, - SSL_SHUTDOWN_TYPE_UNCLEAN, - SSL_SHUTDOWN_TYPE_ACCURATE -} ssl_shutdown_type_e; - -typedef struct { - SSL *ssl; - const char *client_dn; - X509 *client_cert; - ssl_shutdown_type_e shutdown_type; - const char *verify_info; - const char *verify_error; - int verify_depth; - int is_proxy; - int disabled; - int non_ssl_request; -} SSLConnRec; - -typedef struct { - pid_t pid; - apr_pool_t *pPool; - BOOL bFixed; - int nSessionCacheMode; - char *szSessionCacheDataFile; - int nSessionCacheDataSize; - apr_shm_t *pSessionCacheDataMM; - apr_rmm_t *pSessionCacheDataRMM; - void *tSessionCacheDataTable; - ssl_mutexmode_t nMutexMode; - apr_lockmech_e nMutexMech; - const char *szMutexFile; - apr_global_mutex_t *pMutex; - apr_array_header_t *aRandSeed; - apr_hash_t *tVHostKeys; - void *pTmpKeys[SSL_TMP_KEY_MAX]; - apr_hash_t *tPublicCert; - apr_hash_t *tPrivateKey; -#if defined(HAVE_OPENSSL_ENGINE_H) && defined(HAVE_ENGINE_INIT) - const char *szCryptoDevice; -#endif - struct { - void *pV1, *pV2, *pV3, *pV4, *pV5, *pV6, *pV7, *pV8, *pV9, *pV10; - } rCtx; -} SSLModConfigRec; - -/* public cert/private key */ -typedef struct { - /* - * server only has 1-2 certs/keys - * 1 RSA and/or 1 DSA - */ - const char *cert_files[SSL_AIDX_MAX]; - const char *key_files[SSL_AIDX_MAX]; - X509 *certs[SSL_AIDX_MAX]; - EVP_PKEY *keys[SSL_AIDX_MAX]; - - /* Certificates which specify the set of CA names which should be - * sent in the CertificateRequest message: */ - const char *ca_name_path; - const char *ca_name_file; -} modssl_pk_server_t; - -typedef struct { - /* proxy can have any number of cert/key pairs */ - const char *cert_file; - const char *cert_path; - STACK_OF(X509_INFO) *certs; -} modssl_pk_proxy_t; - -/* stuff related to authentication that can also be per-dir */ -typedef struct { - /* known/trusted CAs */ - const char *ca_cert_path; - const char *ca_cert_file; - - const char *cipher_suite; - - /* for client or downstream server authentication */ - int verify_depth; - ssl_verify_t verify_mode; -} modssl_auth_ctx_t; - -typedef struct SSLSrvConfigRec SSLSrvConfigRec; - -typedef struct { - SSLSrvConfigRec *sc; /* pointer back to server config */ - SSL_CTX *ssl_ctx; - - /* we are one or the other */ - modssl_pk_server_t *pks; - modssl_pk_proxy_t *pkp; - - ssl_proto_t protocol; - - /* config for handling encrypted keys */ - ssl_pphrase_t pphrase_dialog_type; - const char *pphrase_dialog_path; - - const char *cert_chain; - - /* certificate revocation list */ - const char *crl_path; - const char *crl_file; - X509_STORE *crl; - - modssl_auth_ctx_t auth; -} modssl_ctx_t; - -struct SSLSrvConfigRec { - SSLModConfigRec *mc; - ssl_enabled_t enabled; - BOOL proxy_enabled; - const char *vhost_id; - int vhost_id_len; - int session_cache_timeout; - BOOL cipher_server_pref; - modssl_ctx_t *server; - modssl_ctx_t *proxy; -}; - -/* - * Define the mod_ssl per-directory configuration structure - * (i.e. the local configuration for all - * and .htaccess contexts) - */ -typedef struct { - BOOL bSSLRequired; - apr_array_header_t *aRequirement; - ssl_opt_t nOptions; - ssl_opt_t nOptionsAdd; - ssl_opt_t nOptionsDel; - const char *szCipherSuite; - ssl_verify_t nVerifyClient; - int nVerifyDepth; - const char *szCACertificatePath; - const char *szCACertificateFile; - const char *szUserName; -} SSLDirConfigRec; - -/* - * function prototypes - */ - -/* API glue structures */ -extern module AP_MODULE_DECLARE_DATA ssl_module; - -/* "global" stuff */ -extern const char ssl_valid_ssl_mutex_string[]; - -/* configuration handling */ -SSLModConfigRec *ssl_config_global_create(server_rec *); -void ssl_config_global_fix(SSLModConfigRec *); -BOOL ssl_config_global_isfixed(SSLModConfigRec *); -void *ssl_config_server_create(apr_pool_t *, server_rec *); -void *ssl_config_server_merge(apr_pool_t *, void *, void *); -void *ssl_config_perdir_create(apr_pool_t *, char *); -void *ssl_config_perdir_merge(apr_pool_t *, void *, void *); -const char *ssl_cmd_SSLMutex(cmd_parms *, void *, const char *); -const char *ssl_cmd_SSLPassPhraseDialog(cmd_parms *, void *, const char *); -const char *ssl_cmd_SSLCryptoDevice(cmd_parms *, void *, const char *); -const char *ssl_cmd_SSLRandomSeed(cmd_parms *, void *, const char *, const char *, const char *); -const char *ssl_cmd_SSLEngine(cmd_parms *, void *, const char *); -const char *ssl_cmd_SSLCipherSuite(cmd_parms *, void *, const char *); -const char *ssl_cmd_SSLCertificateFile(cmd_parms *, void *, const char *); -const char *ssl_cmd_SSLCertificateKeyFile(cmd_parms *, void *, const char *); -const char *ssl_cmd_SSLCertificateChainFile(cmd_parms *, void *, const char *); -const char *ssl_cmd_SSLCACertificatePath(cmd_parms *, void *, const char *); -const char *ssl_cmd_SSLCACertificateFile(cmd_parms *, void *, const char *); -const char *ssl_cmd_SSLCADNRequestPath(cmd_parms *, void *, const char *); -const char *ssl_cmd_SSLCADNRequestFile(cmd_parms *, void *, const char *); -const char *ssl_cmd_SSLCARevocationPath(cmd_parms *, void *, const char *); -const char *ssl_cmd_SSLCARevocationFile(cmd_parms *, void *, const char *); -const char *ssl_cmd_SSLHonorCipherOrder(cmd_parms *cmd, void *dcfg, int flag); -const char *ssl_cmd_SSLVerifyClient(cmd_parms *, void *, const char *); -const char *ssl_cmd_SSLVerifyDepth(cmd_parms *, void *, const char *); -const char *ssl_cmd_SSLSessionCache(cmd_parms *, void *, const char *); -const char *ssl_cmd_SSLSessionCacheTimeout(cmd_parms *, void *, const char *); -const char *ssl_cmd_SSLProtocol(cmd_parms *, void *, const char *); -const char *ssl_cmd_SSLOptions(cmd_parms *, void *, const char *); -const char *ssl_cmd_SSLRequireSSL(cmd_parms *, void *); -const char *ssl_cmd_SSLRequire(cmd_parms *, void *, const char *); -const char *ssl_cmd_SSLUserName(cmd_parms *, void *, const char *); - -const char *ssl_cmd_SSLProxyEngine(cmd_parms *cmd, void *dcfg, int flag); -const char *ssl_cmd_SSLProxyProtocol(cmd_parms *, void *, const char *); -const char *ssl_cmd_SSLProxyCipherSuite(cmd_parms *, void *, const char *); -const char *ssl_cmd_SSLProxyVerify(cmd_parms *, void *, const char *); -const char *ssl_cmd_SSLProxyVerifyDepth(cmd_parms *, void *, const char *); -const char *ssl_cmd_SSLProxyCACertificatePath(cmd_parms *, void *, const char *); -const char *ssl_cmd_SSLProxyCACertificateFile(cmd_parms *, void *, const char *); -const char *ssl_cmd_SSLProxyCARevocationPath(cmd_parms *, void *, const char *); -const char *ssl_cmd_SSLProxyCARevocationFile(cmd_parms *, void *, const char *); -const char *ssl_cmd_SSLProxyMachineCertificatePath(cmd_parms *, void *, const char *); -const char *ssl_cmd_SSLProxyMachineCertificateFile(cmd_parms *, void *, const char *); - -/* module initialization */ -int ssl_init_Module(apr_pool_t *, apr_pool_t *, apr_pool_t *, server_rec *); -void ssl_init_Engine(server_rec *, apr_pool_t *); -void ssl_init_ConfigureServer(server_rec *, apr_pool_t *, apr_pool_t *, SSLSrvConfigRec *); -void ssl_init_CheckServers(server_rec *, apr_pool_t *); -STACK_OF(X509_NAME) - *ssl_init_FindCAList(server_rec *, apr_pool_t *, const char *, const char *); -void ssl_init_Child(apr_pool_t *, server_rec *); -apr_status_t ssl_init_ModuleKill(void *data); - -/* Apache API hooks */ -int ssl_hook_Auth(request_rec *); -int ssl_hook_UserCheck(request_rec *); -int ssl_hook_Access(request_rec *); -int ssl_hook_Fixup(request_rec *); -int ssl_hook_ReadReq(request_rec *); -int ssl_hook_Upgrade(request_rec *); -void ssl_hook_ConfigTest(apr_pool_t *pconf, server_rec *s); - -/* OpenSSL callbacks */ -RSA *ssl_callback_TmpRSA(SSL *, int, int); -DH *ssl_callback_TmpDH(SSL *, int, int); -int ssl_callback_SSLVerify(int, X509_STORE_CTX *); -int ssl_callback_SSLVerify_CRL(int, X509_STORE_CTX *, conn_rec *); -int ssl_callback_proxy_cert(SSL *ssl, MODSSL_CLIENT_CERT_CB_ARG_TYPE **x509, EVP_PKEY **pkey); -int ssl_callback_NewSessionCacheEntry(SSL *, SSL_SESSION *); -SSL_SESSION *ssl_callback_GetSessionCacheEntry(SSL *, unsigned char *, int, int *); -void ssl_callback_DelSessionCacheEntry(SSL_CTX *, SSL_SESSION *); -void ssl_callback_LogTracingState(MODSSL_INFO_CB_ARG_TYPE, int, int); - -/* Session Cache Support */ -void ssl_scache_init(server_rec *, apr_pool_t *); -void ssl_scache_status_register(apr_pool_t *p); -void ssl_scache_kill(server_rec *); -BOOL ssl_scache_store(server_rec *, UCHAR *, int, time_t, SSL_SESSION *); -SSL_SESSION *ssl_scache_retrieve(server_rec *, UCHAR *, int); -void ssl_scache_remove(server_rec *, UCHAR *, int); - -char *ssl_scache_id2sz(UCHAR *, int); -void ssl_scache_dbm_init(server_rec *, apr_pool_t *); -void ssl_scache_dbm_kill(server_rec *); -BOOL ssl_scache_dbm_store(server_rec *, UCHAR *, int, time_t, SSL_SESSION *); -SSL_SESSION *ssl_scache_dbm_retrieve(server_rec *, UCHAR *, int); -void ssl_scache_dbm_remove(server_rec *, UCHAR *, int); -void ssl_scache_dbm_status(request_rec *r, int flags, apr_pool_t *pool); - -void ssl_scache_shmcb_init(server_rec *, apr_pool_t *); -void ssl_scache_shmcb_kill(server_rec *); -BOOL ssl_scache_shmcb_store(server_rec *, UCHAR *, int, time_t, SSL_SESSION *); -SSL_SESSION *ssl_scache_shmcb_retrieve(server_rec *, UCHAR *, int); -void ssl_scache_shmcb_remove(server_rec *, UCHAR *, int); -void ssl_scache_shmcb_status(request_rec *r, int flags, apr_pool_t *pool); - -void ssl_scache_dc_init(server_rec *, apr_pool_t *); -void ssl_scache_dc_kill(server_rec *); -BOOL ssl_scache_dc_store(server_rec *, UCHAR *, int, time_t, SSL_SESSION *); -SSL_SESSION *ssl_scache_dc_retrieve(server_rec *, UCHAR *, int); -void ssl_scache_dc_remove(server_rec *, UCHAR *, int); -void ssl_scache_dc_status(request_rec *r, int flags, apr_pool_t *pool); - -/* Proxy Support */ -int ssl_proxy_enable(conn_rec *c); -int ssl_engine_disable(conn_rec *c); - -/* I/O */ -void ssl_io_filter_init(conn_rec *, SSL *); -void ssl_io_filter_register(apr_pool_t *); -long ssl_io_data_cb(BIO *, int, MODSSL_BIO_CB_ARG_TYPE *, int, long, long); - -/* PRNG */ -int ssl_rand_seed(server_rec *, apr_pool_t *, ssl_rsctx_t, char *); - -/* Utility Functions */ -char *ssl_util_vhostid(apr_pool_t *, server_rec *); -apr_file_t *ssl_util_ppopen(server_rec *, apr_pool_t *, const char *, - const char * const *); -void ssl_util_ppclose(server_rec *, apr_pool_t *, apr_file_t *); -char *ssl_util_readfilter(server_rec *, apr_pool_t *, const char *, - const char * const *); -BOOL ssl_util_path_check(ssl_pathcheck_t, const char *, apr_pool_t *); -ssl_algo_t ssl_util_algotypeof(X509 *, EVP_PKEY *); -char *ssl_util_algotypestr(ssl_algo_t); -void ssl_util_thread_setup(apr_pool_t *); -int ssl_init_ssl_connection(conn_rec *c); - -/* Pass Phrase Support */ -void ssl_pphrase_Handle(server_rec *, apr_pool_t *); - -/* Diffie-Hellman Parameter Support */ -DH *ssl_dh_GetTmpParam(int); -DH *ssl_dh_GetParamFromFile(char *); - -unsigned char *ssl_asn1_table_set(apr_hash_t *table, - const char *key, - long int length); - -ssl_asn1_t *ssl_asn1_table_get(apr_hash_t *table, - const char *key); - -void ssl_asn1_table_unset(apr_hash_t *table, - const char *key); - -const char *ssl_asn1_keystr(int keytype); - -const char *ssl_asn1_table_keyfmt(apr_pool_t *p, - const char *id, - int keytype); -/* Mutex Support */ -int ssl_mutex_init(server_rec *, apr_pool_t *); -int ssl_mutex_reinit(server_rec *, apr_pool_t *); -int ssl_mutex_on(server_rec *); -int ssl_mutex_off(server_rec *); - -/* Logfile Support */ -void ssl_die(void); -void ssl_log_ssl_error(const char *, int, int, server_rec *); - -/* Variables */ -void ssl_var_register(void); -char *ssl_var_lookup(apr_pool_t *, server_rec *, conn_rec *, request_rec *, char *); -const char *ssl_ext_lookup(apr_pool_t *p, conn_rec *c, int peer, const char *oid); - -void ssl_var_log_config_register(apr_pool_t *p); - -#define APR_SHM_MAXSIZE (64 * 1024 * 1024) - -#endif /* SSL_PRIVATE_H */ diff --git a/trunk/modules/ssl/ssl_scache.c b/trunk/modules/ssl/ssl_scache.c deleted file mode 100644 index 877dc0779d355e4cdb5be92b71294f69898b0d3f..0000000000000000000000000000000000000000 --- a/trunk/modules/ssl/ssl_scache.c +++ /dev/null @@ -1,176 +0,0 @@ -/* Copyright 2001-2005 The Apache Software Foundation or its licensors, as - * applicable. - * - * 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_ssl - * | '_ ` _ \ / _ \ / _` | / __/ __| | Apache Interface to OpenSSL - * | | | | | | (_) | (_| | \__ \__ \ | - * |_| |_| |_|\___/ \__,_|___|___/___/_| - * |_____| - * ssl_scache.c - * Session Cache Abstraction - */ - /* ``Open-Source Software: generous - programmers from around the world all - join forces to help you shoot - yourself in the foot for free.'' - -- Unknown */ -#include "ssl_private.h" -#include "mod_status.h" - -/* _________________________________________________________________ -** -** Session Cache: Common Abstraction Layer -** _________________________________________________________________ -*/ - -void ssl_scache_init(server_rec *s, apr_pool_t *p) -{ - SSLModConfigRec *mc = myModConfig(s); - - /* - * Warn the user that he should use the session cache. - * But we can operate without it, of course. - */ - if (mc->nSessionCacheMode == SSL_SCMODE_UNSET) { - ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s, - "Init: Session Cache is not configured " - "[hint: SSLSessionCache]"); - mc->nSessionCacheMode = SSL_SCMODE_NONE; - return; - } - - if (mc->nSessionCacheMode == SSL_SCMODE_DBM) - ssl_scache_dbm_init(s, p); -#ifdef HAVE_DISTCACHE - else if (mc->nSessionCacheMode == SSL_SCMODE_DC) - ssl_scache_dc_init(s, p); -#endif - else if (mc->nSessionCacheMode == SSL_SCMODE_SHMCB) { - void *data; - const char *userdata_key = "ssl_scache_init"; - - apr_pool_userdata_get(&data, userdata_key, s->process->pool); - if (!data) { - apr_pool_userdata_set((const void *)1, userdata_key, - apr_pool_cleanup_null, s->process->pool); - return; - } - ssl_scache_shmcb_init(s, p); - } -} - -void ssl_scache_kill(server_rec *s) -{ - SSLModConfigRec *mc = myModConfig(s); - - if (mc->nSessionCacheMode == SSL_SCMODE_DBM) - ssl_scache_dbm_kill(s); - else if (mc->nSessionCacheMode == SSL_SCMODE_SHMCB) - ssl_scache_shmcb_kill(s); -#ifdef HAVE_DISTCACHE - else if (mc->nSessionCacheMode == SSL_SCMODE_DC) - ssl_scache_dc_kill(s); -#endif - return; -} - -BOOL ssl_scache_store(server_rec *s, UCHAR *id, int idlen, time_t expiry, SSL_SESSION *sess) -{ - SSLModConfigRec *mc = myModConfig(s); - BOOL rv = FALSE; - - if (mc->nSessionCacheMode == SSL_SCMODE_DBM) - rv = ssl_scache_dbm_store(s, id, idlen, expiry, sess); - else if (mc->nSessionCacheMode == SSL_SCMODE_SHMCB) - rv = ssl_scache_shmcb_store(s, id, idlen, expiry, sess); -#ifdef HAVE_DISTCACHE - else if (mc->nSessionCacheMode == SSL_SCMODE_DC) - rv = ssl_scache_dc_store(s, id, idlen, expiry, sess); -#endif - return rv; -} - -SSL_SESSION *ssl_scache_retrieve(server_rec *s, UCHAR *id, int idlen) -{ - SSLModConfigRec *mc = myModConfig(s); - SSL_SESSION *sess = NULL; - - if (mc->nSessionCacheMode == SSL_SCMODE_DBM) - sess = ssl_scache_dbm_retrieve(s, id, idlen); - else if (mc->nSessionCacheMode == SSL_SCMODE_SHMCB) - sess = ssl_scache_shmcb_retrieve(s, id, idlen); -#ifdef HAVE_DISTCACHE - else if (mc->nSessionCacheMode == SSL_SCMODE_DC) - sess = ssl_scache_dc_retrieve(s, id, idlen); -#endif - return sess; -} - -void ssl_scache_remove(server_rec *s, UCHAR *id, int idlen) -{ - SSLModConfigRec *mc = myModConfig(s); - - if (mc->nSessionCacheMode == SSL_SCMODE_DBM) - ssl_scache_dbm_remove(s, id, idlen); - else if (mc->nSessionCacheMode == SSL_SCMODE_SHMCB) - ssl_scache_shmcb_remove(s, id, idlen); -#ifdef HAVE_DISTCACHE - else if (mc->nSessionCacheMode == SSL_SCMODE_DC) - ssl_scache_dc_remove(s, id, idlen); -#endif - return; -} - -/* _________________________________________________________________ -** -** SSL Extension to mod_status -** _________________________________________________________________ -*/ -static int ssl_ext_status_hook(request_rec *r, int flags) -{ - SSLSrvConfigRec *sc = mySrvConfig(r->server); - - if (sc == NULL || flags & AP_STATUS_SHORT) - return OK; - - ap_rputs("
\n", r); - ap_rputs("\n", r); - ap_rputs("\n", r); - ap_rputs("\n", r); - ap_rputs("
\n", r); - ap_rputs("SSL/TLS Session Cache Status:\r", r); - ap_rputs("
\n", r); - - if (sc->mc->nSessionCacheMode == SSL_SCMODE_DBM) - ssl_scache_dbm_status(r, flags, r->pool); - else if (sc->mc->nSessionCacheMode == SSL_SCMODE_SHMCB) - ssl_scache_shmcb_status(r, flags, r->pool); -#ifdef HAVE_DISTCACHE - else if (sc->mc->nSessionCacheMode == SSL_SCMODE_DC) - ssl_scache_dc_status(r, flags, r->pool); -#endif - - ap_rputs("
\n", r); - return OK; -} - -void ssl_scache_status_register(apr_pool_t *p) -{ - APR_OPTIONAL_HOOK(ap, status_hook, ssl_ext_status_hook, NULL, NULL, - APR_HOOK_MIDDLE); -} - diff --git a/trunk/modules/ssl/ssl_scache_dbm.c b/trunk/modules/ssl/ssl_scache_dbm.c deleted file mode 100644 index aa345b5711d34effd50519a9800b4c0b617532d7..0000000000000000000000000000000000000000 --- a/trunk/modules/ssl/ssl_scache_dbm.c +++ /dev/null @@ -1,463 +0,0 @@ -/* Copyright 2001-2005 The Apache Software Foundation or its licensors, as - * applicable. - * - * 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_ssl - * | '_ ` _ \ / _ \ / _` | / __/ __| | Apache Interface to OpenSSL - * | | | | | | (_) | (_| | \__ \__ \ | - * |_| |_| |_|\___/ \__,_|___|___/___/_| - * |_____| - * ssl_scache_dbm.c - * Session Cache via DBM - */ - -#include "ssl_private.h" - -static void ssl_scache_dbm_expire(server_rec *s); - -void ssl_scache_dbm_init(server_rec *s, apr_pool_t *p) -{ - SSLModConfigRec *mc = myModConfig(s); - apr_dbm_t *dbm; - apr_status_t rv; - - /* for the DBM we need the data file */ - if (mc->szSessionCacheDataFile == NULL) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, - "SSLSessionCache required"); - ssl_die(); - } - - /* open it once to create it and to make sure it _can_ be created */ - ssl_mutex_on(s); - if ((rv = apr_dbm_open(&dbm, mc->szSessionCacheDataFile, - APR_DBM_RWCREATE, SSL_DBM_FILE_MODE, mc->pPool)) != APR_SUCCESS) { - ap_log_error(APLOG_MARK, APLOG_ERR, rv, s, - "Cannot create SSLSessionCache DBM file `%s'", - mc->szSessionCacheDataFile); - ssl_mutex_off(s); - return; - } - apr_dbm_close(dbm); - -#if !defined(OS2) && !defined(WIN32) && !defined(BEOS) && !defined(NETWARE) - /* - * We have to make sure the Apache child processes have access to - * the DBM file. But because there are brain-dead platforms where we - * cannot exactly determine the suffixes we try all possibilities. - */ - if (geteuid() == 0 /* is superuser */) { - chown(mc->szSessionCacheDataFile, unixd_config.user_id, -1 /* no gid change */); - if (chown(apr_pstrcat(p, mc->szSessionCacheDataFile, SSL_DBM_FILE_SUFFIX_DIR, NULL), - unixd_config.user_id, -1) == -1) { - if (chown(apr_pstrcat(p, mc->szSessionCacheDataFile, ".db", NULL), - unixd_config.user_id, -1) == -1) - chown(apr_pstrcat(p, mc->szSessionCacheDataFile, ".dir", NULL), - unixd_config.user_id, -1); - } - if (chown(apr_pstrcat(p, mc->szSessionCacheDataFile, SSL_DBM_FILE_SUFFIX_PAG, NULL), - unixd_config.user_id, -1) == -1) { - if (chown(apr_pstrcat(p, mc->szSessionCacheDataFile, ".db", NULL), - unixd_config.user_id, -1) == -1) - chown(apr_pstrcat(p, mc->szSessionCacheDataFile, ".pag", NULL), - unixd_config.user_id, -1); - } - } -#endif - ssl_mutex_off(s); - ssl_scache_dbm_expire(s); - return; -} - -void ssl_scache_dbm_kill(server_rec *s) -{ - SSLModConfigRec *mc = myModConfig(s); - apr_pool_t *p; - - apr_pool_create_ex(&p, mc->pPool, NULL, NULL); - if (p != NULL) { - /* the correct way */ - unlink(apr_pstrcat(p, mc->szSessionCacheDataFile, SSL_DBM_FILE_SUFFIX_DIR, NULL)); - unlink(apr_pstrcat(p, mc->szSessionCacheDataFile, SSL_DBM_FILE_SUFFIX_PAG, NULL)); - /* the additional ways to be sure */ - unlink(apr_pstrcat(p, mc->szSessionCacheDataFile, ".dir", NULL)); - unlink(apr_pstrcat(p, mc->szSessionCacheDataFile, ".pag", NULL)); - unlink(apr_pstrcat(p, mc->szSessionCacheDataFile, ".db", NULL)); - unlink(mc->szSessionCacheDataFile); - apr_pool_destroy(p); - } - return; -} - -BOOL ssl_scache_dbm_store(server_rec *s, UCHAR *id, int idlen, time_t expiry, SSL_SESSION *sess) -{ - SSLModConfigRec *mc = myModConfig(s); - apr_dbm_t *dbm; - apr_datum_t dbmkey; - apr_datum_t dbmval; - UCHAR ucaData[SSL_SESSION_MAX_DER]; - int nData; - UCHAR *ucp; - apr_status_t rv; - - /* streamline session data */ - if ((nData = i2d_SSL_SESSION(sess, NULL)) > sizeof(ucaData)) { - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "streamline session data size too large: %d > " - "%" APR_SIZE_T_FMT, - nData, sizeof(ucaData)); - return FALSE; - } - ucp = ucaData; - i2d_SSL_SESSION(sess, &ucp); - - /* be careful: do not try to store too much bytes in a DBM file! */ -#ifdef PAIRMAX - if ((idlen + nData) >= PAIRMAX) { - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "data size too large for DBM session cache: %d >= %d", - (idlen + nData), PAIRMAX); - return FALSE; - } -#else - if ((idlen + nData) >= 950 /* at least less than approx. 1KB */) { - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "data size too large for DBM session cache: %d >= %d", - (idlen + nData), 950); - return FALSE; - } -#endif - - /* create DBM key */ - dbmkey.dptr = (char *)id; - dbmkey.dsize = idlen; - - /* create DBM value */ - dbmval.dsize = sizeof(time_t) + nData; - dbmval.dptr = (char *)malloc(dbmval.dsize); - if (dbmval.dptr == NULL) { - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "malloc error creating DBM value"); - return FALSE; - } - memcpy((char *)dbmval.dptr, &expiry, sizeof(time_t)); - memcpy((char *)dbmval.dptr+sizeof(time_t), ucaData, nData); - - /* and store it to the DBM file */ - ssl_mutex_on(s); - if ((rv = apr_dbm_open(&dbm, mc->szSessionCacheDataFile, - APR_DBM_RWCREATE, SSL_DBM_FILE_MODE, mc->pPool)) != APR_SUCCESS) { - ap_log_error(APLOG_MARK, APLOG_ERR, rv, s, - "Cannot open SSLSessionCache DBM file `%s' for writing " - "(store)", - mc->szSessionCacheDataFile); - ssl_mutex_off(s); - free(dbmval.dptr); - return FALSE; - } - if ((rv = apr_dbm_store(dbm, dbmkey, dbmval)) != APR_SUCCESS) { - ap_log_error(APLOG_MARK, APLOG_ERR, rv, s, - "Cannot store SSL session to DBM file `%s'", - mc->szSessionCacheDataFile); - apr_dbm_close(dbm); - ssl_mutex_off(s); - free(dbmval.dptr); - return FALSE; - } - apr_dbm_close(dbm); - ssl_mutex_off(s); - - /* free temporary buffers */ - free(dbmval.dptr); - - /* allow the regular expiring to occur */ - ssl_scache_dbm_expire(s); - - return TRUE; -} - -SSL_SESSION *ssl_scache_dbm_retrieve(server_rec *s, UCHAR *id, int idlen) -{ - SSLModConfigRec *mc = myModConfig(s); - apr_dbm_t *dbm; - apr_datum_t dbmkey; - apr_datum_t dbmval; - SSL_SESSION *sess = NULL; - UCHAR *ucpData; - int nData; - time_t expiry; - time_t now; - apr_status_t rc; - - /* allow the regular expiring to occur */ - ssl_scache_dbm_expire(s); - - /* create DBM key and values */ - dbmkey.dptr = (char *)id; - dbmkey.dsize = idlen; - - /* and fetch it from the DBM file - * XXX: Should we open the dbm against r->pool so the cleanup will - * do the apr_dbm_close? This would make the code a bit cleaner. - */ - ssl_mutex_on(s); - if ((rc = apr_dbm_open(&dbm, mc->szSessionCacheDataFile, - APR_DBM_RWCREATE, SSL_DBM_FILE_MODE, mc->pPool)) != APR_SUCCESS) { - ap_log_error(APLOG_MARK, APLOG_ERR, rc, s, - "Cannot open SSLSessionCache DBM file `%s' for reading " - "(fetch)", - mc->szSessionCacheDataFile); - ssl_mutex_off(s); - return NULL; - } - rc = apr_dbm_fetch(dbm, dbmkey, &dbmval); - if (rc != APR_SUCCESS) { - apr_dbm_close(dbm); - ssl_mutex_off(s); - return NULL; - } - if (dbmval.dptr == NULL || dbmval.dsize <= sizeof(time_t)) { - apr_dbm_close(dbm); - ssl_mutex_off(s); - return NULL; - } - - /* parse resulting data */ - nData = dbmval.dsize-sizeof(time_t); - ucpData = (UCHAR *)malloc(nData); - if (ucpData == NULL) { - apr_dbm_close(dbm); - ssl_mutex_off(s); - return NULL; - } - memcpy(ucpData, (char *)dbmval.dptr+sizeof(time_t), nData); - memcpy(&expiry, dbmval.dptr, sizeof(time_t)); - - apr_dbm_close(dbm); - ssl_mutex_off(s); - - /* make sure the stuff is still not expired */ - now = time(NULL); - if (expiry <= now) { - ssl_scache_dbm_remove(s, id, idlen); - return NULL; - } - - /* unstreamed SSL_SESSION */ - sess = d2i_SSL_SESSION(NULL, &ucpData, nData); - - return sess; -} - -void ssl_scache_dbm_remove(server_rec *s, UCHAR *id, int idlen) -{ - SSLModConfigRec *mc = myModConfig(s); - apr_dbm_t *dbm; - apr_datum_t dbmkey; - apr_status_t rv; - - /* create DBM key and values */ - dbmkey.dptr = (char *)id; - dbmkey.dsize = idlen; - - /* and delete it from the DBM file */ - ssl_mutex_on(s); - if ((rv = apr_dbm_open(&dbm, mc->szSessionCacheDataFile, - APR_DBM_RWCREATE, SSL_DBM_FILE_MODE, mc->pPool)) != APR_SUCCESS) { - ap_log_error(APLOG_MARK, APLOG_ERR, rv, s, - "Cannot open SSLSessionCache DBM file `%s' for writing " - "(delete)", - mc->szSessionCacheDataFile); - ssl_mutex_off(s); - return; - } - apr_dbm_delete(dbm, dbmkey); - apr_dbm_close(dbm); - ssl_mutex_off(s); - - return; -} - -static void ssl_scache_dbm_expire(server_rec *s) -{ - SSLModConfigRec *mc = myModConfig(s); - SSLSrvConfigRec *sc = mySrvConfig(s); - static time_t tLast = 0; - apr_dbm_t *dbm; - apr_datum_t dbmkey; - apr_datum_t dbmval; - apr_pool_t *p; - time_t tExpiresAt; - int nElements = 0; - int nDeleted = 0; - int bDelete; - apr_datum_t *keylist; - int keyidx; - int i; - time_t tNow; - apr_status_t rv; - - /* - * make sure the expiration for still not-accessed session - * cache entries is done only from time to time - */ - tNow = time(NULL); - if (tNow < tLast+sc->session_cache_timeout) - return; - tLast = tNow; - - /* - * Here we have to be very carefully: Not all DBM libraries are - * smart enough to allow one to iterate over the elements and at the - * same time delete expired ones. Some of them get totally crazy - * while others have no problems. So we have to do it the slower but - * more safe way: we first iterate over all elements and remember - * those which have to be expired. Then in a second pass we delete - * all those expired elements. Additionally we reopen the DBM file - * to be really safe in state. - */ - -#define KEYMAX 1024 - - ssl_mutex_on(s); - for (;;) { - /* allocate the key array in a memory sub pool */ - apr_pool_create_ex(&p, mc->pPool, NULL, NULL); - if (p == NULL) - break; - if ((keylist = apr_palloc(p, sizeof(dbmkey)*KEYMAX)) == NULL) { - apr_pool_destroy(p); - break; - } - - /* pass 1: scan DBM database */ - keyidx = 0; - if ((rv = apr_dbm_open(&dbm, mc->szSessionCacheDataFile, - APR_DBM_RWCREATE,SSL_DBM_FILE_MODE, - p)) != APR_SUCCESS) { - ap_log_error(APLOG_MARK, APLOG_ERR, rv, s, - "Cannot open SSLSessionCache DBM file `%s' for " - "scanning", - mc->szSessionCacheDataFile); - apr_pool_destroy(p); - break; - } - apr_dbm_firstkey(dbm, &dbmkey); - while (dbmkey.dptr != NULL) { - nElements++; - bDelete = FALSE; - apr_dbm_fetch(dbm, dbmkey, &dbmval); - if (dbmval.dsize <= sizeof(time_t) || dbmval.dptr == NULL) - bDelete = TRUE; - else { - memcpy(&tExpiresAt, dbmval.dptr, sizeof(time_t)); - if (tExpiresAt <= tNow) - bDelete = TRUE; - } - if (bDelete) { - if ((keylist[keyidx].dptr = apr_palloc(p, dbmkey.dsize)) != NULL) { - memcpy(keylist[keyidx].dptr, dbmkey.dptr, dbmkey.dsize); - keylist[keyidx].dsize = dbmkey.dsize; - keyidx++; - if (keyidx == KEYMAX) - break; - } - } - apr_dbm_nextkey(dbm, &dbmkey); - } - apr_dbm_close(dbm); - - /* pass 2: delete expired elements */ - if (apr_dbm_open(&dbm, mc->szSessionCacheDataFile, - APR_DBM_RWCREATE,SSL_DBM_FILE_MODE, p) != APR_SUCCESS) { - ap_log_error(APLOG_MARK, APLOG_ERR, rv, s, - "Cannot re-open SSLSessionCache DBM file `%s' for " - "expiring", - mc->szSessionCacheDataFile); - apr_pool_destroy(p); - break; - } - for (i = 0; i < keyidx; i++) { - apr_dbm_delete(dbm, keylist[i]); - nDeleted++; - } - apr_dbm_close(dbm); - - /* destroy temporary pool */ - apr_pool_destroy(p); - - if (keyidx < KEYMAX) - break; - } - ssl_mutex_off(s); - - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "Inter-Process Session Cache (DBM) Expiry: " - "old: %d, new: %d, removed: %d", - nElements, nElements-nDeleted, nDeleted); - return; -} - -void ssl_scache_dbm_status(request_rec *r, int flags, apr_pool_t *p) -{ - SSLModConfigRec *mc = myModConfig(r->server); - apr_dbm_t *dbm; - apr_datum_t dbmkey; - apr_datum_t dbmval; - int nElem; - int nSize; - int nAverage; - apr_status_t rv; - - nElem = 0; - nSize = 0; - ssl_mutex_on(r->server); - /* - * XXX - Check what pool is to be used - TBD - */ - if ((rv = apr_dbm_open(&dbm, mc->szSessionCacheDataFile, - APR_DBM_RWCREATE, SSL_DBM_FILE_MODE, - mc->pPool)) != APR_SUCCESS) { - ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, - "Cannot open SSLSessionCache DBM file `%s' for status " - "retrival", - mc->szSessionCacheDataFile); - ssl_mutex_off(r->server); - return; - } - /* - * XXX - Check the return value of apr_dbm_firstkey, apr_dbm_fetch - TBD - */ - apr_dbm_firstkey(dbm, &dbmkey); - for ( ; dbmkey.dptr != NULL; apr_dbm_nextkey(dbm, &dbmkey)) { - apr_dbm_fetch(dbm, dbmkey, &dbmval); - if (dbmval.dptr == NULL) - continue; - nElem += 1; - nSize += dbmval.dsize; - } - apr_dbm_close(dbm); - ssl_mutex_off(r->server); - if (nSize > 0 && nElem > 0) - nAverage = nSize / nElem; - else - nAverage = 0; - ap_rprintf(r, "cache type: DBM, maximum size: unlimited
"); - ap_rprintf(r, "current sessions: %d, current size: %d bytes
", nElem, nSize); - ap_rprintf(r, "average session size: %d bytes
", nAverage); - return; -} - diff --git a/trunk/modules/ssl/ssl_scache_dc.c b/trunk/modules/ssl/ssl_scache_dc.c deleted file mode 100644 index d8aa1eb2a9cdc6c73de446f3550083e0e354389c..0000000000000000000000000000000000000000 --- a/trunk/modules/ssl/ssl_scache_dc.c +++ /dev/null @@ -1,176 +0,0 @@ -/* 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_ssl - * | '_ ` _ \ / _ \ / _` | / __/ __| | Apache Interface to OpenSSL - * | | | | | | (_) | (_| | \__ \__ \ | - * |_| |_| |_|\___/ \__,_|___|___/___/_| - * |_____| - * ssl_scache_dc.c - * Distributed Session Cache (client support) - */ - -#include "ssl_private.h" - -/* Only build this code if it's enabled at configure-time. */ -#ifdef HAVE_DISTCACHE - -#include "distcache/dc_client.h" - -#if !defined(DISTCACHE_CLIENT_API) || (DISTCACHE_CLIENT_API < 0x0001) -#error "You must compile with a more recent version of the distcache-base package" -#endif - -/* - * This cache implementation allows modssl to access 'distcache' servers (or - * proxies) to facilitate distributed session caching. It is based on code - * released as open source by Cryptographic Appliances Inc, and was developed by - * Geoff Thorpe, Steve Robb, and Chris Zimmerman. - */ - -/* -** -** High-Level "handlers" as per ssl_scache.c -** -*/ - -void ssl_scache_dc_init(server_rec *s, apr_pool_t *p) -{ - DC_CTX *ctx; - SSLModConfigRec *mc = myModConfig(s); - /* - * Create a session context - */ - if (mc->szSessionCacheDataFile == NULL) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, "SSLSessionCache required"); - ssl_die(); - } -#if 0 - /* If a "persistent connection" mode of operation is preferred, you *must* - * also use the PIDCHECK flag to ensure fork()'d processes don't interlace - * comms on the same connection as each other. */ -#define SESSION_CTX_FLAGS SESSION_CTX_FLAG_PERSISTENT | \ - SESSION_CTX_FLAG_PERSISTENT_PIDCHECK | \ - SESSION_CTX_FLAG_PERSISTENT_RETRY | \ - SESSION_CTX_FLAG_PERSISTENT_LATE -#else - /* This mode of operation will open a temporary connection to the 'target' - * for each cache operation - this makes it safe against fork() - * automatically. This mode is preferred when running a local proxy (over - * unix domain sockets) because overhead is negligable and it reduces the - * performance/stability danger of file-descriptor bloatage. */ -#define SESSION_CTX_FLAGS 0 -#endif - ctx = DC_CTX_new(mc->szSessionCacheDataFile, SESSION_CTX_FLAGS); - if (!ctx) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, "distributed scache failed to obtain context"); - ssl_die(); - } - ap_log_error(APLOG_MARK, APLOG_INFO, 0, s, "distributed scache context initialised"); - /* - * Success ... - */ - mc->tSessionCacheDataTable = ctx; - return; -} - -void ssl_scache_dc_kill(server_rec *s) -{ - SSLModConfigRec *mc = myModConfig(s); - - if (mc->tSessionCacheDataTable) - DC_CTX_free(mc->tSessionCacheDataTable); - mc->tSessionCacheDataTable = NULL; -} - -BOOL ssl_scache_dc_store(server_rec *s, UCHAR *id, int idlen, - time_t timeout, SSL_SESSION * pSession) -{ - unsigned char der[SSL_SESSION_MAX_DER]; - int der_len; - unsigned char *pder = der; - SSLModConfigRec *mc = myModConfig(s); - DC_CTX *ctx = mc->tSessionCacheDataTable; - - /* Serialise the SSL_SESSION object */ - if ((der_len = i2d_SSL_SESSION(pSession, NULL)) > SSL_SESSION_MAX_DER) - return FALSE; - i2d_SSL_SESSION(pSession, &pder); - /* !@#$%^ - why do we deal with *absolute* time anyway??? */ - timeout -= time(NULL); - /* Send the serialised session to the distributed cache context */ - if (!DC_CTX_add_session(ctx, id, idlen, der, der_len, - (unsigned long)timeout * 1000)) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, "distributed scache 'add_session' failed"); - return FALSE; - } - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, "distributed scache 'add_session' successful"); - return TRUE; -} - -SSL_SESSION *ssl_scache_dc_retrieve(server_rec *s, UCHAR *id, int idlen) -{ - unsigned char der[SSL_SESSION_MAX_DER]; - unsigned int der_len; - SSL_SESSION *pSession; - unsigned char *pder = der; - SSLModConfigRec *mc = myModConfig(s); - DC_CTX *ctx = mc->tSessionCacheDataTable; - - /* Retrieve any corresponding session from the distributed cache context */ - if (!DC_CTX_get_session(ctx, id, idlen, der, SSL_SESSION_MAX_DER, - &der_len)) { - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, "distributed scache 'get_session' MISS"); - return NULL; - } - if (der_len > SSL_SESSION_MAX_DER) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, "distributed scache 'get_session' OVERFLOW"); - return NULL; - } - pSession = d2i_SSL_SESSION(NULL, &pder, der_len); - if (!pSession) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, "distributed scache 'get_session' CORRUPT"); - return NULL; - } - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, "distributed scache 'get_session' HIT"); - return pSession; -} - -void ssl_scache_dc_remove(server_rec *s, UCHAR *id, int idlen) -{ - SSLModConfigRec *mc = myModConfig(s); - DC_CTX *ctx = mc->tSessionCacheDataTable; - - /* Remove any corresponding session from the distributed cache context */ - if (!DC_CTX_remove_session(ctx, id, idlen)) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, "distributed scache 'remove_session' MISS"); - } else { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, "distributed scache 'remove_session' HIT"); - } -} - -void ssl_scache_dc_status(request_rec *r, int flags, apr_pool_t *pool) -{ - SSLModConfigRec *mc = myModConfig(r->server); - - ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, - "distributed scache 'ssl_scache_dc_status'"); - ap_rprintf(r, "cache type: DC (Distributed Cache), " - " target: %s
", mc->szSessionCacheDataFile); -} - -#endif - diff --git a/trunk/modules/ssl/ssl_scache_shmcb.c b/trunk/modules/ssl/ssl_scache_shmcb.c deleted file mode 100644 index 45ca10002e843e2c87d8e41831f0b5d547643e09..0000000000000000000000000000000000000000 --- a/trunk/modules/ssl/ssl_scache_shmcb.c +++ /dev/null @@ -1,1343 +0,0 @@ -/* Copyright 2001-2005 The Apache Software Foundation or its licensors, as - * applicable. - * - * 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_ssl - * | '_ ` _ \ / _ \ / _` | / __/ __| | Apache Interface to OpenSSL - * | | | | | | (_) | (_| | \__ \__ \ | - * |_| |_| |_|\___/ \__,_|___|___/___/_| - * |_____| - * ssl_scache_shmcb.c - * Session Cache via Shared Memory (Cyclic Buffer Variant) - */ - -#include "ssl_private.h" - -/* - * This shared memory based SSL session cache implementation was - * originally written by Geoff Thorpe for C2Net - * Europe as a contribution to Ralf Engelschall's mod_ssl project. - */ - -/* - * The shared-memory segment header can be cast to and from the - * SHMCBHeader type, all other structures need to be initialised by - * utility functions. - * - * The "header" looks like this; - * - * data applying to the overall structure: - * - division_offset (unsigned int): - * how far into the shared memory segment the first division is. - * - division_size (unsigned int): - * how many bytes each division occupies. - * (NB: This includes the queue and the cache) - * - division_mask (unsigned char): - * the "mask" in the next line. Add one to this, - * and that's the number of divisions. - * - * data applying to within each division: - * - queue_size (unsigned int): - * how big each "queue" is. NB: The queue is the first block in each - * division and is followed immediately by the cache itself so so - * there's no cache_offset value. - * - * data applying to within each queue: - * - index_num (unsigned char): - * how many indexes in each cache's queue - * - index_offset (unsigned char): - * how far into the queue the first index is. - * - index_size: - * how big each index is. - * - * data applying to within each cache: - * - cache_data_offset (unsigned int): - * how far into the cache the session-data array is stored. - * - cache_data_size (unsigned int): - * how big each cache's data block is. - * - * statistics data (this will eventually be per-division but right now - * there's only one mutex): - * - stores (unsigned long): - * how many stores have been performed in the cache. - * - expiries (unsigned long): - * how many session have been expired from the cache. - * - scrolled (unsigned long): - * how many sessions have been scrolled out of full cache during a - * "store" operation. This is different to the "removes" stats as - * they are requested by mod_ssl/Apache, these are done because of - * cache logistics. (NB: Also, this value should be deducible from - * the others if my code has no bugs, but I count it anyway - plus - * it helps debugging :-). - * - retrieves_hit (unsigned long): - * how many session-retrieves have succeeded. - * - retrieves_miss (unsigned long): - * how many session-retrieves have failed. - * - removes_hit (unsigned long): - * - removes_miss (unsigned long): - * - * Following immediately after the header is an array of "divisions". - * Each division is simply a "queue" immediately followed by its - * corresponding "cache". Each division handles some pre-defined band - * of sessions by using the "division_mask" in the header. Eg. if - * division_mask=0x1f then there are 32 divisions, the first of which - * will store sessions whose least-significant 5 bits are 0, the second - * stores session whose LS 5 bits equal 1, etc. A queue is an indexing - * structure referring to its corresponding cache. - * - * A "queue" looks like this; - * - * - first_pos (unsigned int): - * the location within the array of indexes where the virtual - * "left-hand-edge" of the cyclic buffer is. - * - pos_count (unsigned int): - * the number of indexes occupied from first_pos onwards. - * - * ...followed by an array of indexes, each of which can be - * memcpy'd to and from an SHMCBIndex, and look like this; - * - * - expires (time_t): - * the time() value at which this session expires. - * - offset (unsigned int): - * the offset within the cache data block where the corresponding - * session is stored. - * - s_id2 (unsigned char): - * the second byte of the session_id, stored as an optimisation to - * reduce the number of d2i_SSL_SESSION calls that are made when doing - * a lookup. - * - removed (unsigned char): - * a byte used to indicate whether a session has been "passively" - * removed. Ie. it is still in the cache but is to be disregarded by - * any "retrieve" operation. - * - * A "cache" looks like this; - * - * - first_pos (unsigned int): - * the location within the data block where the virtual - * "left-hand-edge" of the cyclic buffer is. - * - pos_count (unsigned int): - * the number of bytes used in the data block from first_pos onwards. - * - * ...followed by the data block in which actual DER-encoded SSL - * sessions are stored. - */ - -/* - * Header - can be memcpy'd to and from the front of the shared - * memory segment. NB: The first copy (commented out) has the - * elements in a meaningful order, but due to data-alignment - * braindeadness, the second (uncommented) copy has the types grouped - * so as to decrease "struct-bloat". sigh. - */ -typedef struct { - unsigned long num_stores; - unsigned long num_expiries; - unsigned long num_scrolled; - unsigned long num_retrieves_hit; - unsigned long num_retrieves_miss; - unsigned long num_removes_hit; - unsigned long num_removes_miss; - unsigned int division_offset; - unsigned int division_size; - unsigned int queue_size; - unsigned int cache_data_offset; - unsigned int cache_data_size; - unsigned char division_mask; - unsigned int index_num; - unsigned int index_offset; - unsigned int index_size; -} SHMCBHeader; - -/* - * Index - can be memcpy'd to and from an index inside each - * queue's index array. - */ -typedef struct { - time_t expires; - unsigned int offset; - unsigned char s_id2; - unsigned char removed; -} SHMCBIndex; - -/* - * Queue - must be populated by a call to shmcb_get_division - * and the structure's pointers are used for updating (ie. - * the structure doesn't need any "set" to update values). - */ -typedef struct { - SHMCBHeader *header; - unsigned int *first_pos; - unsigned int *pos_count; - SHMCBIndex *indexes; -} SHMCBQueue; - -/* - * Cache - same comment as for Queue. 'Queue's are in a 1-1 - * correspondance with 'Cache's and are usually carried round - * in a pair, they are only seperated for clarity. - */ -typedef struct { - SHMCBHeader *header; - unsigned int *first_pos; - unsigned int *pos_count; - unsigned char *data; -} SHMCBCache; - -/* - * Forward function prototypes. - */ - -/* Functions for working around data-alignment-picky systems (sparcs, - Irix, etc). These use "memcpy" as a way of foxing these systems into - treating the composite types as byte-arrays rather than higher-level - primitives that it prefers to have 4-(or 8-)byte aligned. I don't - envisage this being a performance issue as a couple of 2 or 4 byte - memcpys can hardly make a dent on the massive memmove operations this - cache technique avoids, nor the overheads of ASN en/decoding. */ -static unsigned int shmcb_get_safe_uint(unsigned int *); -static void shmcb_set_safe_uint_ex(unsigned char *, const unsigned char *); -#define shmcb_set_safe_uint(pdest, src) \ - do { \ - unsigned int tmp_uint = src; \ - shmcb_set_safe_uint_ex((unsigned char *)pdest, \ - (const unsigned char *)(&tmp_uint)); \ - } while(0) -#if 0 /* Unused so far */ -static unsigned long shmcb_get_safe_ulong(unsigned long *); -static void shmcb_set_safe_ulong_ex(unsigned char *, const unsigned char *); -#define shmcb_set_safe_ulong(pdest, src) \ - do { \ - unsigned long tmp_ulong = src; \ - shmcb_set_safe_ulong_ex((unsigned char *)pdest, \ - (const unsigned char *)(&tmp_ulong)); \ - } while(0) -#endif -static time_t shmcb_get_safe_time(time_t *); -static void shmcb_set_safe_time_ex(unsigned char *, const unsigned char *); -#define shmcb_set_safe_time(pdest, src) \ - do { \ - time_t tmp_time = src; \ - shmcb_set_safe_time_ex((unsigned char *)pdest, \ - (const unsigned char *)(&tmp_time)); \ - } while(0) - -/* This is necessary simply so that the size passed to memset() is not a - * compile-time constant, preventing the compiler from optimising it. */ -static void shmcb_safe_clear(void *ptr, size_t size) -{ - memset(ptr, 0, size); -} - -/* Underlying functions for session-caching */ -static BOOL shmcb_init_memory(server_rec *, void *, unsigned int); -static BOOL shmcb_store_session(server_rec *, void *, UCHAR *, int, SSL_SESSION *, time_t); -static SSL_SESSION *shmcb_retrieve_session(server_rec *, void *, UCHAR *, int); -static BOOL shmcb_remove_session(server_rec *, void *, UCHAR *, int); - -/* Utility functions for manipulating the structures */ -static void shmcb_get_header(void *, SHMCBHeader **); -static BOOL shmcb_get_division(SHMCBHeader *, SHMCBQueue *, SHMCBCache *, unsigned int); -static SHMCBIndex *shmcb_get_index(const SHMCBQueue *, unsigned int); -static unsigned int shmcb_expire_division(server_rec *, SHMCBQueue *, SHMCBCache *); -static BOOL shmcb_insert_encoded_session(server_rec *, SHMCBQueue *, SHMCBCache *, unsigned char *, unsigned int, unsigned char *, time_t); -static SSL_SESSION *shmcb_lookup_session_id(server_rec *, SHMCBQueue *, SHMCBCache *, UCHAR *, unsigned int); -static BOOL shmcb_remove_session_id(server_rec *, SHMCBQueue *, SHMCBCache *, UCHAR *, unsigned int); - -/* - * Data-alignment functions (a.k.a. avoidance tactics) - * - * NB: On HPUX (and possibly others) there is a *very* mischievous little - * "optimisation" in the compilers where it will convert the following; - * memcpy(dest_ptr, &source, sizeof(unsigned int)); - * (where dest_ptr is of type (unsigned int *) and source is (unsigned int)) - * into; - * *dest_ptr = source; (or *dest_ptr = *(&source), not sure). - * Either way, it completely destroys the whole point of these _safe_ - * functions, because the assignment operation will fall victim to the - * architecture's byte-alignment dictations, whereas the memcpy (as a - * byte-by-byte copy) should not. sigh. So, if you're wondering about the - * apparently unnecessary conversions to (unsigned char *) in these - * functions, you now have an explanation. Don't just revert them back and - * say "ooh look, it still works" - if you try it on HPUX (well, 32-bit - * HPUX 11.00 at least) you may find it fails with a SIGBUS. :-( - */ - -static unsigned int shmcb_get_safe_uint(unsigned int *ptr) -{ - unsigned int ret; - shmcb_set_safe_uint_ex((unsigned char *)(&ret), - (const unsigned char *)ptr); - return ret; -} - -static void shmcb_set_safe_uint_ex(unsigned char *dest, - const unsigned char *src) -{ - memcpy(dest, src, sizeof(unsigned int)); -} - -#if 0 /* Unused so far */ -static unsigned long shmcb_get_safe_ulong(unsigned long *ptr) -{ - unsigned long ret; - shmcb_set_safe_ulong_ex((unsigned char *)(&ret), - (const unsigned char *)ptr); - return ret; -} - -static void shmcb_set_safe_ulong_ex(unsigned char *dest, - const unsigned char *src) -{ - memcpy(dest, src, sizeof(unsigned long)); -} -#endif - -static time_t shmcb_get_safe_time(time_t * ptr) -{ - time_t ret; - shmcb_set_safe_time_ex((unsigned char *)(&ret), - (const unsigned char *)ptr); - return ret; -} - -static void shmcb_set_safe_time_ex(unsigned char *dest, - const unsigned char *src) -{ - memcpy(dest, src, sizeof(time_t)); -} -/* -** -** High-Level "handlers" as per ssl_scache.c -** -*/ - -void ssl_scache_shmcb_init(server_rec *s, apr_pool_t *p) -{ - SSLModConfigRec *mc = myModConfig(s); - void *shm_segment; - apr_size_t shm_segsize; - apr_status_t rv; - - /* - * Create shared memory segment - */ - if (mc->szSessionCacheDataFile == NULL) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, - "SSLSessionCache required"); - ssl_die(); - } - - /* Use anonymous shm by default, fall back on name-based. */ - rv = apr_shm_create(&(mc->pSessionCacheDataMM), - mc->nSessionCacheDataSize, - NULL, mc->pPool); - - if (APR_STATUS_IS_ENOTIMPL(rv)) { - /* For a name-based segment, remove it first in case of a - * previous unclean shutdown. */ - apr_shm_remove(mc->szSessionCacheDataFile, mc->pPool); - - rv = apr_shm_create(&(mc->pSessionCacheDataMM), - mc->nSessionCacheDataSize, - mc->szSessionCacheDataFile, - mc->pPool); - } - - if (rv != APR_SUCCESS) { - char buf[100]; - ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, - "Cannot allocate shared memory: (%d)%s", rv, - apr_strerror(rv, buf, sizeof(buf))); - ssl_die(); - } - shm_segment = apr_shm_baseaddr_get(mc->pSessionCacheDataMM); - shm_segsize = apr_shm_size_get(mc->pSessionCacheDataMM); - - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "shmcb_init allocated %" APR_SIZE_T_FMT - " bytes of shared memory", - shm_segsize); - if (!shmcb_init_memory(s, shm_segment, shm_segsize)) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, - "Failure initialising 'shmcb' shared memory"); - ssl_die(); - } - ap_log_error(APLOG_MARK, APLOG_INFO, 0, s, - "Shared memory session cache initialised"); - - /* - * Success ... - */ - mc->tSessionCacheDataTable = shm_segment; - return; -} - -void ssl_scache_shmcb_kill(server_rec *s) -{ - SSLModConfigRec *mc = myModConfig(s); - - if (mc->pSessionCacheDataMM != NULL) { - apr_shm_destroy(mc->pSessionCacheDataMM); - mc->pSessionCacheDataMM = NULL; - } - return; -} - -BOOL ssl_scache_shmcb_store(server_rec *s, UCHAR *id, int idlen, - time_t timeout, SSL_SESSION * pSession) -{ - SSLModConfigRec *mc = myModConfig(s); - BOOL to_return = FALSE; - - ssl_mutex_on(s); - if (!shmcb_store_session(s, mc->tSessionCacheDataTable, id, idlen, - pSession, timeout)) - /* in this cache engine, "stores" should never fail. */ - ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, - "'shmcb' code was unable to store a " - "session in the cache."); - else { - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "shmcb_store successful"); - to_return = TRUE; - } - ssl_mutex_off(s); - return to_return; -} - -SSL_SESSION *ssl_scache_shmcb_retrieve(server_rec *s, UCHAR *id, int idlen) -{ - SSLModConfigRec *mc = myModConfig(s); - SSL_SESSION *pSession; - - ssl_mutex_on(s); - pSession = shmcb_retrieve_session(s, mc->tSessionCacheDataTable, id, idlen); - ssl_mutex_off(s); - if (pSession) - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "shmcb_retrieve had a hit"); - else { - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "shmcb_retrieve had a miss"); - ap_log_error(APLOG_MARK, APLOG_INFO, 0, s, - "Client requested a 'session-resume' but " - "we have no such session."); - } - return pSession; -} - -void ssl_scache_shmcb_remove(server_rec *s, UCHAR *id, int idlen) -{ - SSLModConfigRec *mc = myModConfig(s); - - ssl_mutex_on(s); - shmcb_remove_session(s, mc->tSessionCacheDataTable, id, idlen); - ssl_mutex_off(s); -} - -void ssl_scache_shmcb_status(request_rec *r, int flags, apr_pool_t *p) -{ - SSLModConfigRec *mc = myModConfig(r->server); - SHMCBHeader *header; - SHMCBQueue queue; - SHMCBCache cache; - SHMCBIndex *idx; - unsigned int loop, total, cache_total, non_empty_divisions; - int index_pct, cache_pct; - double expiry_total; - time_t average_expiry, now, max_expiry, min_expiry, idxexpiry; - - ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, "inside shmcb_status"); - - /* Get the header structure. */ - shmcb_get_header(mc->tSessionCacheDataTable, &header); - total = cache_total = non_empty_divisions = 0; - average_expiry = max_expiry = min_expiry = 0; - expiry_total = 0; - - /* It may seem strange to grab "now" at this point, but in theory - * we should never have a negative threshold but grabbing "now" after - * the loop (which performs expiries) could allow that chance. */ - now = time(NULL); - for (loop = 0; loop <= header->division_mask; loop++) { - if (shmcb_get_division(header, &queue, &cache, loop)) { - shmcb_expire_division(r->server, &queue, &cache); - total += shmcb_get_safe_uint(queue.pos_count); - cache_total += shmcb_get_safe_uint(cache.pos_count); - if (shmcb_get_safe_uint(queue.pos_count) > 0) { - idx = shmcb_get_index(&queue, - shmcb_get_safe_uint(queue.first_pos)); - non_empty_divisions++; - idxexpiry = shmcb_get_safe_time(&(idx->expires)); - expiry_total += (double) idxexpiry; - max_expiry = (idxexpiry > max_expiry ? idxexpiry : - max_expiry); - if (min_expiry == 0) - min_expiry = idxexpiry; - else - min_expiry = (idxexpiry < min_expiry ? idxexpiry : - min_expiry); - } - } - } - index_pct = (100 * total) / (header->index_num * (header->division_mask + 1)); - cache_pct = (100 * cache_total) / (header->cache_data_size * (header->division_mask + 1)); - ap_rprintf(r, "cache type: SHMCB, shared memory: %d " - "bytes, current sessions: %d
", - mc->nSessionCacheDataSize, total); - ap_rprintf(r, "sub-caches: %d, indexes per sub-cache: " - "%d
", (int) header->division_mask + 1, - (int) header->index_num); - if (non_empty_divisions != 0) { - average_expiry = (time_t)(expiry_total / (double)non_empty_divisions); - ap_rprintf(r, "time left on oldest entries' SSL sessions: "); - if (now < average_expiry) - ap_rprintf(r, "avg: %d seconds, (range: %d...%d)
", - (int)(average_expiry - now), (int) (min_expiry - now), - (int)(max_expiry - now)); - else - ap_rprintf(r, "expiry threshold: Calculation Error!" - "
"); - - } - ap_rprintf(r, "index usage: %d%%, cache usage: %d%%" - "
", index_pct, cache_pct); - ap_rprintf(r, "total sessions stored since starting: %lu
", - header->num_stores); - ap_rprintf(r, "total sessions expired since starting: %lu
", - header->num_expiries); - ap_rprintf(r, "total (pre-expiry) sessions scrolled out of the " - "cache: %lu
", header->num_scrolled); - ap_rprintf(r, "total retrieves since starting: %lu hit, " - "%lu miss
", header->num_retrieves_hit, - header->num_retrieves_miss); - ap_rprintf(r, "total removes since starting: %lu hit, " - "%lu miss
", header->num_removes_hit, - header->num_removes_miss); - ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, "leaving shmcb_status"); - return; -} - -/* -** -** Memory manipulation and low-level cache operations -** -*/ - -static BOOL shmcb_init_memory( - server_rec *s, void *shm_mem, - unsigned int shm_mem_size) -{ - SHMCBHeader *header; - SHMCBQueue queue; - SHMCBCache cache; - unsigned int temp, loop, granularity; - - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "entered shmcb_init_memory()"); - - /* Calculate some sizes... */ - temp = sizeof(SHMCBHeader); - - /* If the segment is ridiculously too small, bail out */ - if (shm_mem_size < (2*temp)) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, - "shared memory segment too small"); - return FALSE; - } - - /* Make temp the amount of memory without the header */ - temp = shm_mem_size - temp; - - /* Work on the basis that you need 10 bytes index for each session - * (approx 150 bytes), which is to divide temp by 160 - and then - * make sure we err on having too index space to burn even when - * the cache is full, which is a lot less stupid than having - * having not enough index space to utilise the whole cache!. */ - temp /= 120; - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "for %u bytes, recommending %u indexes", - shm_mem_size, temp); - - /* We should divide these indexes evenly amongst the queues. Try - * to get it so that there are roughly half the number of divisions - * as there are indexes in each division. */ - granularity = 256; - while ((temp / granularity) < (2 * granularity)) - granularity /= 2; - - /* So we have 'granularity' divisions, set 'temp' equal to the - * number of indexes in each division. */ - temp /= granularity; - - /* Too small? Bail ... */ - if (temp < 5) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, - "shared memory segment too small"); - return FALSE; - } - - /* OK, we're sorted - from here on in, the return should be TRUE */ - header = (SHMCBHeader *)shm_mem; - header->division_mask = (unsigned char)(granularity - 1); - header->division_offset = sizeof(SHMCBHeader); - header->index_num = temp; - header->index_offset = (2 * sizeof(unsigned int)); - header->index_size = sizeof(SHMCBIndex); - header->queue_size = header->index_offset + - (header->index_num * header->index_size); - - /* Now calculate the space for each division */ - temp = shm_mem_size - header->division_offset; - header->division_size = temp / granularity; - - /* Calculate the space left in each division for the cache */ - temp -= header->queue_size; - header->cache_data_offset = (2 * sizeof(unsigned int)); - header->cache_data_size = header->division_size - - header->queue_size - header->cache_data_offset; - - /* Output trace info */ - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "shmcb_init_memory choices follow"); - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "division_mask = 0x%02X", header->division_mask); - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "division_offset = %u", header->division_offset); - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "division_size = %u", header->division_size); - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "queue_size = %u", header->queue_size); - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "index_num = %u", header->index_num); - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "index_offset = %u", header->index_offset); - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "index_size = %u", header->index_size); - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "cache_data_offset = %u", header->cache_data_offset); - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "cache_data_size = %u", header->cache_data_size); - - /* The header is done, make the caches empty */ - for (loop = 0; loop < granularity; loop++) { - if (!shmcb_get_division(header, &queue, &cache, loop)) - ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, "shmcb_init_memory, " "internal error"); - shmcb_set_safe_uint(cache.first_pos, 0); - shmcb_set_safe_uint(cache.pos_count, 0); - shmcb_set_safe_uint(queue.first_pos, 0); - shmcb_set_safe_uint(queue.pos_count, 0); - } - - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "leaving shmcb_init_memory()"); - return TRUE; -} - -static BOOL shmcb_store_session( - server_rec *s, void *shm_segment, UCHAR *id, - int idlen, SSL_SESSION * pSession, - time_t timeout) -{ - SHMCBHeader *header; - SHMCBQueue queue; - SHMCBCache cache; - unsigned char masked_index; - unsigned char encoded[SSL_SESSION_MAX_DER]; - unsigned char *ptr_encoded; - unsigned int len_encoded; - time_t expiry_time; - unsigned char *session_id = SSL_SESSION_get_session_id(pSession); - - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "inside shmcb_store_session"); - - /* Get the header structure, which division this session will fall into etc. */ - shmcb_get_header(shm_segment, &header); - masked_index = session_id[0] & header->division_mask; - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "session_id[0]=%u, masked index=%u", - session_id[0], masked_index); - if (!shmcb_get_division(header, &queue, &cache, (unsigned int)masked_index)) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, - "shmcb_store_session internal error"); - return FALSE; - } - - /* Serialise the session, work out how much we're dealing - * with. NB: This check could be removed if we're not paranoid - * or we find some assurance that it will never be necessary. */ - len_encoded = i2d_SSL_SESSION(pSession, NULL); - if (len_encoded > SSL_SESSION_MAX_DER) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, - "session is too big (%u bytes)", len_encoded); - return FALSE; - } - ptr_encoded = encoded; - len_encoded = i2d_SSL_SESSION(pSession, &ptr_encoded); - expiry_time = timeout; - if (!shmcb_insert_encoded_session(s, &queue, &cache, encoded, - len_encoded, session_id, - expiry_time)) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, - "can't store a session!"); - return FALSE; - } - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "leaving shmcb_store successfully"); - header->num_stores++; - return TRUE; -} - -static SSL_SESSION *shmcb_retrieve_session( - server_rec *s, void *shm_segment, - UCHAR *id, int idlen) -{ - SHMCBHeader *header; - SHMCBQueue queue; - SHMCBCache cache; - unsigned char masked_index; - SSL_SESSION *pSession; - - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "inside shmcb_retrieve_session"); - if (idlen < 2) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, "unusably short session_id provided " - "(%u bytes)", idlen); - return FALSE; - } - - /* Get the header structure, which division this session lookup - * will come from etc. */ - shmcb_get_header(shm_segment, &header); - masked_index = id[0] & header->division_mask; - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "id[0]=%u, masked index=%u", id[0], masked_index); - if (!shmcb_get_division(header, &queue, &cache, (unsigned int) masked_index)) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, - "shmcb_retrieve_session internal error"); - header->num_retrieves_miss++; - return FALSE; - } - - /* Get the session corresponding to the session_id or NULL if it - * doesn't exist (or is flagged as "removed"). */ - pSession = shmcb_lookup_session_id(s, &queue, &cache, id, idlen); - if (pSession) - header->num_retrieves_hit++; - else - header->num_retrieves_miss++; - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "leaving shmcb_retrieve_session"); - return pSession; -} - -static BOOL shmcb_remove_session( - server_rec *s, void *shm_segment, - UCHAR *id, int idlen) -{ - SHMCBHeader *header; - SHMCBQueue queue; - SHMCBCache cache; - unsigned char masked_index; - BOOL res; - - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "inside shmcb_remove_session"); - if (id == NULL) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, "remove called with NULL session_id!"); - return FALSE; - } - - /* Get the header structure, which division this session remove - * will happen in etc. */ - shmcb_get_header(shm_segment, &header); - masked_index = id[0] & header->division_mask; - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "id[0]=%u, masked index=%u", id[0], masked_index); - if (!shmcb_get_division(header, &queue, &cache, (unsigned int)masked_index)) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, "shmcb_remove_session, internal error"); - header->num_removes_miss++; - return FALSE; - } - res = shmcb_remove_session_id(s, &queue, &cache, id, idlen); - if (res) - header->num_removes_hit++; - else - header->num_removes_miss++; - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "leaving shmcb_remove_session"); - return res; -} - - -/* -** -** Weirdo cyclic buffer functions -** -*/ - -/* This gets used in the cyclic "index array" (in the 'Queue's) and - * in the cyclic 'Cache's too ... you provide the "width" of the - * cyclic store, the starting position and how far to move (with - * wrapping if necessary). Basically it's addition modulo buf_size. */ -static unsigned int shmcb_cyclic_increment( - unsigned int buf_size, - unsigned int start_pos, - unsigned int to_add) -{ - start_pos += to_add; - while (start_pos >= buf_size) - start_pos -= buf_size; - return start_pos; -} - -/* Given two positions in a cyclic buffer, calculate the "distance". - * This is to cover the case ("non-trivial") where the 'next' offset - * is to the left of the 'start' offset. NB: This calculates the - * space inclusive of one end-point but not the other. There is an - * ambiguous case (which is why we use the - * coordinate system rather than one) when 'start' - * is the same as 'next'. It could indicate the buffer is full or it - * can indicate the buffer is empty ... I choose the latter as it's - * easier and usually necessary to check if the buffer is full anyway - * before doing incremental logic (which is this useful for), but we - * definitely need the empty case handled - in fact it's our starting - * state!! */ -static unsigned int shmcb_cyclic_space( - unsigned int buf_size, - unsigned int start_offset, - unsigned int next_offset) -{ - /* Is it the trivial case? */ - if (start_offset <= next_offset) - return (next_offset - start_offset); /* yes */ - else - return ((buf_size - start_offset) + next_offset); /* no */ -} - -/* A "normal-to-cyclic" memcpy ... this takes a linear block of - * memory and copies it onto a cyclic buffer. The purpose and - * function of this is pretty obvious, you need to cover the case - * that the destination (cyclic) buffer has to wrap round. */ -static void shmcb_cyclic_ntoc_memcpy( - unsigned int buf_size, - unsigned char *data, - unsigned int dest_offset, - unsigned char *src, unsigned int src_len) -{ - /* Cover the case that src_len > buf_size */ - if (src_len > buf_size) - src_len = buf_size; - - /* Can it be copied all in one go? */ - if (dest_offset + src_len < buf_size) - /* yes */ - memcpy(data + dest_offset, src, src_len); - else { - /* no */ - memcpy(data + dest_offset, src, buf_size - dest_offset); - memcpy(data, src + buf_size - dest_offset, - src_len + dest_offset - buf_size); - } - return; -} - -/* A "cyclic-to-normal" memcpy ... given the last function, this - * one's purpose is clear, it copies out of a cyclic buffer handling - * wrapping. */ -static void shmcb_cyclic_cton_memcpy( - unsigned int buf_size, - unsigned char *dest, - unsigned char *data, - unsigned int src_offset, - unsigned int src_len) -{ - /* Cover the case that src_len > buf_size */ - if (src_len > buf_size) - src_len = buf_size; - - /* Can it be copied all in one go? */ - if (src_offset + src_len < buf_size) - /* yes */ - memcpy(dest, data + src_offset, src_len); - else { - /* no */ - memcpy(dest, data + src_offset, buf_size - src_offset); - memcpy(dest + buf_size - src_offset, data, - src_len + src_offset - buf_size); - } - return; -} - -/* Here's the cool hack that makes it all work ... by simply - * making the first collection of bytes *be* our header structure - * (casting it into the C structure), we have the perfect way to - * maintain state in a shared-memory session cache from one call - * (and process) to the next, use the shared memory itself! The - * original mod_ssl shared-memory session cache uses variables - * inside the context, but we simply use that for storing the - * pointer to the shared memory itself. And don't forget, after - * Apache's initialisation, this "header" is constant/read-only - * so we can read it outside any locking. - * - sometimes I just *love* coding y'know?! */ -static void shmcb_get_header(void *shm_mem, SHMCBHeader **header) -{ - *header = (SHMCBHeader *)shm_mem; - return; -} - -/* This is what populates our "interesting" structures. Given a - * pointer to the header, and an index into the appropriate - * division (this must have already been masked using the - * division_mask by the caller!), we can populate the provided - * SHMCBQueue and SHMCBCache structures with values and - * pointers to the underlying shared memory. Upon returning - * (if not FALSE), the caller can meddle with the pointer - * values and they will map into the shared-memory directly, - * as such there's no need to "free" or "set" the Queue or - * Cache values, they were themselves references to the *real* - * data. */ -static BOOL shmcb_get_division( - SHMCBHeader *header, SHMCBQueue *queue, - SHMCBCache *cache, unsigned int idx) -{ - unsigned char *pQueue; - unsigned char *pCache; - - /* bounds check */ - if (idx > (unsigned int) header->division_mask) - return FALSE; - - /* Locate the blocks of memory storing the corresponding data */ - pQueue = ((unsigned char *) header) + header->division_offset + - (idx * header->division_size); - pCache = pQueue + header->queue_size; - - /* Populate the structures with appropriate pointers */ - queue->first_pos = (unsigned int *) pQueue; - - /* Our structures stay packed, no matter what the system's - * data-alignment regime is. */ - queue->pos_count = (unsigned int *) (pQueue + sizeof(unsigned int)); - queue->indexes = (SHMCBIndex *) (pQueue + (2 * sizeof(unsigned int))); - cache->first_pos = (unsigned int *) pCache; - cache->pos_count = (unsigned int *) (pCache + sizeof(unsigned int)); - cache->data = (unsigned char *) (pCache + (2 * sizeof(unsigned int))); - queue->header = cache->header = header; - - return TRUE; -} - -/* This returns a pointer to the piece of shared memory containing - * a specified 'Index'. SHMCBIndex, like SHMCBHeader, is a fixed - * width non-referencing structure of primitive types that can be - * cast onto the corresponding block of shared memory. Thus, by - * returning a cast pointer to that section of shared memory, the - * caller can read and write values to and from the "structure" and - * they are actually reading and writing the underlying shared - * memory. */ -static SHMCBIndex *shmcb_get_index( - const SHMCBQueue *queue, unsigned int idx) -{ - /* bounds check */ - if (idx > queue->header->index_num) - return NULL; - - /* Return a pointer to the index. NB: I am being horribly pendantic - * here so as to avoid any potential data-alignment assumptions being - * placed on the pointer arithmetic by the compiler (sigh). */ - return (SHMCBIndex *)(((unsigned char *) queue->indexes) + - (idx * sizeof(SHMCBIndex))); -} - -/* This functions rolls expired cache (and index) entries off the front - * of the cyclic buffers in a division. The function returns the number - * of expired sessions. */ -static unsigned int shmcb_expire_division( - server_rec *s, SHMCBQueue *queue, SHMCBCache *cache) -{ - SHMCBIndex *idx; - time_t now; - unsigned int loop, index_num, pos_count, new_pos; - SHMCBHeader *header; - - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "entering shmcb_expire_division"); - - /* We must calculate num and space ourselves based on expiry times. */ - now = time(NULL); - loop = 0; - new_pos = shmcb_get_safe_uint(queue->first_pos); - - /* Cache useful values */ - header = queue->header; - index_num = header->index_num; - pos_count = shmcb_get_safe_uint(queue->pos_count); - while (loop < pos_count) { - idx = shmcb_get_index(queue, new_pos); - if (shmcb_get_safe_time(&(idx->expires)) > now) - /* it hasn't expired yet, we're done iterating */ - break; - /* This one should be expired too. Shift to the next entry. */ - loop++; - new_pos = shmcb_cyclic_increment(index_num, new_pos, 1); - } - - /* Find the new_offset and make the expiries happen. */ - if (loop > 0) { - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "will be expiring %u sessions", loop); - /* We calculate the new_offset by "peeking" (or in the - * case it's the last entry, "sneaking" ;-). */ - if (loop == pos_count) { - /* We are expiring everything! This is easy to do... */ - shmcb_set_safe_uint(queue->pos_count, 0); - shmcb_set_safe_uint(cache->pos_count, 0); - } - else { - /* The Queue is easy to adjust */ - shmcb_set_safe_uint(queue->pos_count, - shmcb_get_safe_uint(queue->pos_count) - loop); - shmcb_set_safe_uint(queue->first_pos, new_pos); - /* peek to the start of the next session */ - idx = shmcb_get_index(queue, new_pos); - /* We can use shmcb_cyclic_space because we've guaranteed - * we don't fit the ambiguous full/empty case. */ - shmcb_set_safe_uint(cache->pos_count, - shmcb_get_safe_uint(cache->pos_count) - - shmcb_cyclic_space(header->cache_data_size, - shmcb_get_safe_uint(cache->first_pos), - shmcb_get_safe_uint(&(idx->offset)))); - shmcb_set_safe_uint(cache->first_pos, shmcb_get_safe_uint(&(idx->offset))); - } - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "we now have %u sessions", - shmcb_get_safe_uint(queue->pos_count)); - } - header->num_expiries += loop; - return loop; -} - -/* Inserts a new encoded session into a queue/cache pair - expiring - * (early or otherwise) any leading sessions as necessary to ensure - * there is room. An error return (FALSE) should only happen in the - * event of surreal values being passed on, or ridiculously small - * cache sizes. NB: For tracing purposes, this function is also given - * the server_rec to allow "ssl_log()". */ -static BOOL shmcb_insert_encoded_session( - server_rec *s, SHMCBQueue * queue, - SHMCBCache * cache, - unsigned char *encoded, - unsigned int encoded_len, - unsigned char *session_id, - time_t expiry_time) -{ - SHMCBHeader *header; - SHMCBIndex *idx = NULL; - unsigned int gap, new_pos, loop, new_offset; - int need; - - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "entering shmcb_insert_encoded_session, " - "*queue->pos_count = %u", - shmcb_get_safe_uint(queue->pos_count)); - - /* If there's entries to expire, ditch them first thing. */ - shmcb_expire_division(s, queue, cache); - header = cache->header; - gap = header->cache_data_size - shmcb_get_safe_uint(cache->pos_count); - if (gap < encoded_len) { - new_pos = shmcb_get_safe_uint(queue->first_pos); - loop = 0; - need = (int) encoded_len - (int) gap; - while ((need > 0) && (loop + 1 < shmcb_get_safe_uint(queue->pos_count))) { - new_pos = shmcb_cyclic_increment(header->index_num, new_pos, 1); - loop += 1; - idx = shmcb_get_index(queue, new_pos); - need = (int) encoded_len - (int) gap - - shmcb_cyclic_space(header->cache_data_size, - shmcb_get_safe_uint(cache->first_pos), - shmcb_get_safe_uint(&(idx->offset))); - } - if (loop > 0) { - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "about to scroll %u sessions from %u", - loop, shmcb_get_safe_uint(queue->pos_count)); - /* We are removing "loop" items from the cache. */ - shmcb_set_safe_uint(cache->pos_count, - shmcb_get_safe_uint(cache->pos_count) - - shmcb_cyclic_space(header->cache_data_size, - shmcb_get_safe_uint(cache->first_pos), - shmcb_get_safe_uint(&(idx->offset)))); - shmcb_set_safe_uint(cache->first_pos, shmcb_get_safe_uint(&(idx->offset))); - shmcb_set_safe_uint(queue->pos_count, shmcb_get_safe_uint(queue->pos_count) - loop); - shmcb_set_safe_uint(queue->first_pos, new_pos); - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "now only have %u sessions", - shmcb_get_safe_uint(queue->pos_count)); - /* Update the stats!!! */ - header->num_scrolled += loop; - } - } - - /* probably unecessary checks, but I'll leave them until this code - * is verified. */ - if (shmcb_get_safe_uint(cache->pos_count) + encoded_len > - header->cache_data_size) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, - "shmcb_insert_encoded_session internal error"); - return FALSE; - } - if (shmcb_get_safe_uint(queue->pos_count) == header->index_num) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, - "shmcb_insert_encoded_session internal error"); - return FALSE; - } - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "we have %u bytes and %u indexes free - enough", - header->cache_data_size - - shmcb_get_safe_uint(cache->pos_count), header->index_num - - shmcb_get_safe_uint(queue->pos_count)); - - - /* HERE WE ASSUME THAT THE NEW SESSION SHOULD GO ON THE END! I'M NOT - * CHECKING WHETHER IT SHOULD BE GENUINELY "INSERTED" SOMEWHERE. - * - * We either fix that, or find out at a "higher" (read "mod_ssl") - * level whether it is possible to have distinct session caches for - * any attempted tomfoolery to do with different session timeouts. - * Knowing in advance that we can have a cache-wide constant timeout - * would make this stuff *MUCH* more efficient. Mind you, it's very - * efficient right now because I'm ignoring this problem!!! - */ - - /* Increment to the first unused byte */ - new_offset = shmcb_cyclic_increment(header->cache_data_size, - shmcb_get_safe_uint(cache->first_pos), - shmcb_get_safe_uint(cache->pos_count)); - /* Copy the DER-encoded session into place */ - shmcb_cyclic_ntoc_memcpy(header->cache_data_size, cache->data, - new_offset, encoded, encoded_len); - /* Get the new index that this session is stored in. */ - new_pos = shmcb_cyclic_increment(header->index_num, - shmcb_get_safe_uint(queue->first_pos), - shmcb_get_safe_uint(queue->pos_count)); - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "storing in index %u, at offset %u", - new_pos, new_offset); - idx = shmcb_get_index(queue, new_pos); - if (idx == NULL) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, - "shmcb_insert_encoded_session internal error"); - return FALSE; - } - shmcb_safe_clear(idx, sizeof(SHMCBIndex)); - shmcb_set_safe_time(&(idx->expires), expiry_time); - shmcb_set_safe_uint(&(idx->offset), new_offset); - - /* idx->removed = (unsigned char)0; */ /* Not needed given the memset above. */ - idx->s_id2 = session_id[1]; - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "session_id[0]=%u, idx->s_id2=%u", - session_id[0], session_id[1]); - - /* All that remains is to adjust the cache's and queue's "pos_count"s. */ - shmcb_set_safe_uint(cache->pos_count, - shmcb_get_safe_uint(cache->pos_count) + encoded_len); - shmcb_set_safe_uint(queue->pos_count, - shmcb_get_safe_uint(queue->pos_count) + 1); - - /* And just for good debugging measure ... */ - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "leaving now with %u bytes in the cache and %u indexes", - shmcb_get_safe_uint(cache->pos_count), - shmcb_get_safe_uint(queue->pos_count)); - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "leaving shmcb_insert_encoded_session"); - return TRUE; -} - -/* Performs a lookup into a queue/cache pair for a - * session_id. If found, the session is deserialised - * and returned, otherwise NULL. */ -static SSL_SESSION *shmcb_lookup_session_id( - server_rec *s, SHMCBQueue *queue, - SHMCBCache *cache, UCHAR *id, - unsigned int idlen) -{ - unsigned char tempasn[SSL_SESSION_MAX_DER]; - SHMCBIndex *idx; - SHMCBHeader *header; - SSL_SESSION *pSession = NULL; - unsigned int curr_pos, loop, count; - unsigned char *ptr; - time_t now; - - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "entering shmcb_lookup_session_id"); - - /* If there are entries to expire, ditch them first thing. */ - shmcb_expire_division(s, queue, cache); - now = time(NULL); - curr_pos = shmcb_get_safe_uint(queue->first_pos); - count = shmcb_get_safe_uint(queue->pos_count); - header = queue->header; - for (loop = 0; loop < count; loop++) { - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "loop=%u, count=%u, curr_pos=%u", - loop, count, curr_pos); - idx = shmcb_get_index(queue, curr_pos); - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "idx->s_id2=%u, id[1]=%u, offset=%u", - idx->s_id2, id[1], shmcb_get_safe_uint(&(idx->offset))); - /* Only look into the session further if; - * (a) the second byte of the session_id matches, - * (b) the "removed" flag isn't set, - * (c) the session hasn't expired yet. - * We do (c) like this so that it saves us having to - * do natural expiries ... naturally expired sessions - * scroll off the front anyway when the cache is full and - * "rotating", the only real issue that remains is the - * removal or disabling of forcibly killed sessions. */ - if ((idx->s_id2 == id[1]) && !idx->removed && - (shmcb_get_safe_time(&(idx->expires)) > now)) { - unsigned int session_id_length; - unsigned char *session_id; - - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "at index %u, found possible session match", - curr_pos); - shmcb_cyclic_cton_memcpy(header->cache_data_size, - tempasn, cache->data, - shmcb_get_safe_uint(&(idx->offset)), - SSL_SESSION_MAX_DER); - ptr = tempasn; - pSession = d2i_SSL_SESSION(NULL, &ptr, SSL_SESSION_MAX_DER); - session_id_length = SSL_SESSION_get_session_id_length(pSession); - session_id = SSL_SESSION_get_session_id(pSession); - - if (pSession == NULL) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, - "scach2_lookup_session_id internal error"); - return NULL; - } - if ((session_id_length == idlen) && - (memcmp(session_id, id, idlen) == 0)) { - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "a match!"); - return pSession; - } - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "not a match"); - SSL_SESSION_free(pSession); - pSession = NULL; - } - curr_pos = shmcb_cyclic_increment(header->index_num, curr_pos, 1); - } - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "no matching sessions were found"); - return NULL; -} - -static BOOL shmcb_remove_session_id( - server_rec *s, SHMCBQueue *queue, - SHMCBCache *cache, UCHAR *id, unsigned int idlen) -{ - unsigned char tempasn[SSL_SESSION_MAX_DER]; - SSL_SESSION *pSession = NULL; - SHMCBIndex *idx; - SHMCBHeader *header; - unsigned int curr_pos, loop, count; - unsigned char *ptr; - BOOL to_return = FALSE; - - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "entering shmcb_remove_session_id"); - - /* If there's entries to expire, ditch them first thing. */ - /* shmcb_expire_division(s, queue, cache); */ - - /* Regarding the above ... hmmm ... I know my expiry code is slightly - * "faster" than all this remove stuff ... but if the higher level - * code calls a "remove" operation (and this *only* seems to happen - * when it has spotted an expired session before we had a chance to) - * then it should get credit for a remove (stats-wise). Also, in the - * off-chance that the server *requests* a renegotiate and wants to - * wipe the session clean we should give that priority over our own - * routine expiry handling. So I've moved the expiry check to *after* - * this general remove stuff. */ - curr_pos = shmcb_get_safe_uint(queue->first_pos); - count = shmcb_get_safe_uint(queue->pos_count); - header = cache->header; - for (loop = 0; loop < count; loop++) { - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "loop=%u, count=%u, curr_pos=%u", - loop, count, curr_pos); - idx = shmcb_get_index(queue, curr_pos); - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "idx->s_id2=%u, id[1]=%u", idx->s_id2, - id[1]); - /* Only look into the session further if the second byte of the - * session_id matches. */ - if (idx->s_id2 == id[1]) { - unsigned int session_id_length; - unsigned char *session_id; - - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "at index %u, found possible " - "session match", curr_pos); - shmcb_cyclic_cton_memcpy(header->cache_data_size, - tempasn, cache->data, - shmcb_get_safe_uint(&(idx->offset)), - SSL_SESSION_MAX_DER); - ptr = tempasn; - pSession = d2i_SSL_SESSION(NULL, &ptr, SSL_SESSION_MAX_DER); - if (pSession == NULL) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, - "shmcb_remove_session_id, internal error"); - goto end; - } - session_id_length = SSL_SESSION_get_session_id_length(pSession); - session_id = SSL_SESSION_get_session_id(pSession); - - if ((session_id_length == idlen) - && (memcmp(id, session_id, idlen) == 0)) { - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "a match!"); - /* Scrub out this session "quietly" */ - idx->removed = (unsigned char) 1; - SSL_SESSION_free(pSession); - to_return = TRUE; - goto end; - } - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "not a match"); - SSL_SESSION_free(pSession); - pSession = NULL; - } - curr_pos = shmcb_cyclic_increment(header->index_num, curr_pos, 1); - } - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "no matching sessions were found"); - - /* If there's entries to expire, ditch them now. */ - shmcb_expire_division(s, queue, cache); -end: - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "leaving shmcb_remove_session_id"); - return to_return; -} diff --git a/trunk/modules/ssl/ssl_toolkit_compat.h b/trunk/modules/ssl/ssl_toolkit_compat.h deleted file mode 100644 index 80b38cc4d915f005b459ec29c95a746f24c6e589..0000000000000000000000000000000000000000 --- a/trunk/modules/ssl/ssl_toolkit_compat.h +++ /dev/null @@ -1,231 +0,0 @@ -/* Copyright 2002-2005 The Apache Software Foundation or its licensors, as - * applicable. - * - * 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. - */ - -#ifndef SSL_TOOLKIT_COMPAT_H -#define SSL_TOOLKIT_COMPAT_H - -/* - * this header file provides a compatiblity layer - * between OpenSSL and RSA sslc - */ - -#ifdef HAVE_OPENSSL - -/* OpenSSL headers */ -#include -#include -#include -#include -#include -#include -#include -#include -/* Avoid tripping over an engine build installed globally and detected - * when the user points at an explicit non-engine flavor of OpenSSL - */ -#if defined(HAVE_OPENSSL_ENGINE_H) && defined(HAVE_ENGINE_INIT) -#include -#endif - -/* - * rsa sslc uses incomplete types for most structures - * so we macroize for OpenSSL those which cannot be dereferenced - * using the same sames as the sslc functions - */ - -#define EVP_PKEY_key_type(k) (EVP_PKEY_type(k->type)) - -#define X509_NAME_get_entries(xs) (xs->entries) -#define X509_REVOKED_get_serialNumber(xs) (xs->serialNumber) - -#define X509_get_signature_algorithm(xs) (xs->cert_info->signature->algorithm) -#define X509_get_key_algorithm(xs) (xs->cert_info->key->algor->algorithm) - -#define X509_NAME_ENTRY_get_data_ptr(xs) (xs->value->data) -#define X509_NAME_ENTRY_get_data_len(xs) (xs->value->length) - -#define SSL_CTX_get_extra_certs(ctx) (ctx->extra_certs) -#define SSL_CTX_set_extra_certs(ctx,value) {ctx->extra_certs = value;} - -#define SSL_CIPHER_get_name(s) (s->name) -#define SSL_CIPHER_get_valid(s) (s->valid) - -#define SSL_SESSION_get_session_id(s) (s->session_id) -#define SSL_SESSION_get_session_id_length(s) (s->session_id_length) - -/* - * Support for retrieving/overriding states - */ -#ifndef SSL_get_state -#define SSL_get_state(ssl) SSL_state(ssl) -#endif - -#define SSL_set_state(ssl,val) (ssl)->state = val - -#define MODSSL_BIO_CB_ARG_TYPE const char -#define MODSSL_CRYPTO_CB_ARG_TYPE const char -#if (OPENSSL_VERSION_NUMBER < 0x00907000) -#define MODSSL_INFO_CB_ARG_TYPE SSL* -#else -#define MODSSL_INFO_CB_ARG_TYPE const SSL* -#endif -#define MODSSL_CLIENT_CERT_CB_ARG_TYPE X509 -#define MODSSL_PCHAR_CAST - -#define modssl_X509_verify_cert X509_verify_cert - -typedef int (modssl_read_bio_cb_fn)(char*,int,int,void*); - -#if (OPENSSL_VERSION_NUMBER < 0x00904000) -#define modssl_PEM_read_bio_X509(b, x, cb, arg) PEM_read_bio_X509(b, x, cb) -#else -#define modssl_PEM_read_bio_X509(b, x, cb, arg) PEM_read_bio_X509(b, x, cb, arg) -#endif - -#define modssl_PEM_X509_INFO_read_bio PEM_X509_INFO_read_bio - -#define modssl_PEM_read_bio_PrivateKey PEM_read_bio_PrivateKey - -#define modssl_set_cipher_list SSL_set_cipher_list - -#define modssl_free OPENSSL_free - -#define EVP_PKEY_reference_inc(pkey) \ - CRYPTO_add(&((pkey)->references), +1, CRYPTO_LOCK_X509_PKEY) - -#define X509_reference_inc(cert) \ - CRYPTO_add(&((cert)->references), +1, CRYPTO_LOCK_X509) - -#define HAVE_SSL_RAND_EGD /* since 9.5.1 */ - -#define HAVE_SSL_X509V3_EXT_d2i - -#elif defined(HAVE_SSLC) - -#include -#include -#include -#include -#include -#include -#include -#include - -/* sslc does not support this function, OpenSSL has since 9.5.1 */ -#define RAND_status() 1 - -/* sslc names this function a bit differently */ -#define CRYPTO_num_locks() CRYPTO_get_num_locks() - -#ifndef STACK_OF -#define STACK_OF(type) STACK -#endif - -#define MODSSL_BIO_CB_ARG_TYPE char -#define MODSSL_CRYPTO_CB_ARG_TYPE char -#define MODSSL_INFO_CB_ARG_TYPE SSL* -#define MODSSL_CLIENT_CERT_CB_ARG_TYPE void -#define MODSSL_PCHAR_CAST (char *) - -typedef int (modssl_read_bio_cb_fn)(char*,int,int); - -#define modssl_X509_verify_cert(c) X509_verify_cert(c, NULL) - -#define modssl_PEM_read_bio_X509(b, x, cb, arg) \ - PEM_read_bio_X509(b, x, cb) - -#define modssl_PEM_X509_INFO_read_bio(b, x, cb, arg)\ - PEM_X509_INFO_read_bio(b, x, cb) - -#define modssl_PEM_read_bio_PrivateKey(b, k, cb, arg) \ - PEM_read_bio_PrivateKey(b, k, cb) - -#ifndef HAVE_SSL_SET_STATE -#define SSL_set_state(ssl, state) /* XXX: should throw an error */ -#endif - -#define modssl_set_cipher_list(ssl, l) \ - SSL_set_cipher_list(ssl, (char *)l) - -#define modssl_free free - -#ifndef PEM_F_DEF_CALLBACK -#define PEM_F_DEF_CALLBACK PEM_F_DEF_CB -#endif - -#if SSLC_VERSION_NUMBER < 0x2000 - -#define X509_STORE_CTX_set_depth(st, d) -#define X509_CRL_get_lastUpdate(x) ((x)->crl->lastUpdate) -#define X509_CRL_get_nextUpdate(x) ((x)->crl->nextUpdate) -#define X509_CRL_get_REVOKED(x) ((x)->crl->revoked) -#define X509_REVOKED_get_serialNumber(xs) (xs->serialNumber) - -#define modssl_set_verify(ssl, verify, cb) \ - SSL_set_verify(ssl, verify) - -#else /* SSLC_VERSION_NUMBER >= 0x2000 */ - -#define CRYPTO_malloc_init R_malloc_init - -#define EVP_cleanup() - -#endif /* SSLC_VERSION_NUMBER >= 0x2000 */ - -typedef void (*modssl_popfree_fn)(char *data); - -#define sk_SSL_CIPHER_dup sk_dup -#define sk_SSL_CIPHER_find(st, data) sk_find(st, (void *)data) -#define sk_SSL_CIPHER_free sk_free -#define sk_SSL_CIPHER_num sk_num -#define sk_SSL_CIPHER_value (SSL_CIPHER *)sk_value -#define sk_X509_num sk_num -#define sk_X509_push sk_push -#define sk_X509_pop_free(st, free) sk_pop_free((STACK*)(st), (modssl_popfree_fn)(free)) -#define sk_X509_value (X509 *)sk_value -#define sk_X509_INFO_free sk_free -#define sk_X509_INFO_pop_free(st, free) sk_pop_free((STACK*)(st), (modssl_popfree_fn)(free)) -#define sk_X509_INFO_num sk_num -#define sk_X509_INFO_new_null sk_new_null -#define sk_X509_INFO_value (X509_INFO *)sk_value -#define sk_X509_NAME_find(st, data) sk_find(st, (void *)data) -#define sk_X509_NAME_free sk_free -#define sk_X509_NAME_new sk_new -#define sk_X509_NAME_num sk_num -#define sk_X509_NAME_push(st, data) sk_push(st, (void *)data) -#define sk_X509_NAME_value (X509_NAME *)sk_value -#define sk_X509_NAME_ENTRY_num sk_num -#define sk_X509_NAME_ENTRY_value (X509_NAME_ENTRY *)sk_value -#define sk_X509_NAME_set_cmp_func sk_set_cmp_func -#define sk_X509_REVOKED_num sk_num -#define sk_X509_REVOKED_value (X509_REVOKED *)sk_value - -#else /* ! HAVE_OPENSSL && ! HAVE_SSLC */ - -#error "Unrecognized SSL Toolkit!" - -#endif /* ! HAVE_OPENSSL && ! HAVE_SSLC */ - -#ifndef modssl_set_verify -#define modssl_set_verify(ssl, verify, cb) \ - SSL_set_verify(ssl, verify, cb) -#endif - -#ifndef SSL_SESS_CACHE_NO_INTERNAL -#define SSL_SESS_CACHE_NO_INTERNAL SSL_SESS_CACHE_NO_INTERNAL_LOOKUP -#endif - -#endif /* SSL_TOOLKIT_COMPAT_H */ diff --git a/trunk/modules/ssl/ssl_util.c b/trunk/modules/ssl/ssl_util.c deleted file mode 100644 index bd6c2c8e81e063c93a7ab1e611437871d50e70a8..0000000000000000000000000000000000000000 --- a/trunk/modules/ssl/ssl_util.c +++ /dev/null @@ -1,348 +0,0 @@ -/* Copyright 2001-2005 The Apache Software Foundation or its licensors, as - * applicable. - * - * 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_ssl - * | '_ ` _ \ / _ \ / _` | / __/ __| | Apache Interface to OpenSSL - * | | | | | | (_) | (_| | \__ \__ \ | - * |_| |_| |_|\___/ \__,_|___|___/___/_| - * |_____| - * ssl_util.c - * Utility Functions - */ - /* ``Every day of my life - I am forced to add another - name to the list of people - who piss me off!'' - -- Calvin */ - -#include "ssl_private.h" -#include "ap_mpm.h" -#include "apr_thread_mutex.h" - -/* _________________________________________________________________ -** -** Utility Functions -** _________________________________________________________________ -*/ - -char *ssl_util_vhostid(apr_pool_t *p, server_rec *s) -{ - char *id; - SSLSrvConfigRec *sc; - char *host; - apr_port_t port; - - host = s->server_hostname; - if (s->port != 0) - port = s->port; - else { - sc = mySrvConfig(s); - if (sc->enabled == TRUE) - port = DEFAULT_HTTPS_PORT; - else - port = DEFAULT_HTTP_PORT; - } - id = apr_psprintf(p, "%s:%lu", host, (unsigned long)port); - return id; -} - -apr_file_t *ssl_util_ppopen(server_rec *s, apr_pool_t *p, const char *cmd, - const char * const *argv) -{ - apr_procattr_t *procattr; - apr_proc_t *proc; - - if (apr_procattr_create(&procattr, p) != APR_SUCCESS) - return NULL; - if (apr_procattr_io_set(procattr, APR_FULL_BLOCK, APR_FULL_BLOCK, - APR_FULL_BLOCK) != APR_SUCCESS) - return NULL; - if (apr_procattr_dir_set(procattr, - ap_make_dirstr_parent(p, cmd)) != APR_SUCCESS) - return NULL; - if (apr_procattr_cmdtype_set(procattr, APR_PROGRAM) != APR_SUCCESS) - return NULL; - if ((proc = (apr_proc_t *)apr_pcalloc(p, sizeof(apr_proc_t))) == NULL) - return NULL; - if (apr_proc_create(proc, cmd, argv, NULL, procattr, p) != APR_SUCCESS) - return NULL; - return proc->out; -} - -void ssl_util_ppclose(server_rec *s, apr_pool_t *p, apr_file_t *fp) -{ - apr_file_close(fp); - return; -} - -/* - * Run a filter program and read the first line of its stdout output - */ -char *ssl_util_readfilter(server_rec *s, apr_pool_t *p, const char *cmd, - const char * const *argv) -{ - static char buf[MAX_STRING_LEN]; - apr_file_t *fp; - apr_size_t nbytes = 1; - char c; - int k; - - if ((fp = ssl_util_ppopen(s, p, cmd, argv)) == NULL) - return NULL; - /* XXX: we are reading 1 byte at a time here */ - for (k = 0; apr_file_read(fp, &c, &nbytes) == APR_SUCCESS - && nbytes == 1 && (k < MAX_STRING_LEN-1) ; ) { - if (c == '\n' || c == '\r') - break; - buf[k++] = c; - } - buf[k] = NUL; - ssl_util_ppclose(s, p, fp); - - return buf; -} - -BOOL ssl_util_path_check(ssl_pathcheck_t pcm, const char *path, apr_pool_t *p) -{ - apr_finfo_t finfo; - - if (path == NULL) - return FALSE; - if (pcm & SSL_PCM_EXISTS && apr_stat(&finfo, path, - APR_FINFO_TYPE|APR_FINFO_SIZE, p) != 0) - return FALSE; - if (pcm & SSL_PCM_ISREG && finfo.filetype != APR_REG) - return FALSE; - if (pcm & SSL_PCM_ISDIR && finfo.filetype != APR_DIR) - return FALSE; - if (pcm & SSL_PCM_ISNONZERO && finfo.size <= 0) - return FALSE; - return TRUE; -} - -ssl_algo_t ssl_util_algotypeof(X509 *pCert, EVP_PKEY *pKey) -{ - ssl_algo_t t; - - t = SSL_ALGO_UNKNOWN; - if (pCert != NULL) - pKey = X509_get_pubkey(pCert); - if (pKey != NULL) { - switch (EVP_PKEY_key_type(pKey)) { - case EVP_PKEY_RSA: - t = SSL_ALGO_RSA; - break; - case EVP_PKEY_DSA: - t = SSL_ALGO_DSA; - break; - default: - break; - } - } - return t; -} - -char *ssl_util_algotypestr(ssl_algo_t t) -{ - char *cp; - - cp = "UNKNOWN"; - switch (t) { - case SSL_ALGO_RSA: - cp = "RSA"; - break; - case SSL_ALGO_DSA: - cp = "DSA"; - break; - default: - break; - } - return cp; -} - -/* - * certain key and cert data needs to survive restarts, - * which are stored in the user data table of s->process->pool. - * to prevent "leaking" of this data, we use malloc/free - * rather than apr_palloc and these wrappers to help make sure - * we do not leak the malloc-ed data. - */ -unsigned char *ssl_asn1_table_set(apr_hash_t *table, - const char *key, - long int length) -{ - apr_ssize_t klen = strlen(key); - ssl_asn1_t *asn1 = apr_hash_get(table, key, klen); - - /* - * if a value for this key already exists, - * reuse as much of the already malloc-ed data - * as possible. - */ - if (asn1) { - if (asn1->nData != length) { - free(asn1->cpData); /* XXX: realloc? */ - asn1->cpData = NULL; - } - } - else { - asn1 = malloc(sizeof(*asn1)); - asn1->source_mtime = 0; /* used as a note for encrypted private keys */ - asn1->cpData = NULL; - } - - asn1->nData = length; - if (!asn1->cpData) { - asn1->cpData = malloc(length); - } - - apr_hash_set(table, key, klen, asn1); - - return asn1->cpData; /* caller will assign a value to this */ -} - -ssl_asn1_t *ssl_asn1_table_get(apr_hash_t *table, - const char *key) -{ - return (ssl_asn1_t *)apr_hash_get(table, key, APR_HASH_KEY_STRING); -} - -void ssl_asn1_table_unset(apr_hash_t *table, - const char *key) -{ - apr_ssize_t klen = strlen(key); - ssl_asn1_t *asn1 = apr_hash_get(table, key, klen); - - if (!asn1) { - return; - } - - if (asn1->cpData) { - free(asn1->cpData); - } - free(asn1); - - apr_hash_set(table, key, klen, NULL); -} - -static const char *ssl_asn1_key_types[] = {"RSA", "DSA"}; - -const char *ssl_asn1_keystr(int keytype) -{ - if (keytype >= SSL_AIDX_MAX) { - return NULL; - } - - return ssl_asn1_key_types[keytype]; -} - -const char *ssl_asn1_table_keyfmt(apr_pool_t *p, - const char *id, - int keytype) -{ - const char *keystr = ssl_asn1_keystr(keytype); - - return apr_pstrcat(p, id, ":", keystr, NULL); -} - - -#if APR_HAS_THREADS -/* - * To ensure thread-safetyness in OpenSSL - work in progress - */ - -static apr_thread_mutex_t **lock_cs; -static int lock_num_locks; - -#ifdef HAVE_SSLC -#if SSLC_VERSION_NUMBER >= 0x2000 -static int ssl_util_thr_lock(int mode, int type, - char *file, int line) -#else -static void ssl_util_thr_lock(int mode, int type, - char *file, int line) -#endif -#else -static void ssl_util_thr_lock(int mode, int type, - const char *file, int line) -#endif -{ - if (type < lock_num_locks) { - if (mode & CRYPTO_LOCK) { - apr_thread_mutex_lock(lock_cs[type]); - } - else { - apr_thread_mutex_unlock(lock_cs[type]); - } -#ifdef HAVE_SSLC -#if SSLC_VERSION_NUMBER >= 0x2000 - return 1; - } - else { - return -1; -#endif -#endif - } -} - -static unsigned long ssl_util_thr_id(void) -{ - /* OpenSSL needs this to return an unsigned long. On OS/390, the pthread - * id is a structure twice that big. Use the TCB pointer instead as a - * unique unsigned long. - */ -#ifdef __MVS__ - struct PSA { - char unmapped[540]; - unsigned long PSATOLD; - } *psaptr = 0; - - return psaptr->PSATOLD; -#else - return (unsigned long) apr_os_thread_current(); -#endif -} - -static apr_status_t ssl_util_thread_cleanup(void *data) -{ - CRYPTO_set_locking_callback(NULL); - CRYPTO_set_id_callback(NULL); - - /* Let the registered mutex cleanups do their own thing - */ - return APR_SUCCESS; -} - -void ssl_util_thread_setup(apr_pool_t *p) -{ - int i; - - lock_num_locks = CRYPTO_num_locks(); - lock_cs = apr_palloc(p, lock_num_locks * sizeof(*lock_cs)); - - for (i = 0; i < lock_num_locks; i++) { - apr_thread_mutex_create(&(lock_cs[i]), APR_THREAD_MUTEX_DEFAULT, p); - } - - CRYPTO_set_id_callback(ssl_util_thr_id); - - CRYPTO_set_locking_callback(ssl_util_thr_lock); - - apr_pool_cleanup_register(p, NULL, ssl_util_thread_cleanup, - apr_pool_cleanup_null); -} -#endif diff --git a/trunk/modules/ssl/ssl_util_ssl.c b/trunk/modules/ssl/ssl_util_ssl.c deleted file mode 100644 index ef8eb6668b543ccad2fd9cad206cd4534991ff13..0000000000000000000000000000000000000000 --- a/trunk/modules/ssl/ssl_util_ssl.c +++ /dev/null @@ -1,572 +0,0 @@ -/* Copyright 2001-2005 The Apache Software Foundation or its licensors, as - * applicable. - * - * 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_ssl - * | '_ ` _ \ / _ \ / _` | / __/ __| | Apache Interface to OpenSSL - * | | | | | | (_) | (_| | \__ \__ \ | - * |_| |_| |_|\___/ \__,_|___|___/___/_| - * |_____| - * ssl_util_ssl.c - * Additional Utility Functions for OpenSSL - */ - -#include "ssl_private.h" - -/* _________________________________________________________________ -** -** Additional High-Level Functions for OpenSSL -** _________________________________________________________________ -*/ - -/* we initialize this index at startup time - * and never write to it at request time, - * so this static is thread safe. - * also note that OpenSSL increments at static variable when - * SSL_get_ex_new_index() is called, so we _must_ do this at startup. - */ -static int SSL_app_data2_idx = -1; - -void SSL_init_app_data2_idx(void) -{ - int i; - - if (SSL_app_data2_idx > -1) { - return; - } - - /* we _do_ need to call this twice */ - for (i=0; i<=1; i++) { - SSL_app_data2_idx = - SSL_get_ex_new_index(0, - "Second Application Data for SSL", - NULL, NULL, NULL); - } -} - -void *SSL_get_app_data2(SSL *ssl) -{ - return (void *)SSL_get_ex_data(ssl, SSL_app_data2_idx); -} - -void SSL_set_app_data2(SSL *ssl, void *arg) -{ - SSL_set_ex_data(ssl, SSL_app_data2_idx, (char *)arg); - return; -} - -/* _________________________________________________________________ -** -** High-Level Certificate / Private Key Loading -** _________________________________________________________________ -*/ - -X509 *SSL_read_X509(char* filename, X509 **x509, modssl_read_bio_cb_fn *cb) -{ - X509 *rc; - BIO *bioS; - BIO *bioF; - - /* 1. try PEM (= DER+Base64+headers) */ - if ((bioS=BIO_new_file(filename, "r")) == NULL) - return NULL; - rc = modssl_PEM_read_bio_X509 (bioS, x509, cb, NULL); - BIO_free(bioS); - - if (rc == NULL) { - /* 2. try DER+Base64 */ - if ((bioS=BIO_new_file(filename, "r")) == NULL) - return NULL; - - if ((bioF = BIO_new(BIO_f_base64())) == NULL) { - BIO_free(bioS); - return NULL; - } - bioS = BIO_push(bioF, bioS); - rc = d2i_X509_bio(bioS, NULL); - BIO_free_all(bioS); - - if (rc == NULL) { - /* 3. try plain DER */ - if ((bioS=BIO_new_file(filename, "r")) == NULL) - return NULL; - rc = d2i_X509_bio(bioS, NULL); - BIO_free(bioS); - } - } - if (rc != NULL && x509 != NULL) { - if (*x509 != NULL) - X509_free(*x509); - *x509 = rc; - } - return rc; -} - -#if SSL_LIBRARY_VERSION <= 0x00904100 -static EVP_PKEY *d2i_PrivateKey_bio(BIO *bio, EVP_PKEY **key) -{ - return ((EVP_PKEY *)ASN1_d2i_bio( - (char *(*)())EVP_PKEY_new, - (char *(*)())d2i_PrivateKey, - (bio), (unsigned char **)(key))); -} -#endif - -EVP_PKEY *SSL_read_PrivateKey(char* filename, EVP_PKEY **key, modssl_read_bio_cb_fn *cb, void *s) -{ - EVP_PKEY *rc; - BIO *bioS; - BIO *bioF; - - /* 1. try PEM (= DER+Base64+headers) */ - if ((bioS=BIO_new_file(filename, "r")) == NULL) - return NULL; - rc = modssl_PEM_read_bio_PrivateKey(bioS, key, cb, s); - BIO_free(bioS); - - if (rc == NULL) { - /* 2. try DER+Base64 */ - if ((bioS = BIO_new_file(filename, "r")) == NULL) - return NULL; - - if ((bioF = BIO_new(BIO_f_base64())) == NULL) { - BIO_free(bioS); - return NULL; - } - bioS = BIO_push(bioF, bioS); - rc = d2i_PrivateKey_bio(bioS, NULL); - BIO_free_all(bioS); - - if (rc == NULL) { - /* 3. try plain DER */ - if ((bioS = BIO_new_file(filename, "r")) == NULL) - return NULL; - rc = d2i_PrivateKey_bio(bioS, NULL); - BIO_free(bioS); - } - } - if (rc != NULL && key != NULL) { - if (*key != NULL) - EVP_PKEY_free(*key); - *key = rc; - } - return rc; -} - -/* _________________________________________________________________ -** -** Smart shutdown -** _________________________________________________________________ -*/ - -int SSL_smart_shutdown(SSL *ssl) -{ - int i; - int rc; - - /* - * Repeat the calls, because SSL_shutdown internally dispatches through a - * little state machine. Usually only one or two interation should be - * needed, so we restrict the total number of restrictions in order to - * avoid process hangs in case the client played bad with the socket - * connection and OpenSSL cannot recognize it. - */ - rc = 0; - for (i = 0; i < 4 /* max 2x pending + 2x data = 4 */; i++) { - if ((rc = SSL_shutdown(ssl))) - break; - } - return rc; -} - -/* _________________________________________________________________ -** -** Certificate Revocation List (CRL) Storage -** _________________________________________________________________ -*/ - -X509_STORE *SSL_X509_STORE_create(char *cpFile, char *cpPath) -{ - X509_STORE *pStore; - X509_LOOKUP *pLookup; - - if (cpFile == NULL && cpPath == NULL) - return NULL; - if ((pStore = X509_STORE_new()) == NULL) - return NULL; - if (cpFile != NULL) { - pLookup = X509_STORE_add_lookup(pStore, X509_LOOKUP_file()); - if (pLookup == NULL) { - X509_STORE_free(pStore); - return NULL; - } - X509_LOOKUP_load_file(pLookup, cpFile, X509_FILETYPE_PEM); - } - if (cpPath != NULL) { - pLookup = X509_STORE_add_lookup(pStore, X509_LOOKUP_hash_dir()); - if (pLookup == NULL) { - X509_STORE_free(pStore); - return NULL; - } - X509_LOOKUP_add_dir(pLookup, cpPath, X509_FILETYPE_PEM); - } - return pStore; -} - -int SSL_X509_STORE_lookup(X509_STORE *pStore, int nType, - X509_NAME *pName, X509_OBJECT *pObj) -{ - X509_STORE_CTX pStoreCtx; - int rc; - - X509_STORE_CTX_init(&pStoreCtx, pStore, NULL, NULL); - rc = X509_STORE_get_by_subject(&pStoreCtx, nType, pName, pObj); - X509_STORE_CTX_cleanup(&pStoreCtx); - return rc; -} - -/* _________________________________________________________________ -** -** Cipher Suite Spec String Creation -** _________________________________________________________________ -*/ - -char *SSL_make_ciphersuite(apr_pool_t *p, SSL *ssl) -{ - STACK_OF(SSL_CIPHER) *sk; - SSL_CIPHER *c; - int i; - int l; - char *cpCipherSuite; - char *cp; - - if (ssl == NULL) - return ""; - if ((sk = (STACK_OF(SSL_CIPHER) *)SSL_get_ciphers(ssl)) == NULL) - return ""; - l = 0; - for (i = 0; i < sk_SSL_CIPHER_num(sk); i++) { - c = sk_SSL_CIPHER_value(sk, i); - l += strlen(SSL_CIPHER_get_name(c))+2+1; - } - if (l == 0) - return ""; - cpCipherSuite = (char *)apr_palloc(p, l+1); - cp = cpCipherSuite; - for (i = 0; i < sk_SSL_CIPHER_num(sk); i++) { - c = sk_SSL_CIPHER_value(sk, i); - l = strlen(SSL_CIPHER_get_name(c)); - memcpy(cp, SSL_CIPHER_get_name(c), l); - cp += l; - *cp++ = '/'; - *cp++ = (SSL_CIPHER_get_valid(c) == 1 ? '1' : '0'); - *cp++ = ':'; - } - *(cp-1) = NUL; - return cpCipherSuite; -} - -/* _________________________________________________________________ -** -** Certificate Checks -** _________________________________________________________________ -*/ - -/* check whether cert contains extended key usage with a SGC tag */ -BOOL SSL_X509_isSGC(X509 *cert) -{ -#ifdef HAVE_SSL_X509V3_EXT_d2i - X509_EXTENSION *ext; - int ext_nid; - STACK *sk; - BOOL is_sgc; - int idx; - int i; - - is_sgc = FALSE; - idx = X509_get_ext_by_NID(cert, NID_ext_key_usage, -1); - if (idx >= 0) { - ext = X509_get_ext(cert, idx); - if ((sk = (STACK *)X509V3_EXT_d2i(ext)) != NULL) { - for (i = 0; i < sk_num(sk); i++) { - ext_nid = OBJ_obj2nid((ASN1_OBJECT *)sk_value(sk, i)); - if (ext_nid == NID_ms_sgc || ext_nid == NID_ns_sgc) { - is_sgc = TRUE; - break; - } - } - } - } - return is_sgc; -#else - return FALSE; -#endif -} - -/* retrieve basic constraints ingredients */ -BOOL SSL_X509_getBC(X509 *cert, int *ca, int *pathlen) -{ -#ifdef HAVE_SSL_X509V3_EXT_d2i - X509_EXTENSION *ext; - BASIC_CONSTRAINTS *bc; - int idx; - BIGNUM *bn = NULL; - char *cp; - - if ((idx = X509_get_ext_by_NID(cert, NID_basic_constraints, -1)) < 0) - return FALSE; - ext = X509_get_ext(cert, idx); - if (ext == NULL) - return FALSE; - if ((bc = (BASIC_CONSTRAINTS *)X509V3_EXT_d2i(ext)) == NULL) - return FALSE; - *ca = bc->ca; - *pathlen = -1 /* unlimited */; - if (bc->pathlen != NULL) { - if ((bn = ASN1_INTEGER_to_BN(bc->pathlen, NULL)) == NULL) - return FALSE; - if ((cp = BN_bn2dec(bn)) == NULL) - return FALSE; - *pathlen = atoi(cp); - free(cp); - BN_free(bn); - } - BASIC_CONSTRAINTS_free(bc); - return TRUE; -#else - return FALSE; -#endif -} - -/* retrieve subject CommonName of certificate */ -BOOL SSL_X509_getCN(apr_pool_t *p, X509 *xs, char **cppCN) -{ - X509_NAME *xsn; - X509_NAME_ENTRY *xsne; - int i, nid; - unsigned char *data_ptr; - int data_len; - - xsn = X509_get_subject_name(xs); - for (i = 0; i < sk_X509_NAME_ENTRY_num((STACK_OF(X509_NAME_ENTRY) *) - X509_NAME_get_entries(xsn)); i++) { - xsne = sk_X509_NAME_ENTRY_value((STACK_OF(X509_NAME_ENTRY) *) - X509_NAME_get_entries(xsn), i); - nid = OBJ_obj2nid((ASN1_OBJECT *)X509_NAME_ENTRY_get_object(xsne)); - if (nid == NID_commonName) { - data_ptr = X509_NAME_ENTRY_get_data_ptr(xsne); - data_len = X509_NAME_ENTRY_get_data_len(xsne); - *cppCN = apr_palloc(p, data_len+1); - apr_cpystrn(*cppCN, (char *)data_ptr, data_len+1); - (*cppCN)[data_len] = NUL; - ap_xlate_proto_from_ascii(*cppCN, data_len); - return TRUE; - } - } - return FALSE; -} - -/* _________________________________________________________________ -** -** Low-Level CA Certificate Loading -** _________________________________________________________________ -*/ - -BOOL SSL_X509_INFO_load_file(apr_pool_t *ptemp, - STACK_OF(X509_INFO) *sk, - const char *filename) -{ - BIO *in; - - if (!(in = BIO_new(BIO_s_file()))) { - return FALSE; - } - - if (BIO_read_filename(in, MODSSL_PCHAR_CAST filename) <= 0) { - BIO_free(in); - return FALSE; - } - - ERR_clear_error(); - - modssl_PEM_X509_INFO_read_bio(in, sk, NULL, NULL); - - BIO_free(in); - - return TRUE; -} - -BOOL SSL_X509_INFO_load_path(apr_pool_t *ptemp, - STACK_OF(X509_INFO) *sk, - const char *pathname) -{ - /* XXX: this dir read code is exactly the same as that in - * ssl_engine_init.c, only the call to handle the fullname is different, - * should fold the duplication. - */ - apr_dir_t *dir; - apr_finfo_t dirent; - apr_int32_t finfo_flags = APR_FINFO_TYPE|APR_FINFO_NAME; - const char *fullname; - BOOL ok = FALSE; - - if (apr_dir_open(&dir, pathname, ptemp) != APR_SUCCESS) { - return FALSE; - } - - while ((apr_dir_read(&dirent, finfo_flags, dir)) == APR_SUCCESS) { - if (dirent.filetype == APR_DIR) { - continue; /* don't try to load directories */ - } - - fullname = apr_pstrcat(ptemp, - pathname, "/", dirent.name, - NULL); - - if (SSL_X509_INFO_load_file(ptemp, sk, fullname)) { - ok = TRUE; - } - } - - apr_dir_close(dir); - - return ok; -} - -/* _________________________________________________________________ -** -** Extra Server Certificate Chain Support -** _________________________________________________________________ -*/ - -/* - * Read a file that optionally contains the server certificate in PEM - * format, possibly followed by a sequence of CA certificates that - * should be sent to the peer in the SSL Certificate message. - */ -int SSL_CTX_use_certificate_chain( - SSL_CTX *ctx, char *file, int skipfirst, modssl_read_bio_cb_fn *cb) -{ - BIO *bio; - X509 *x509; - unsigned long err; - int n; - STACK *extra_certs; - - if ((bio = BIO_new(BIO_s_file_internal())) == NULL) - return -1; - if (BIO_read_filename(bio, file) <= 0) { - BIO_free(bio); - return -1; - } - /* optionally skip a leading server certificate */ - if (skipfirst) { - if ((x509 = modssl_PEM_read_bio_X509(bio, NULL, cb, NULL)) == NULL) { - BIO_free(bio); - return -1; - } - X509_free(x509); - } - /* free a perhaps already configured extra chain */ - extra_certs=SSL_CTX_get_extra_certs(ctx); - if (extra_certs != NULL) { - sk_X509_pop_free((STACK_OF(X509) *)extra_certs, X509_free); - SSL_CTX_set_extra_certs(ctx,NULL); - } - /* create new extra chain by loading the certs */ - n = 0; - while ((x509 = modssl_PEM_read_bio_X509(bio, NULL, cb, NULL)) != NULL) { - if (!SSL_CTX_add_extra_chain_cert(ctx, x509)) { - X509_free(x509); - BIO_free(bio); - return -1; - } - n++; - } - /* Make sure that only the error is just an EOF */ - if ((err = ERR_peek_error()) > 0) { - if (!( ERR_GET_LIB(err) == ERR_LIB_PEM - && ERR_GET_REASON(err) == PEM_R_NO_START_LINE)) { - BIO_free(bio); - return -1; - } - while (ERR_get_error() > 0) ; - } - BIO_free(bio); - return n; -} - -/* _________________________________________________________________ -** -** Session Stuff -** _________________________________________________________________ -*/ - -char *SSL_SESSION_id2sz(unsigned char *id, int idlen, - char *str, int strsize) -{ - char *cp; - int n; - - cp = str; - for (n = 0; n < idlen && n < SSL_MAX_SSL_SESSION_ID_LENGTH; n++) { - apr_snprintf(cp, strsize - (cp-str), "%02X", id[n]); - cp += 2; - } - *cp = NUL; - return str; -} - -/* sslc+OpenSSL compat */ - -int modssl_session_get_time(SSL_SESSION *session) -{ -#ifdef OPENSSL_VERSION_NUMBER - return SSL_SESSION_get_time(session); -#else /* assume sslc */ - CRYPTO_TIME_T ct; - SSL_SESSION_get_time(session, &ct); - return CRYPTO_time_to_int(&ct); -#endif -} - -#ifndef SSLC_VERSION_NUMBER -#define SSLC_VERSION_NUMBER 0x0000 -#endif - -DH *modssl_dh_configure(unsigned char *p, int plen, - unsigned char *g, int glen) -{ - DH *dh; - - if (!(dh = DH_new())) { - return NULL; - } - -#if defined(OPENSSL_VERSION_NUMBER) || (SSLC_VERSION_NUMBER < 0x2000) - dh->p = BN_bin2bn(p, plen, NULL); - dh->g = BN_bin2bn(g, glen, NULL); - if (!(dh->p && dh->g)) { - DH_free(dh); - return NULL; - } -#else - R_EITEMS_add(dh->data, PK_TYPE_DH, PK_DH_P, 0, p, plen, R_EITEMS_PF_COPY); - R_EITEMS_add(dh->data, PK_TYPE_DH, PK_DH_G, 0, g, glen, R_EITEMS_PF_COPY); -#endif - - return dh; -} diff --git a/trunk/modules/ssl/ssl_util_ssl.h b/trunk/modules/ssl/ssl_util_ssl.h deleted file mode 100644 index a4bdd8585614d9b25707e5ab3fd333574320c0d6..0000000000000000000000000000000000000000 --- a/trunk/modules/ssl/ssl_util_ssl.h +++ /dev/null @@ -1,80 +0,0 @@ -/* Copyright 2001-2005 The Apache Software Foundation or its licensors, as - * applicable. - * - * 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_ssl - * | '_ ` _ \ / _ \ / _` | / __/ __| | Apache Interface to OpenSSL - * | | | | | | (_) | (_| | \__ \__ \ | - * |_| |_| |_|\___/ \__,_|___|___/___/_| - * |_____| - * ssl_util_ssl.h - * Additional Utility Functions for OpenSSL - */ - -#ifndef __SSL_UTIL_SSL_H__ -#define __SSL_UTIL_SSL_H__ - -/* - * Determine SSL library version number - */ -#ifdef OPENSSL_VERSION_NUMBER -#define SSL_LIBRARY_VERSION OPENSSL_VERSION_NUMBER -#define SSL_LIBRARY_NAME "OpenSSL" -#define SSL_LIBRARY_TEXT OPENSSL_VERSION_TEXT -#elif !defined(SSL_LIBRARY_VERSION) -#define SSL_LIBRARY_VERSION 0x0000 -#define SSL_LIBRARY_NAME "OtherSSL" -#define SSL_LIBRARY_TEXT "OtherSSL 0.0.0 00 XXX 0000" -#endif - -/* - * Maximum length of a DER encoded session. - * FIXME: There is no define in OpenSSL, but OpenSSL uses 1024*10, - * so this value should be ok. Although we have no warm feeling. - */ -#define SSL_SESSION_MAX_DER 1024*10 - -/* max length for SSL_SESSION_id2sz */ -#define SSL_SESSION_ID_STRING_LEN \ - ((SSL_MAX_SSL_SESSION_ID_LENGTH + 1) * 2) - -/* - * Additional Functions - */ -void SSL_init_app_data2_idx(void); -void *SSL_get_app_data2(SSL *); -void SSL_set_app_data2(SSL *, void *); -X509 *SSL_read_X509(char *, X509 **, modssl_read_bio_cb_fn *); -EVP_PKEY *SSL_read_PrivateKey(char *, EVP_PKEY **, modssl_read_bio_cb_fn *, void *); -int SSL_smart_shutdown(SSL *ssl); -X509_STORE *SSL_X509_STORE_create(char *, char *); -int SSL_X509_STORE_lookup(X509_STORE *, int, X509_NAME *, X509_OBJECT *); -char *SSL_make_ciphersuite(apr_pool_t *, SSL *); -BOOL SSL_X509_isSGC(X509 *); -BOOL SSL_X509_getBC(X509 *, int *, int *); -BOOL SSL_X509_getCN(apr_pool_t *, X509 *, char **); -BOOL SSL_X509_INFO_load_file(apr_pool_t *, STACK_OF(X509_INFO) *, const char *); -BOOL SSL_X509_INFO_load_path(apr_pool_t *, STACK_OF(X509_INFO) *, const char *); -int SSL_CTX_use_certificate_chain(SSL_CTX *, char *, int, modssl_read_bio_cb_fn *); -char *SSL_SESSION_id2sz(unsigned char *, int, char *, int); - -/* util functions for OpenSSL+sslc compat */ -int modssl_session_get_time(SSL_SESSION *session); - -DH *modssl_dh_configure(unsigned char *p, int plen, - unsigned char *g, int glen); - -#endif /* __SSL_UTIL_SSL_H__ */