#!/bin/sh
#
# Configuration script for Services.
#
# Anope (c) 2003 Anope team
# Contact us at anope@zero.org
#
# This program is free but copyrighted software; see the file COPYING for
# details.
#
# Based on the original code of Epona by PegSoft.
# Based on the original code of Services by Andy Church.

###########################################################################

# Nifty handy functions.

echo2 () {
	$ECHO2 "$*$ECHO2SUF"	# these are defined later
}

log () {
	echo >&3 "$MODE: $*"
}

run () {
	echo >&3 "$MODE: >>> $*"
	$* >&3 2>&3 </dev/null
}

exists () {			# because some shells don't have test -e
	if [ -f $1 -o -d $1 -o -p $1 -o -c $1 -o -b $1 ] ; then
		return 0
	else
		return 1
	fi
}

###########################################################################

# Test for the presence of a given include file or function.  If the
# variable TEST is non-empty, it contains code to be placed at the end of
# main(), and should return 0 if everything is okay, else 1.
#
# For includes: Pass the include filename as an argument.  The variable
# HAVE_include_name, where "include_name" is the name of the include file
# with letters uppercased and non-alphanumerics replaced by underscores, is
# set to 1 if the include file is present, else 0.
#
# For functions: Pass the return type, function name, and prototype as
# arguments.  The variable HAVE_function, where "function" is the name
# of the function with letters uppercased, is set to 1 if the function is
# available, else 0.
#
# For both: The result code of the function will be 0 (true) if the entity
# is present, else 1 (false).

test_include () {
	include="$1"
	inc2="`echo $include | sed 'y+abcdefghijklmnopqrstuvwxyz/.-+ABCDEFGHIJKLMNOPQRSTUVWXYZ___+'`"
	if [ -f "/usr/include/$include" ] ; then
		eval "HAVE_${inc2}=1"
		log "found $include in /usr/include"
		return 0
	fi
	cat >tmp/test.c <<EOT
#include <$include>
int main() { return 0; }
EOT
	if run $CC $CC_FLAGS tmp/test.c $CC_LIBS -o tmp/test ; then
		eval "HAVE_${inc2}=1"
		log "found $include"
		return 0
	else
		eval "HAVE_${inc2}=0"
		log "didn't find $include"
		return 1
	fi
}

test_function () {
	rettype="$1"
	func="$2"
	proto="$3"
	if [ ! "$rettype" -o ! "$func" ] ; then
		log "test_function: missing parameter(s)"
		return 1
	fi
	if [ ! "$proto" ] ; then
		proto="(...)"
	fi
	func2=`echo $func | tr '[a-z]' '[A-Z]'`
	if [ ! "$TEST" ] ; then
		TEST="return 0;"
	fi
	cat >tmp/test.c <<EOT
	int main() {
		extern int $func$proto;
		$TEST
	}
EOT
	if run $CC $CC_FLAGS tmp/test.c $CC_LIBS -o tmp/test && run tmp/test ; then
		eval "HAVE_${func2}=1"
		log "found $func"
		return 0
	else
		eval "HAVE_${func2}=0"
		log "didn't find $func"
		return 1
	fi
}

###########################################################################

# If something happens that really shouldn't:

