## _ _ ## _ __ ___ ___ __| | ___ ___| | mod_ssl ## | '_ ` _ \ / _ \ / _` | / __/ __| | Apache Interface to OpenSSL ## | | | | | | (_) | (_| | \__ \__ \ | www.modssl.org ## |_| |_| |_|\___/ \__,_|___|___/___/_| ftp.modssl.org ## |_____| ## libssl.module ## Apache 1.3 Configuration mechanism module stub ## ## ## ==================================================================== ## Copyright (c) 1998-2003 Ralf S. Engelschall. All rights reserved. ## ## Redistribution and use in source and binary forms, with or without ## modification, are permitted provided that the following conditions ## are met: ## ## 1. Redistributions of source code must retain the above copyright ## notice, this list of conditions and the following disclaimer. ## ## 2. Redistributions in binary form must reproduce the above copyright ## notice, this list of conditions and the following ## disclaimer in the documentation and/or other materials ## provided with the distribution. ## ## 3. All advertising materials mentioning features or use of this ## software must display the following acknowledgment: ## "This product includes software developed by ## Ralf S. Engelschall for use in the ## mod_ssl project (http://www.modssl.org/)." ## ## 4. The names "mod_ssl" must not be used to endorse or promote ## products derived from this software without prior written ## permission. For written permission, please contact ## rse@engelschall.com. ## ## 5. Products derived from this software may not be called "mod_ssl" ## nor may "mod_ssl" appear in their names without prior ## written permission of Ralf S. Engelschall. ## ## 6. Redistributions of any form whatsoever must retain the following ## acknowledgment: ## "This product includes software developed by ## Ralf S. Engelschall for use in the ## mod_ssl project (http://www.modssl.org/)." ## ## THIS SOFTWARE IS PROVIDED BY RALF S. ENGELSCHALL ``AS IS'' AND ANY ## EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ## IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ## PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL RALF S. ENGELSCHALL OR ## HIS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT ## NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; ## LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ## HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, ## STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ## ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED ## OF THE POSSIBILITY OF SUCH DAMAGE. ## ==================================================================== ## # ``What you are missing, I suppose, is that I'm not # prepared to give equal rights to Ralf on the basis # that he's spent a few hours doing what he thinks is # better than what I've spent the last 4 years on, # and so he isn't prepared to cooperate with me.'' # -- Ben Laurie, Apache-SSL author Name: ssl_module ConfigStart # # interface to the src/Configure script # my_dir="`echo ${modfile} | sed -e 's:/[^/]*$::'`" my_version="$my_dir/libssl.version" my_outfile="Makefile.config" my_prefix=" +" my_prefixe=" " SSL_CFLAGS='' SSL_LDFLAGS='' SSL_LIBS='' # # find a reasonable Bourne Shell for sub-shell calls # SH=/bin/sh # # determine mod_ssl author version # A_ID=`cat $my_version | sed -e 's; .*;;'` A_NAME=`echo $A_ID | sed -e 's;/.*;;'` A_VER=`echo $A_ID | sed -e 's;.*/;;'` A_VER_STR=`echo $A_VER | sed -e 's;-.*;;'` case $A_VER_STR in *.*b* ) A_VER_HEX=`echo "$A_VER_STR" | sed -e 's/b.*//' | awk -F. '{ printf("%d%02d", $1, $2); }' && echo "$A_VER_STR" | sed -e 's/.*b//' | awk '{ printf("0%02d", $1); }'` ;; *.*.* ) A_VER_HEX=`echo "$A_VER_STR" | awk -F. '{ printf("%d%02d1%02d", $1, $2, $3); }'` ;; esac echo "$my_prefix SSL interface: $A_NAME/$A_VER_STR" SSL_VERSION="-DMOD_SSL_VERSION=\\\"$A_VER_STR\\\"" # # determine optional mod_ssl product version # if [ ".`egrep '.*/.* .*/.*' $my_version`" != . ]; then P_ID=`cat $my_version | sed -e 's;.* ;;'` P_NAME=`echo $P_ID | sed -e 's;/.*;;'` P_VER=`echo $P_ID | sed -e 's;.*/;;'` P_VER_STR=`echo $P_VER | sed -e 's;-.*;;'` case $P_VER_STR in *.*b* ) P_VER_HEX=`echo "$P_VER_STR" | sed -e 's/b.*//' | awk -F. '{ printf("%d%02d", $1, $2); }' && echo "$P_VER_STR" | sed -e 's/.*b//' | awk '{ printf("0%02d", $1); }'` ;; *.*.* ) P_VER_HEX=`echo "$P_VER_STR" | awk -F. '{ printf("%d%02d1%02d", $1, $2, $3); }'` ;; esac echo "$my_prefix SSL product: $P_NAME/$P_VER_STR" SSL_VERSION="$SSL_VERSION -DSSL_PRODUCT_NAME=\\\"$P_NAME\\\"" SSL_VERSION="$SSL_VERSION -DSSL_PRODUCT_VERSION=\\\"$P_VER_STR\\\"" fi # # determine object build type # case $modfile in *.so ) my_buildtype="DSO" ;; * ) my_buildtype="OBJ" ;; esac echo "$my_prefix SSL interface build type: $my_buildtype" # # determine SSL rules # if [ ".$APXS_MODE" = .YES ]; then my_rule_SSL_COMPAT=$SSL_COMPAT my_rule_SSL_SDBM=$SSL_SDBM my_rule_SSL_EXPERIMENTAL=$SSL_EXPERIMENTAL my_rule_SSL_CONSERVATIVE=$SSL_CONSERVATIVE my_rule_SSL_VENDOR=$SSL_VENDOR else my_rule_SSL_COMPAT=`$SH helpers/CutRule SSL_COMPAT $file` my_rule_SSL_SDBM=`$SH helpers/CutRule SSL_SDBM $file` my_rule_SSL_EXPERIMENTAL=`$SH helpers/CutRule SSL_EXPERIMENTAL $file` my_rule_SSL_CONSERVATIVE=`$SH helpers/CutRule SSL_CONSERVATIVE $file` my_rule_SSL_VENDOR=`$SH helpers/CutRule SSL_VENDOR $file` fi # # determine compatibility mode # if [ ".$my_rule_SSL_COMPAT" = .yes ]; then echo "$my_prefix SSL interface compatibility: enabled" SSL_CFLAGS="$SSL_CFLAGS -DSSL_COMPAT" else echo "$my_prefix SSL interface compatibility: disabled" fi # # determine experimental mode # if [ ".$my_rule_SSL_EXPERIMENTAL" = .yes ]; then echo "$my_prefix SSL interface experimental code: enabled" SSL_CFLAGS="$SSL_CFLAGS -DSSL_EXPERIMENTAL" else echo "$my_prefix SSL interface experimental code: disabled" fi # # determine conservative mode # if [ ".$my_rule_SSL_CONSERVATIVE" = .yes ]; then echo "$my_prefix SSL interface conservative code: enabled" SSL_CFLAGS="$SSL_CFLAGS -DSSL_CONSERVATIVE" else echo "$my_prefix SSL interface conservative code: disabled" fi # # determine vendor mode # SSL_VENDOR_OBJS='' SSL_VENDOR_OBJS_PIC='' if [ ".$my_rule_SSL_VENDOR" = .yes ]; then echo "$my_prefix SSL interface vendor extensions: enabled" SSL_CFLAGS="$SSL_CFLAGS -DSSL_VENDOR" my_src="`cd $my_dir && echo ssl_vendor*.c`" if [ ".$my_src" != . -a ".$my_src" != ".ssl_vendor*.c" ]; then SSL_CFLAGS="$SSL_CFLAGS -DSSL_VENDOR_OBJS" SSL_VENDOR_OBJS="`echo $my_src | sed -e 's;\.c;.o;g'`" SSL_VENDOR_OBJS_PIC="`echo $my_src | sed -e 's;\.c;.lo;g'`" echo "$my_prefix SSL interface vendor objects: $SSL_VENDOR_OBJS" fi else echo "$my_prefix SSL interface vendor extensions: disabled" fi # # determine DBM support library # (src/Configure has DBM_LIB predefined for some platforms) # if [ ".$APXS_MODE" != .YES ]; then SSL_DBM_NAME='' # 1. check for predefined DBM lib if [ ".$DBM_LIB" != . ]; then LIBS_ORIG="$LIBS" LIBS="$LIBS $DBM_LIB" if $SH helpers/TestCompile func dbm_open; then SSL_DBM_NAME="Configured DBM ($DBM_LIB)" SSL_DBM_FLAG="$DBM_LIB" fi LIBS="$LIBS_ORIG" fi # 2. check for various vendor DBM libs if [ ".$SSL_DBM_NAME" = . ]; then if $SH helpers/TestCompile func dbm_open; then SSL_DBM_NAME='Vendor DBM (libc)' SSL_DBM_FLAG='' elif $SH helpers/TestCompile lib dbm dbm_open; then SSL_DBM_NAME='Vendor DBM (libdbm)' SSL_DBM_FLAG='-ldbm' elif $SH helpers/TestCompile lib ndbm dbm_open; then SSL_DBM_NAME='Vendor DBM (libndbm)' SSL_DBM_FLAG='-lndbm' fi fi # 3. let the SSL_SDBM rule override decisions if [ ".$my_rule_SSL_SDBM" = .yes ]; then # force us to fallback to SDBM SSL_DBM_NAME='' fi if [ ".$my_rule_SSL_SDBM" = .no ]; then # for us to never use SDBM, but be # careful when no DBM was found at all if [ ".$SSL_DBM_NAME" = . ]; then echo "Error: SDBM is needed, because no custom or vendor DBM library available!" 1>&2 echo "Hint: Allow us to choose SDBM by changing the rule SSL_SDBM, please." 1>&2 exit 1 fi fi # 4. override decision on a few brain-dead platforms if [ ".$my_rule_SSL_SDBM" = .default ]; then case "$PLAT" in *-linux* ) # force Linux boxes to use builtin SDBM per default because # of too much broken vendor DBM libraries on this platform SSL_DBM_NAME='' ;; esac fi # 5. finally configure the chosen DBM lib if [ ".$SSL_DBM_NAME" != . ]; then echo "$my_prefix SSL interface plugin: $SSL_DBM_NAME" my_dbm_already_used=`echo $LIBS | grep -- " $SSL_DBM_FLAG"` if [ ".$my_buildtype" = .OBJ -a ".$my_dbm_already_used" != . ]; then : else SSL_LIBS="$SSL_LIBS $SSL_DBM_FLAG" fi else echo "$my_prefix SSL interface plugin: Built-in SDBM" SSL_CFLAGS="$SSL_CFLAGS -DSSL_USE_SDBM" fi fi # # determine SSL_BASE # if [ ".$SSL_BASE" = . ]; then SSL_BASE=`egrep '^SSL_BASE=' $file | sed -n -e '$p' | awk -F= '{print $2}'` if [ ".$SSL_BASE" = . ]; then if [ -d /usr/local/ssl ]; then SSL_BASE="/usr/local/ssl" else SSL_BASE="SYSTEM" fi fi fi case $SSL_BASE in SYSTEM ) ;; /* ) ;; * ) SSL_BASE="`cd ../$SSL_BASE; pwd`" ;; esac if [ ".$SSL_BASE" = .SYSTEM ]; then echo "$my_prefix SSL library path: [SYSTEM]" else if [ ! -d "$SSL_BASE" ]; then echo "Error: Cannot find SSL installation in $SSL_BASE" 1>&2 echo "Hint: Please provide us with the location of OpenSSL" 1>&2 echo " via the environment variable SSL_BASE." 1>&2 exit 1 fi echo "$my_prefix SSL library path: $SSL_BASE" fi # # determine location of OpenSSL binaries # (we still search also for `ssleay' to allow us to # better complain about the actually installed version) # SSL_BINDIR="" if [ ".$SSL_BASE" = .SYSTEM ]; then for name in openssl ssleay; do for p in . `echo $PATH | sed -e 's/:/ /g'`; do if [ -f "$p/$name" ]; then SSL_PROGRAM="$p/$name" SSL_BINDIR="$p" break fi done if [ ".$SSL_BINDIR" != . ]; then break; fi done if [ ".$SSL_BINDIR" = . ]; then echo "Error: Cannot find SSL binaries in $PATH" 1>&2 exit 1 fi else for name in openssl ssleay; do if [ -f "$SSL_BASE/bin/$name" ]; then SSL_PROGRAM="$SSL_BASE/bin/$name" SSL_BINDIR='$(SSL_BASE)/bin' break; fi if [ -f "$SSL_BASE/sbin/$name" ]; then SSL_PROGRAM="$SSL_BASE/sbin/$name" SSL_BINDIR='$(SSL_BASE)/sbin' break; fi if [ -f "$SSL_BASE/apps/$name" ]; then SSL_PROGRAM="$SSL_BASE/apps/$name" SSL_BINDIR='$(SSL_BASE)/apps' break; fi done if [ ".$SSL_BINDIR" = . ]; then echo "Error: Cannot find SSL binaries under $SSL_BASE" 1>&2 exit 1 fi fi # # SSL version # SSL_VERSION_ID="`$SSL_PROGRAM version`" echo "$my_prefix SSL library version: $SSL_VERSION_ID" case $SSL_VERSION_ID in *0.[5678].*|*0.9.[012]* ) echo "Error: OpenSSL VERSIONS BELOW 0.9.3 ARE NO LONGER SUPPORTED." echo "Hint: Use OpenSSL version 0.9.3 or higher!" exit 1 ;; esac # # SSL engine support # case $SSL_VERSION_ID in *0.9.6*engine* | *0.9.6a*engine* | *0.9.[789]* ) SSL_CFLAGS="$SSL_CFLAGS -DSSL_ENGINE" ;; esac # # determine location of OpenSSL headers # if [ ".$SSL_BASE" = .SYSTEM ]; then SSL_INCDIR="" for p in . /usr/include /usr/include/ssl/ /usr/local/include /usr/local/include/ssl; do if [ -f "$p/openssl/ssl.h" ]; then SSL_INCDIR="$p" break fi done if [ ".$SSL_INCDIR" = . ]; then echo "Error: Cannot find SSL header files in any of the following dirs:" 1>&2 echo "Error: . /usr/include /usr/include/ssl/ /usr/local/include /usr/local/include/ssl" 1>&2 exit 1 fi else if [ -f "$SSL_BASE/include/openssl/ssl.h" ]; then SSL_INCDIR='$(SSL_BASE)/include' else echo "Error: Cannot find SSL header files under $SSL_BASE" 1>&2 exit 1 fi fi if [ ".$SSL_INCDIR" != "./usr/include" ]; then SSL_CFLAGS="$SSL_CFLAGS -I\$(SSL_INCDIR)" fi # # determine location of OpenSSL libraries # if [ ".$SSL_BASE" = .SYSTEM ]; then SSL_LIBDIR="" for p in . /lib /usr/lib /usr/local/lib; do if [ -f "$p/libssl.a" -o -f "$p/libssl.so" ]; then SSL_LIBDIR="$p" my_real_ssl_libdir="$p" break fi done if [ ".$SSL_LIBDIR" = . ]; then echo "Error: Cannot find SSL library files in any of the following dirs:" 1>&2 echo "Error: . /lib /usr/lib /usr/local/lib" 1>&2 exit 1 fi else if [ -f "$SSL_BASE/libssl.a" -o -f "$SSL_BASE/libssl.so" ]; then SSL_LIBDIR='$(SSL_BASE)' my_real_ssl_libdir="$SSL_BASE" elif [ -f "$SSL_BASE/lib/libssl.a" -o -f "$SSL_BASE/lib/libssl.so" ]; then SSL_LIBDIR='$(SSL_BASE)/lib' my_real_ssl_libdir="$SSL_BASE/lib" else echo "Error: Cannot find SSL library files under $SSL_BASE" 1>&2 exit 1 fi fi SSL_LDFLAGS="$SSL_LDFLAGS -L\$(SSL_LIBDIR)" SSL_LIBS="$SSL_LIBS -lssl -lcrypto" # # SSL installation type # case $SSL_BINDIR in */apps ) my_type="source tree only" ;; * ) my_type="installed package" ;; esac case $SSL_BASE in SYSTEM ) my_note="(system-wide)" ;; * ) my_note="(stand-alone)" ;; esac echo "$my_prefix SSL library type: $my_type $my_note" # # Special GCC/DSO support # # Under some platforms where GCC is used we have to link the DSO # (libssl.so) explicitly against the GCC library (libgcc) to avoid # problems with missing symbols like __umoddi3, etc. # # Notice: When GCC is installed as "cc" we assume it's really # well incorporated into the system and no hack is # needed (like on FreeBSD, Linux, etc.) # if [ ".$my_buildtype" = .DSO ]; then my_CC=`echo "$CC" | sed -e 's/ .*//'` case $my_CC in gcc|*/gcc|egcs|*/egcs|egcc|*/egcc|pgcc|*/pgcc ) gcclibdir="`$CC --print-libgcc-file-name | sed -e 's;/[^/]*$;;'`" SSL_LIBS="$SSL_LIBS -L$gcclibdir -lgcc" ;; esac fi # # adjust the Apache build environment # echo "SSL_BASE=$SSL_BASE" >>$my_outfile echo "SSL_BINDIR=$SSL_BINDIR" >>$my_outfile echo "SSL_INCDIR=$SSL_INCDIR" >>$my_outfile echo "SSL_LIBDIR=$SSL_LIBDIR" >>$my_outfile echo "SSL_PROGRAM=$SSL_PROGRAM" >>$my_outfile echo "SSL_VERSION=$SSL_VERSION" >>$my_outfile echo "SSL_CFLAGS=$SSL_CFLAGS" >>$my_outfile echo "SSL_VENDOR_OBJS=$SSL_VENDOR_OBJS" >>$my_outfile echo "SSL_VENDOR_OBJS_PIC=$SSL_VENDOR_OBJS_PIC" >>$my_outfile if [ ".$my_buildtype" = .DSO ]; then # under DSO we link ourself echo "SSL_LIBS=$SSL_LIBS" >>$my_outfile echo "SSL_LDFLAGS=$SSL_LDFLAGS" >>$my_outfile else # else we are linked with httpd LDFLAGS="$LDFLAGS $SSL_LDFLAGS" LIBS="$LIBS $SSL_LIBS" fi CFLAGS="$CFLAGS -DMOD_SSL=$A_VER_HEX" if [ ".$P_ID" != . ]; then CFLAGS="$CFLAGS -DSSL_PRODUCT=$P_VER_HEX" fi RULE_EAPI=yes ConfigEnd