whoa_there () {
	echo ""
	echo ""
	echo "*** WHOA THERE! ***"
	echo ""
	echo "We suddenly couldn't compile using the C compiler we already tested!"
	echo "The command line we used was:"
	echo "     $CC $CC_FLAGS tmp/test.c $CC_LIBS -o tmp/test"
	echo "Please try to fix this; if you can't, mail anope@zero.org"
	echo "with information about your system, the output from this script,"
	echo "and the "\`"configure.log' file generated by this script."
	echo ""
	exit 4
}

###########################################################################
###########################################################################

# Create a temporary directory for our use.

if [ -d tmp ] ; then
	rm -rf tmp
fi
if mkdir tmp ; then : ; else
	echo "Failed to create temporary directory!  Exiting."
	exit 2
fi
if chmod u+rwx tmp ; then : ; else
	echo "Cannot write to temporary directory!  Exiting."
	exit 2
fi

###########################################################################

# Variable initialization.

PROGRAM=services
BINDEST=$HOME/services
DATDEST=$HOME/services

RUNGROUP=
UMASK=
IRCTYPE="no default"
IRCTYPE_DEF=
IRCTYPE_DEF2=
ENCRYPTION=
IMPORTSUPPORT=
THREAD=
MYSQL=
RDB=
HAVE_MYSQL_MYSQL_H=
USE_MODULES=
MODULE_PATH=
HAS_RTLD_LOCAL=
CC_ELIBS=
CC_MLIBS=


INSTALL=
CP_ALL=

CC=
CC_FLAGS=bonkle
CC_LFLAGS=bonkle
CC_LIBS=bonkle

OSTYPE=bonkle

TYPE_INT16=
TYPE_INT32=

HAVE_STRINGS_H=
HAVE_SYS_SELECT_H=
HAVE_SYS_SYSPROTO_H=

HAVE_GETHOSTBYNAME_R=bonkle

HAVE_STRERROR=
HAVE_SYS_ERRLIST=0

HAVE_SNPRINTF=
BAD_SNPRINTF=
HAVE_STRICMP=
HAVE_STRCASECMP=
HAVE_STRDUP=
HAVE_STRSPN=
HAVE_STRSIGNAL=
HAVE_GETTIMEOFDAY=
HAVE_SETGRENT=
HAVE_UMASK=
HAVE_FORK=
MISSING=bonkle

###########################################################################

# How can we echo something without going to the next line?

ECHO2SUF=''
if [ "`echo -n a ; echo -n b`" = "ab" ] ; then
	ECHO2='echo -n'
elif [ "`echo 'a\c' ; echo 'b\c'`" = "ab" ] ; then
	ECHO2='echo' ; ECHO2SUF='\c'
elif [ "`printf 'a' 2>&1 ; printf 'b' 2>&1`" = "ab" ] ; then
	ECHO2='printf "%s"'
else
	# oh well...
	ECHO2='echo'
fi
export ECHO2 ECHO2SUF

###########################################################################

# Command-line parsing.

IGNORE_CACHE= ; USER_CC= ; USER_CC_FLAGS=bonkle ; USER_CC_LFLAGS=bonkle
USER_CC_LIBS= ; MYSQL_LIB_DIR=bonkle ; MYSQL_INC_DIR=bonkle

export IGNORE_CACHE USER_CC USER_CC_FLAGS USER_CC_LFLAGS USER_CC_LIBS MYSQL_LIB_DIR MYSQL_INC_DIR

while [ $# -gt 0 ] ; do
	if [ "$1" = "-ignore-cache" ] ; then
		IGNORE_CACHE=bonkle
	elif [ "$1" = "-cc" ] ; then
		shift
		USER_CC=$1
	elif [ "$1" = "-cflags" ] ; then
		shift
		USER_CC_FLAGS=$1
	elif [ "$1" = "-lflags" ] ; then
		shift
		USER_CC_LFLAGS=$1
	elif [ "$1" = "-libs" ] ; then
		shift
		USER_CC_LIBS=$1
	elif [ "$1" = "-os2" ] ; then
		PROGRAM=services.exe
	elif [ "$1" = "-with-mysql-libs" ] ; then
		shift
		MYSQL_LIB_DIR=$1
	elif [ "$1" = "-with-mysql-includes" ] ; then
		shift
		MYSQL_INC_DIR=$1
	else
		if [ "$1" != "-help" -a "$1" != "-h" -a "$1" != "--help" ]; then
			echo >&2 Unknown option/parameter: "$1"
			exitval=1
		else
			exitval=0
		fi
		cat >&2 <<EOT
Available options:
	-ignore-cache		Don't use cache file if it exists
	-os2			Indicate that this is an OS/2 system.
	-cc			Specify C compiler to use (overrides cache and check)
	-cflags			Specify compilation flags (defaults: -O2 for gcc,
			   	 -O for other compilers; overrides cache/check)
	-lflags			Specify link flags for C compiler (default: none)
	-libs			Specify extra link libraries to use (default: none)
	-with-mysql-libs	Specify MySQL library directory to use (default: /usr/lib/mysql)
	-with-mysql-includes	Specify MySQL include directory to use (default: /usr/include)
EOT
		exit $exitval
	fi
	shift
done

###########################################################################

echo ""
echo "-========================= A N O P E ==========================-"
echo "For more detailed information on the features of Anope1.6 please"
echo "read the self-named documentation found on the 'docs' directory."
echo ""

echo "Anope is a set of IRC Service expanded upon Lara's Epona, based"
echo "on Andy Church's IRC Services. For all your Anope needs please"
echo "visit our portal at http://www.anope.org/"
echo ""

echo "Please read the INSTALL file for install/upgrade instructions."
echo "Reading the FAQ and README files would be a good idea too. (all"
echo "documentation is located on directory 'docs')."
echo "-==============================================================-"
echo ""
echo "Beginning Services configuration."
echo ""

###########################################################################

# First, test for the presence of a config.cache file.  If found, either
# don't use it (-ignore-cache), or let the user know how to not use it and
# then use it.

if [ -f config.cache -a -r config.cache -a ! "$IGNORE_CACHE" ] ; then
	cat <<EOT
Using defaults from config.cache. To ignore, either rm config.cache 
or give the command-line option "-ignore-cache".

EOT
	. config.cache
	if [ ! "$HAVE_SNPRINTF" \
			-o ! "$BAD_SNPRINTF" \
			-o ! "$HAVE_STRICMP" \
			-o ! "$HAVE_STRCASECMP" \
			-o ! "$HAVE_STRDUP" \
			-o ! "$HAVE_STRSPN" \
			-o ! "$HAVE_STRSIGNAL" ] ; then
		MISSING=bonkle
	fi
fi

###########################################################################


###########################################################################

# Set up log file for automated tests, so we have a clue what's going on if
# something dies.

exec 3>configure.log

MODE="                "
TEST=""
export MODE TEST

###########################################################################

# Search for a compiler.

MODE="find_cc         "
echo2 "Searching for a suitable compiler... "
if [ "$USER_CC" ] ; then
	CC="$USER_CC"
	echo "(supplied) using $CC."
	log user supplied \`"$USER_CC'"
elif [ "$CC" ] ; then
	echo "(cached) using $CC."
	log cache supplied \`"$CC'"
elif run gcc --version ; then
	echo "great, found gcc!"
	CC=gcc
	DEF_CC_FLAGS=-O2
	log using \`gcc\'
else
	echo "gcc not found."
	echo2 "    Looking for alternatives... "
	echo >tmp/test.c "int main(){return 1;}"
	if run cc tmp/test.c -o tmp/test ; then
		CC=cc
	elif run c89 tmp/test.c -o tmp/test ; then
		CC=c89
	else
		echo "no C compiler found!"
		echo "    Use the -cc command line option to specify your C compiler."
		log "automatic tests failed"
		exit 2
	fi
	# See if it handles ANSI.
	cat >tmp/test.c <<EOT
	int main(int argc, char **argv) {
		extern void foo(int bar);
	}
EOT
	log "test for ANSI..."
	if run $CC tmp/test.c -o tmp/test ; then
		echo "using $CC."
		log using \`"$CC'"
	else
		echo "found $CC, but it's not ANSI-compliant!"
		echo "    Use the -cc command line option to specify your C compiler."
		log \`"$CC' not ANSI-compliant"
		exit 2
	fi
	DEF_CC_FLAGS=-O
fi


# Test compiler options.

MODE="find_ccopts     "
if [ "$USER_CC_FLAGS" != bonkle ] ; then
	CC_FLAGS="$USER_CC_FLAGS"
	echo "Compiler flags supplied: $CC_FLAGS"
	log user supplied flags: \`"$CC_FLAGS'"
elif [ "$CC_FLAGS" != bonkle ] ; then
	echo "Compiler flags: (cached) $CC_FLAGS"
	log cache supplied flags: \`"$CC_FLAGS'"
else
	CC_FLAGS=$DEF_CC_FLAGS
	echo2 "Testing default compiler flags ($CC_FLAGS)... "
	cat >tmp/test.c <<EOT
	int main(int argc, char **argv) {
		extern void foo(int bar);
	}
EOT
	if run $CC $CC_FLAGS -c tmp/test.c -o tmp/test.o ; then
		echo "looks good."
	else
		echo "no luck!  Using no flags."
		echo "    If you know what flags you want, use the -cflags option to configure."
		CC_FLAGS=
	fi
	log using flags: \`"$CC_FLAGS'"
fi

###########################################################################

# Set linker flags.

MODE="find_lflags     "
if [ "$USER_CC_LFLAGS" != "bonkle" ] ; then
	CC_LFLAGS=$USER_CC_LFLAGS
	log user supplied \`"$CC_LFLAGS'"
elif [ "$CC_LFLAGS" != "bonkle" ] ; then
	log cache supplied \`"$CC_LFLAGS'"
else
	log using no flags
	CC_LFLAGS=""
fi

###########################################################################

# See what libraries we have that we might need.

MODE="find_libs       "
echo2 "Let's see what libraries are lying around... "
if [ "$CC_LIBS" != bonkle ] ; then
	if [ "$CC_LIBS" ] ; then
		echo "(cached) $CC_LIBS"
	else
		echo "(cached) none"
	fi
	log cache supplied \`"$CC_LIBS'"
else
	echo >tmp/test.c "int main(){return 1;}"
	CC_LIBS=
	if run $CC $CC_FLAGS tmp/test.c -lnsl -o tmp/test ; then
		CC_LIBS="$CC_LIBS -lnsl"
		echo2 "-lnsl "
	fi
	if run $CC $CC_FLAGS tmp/test.c -lsocket -o tmp/test ; then
		CC_LIBS="$CC_LIBS -lsocket"
		echo2 "-lsocket "
	fi
	if run $CC $CC_FLAGS tmp/test.c -lresolv -o tmp/test ; then
		CC_LIBS="$CC_LIBS -lresolv"
		echo2 "-lresolv "
	fi
	if run $CC $CC_FLAGS tmp/test.c -lbsd -o tmp/test ; then
		CC_LIBS="$CC_LIBS -lbsd"
		echo2 "-lbsd "
	fi

	if [ "$THREAD" = "USE_THREADS" ] ; then
		if run $CC $CC_FLAGS  tmp/test.c -pthread -o tmp/test ; then
			CC_FLAGS="$CC_FLAGS "
			CC_LIBS="$CC_LIBS -pthread"
			echo2 "-pthread "
		elif run $CC $CC_FLAGS  tmp/test.c -lpthread -o tmp/test ; then
			CC_FLAGS="$CC_FLAGS "
			CC_LIBS="$CC_LIBS -lpthread"
			echo2 "-lpthread "
		else
		   	THREAD=""
			echo ""
			echo "Configure was not able to determine how to compile Anope"
			echo "with threading support; disabled it." 
		fi
	fi

        if [ "$MYSQL" = "USE_MYSQL" ] ; then
		if [ "$MYSQL_LIB_DIR" = bonkle ] ; then
			# Let's try to find it...
			MYSQL_LIB_DIR="`mysql_config --libs 2> /dev/null | awk '{print $1}' | sed s/-L//g | sed s/\'//g`"
			if [ -f "$MYSQL_LIB_DIR/libmysqlclient.so" ] ; then
				MYSQL_LIB_DIR="$MYSQL_LIB_DIR"
			elif [ -f "/usr/lib/libmysqlclient.so" ] ; then
				MYSQL_LIB_DIR="/usr/lib"
			elif [ -f "/usr/lib/mysql/libmysqlclient.so" ] ; then
				MYSQL_LIB_DIR="/usr/lib/mysql"
			elif [ -f "/usr/local/lib/mysql/libmysqlclient.so" ] ; then
				MYSQL_LIB_DIR="/usr/local/lib/mysql"
			else 
				echo ""
				echo "Couldn't find default MySQL lib directory."
				echo "Specify your MySQL lib directory manually."
				echo "Run $0 with:"
				echo "-with-mysql-libs /path/to/libmysqlclient.so"
				echo ""
				echo "Exiting..."
				exit 4
			fi
		else
			if [ ! -f "${MYSQL_LIB_DIR}/libmysqlclient.so" ] ; then
				echo ""
				echo "Couldn't find MySQL library files. Check"
				echo "that your MySQL lib directory is correct"
				echo "Exiting..."
				exit 4
			else
				export LD_LIBRARY_PATH="${MYSQL_LIB_DIR}:${LD_LIBRARY_PATH}"
				MYSQL_LIBDIR_WARN="MYSQL_LIBDIR_WARN"
			fi
		fi

		if [ "$MYSQL_INC_DIR" = bonkle ] ; then
			# Same deal as before
			MYSQL_INC_DIR="`mysql_config --cflags 2> /dev/null | sed s/-I//g | sed s/\'//g`"
			if [ -d "$MYSQL_INC_DIR" ] && [ -f "$MYSQL_INC_DIR/mysql/mysql.h" ] ; then
				MYSQL_INC_DIR="$MYSQL_INC_DIR"
			elif [ -f "$MYSQL_INC_DIR/mysql.h" ] ; then
				MYSQL_INC_DIR="$MYSQL_INC_DIR"
				HAVE_MYSQL_MYSQL_H="HAVE_MYSQL_MYSQL_H"
			elif [ -d "/usr/include/mysql" ] && [ -f "/usr/include/mysql/mysql.h" ] ; then
				MYSQL_INC_DIR="/usr/include"
			elif [ -f "/usr/include/mysql.h" ] ; then
				MYSQL_INC_DIR="/usr/include"
				HAVE_MYSQL_MYSQL_H="HAVE_MYSQL_MYSQL_H"
			elif [ -d "/usr/local/include" ] && [ -f "/usr/local/include/mysql/mysql.h" ] ; then
				MYSQL_INC_DIR="/usr/local/include"
			elif [ -f "/usr/local/include/mysql.h" ] ; then
				MYSQL_INC_DIR="/usr/local/include"
				HAVE_MYSQL_MYSQL_H="HAVE_MYSQL_MYSQL_H"
			else 
				echo ""
				echo "Couldn't find default MySQL include directory."
				echo "Specify your MySQL include directory manually."
				echo "Run $0 with:"
				echo "-with-mysql-includes /path/to/mysql.h"
				echo ""
				echo "Exiting..."
				exit 4
			fi
		else
			if [ -f "${MYSQL_INC_DIR}/mysql/mysql.h" ] ; then
				MYSQL_INC_DIR="${MYSQL_INC_DIR}/mysql"
				HAVE_MYSQL_MYSQL_H="HAVE_MYSQL_MYSQL_H"
			elif [ -f "${MYSQL_INC_DIR}/mysql.h" ] ; then
				HAVE_MYSQL_MYSQL_H="HAVE_MYSQL_MYSQL_H"
			else
				echo ""
				echo "Couldn't find MySQL include files. Check that"
				echo "your MySQL include directory is correct."
				echo "Exiting..."
				exit 4
			fi

		fi

		if [ "$HAVE_MYSQL_MYSQL_H" = "HAVE_MYSQL_MYSQL_H" ] ; then
			cat >tmp/test.c <<EOT
			#include <mysql.h>
			int main(void) { return 0; }
EOT
		else
			cat >tmp/test.c <<EOT
			#include <mysql/mysql.h>
			int main(void) { return 0; }
EOT
		fi

		if run $CC $CC_FLAGS -I$MYSQL_INC_DIR -L$MYSQL_LIB_DIR -lmysqlclient tmp/test.c ; then
			CC_LIBS="$CC_LIBS -L$MYSQL_LIB_DIR -lmysqlclient -lz"
			CC_FLAGS="$CC_FLAGS -I$MYSQL_INC_DIR"
			echo2 "-lmysqlclient "
		else
			echo ""
			echo "Unable to compile with MySQL support. Check that the include"
			echo "and library directories are correct."
			exit 4
		fi

        fi

	echo ""
	CC_LIBS="`echo $CC_LIBS | sed 's/^ +//'`"
fi

if [ "$USER_CC_LIBS" ] ; then
	CC_LIBS="$CC_LIBS $USER_CC_LIBS"
	echo "Additional user-supplied libraries: $USER_CC_LIBS"
	log user added \`"$USER_CC_LIBS'"
fi


if [ "$USE_MODULES" = "USE_MODULES" ] ; then
	cat >tmp/test.c <<EOT
	#include <dlfcn.h>
	int main(void) { return RTLD_LOCAL; }
EOT
	if run $CC $CC_FLAGS tmp/test.c ; then
		HAS_RTLD_LOCAL="yes"
		echo "has RTLD_LOCAL "
	else
		echo "no RTLD_LOCAL"
	fi
fi



###########################################################################

# OS specific behaviour

echo2 "Looking for OS specific needs... "
if [ "$OSTYPE" != bonkle ] ; then
	if [ "$OSTYPE" = "LINUX20" ] ; then
		echo2 "(cached) Linux 2.0 or 2.1 thread handling; "
	fi
	if [ "$OSTYPE" = "LINUX22" ] ; then
		echo2 "(cached) Linux 2.2+ thread handling; "
	fi
	if [ "$OSTYPE" = "JAGUAR" ] ; then
		echo2 "(cached) Jaguar (MacOS X 10.2.x); "
	fi
	if [ "$OSTYPE" = "MACOSX" ] ; then
		echo2 "(cached) MacOS X (10.0.x, 10.1.x); "
	fi
else	
	if [ "$THREAD" = "USE_THREADS" -a `uname -s` = "Linux" ] ; then
		VER=`uname -r`
		case $VER in
			2.0*|2.1*)
				OSTYPE="LINUX20"
				echo2 "Linux 2.0 or 2.1 thread handling; "
				;;
			*)
				OSTYPE="LINUX22"
				echo2 "Linux 2.2+ thread handling; "
				;;
		esac
	else
		if [ `uname -s` = "Darwin" ] ; then
			VER=`uname -r`
			case $VER in
				6.*)
					OSTYPE="JAGUAR"
					echo2 "Jaguar (MacOS X 10.2.x); "
					;;
				*)
					OSTYPE="MACOSX"
					echo2 "MacOS X (10.0.x, 10.1.x); "
					;;
			esac
		fi
	fi
fi

echo ""

###########################################################################

# See what sizes various types are.

MODE="check_int16     "
echo2 "Looking for a 16-bit integer type... "
if [ "$TYPE_INT16" ] ; then
	echo "(cached) $TYPE_INT16"
	log "cache supplied $TYPE_INT16"
else
	cat >tmp/test.c <<EOT
	int main() {
		int a;
		short b;
		printf("%d %d", sizeof(a), sizeof(b));
		return 0;
	}
EOT
	if run $CC $CC_FLAGS tmp/test.c $CC_LIBS -o tmp/test ; then
		a="`tmp/test`"
		log "test program output (sizeof(int) sizeof(short)): $a"
		if [ ! "$a" ] ; then
			echo "test program failed!  Assuming short."
			log "assuming short"
			TYPE_INT16=short
		else
			size_int=`echo $a | cut -d\  -f1`
			size_short=`echo $a | cut -d\  -f2`
			if [ $size_int = 2 ] ; then
				echo int
				log "int is 16 bits"
				TYPE_INT16=int
			elif [ $size_short = 2 ] ; then
				echo short
				log "short is 16 bits"
				TYPE_INT16=short
			else
				echo "none found?!  Assuming short."
				log "no 16-bit type found, assuming short"
				TYPE_INT16=short
			fi
		fi
	else
		whoa_there
	fi
fi

MODE="check_int32     "
echo2 "Looking for a 32-bit integer type... "
if [ "$TYPE_INT32" ] ; then
	echo "(cached) $TYPE_INT32"
	log "cache supplied $TYPE_INT32"
else
	cat >tmp/test.c <<EOT
	int main() {
		int a;
		long b;
		printf("%d %d", sizeof(a), sizeof(b));
		return 0;
	}
EOT
	if run $CC $CC_FLAGS tmp/test.c $CC_LIBS -o tmp/test ; then
		a="`tmp/test`"
		log "test program output (sizeof(int) sizeof(long)): $a"
		if [ ! "$a" ] ; then
			echo "test program failed!  Assuming long."
			log "assuming long"
			TYPE_INT32=long
		else
			size_int=`echo $a | cut -d\  -f1`
			size_long=`echo $a | cut -d\  -f2`
			if [ $size_int = 4 ] ; then
				echo int
				log "int is 32 bits"
				TYPE_INT32=int
			elif [ $size_long = 4 ] ; then
				echo long
				log "long is 32 bits"
				TYPE_INT32=long
			else
				echo "none found?!  Assuming long."
				log "no 32-bit type found, assuming long"
				TYPE_INT32=long
			fi
		fi
	else
		whoa_there
	fi
fi

###########################################################################

# Look for include files that might or might not be here.
echo "Checking for presence of include files (it's okay if some aren't there):"

MODE="check_strings   "
echo2 "    strings.h... "
if [ "$HAVE_STRINGS_H" ] ; then
	if [ "$HAVE_STRINGS_H" = 1 ] ; then
		echo "(cached) present"
		log "cache says present"
	else
		echo "(cached) not present"
		log "cache says not present"
	fi
else
	if test_include strings.h ; then
		echo "present"
	else
		echo "not present"
	fi
fi

MODE="check_sysselect "
echo2 "    sys/select.h... "
if [ "$HAVE_SYS_SELECT_H" ] ; then
	if [ "$HAVE_SYS_SELECT_H" = 1 ] ; then
		echo "(cached) present"
		log "cache says present"
	else
		echo "(cached) not present"
		log "cache says not present"
	fi
else
	if test_include sys/select.h ; then
		echo "present"
	else
		echo "not present"
	fi
fi

MODE="check_sysproto  "
echo2 "    sys/sysproto.h... "
if [ "$HAVE_SYS_SYSPROTO_H" ] ; then
	if [ "$HAVE_SYS_SYSPROTO_H" = 1 ] ; then
		echo "(cached) present"
		log "cache says present"
	else
		echo "(cached) not present"
		log "cache says not present"
	fi
else
	if test_include sys/sysproto.h ; then
		echo "present"
	else
		echo "not present"
	fi
fi

###########################################################################

# AIX workaround.

MODE="check_aix_intNN "
echo2 "Seeing if your system defines int16/int32... "
res="`run egrep int16\|int32 /usr/include/sys/systypes.h`"
if [ "$res" ] ; then
	echo "found."
	echo "    (This is bad, but we can work around it.)"
	log "int16/int32 types found, enabling workaround"
	INTTYPE_WORKAROUND=1
else
	echo "not found (this is good)."
	log "int16/int32 types not found"
	INTTYPE_WORKAROUND=0
fi

###########################################################################

# How to use gethostbyname_r() ...

if [ "$THREAD" = "USE_THREADS" ] ; then
	MODE="check_gethostbyname_r  "
	echo2 "Figuring out how to call gethostbyname_r on your system... "
	
	if [ "$HAVE_GETHOSTBYNAME_R" != "bonkle" ] ; then
		if [ "$HAVE_GETHOSTBYNAME_R" = "HAVE_GETHOSTBYNAME_R6" ] ; then
			echo "(cached) with 6 parameters."
			log "cache supplied with 6 parameters."
		elif [ "$HAVE_GETHOSTBYNAME_R" = "HAVE_GETHOSTBYNAME_R5" ] ; then
			echo "(cached) with 5 parameters."
			log "cache supplied with 5 parameters."
		elif [ "$HAVE_GETHOSTBYNAME_R" = "HAVE_GETHOSTBYNAME_R3" ] ; then
			echo "(cached) with 3 parameters."
			log "cache supplied with 3 parameters."
		else
			THREAD=
			echo "(cached) no compatible gethostbyname_r()"
			log "cache supplied no compatible gethostbyname_r()"
		fi
	else
		cat >tmp/test.c <<EOT
		#include "pthread.h"
		#include "netdb.h"
	
		int main() {
			char *name;
    		struct hostent *he, *res;
    		char buffer[2048];
    		int buflen = 2048;
    		int h_errnop;

    		(void) gethostbyname_r(name, he, buffer, buflen, &res, &h_errnop);
		}
EOT
		
		if run $CC $CC_FLAGS tmp/test.c $CC_LIBS -o tmp/test ; then
			HAVE_GETHOSTBYNAME_R="HAVE_GETHOSTBYNAME_R6"
			echo "with 6 parameters"
		fi
	
		if [ "$HAVE_GETHOSTBYNAME_R" = "bonkle" ] ; then
		
		cat >tmp/test.c <<EOT
		#include "pthread.h"
		#include "netdb.h"
	
		int main() {
			char *name;
      		struct hostent *he;
      		char buffer[2048];
      		int buflen = 2048;
      		int h_errnop;

      		(void) gethostbyname_r(name, he, buffer, buflen, &h_errnop);
		}
EOT
		
		if run $CC $CC_FLAGS tmp/test.c $CC_LIBS -o tmp/test ; then
			HAVE_GETHOSTBYNAME_R="HAVE_GETHOSTBYNAME_R5"
			echo "with 5 parameters"
		fi
		
		fi
		
		if [ "$HAVE_GETHOSTBYNAME_R" = "bonkle" ] ; then
		
		cat >tmp/test.c <<EOT
		#include "pthread.h"
		#include "netdb.h"
	
		int main() {
			char *name;
        	struct hostent *he;
        	struct hostent_data data;

        	gethostbyname_r(name, he, &data);
		}
EOT
		
		if run $CC $CC_FLAGS tmp/test.c $CC_LIBS -o tmp/test ; then
			HAVE_GETHOSTBYNAME_R="HAVE_GETHOSTBYNAME_R3"
			echo "with 3 parameters"
		fi
		
		fi
		
		if [ "$HAVE_GETHOSTBYNAME_R" = "bonkle" ] ; then
			HAVE_GETHOSTBYNAME_R=
			echo "no way, so we'll use mutexes"
		fi
	fi
fi 

###########################################################################

# Look for missing/broken built-in routines, and similar compatibility
# stuff.

MODE="check_strerror  "
echo2 "How to complain when something goes wrong... "
if [ "$HAVE_STRERROR" ] ; then
	if [ "$HAVE_STRERROR" = 1 ] ; then
		echo "(cached) strerror()."
		log "cache supplied strerror()"
	elif [ "$HAVE_SYS_ERRLIST" = 1 ] ; then
		echo "(cached) sys_errlist."
		log "cache supplied sys_errlist"
	else
		HAVE_SYS_ERRLIST=0	# just in case... you never know.
		echo "(cached) pseudo sys_errlist."
		log "cache supplied pseudo sys_errlist"
	fi
else
	cat >tmp/test.c <<EOT
	int main() {
		extern void strerror(void);
		strerror();
	}
EOT
	if run $CC $CC_FLAGS tmp/test.c $CC_LIBS -o tmp/test ; then
		HAVE_STRERROR=1
		echo "ah, strerror() is here."
		log "using strerror()"
	else
		HAVE_STRERROR=0
		echo "no strerror()."
		cat >tmp/test.c <<EOT
int main() {
	extern char *sys_errlist[];
	char *s;
	s = sys_errlist[0];
}
EOT
		log "trying sys_errlist..."
		if run $CC $CC_FLAGS tmp/test.c $CC_LIBS -o tmp/test ; then
			HAVE_SYS_ERRLIST=1
			echo "    But you have sys_errlist, which will do nicely."
			log "using sys_errlist"
		else
			HAVE_SYS_ERRLIST=0
			echo "    You don't have sys_errlist either, so we'll have to make do."
			log "using pseudo sys_errlist"
		fi
	fi
fi


echo2 "Looking for other routines we want that you don't have... "

MODE="check_compat    "
if [ "$MISSING" != bonkle ] ; then
	if [ ! "$MISSING" ] ; then
		echo "(cached) none"
		log "cache supplied: (none)"
	else
		echo "(cached)$MISSING"
		log "cache supplied:$MISSING"
	fi
else
	MISSING=

	MODE="check_snprintf  "
	TEST='char buf[16];
		int res;
		buf[0] = 0;
		res = snprintf(buf, 8, "%d", 123456789);
		if (strcmp(buf, "1234567") != 0) {
			printf("test: snprintf broken (bad result in buffer: wanted 1234567, got \"%s\")\n", buf);
			if (strlen(buf) > 7)
				printf("test: your snprintf does not check buffer size!\n");
			return 1;
		} else if (res != 7) {
			printf("test: snprintf broken (wrong return value: wanted 7, got %d)\n", res);
			return 1;
		} else
			return 0;'
	if test_function int snprintf "(char *, int, const char *, ...)" ; then
		BAD_SNPRINTF=0
	else
		tmp="`tmp/test 2>&1`"
		res="`echo $tmp | cut -d\  -f10 2>&1`"
		if [ "$res" = "-1)" ] ; then
			BAD_SNPRINTF=1
			log "found, but returns -1 if string too long"
		elif [ "$res" = "9)" ] ; then
			BAD_SNPRINTF=2
			log "found, but returns large value if string too long"
		else
			BAD_SNPRINTF=0
			MISSING="$MISSING snprintf"
			echo2 "snprintf "
		fi
	fi

	MODE="check_stricmp   "
	TEST='extern int strnicmp(const char *, const char *, int); return stricmp("ABC","abc")==0 && strnicmp("ABC","abd",2)==0 ? 0 : 1;'
	if test_function int stricmp "(const char *, const char *)" ; then
		HAVE_STRCASECMP=0	# doesn't really matter
	else
		TEST='extern int strncasecmp(const char *, const char *, int); return strcasecmp("ABC","abc")==0 && strncasecmp("ABC","abd",2)==0 ? 0 : 1;'
		if test_function int strcasecmp "(const char *, const char *)"
		then : ; else
			MISSING="$MISSING str[n]icmp"
			echo2 "str[n]icmp "
		fi
	fi

	MODE="check_strdup    "
	TEST='char *s, *t;
		s = "ABC";
		t = strdup(s);'"
		return (t != (char *)0 && t[0]=='A' && t[1]=='B' && t[2]=='C' && t[3]==0) ? 0 : 1;"
	if test_function "char *" strdup "(const char *)" ; then : ; else
		MISSING="$MISSING strdup"
		echo2 "strdup "
	fi

	MODE="check_strspn    "
	TEST='return (strspn("ABCBA","BA")==2 && strspn("123","123")==3) ? 0 : 1;'
	if test_function int strspn "(const char *, const char *)" ; then : ; else
		MISSING="$MISSING strspn"
		echo2 "strspn "
	fi

	MODE="check_strsignal "
	TEST="(void) strsignal(1); return 0;"
	if test_function "char *" strsignal "(int)" ; then : ; else
		MISSING="$MISSING strsignal"
		echo2 "strsignal "
	fi

	MODE="check_gettimeofday"
	TEST="char buf[256]; (void) gettimeofday((void *)buf, (void *)buf); return 0;"
	if test_function "char *" gettimeofday "(void *, void *)" ; then : ; else
		MISSING="$MISSING gettimeofday"
		echo2 "gettimeofday "
	fi

	MODE="check_setgrent  "
	TEST="(void) setgrent(); return 0;"
	if test_function int setgrent "(void)" ; then : ; else
		MISSING="$MISSING setgrent"
		echo2 "setgrent "
	fi

	MODE="check_umask     "
	TEST="(void) umask(1); return 0;"
	if test_function int umask "(int)" ; then : ; else
		MISSING="$MISSING umask"
		echo2 "umask "
	fi

	MODE="check_fork      "
	TEST="(void) fork(); return 0;"
	if test_function int fork "(void)" ; then : ; else
		MISSING="$MISSING fork"
		echo2 "fork "
	fi

	MODE="check_gethostbyname"
	TEST='(void) gethostbyname("localhost"); return 0;'
	if test_function "struct hostent *" gethostbyname "(const char *)" ; then : ; else
		MISSING="$MISSING gethostbyname"
		echo2 "gethostbyname "
	fi

	echo ""
fi

if [ $HAVE_GETHOSTBYNAME = 0 ] ; then
	cat <<EOT

*** Notice: Your system does not seem to have the gethostbyname() function.
*** This function is used to translate hostnames into IP addresses.  Since
*** you don't have it (or we can't find it), you will need to use IP
*** addresses instead of hostnames when setting the uplink server address
*** in services.conf.

EOT
fi

###########################################################################

MODE="check_install   "
echo2 "Checking how to install files... "

if [ "$INSTALL" -a "$OLD_RUNGROUP" = "$RUNGROUP" ] ; then
	if [ "`echo $INSTALL | cut -c1`" = "." ] ; then
		echo '(cached) using our own "install".'
		log "cache says use our own"
	else
		echo '(cached) this system'\''s "install" works.'
		log "cache says use regular "\`"install'"
	fi
else
	cat >tmp/test.c <<EOT
	int main() { return 0; }
EOT
	if run $CC $CC_FLAGS tmp/test.c $CC_LIBS -o tmp/test ; then : ; else
		whoa_there
	fi
	if run cp -p tmp/test tmp/test3 ; then : ; else
		echo ""
		echo ""
		echo "*** WHOA THERE! ***"
		echo ""
		echo "A simple "\`"cp -p' failed!"
		echo "Are you out of disk space?"
		exit 4
	fi

	if run install -m 500 tmp/test tmp/test2 && test -f tmp/test && run cmp tmp/test tmp/test2 ; then
		echo 'looks like "install" will work.'
		if [ "$RUNGROUP" ] ; then
			INSTALL="install -g $RUNGROUP -m 750"
		else
			INSTALL="install -m 700"
		fi
	elif run cp -p tmp/test3 tmp/test ; run install -c -m 500 tmp/test tmp/test2 && test -f tmp/test && run cmp tmp/test tmp/test2 ; then
		echo 'looks like "install -c" will work.'
		if [ "$RUNGROUP" ] ; then
			INSTALL="install -c -g $RUNGROUP -m 750"
		else
			INSTALL="install -c -m 700"
		fi
	elif run cp -p tmp/test3 tmp/test ; run ginstall -m 500 tmp/test tmp/test2 && test -f tmp/test && run cmp tmp/test tmp/test2 ; then
		echo 'looks like "ginstall" will work.'
		if [ "$RUNGROUP" ] ; then
			INSTALL="ginstall -g $RUNGROUP -m 750"
		else
			INSTALL="ginstall -m 700"
		fi
	else
		echo \"install\"" doesn't seem to work."
		echo "    But we can still use cp and friends, so we'll roll our own "\"install\".
		if [ "$RUNGROUP" ] ; then
			INSTALL="./install-script -g $RUNGROUP -m 750"
		else
			INSTALL="./install-script -m 700"
		fi
	fi
	log "using: $INSTALL"
fi

###########################################################################

MODE="check_copy_recur"
echo2 "Checking how to copy directories... "

if [ "$CP_ALL" ] ; then
	echo "(cached) $CP_ALL"
	log "cache supplied $CP_ALL"
else
	sysname=`/bin/uname -s 2>&1`
	log "sysname: $sysname"
	case $sysname in
		Linux) CP_ALL="/bin/cp -dpr";
		       log "guessing: cp -dpr";;
		*)     CP_ALL="/bin/cp -pr";
		       log "guessing: cp -pr";;
	esac
	if [ ! -f tmp/test2 ] ; then
		run cp tmp/test tmp/test2
	fi
	if run /bin/mkdir tmp/testA && run /bin/mkdir tmp/testB && run /bin/mv tmp/test2 tmp/testA
	then : ; else
		echo ""
		echo ""
		echo "*** WHOA THERE! ***"
		echo ""
		echo "A few simple mkdir's and mv's failed!"
		echo "Are you out of disk space?"
		exit 4
	fi
	if run $CP_ALL tmp/testA/* tmp/testB && run cmp tmp/testA/test2 tmp/testB/test2 ; then
		echo "$CP_ALL"
		log \`"$CP_ALL' works"
	else
		log \`"$CP_ALL' doesn't work"
		run /bin/rm -rf tmp/testB/*
		if run sh -c '/bin/tar -Ccf tmp/testA - . | /bin/tar -Cxf tmp/testB -' ; then
			echo "tar (yuck)"
			CP_ALL="./bin/cp-recursive -t"
			log "using tar"
		else
			log "tar failed(!)"
			echo ""
			echo "    Neither cp nor tar work!  I give up."
			exit 2
		fi
	fi
fi

###########################################################################

# Create files.

echo2 "Creating sysconf.h... "
cat >sysconf.h <<EOT
/*
 * This file is generated automatically by "configure".  Any changes made
 * to it will be erased next time "configure" is run.
 */

#define SERVICES_BIN		"$BINDEST/services"
#define SERVICES_DIR		"$DATDEST"

EOT
if [ "$RUNGROUP" ] ; then cat >>sysconf.h <<EOT
#define RUNGROUP		"$RUNGROUP"
EOT
fi
cat >>sysconf.h <<EOT
#define DEFUMASK		$UMASK
EOT

cat >>sysconf.h <<EOT

#define $IRCTYPE_DEF
EOT
if [ "$IRCTYPE_DEF2" ] ; then cat >>sysconf.h <<EOT ; fi
#define $IRCTYPE_DEF2
EOT
if [ "$ENCRYPTION" ] ; then cat >>sysconf.h <<EOT ; fi

#define USE_ENCRYPTION
#define $ENCRYPTION
EOT

if [ "$IMPORTSUPPORT" ] ; then cat >>sysconf.h <<EOT ; fi

#define USE_CONVERTER
#define $IMPORTSUPPORT
EOT

if [ "$THREAD" ] ; then cat >>sysconf.h <<EOT ; fi

#define $THREAD 
EOT

if [ "$MYSQL" ] ; then cat >>sysconf.h <<EOT ; fi

#define $MYSQL
EOT

if [ "$RDB" ] ; then cat >>sysconf.h <<EOT ; fi

#define $RDB
EOT

if [ "$HAVE_MYSQL_MYSQL_H" ] ; then cat >>sysconf.h <<EOT ; fi
#define $HAVE_MYSQL_MYSQL_H
EOT

if [ "$USE_MODULES" ] ; then cat >>sysconf.h <<EOT ; fi

#define USE_MODULES		1
#define MODULE_PATH		"$MODULE_PATH"
EOT
if [ "$HAS_RTLD_LOCAL" ] ; then cat >>sysconf.h <<EOT ; fi
#define HAS_RTLD_LOCAL	1
EOT

if [ "$OSTYPE" != "bonkle" ] ; then cat >>sysconf.h <<EOT ; fi
#define $OSTYPE
EOT

cat >>sysconf.h <<EOT

typedef   signed $TYPE_INT16  int16;
typedef unsigned $TYPE_INT16 uint16;
typedef   signed $TYPE_INT32  int32;
typedef unsigned $TYPE_INT32 uint32;

#define HAVE_STRINGS_H		$HAVE_STRINGS_H
#define HAVE_SYS_SELECT_H	$HAVE_SYS_SELECT_H
#define HAVE_SYS_SYSPROTO_H	$HAVE_SYS_SYSPROTO_H

#define HAVE_STRERROR		$HAVE_STRERROR
#define HAVE_SYS_ERRLIST	$HAVE_SYS_ERRLIST
#define HAVE_SNPRINTF		$HAVE_SNPRINTF
#define BAD_SNPRINTF		$BAD_SNPRINTF
#define HAVE_STRICMP		$HAVE_STRICMP
#define HAVE_STRCASECMP		$HAVE_STRCASECMP
#define HAVE_STRDUP		$HAVE_STRDUP
#define HAVE_STRSPN		$HAVE_STRSPN
#define HAVE_STRSIGNAL		$HAVE_STRSIGNAL
#define HAVE_GETTIMEOFDAY	$HAVE_GETTIMEOFDAY
#define HAVE_SETGRENT		$HAVE_SETGRENT
#define HAVE_UMASK		$HAVE_UMASK
#define HAVE_FORK		$HAVE_FORK
#define HAVE_GETHOSTBYNAME	$HAVE_GETHOSTBYNAME
EOT

if [ "$THREAD" = "USE_THREADS" -a "$HAVE_GETHOSTBYNAME_R" != "" ] ; then
cat >>sysconf.h <<EOT
#define $HAVE_GETHOSTBYNAME_R
EOT
fi

echo "done."

echo2 "Creating Makefile.inc... "

if [ "$USE_MODULES" = "USE_MODULES" ] ; then
	if [ `uname -s` = "Linux" ] ; then
		CC_ELIBS="$CC_ELIBS -ldl"
	fi
	CC_MLIBS="$CC_MLIBS -rdynamic"
fi

cat >Makefile.inc <<EOT
# This file is generated automatically by "configure".  Any changes made
# to it will be erased next time "configure" is run.

CC=$CC
BASE_CFLAGS=$CC_FLAGS
LFLAGS=$CC_LFLAGS
LIBS=$CC_LIBS
ELIBS=$CC_ELIBS
MLIBS=$CC_MLIBS

EOT
if [ $HAVE_SNPRINTF = 0 -a $BAD_SNPRINTF = 0 ];then cat >>Makefile.inc <<EOT;fi

VSNPRINTF_C=vsnprintf.c
VSNPRINTF_O=vsnprintf.o
EOT
if [ "$RDB" = "USE_RDB" ];then cat >>Makefile.inc <<EOT;fi

RDB_C=rdb.c
RDB_O=rdb.o
EOT
if [ "$MYSQL" = "USE_MYSQL" ];then cat >>Makefile.inc <<EOT;fi

MYSQL_C=mysql.c
MYSQL_O=mysql.o
EOT
cat >>Makefile.inc <<EOT

PROGRAM=$PROGRAM
BINDEST=$BINDEST
DATDEST=$DATDEST

INSTALL=$INSTALL
CP_ALL=$CP_ALL
RUNGROUP=$RUNGROUP

USE_MODULES=$USE_MODULES
MODULE_PATH=$MODULE_PATH
EOT
echo "done."

###########################################################################

# Save results in cache for next time around.

echo2 "Saving configuration results in config.cache... "

cat <<EOT >config.cache
PROGRAM="$PROGRAM"
BINDEST="$BINDEST"
DATDEST="$DATDEST"

INSTALL="$INSTALL"
CP_ALL="$CP_ALL"

RUNGROUP="$RUNGROUP"
UMASK=$UMASK
IRCTYPE=$IRCTYPE
IRCTYPE_DEF="$IRCTYPE_DEF"
IRCTYPE_DEF2="$IRCTYPE_DEF2"
ENCRYPTION="$ENCRYPTION"
IMPORTSUPPORT="$IMPORTSUPPORT"
THREAD="$THREAD"
MYSQL="$MYSQL"
USE_MODULES="$USE_MODULES"
MODULE_PATH="$MODULE_PATH"
HAVE_MYSQL_MYSQL_H="$HAVE_MYSQL_MYSQL_H"
OSTYPE="$OSTYPE"

CC="$CC"
CC_FLAGS="$CC_FLAGS"
CC_LFLAGS="$CC_LFLAGS"
CC_LIBS="$CC_LIBS"

TYPE_INT16=$TYPE_INT16
TYPE_INT32=$TYPE_INT32

HAVE_STRINGS_H=$HAVE_STRINGS_H
HAVE_SYS_SELECT_H=$HAVE_SYS_SELECT_H
HAVE_SYS_SYSPROTO_H=$HAVE_SYS_SYSPROTO_H

HAVE_GETHOSTBYNAME_R=$HAVE_GETHOSTBYNAME_R

HAVE_STRERROR=$HAVE_STRERROR
HAVE_SYS_ERRLIST=$HAVE_SYS_ERRLIST

HAVE_SNPRINTF=$HAVE_SNPRINTF
BAD_SNPRINTF=$BAD_SNPRINTF
HAVE_STRICMP=$HAVE_STRICMP
HAVE_STRCASECMP=$HAVE_STRCASECMP
HAVE_STRDUP=$HAVE_STRDUP
HAVE_STRSPN=$HAVE_STRSPN
HAVE_STRSIGNAL=$HAVE_STRSIGNAL
HAVE_GETTIMEOFDAY=$HAVE_GETTIMEOFDAY
HAVE_SETGRENT=$HAVE_SETGRENT
HAVE_UMASK=$HAVE_UMASK
HAVE_FORK=$HAVE_FORK
HAVE_GETHOSTBYNAME=$HAVE_GETHOSTBYNAME
MISSING="$MISSING"
EOT

echo "done."

###########################################################################

# Delete the temporary directory we created.

rm -rf tmp

###########################################################################

# If MYSQL is enabled and the user specified a library dir
# warn to include the directory in the LD_LIBRARY_PATH 
if [ "$MYSQL" = "USE_MYSQL" ] && [ "$MYSQL_LIBDIR_WARN" = "MYSQL_LIBDIR_WARN" ] ; then
	echo ""
	echo "BECAUSE YOU SPECIFIED A USER DEFINED LIBRARY DIRECTORY,"
	echo "YOU MAY NEED TO ADD $MYSQL_LIB_DIR"
	echo "TO YOUR LD_LIBRARY_PATH VARIABLE BEFORE RUNNING ANOPE."
	echo "PRESS RETURN TO CONTINUE"
	read foo
fi

cat <<EOT

All done!  Now run "make" (or possibly "gmake") to compile Services.
See the INSTALL, README and FAQ files if you have any problems.
EOT
exit 0


syntax highlighted by Code2HTML, v. 0.9.1