From 52b917d2c3bb32689b632b65f1fbc742c3ebba93 Mon Sep 17 00:00:00 2001 From: Karl Heyes Date: Mon, 21 Jul 2003 02:23:41 +0000 Subject: [PATCH] Make icecast use the shared M4 macros. Cleanup the other files. svn path=/trunk/icecast/; revision=5157 --- Makefile.am | 10 +- acconfig.h | 2 - acinclude.m4 | 492 ------------------------------ autogen.sh | 91 ++++-- configure.in | 195 ++++-------- src/Makefile.am | 21 +- src/config.c | 787 ------------------------------------------------ src/config.h | 144 --------- 8 files changed, 144 insertions(+), 1598 deletions(-) delete mode 100644 acconfig.h delete mode 100644 acinclude.m4 delete mode 100644 src/config.c delete mode 100644 src/config.h diff --git a/Makefile.am b/Makefile.am index 8e3b7290..37044b4b 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,16 +1,18 @@ ## Process this file with automake to produce Makefile.in -AUTOMAKE_OPTIONS = foreign dist-zip +AUTOMAKE_OPTIONS = 1.6 foreign dist-zip SUBDIRS = src conf doc web admin win32 -EXTRA_DIST = HACKING +EXTRA_DIST = HACKING m4/acx_pthread.m4 m4/ogg.m4 m4/vorbis.m4 \ + m4/xiph_compiler.m4 m4/xiph_curl.m4 m4/xiph_net.m4 \ + m4/xiph_types.m4 m4/xiph_xml2.m4 docdir = $(datadir)/doc/$(PACKAGE) doc_DATA = README AUTHORS COPYING NEWS TODO debug: - $(MAKE) all CFLAGS="@DEBUG@ @XML_CFLAGS@ @OGG_CFLAGS@ @VORBIS_CFLAGS@" + $(MAKE) all CFLAGS="@DEBUG@" profile: - $(MAKE) all CFLAGS="@PROFILE@ @XML_CFLAGS@ @OGG_CFLAGS@ @VORBIS_CFLAGS@" + $(MAKE) all CFLAGS="@PROFILE@" diff --git a/acconfig.h b/acconfig.h deleted file mode 100644 index cbf7b2f9..00000000 --- a/acconfig.h +++ /dev/null @@ -1,2 +0,0 @@ -/* Define if you lack the socklen_t type */ -#undef socklen_t diff --git a/acinclude.m4 b/acinclude.m4 deleted file mode 100644 index a8311de3..00000000 --- a/acinclude.m4 +++ /dev/null @@ -1,492 +0,0 @@ -# Configure paths for libogg -# Jack Moffitt 10-21-2000 -# Shamelessly stolen from Owen Taylor and Manish Singh - -dnl AM_PATH_OGG([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) -dnl Test for libogg, and define OGG_CFLAGS and OGG_LIBS -dnl -AC_DEFUN(AM_PATH_OGG, -[dnl -dnl Get the cflags and libraries -dnl -AC_ARG_WITH(ogg-prefix,[ --with-ogg-prefix=PFX Prefix where libogg is installed (optional)], ogg_prefix="$withval", ogg_prefix="") -AC_ARG_ENABLE(oggtest, [ --disable-oggtest Do not try to compile and run a test Ogg program],, enable_oggtest=yes) - - if test "x$ogg_prefix" != "xNONE" ; then - ogg_args="$ogg_args --prefix=$ogg_prefix" - OGG_CFLAGS="-I$ogg_prefix/include" - OGG_LIBS="-L$ogg_prefix/lib" - elif test "$prefix" != ""; then - ogg_args="$ogg_args --prefix=$prefix" - OGG_CFLAGS="-I$prefix/include" - OGG_LIBS="-L$prefix/lib" - fi - - OGG_LIBS="$OGG_LIBS -logg" - - AC_MSG_CHECKING(for Ogg) - no_ogg="" - - - if test "x$enable_oggtest" = "xyes" ; then - ac_save_CFLAGS="$CFLAGS" - ac_save_LIBS="$LIBS" - CFLAGS="$CFLAGS $OGG_CFLAGS" - LIBS="$LIBS $OGG_LIBS" -dnl -dnl Now check if the installed Ogg is sufficiently new. -dnl - rm -f conf.oggtest - AC_TRY_RUN([ -#include -#include -#include -#include - -int main () -{ - system("touch conf.oggtest"); - return 0; -} - -],, no_ogg=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) - CFLAGS="$ac_save_CFLAGS" - LIBS="$ac_save_LIBS" - fi - - if test "x$no_ogg" = "x" ; then - AC_MSG_RESULT(yes) - ifelse([$1], , :, [$1]) - else - AC_MSG_RESULT(no) - if test -f conf.oggtest ; then - : - else - echo "*** Could not run Ogg test program, checking why..." - CFLAGS="$CFLAGS $OGG_CFLAGS" - LIBS="$LIBS $OGG_LIBS" - AC_TRY_LINK([ -#include -#include -], [ return 0; ], - [ echo "*** The test program compiled, but did not run. This usually means" - echo "*** that the run-time linker is not finding Ogg or finding the wrong" - echo "*** version of Ogg. If it is not finding Ogg, you'll need to set your" - echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" - echo "*** to the installed location Also, make sure you have run ldconfig if that" - echo "*** is required on your system" - echo "***" - echo "*** If you have an old version installed, it is best to remove it, although" - echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], - [ echo "*** The test program failed to compile or link. See the file config.log for the" - echo "*** exact error that occured. This usually means Ogg was incorrectly installed" - echo "*** or that you have moved Ogg since it was installed. In the latter case, you" - echo "*** may want to edit the ogg-config script: $OGG_CONFIG" ]) - CFLAGS="$ac_save_CFLAGS" - LIBS="$ac_save_LIBS" - fi - OGG_CFLAGS="" - OGG_LIBS="" - ifelse([$2], , :, [$2]) - fi - AC_SUBST(OGG_CFLAGS) - AC_SUBST(OGG_LIBS) - rm -f conf.oggtest -]) -# Configure paths for libvorbis -# Jack Moffitt 10-21-2000 -# Shamelessly stolen from Owen Taylor and Manish Singh - -dnl AM_PATH_VORBIS([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) -dnl Test for libvorbis, and define VORBIS_CFLAGS and VORBIS_LIBS -dnl -AC_DEFUN(AM_PATH_VORBIS, -[dnl -dnl Get the cflags and libraries -dnl -AC_ARG_WITH(vorbis-prefix,[ --with-vorbis-prefix=PFX Prefix where libvorbis is installed (optional)], vorbis_prefix="$withval", vorbis_prefix="") -AC_ARG_ENABLE(vorbistest, [ --disable-vorbistest Do not try to compile and run a test Vorbis program],, enable_vorbistest=yes) - - if test "x$vorbis_prefix" != "xNONE" ; then - vorbis_args="$vorbis_args --prefix=$vorbis_prefix" - VORBIS_CFLAGS="-I$vorbis_prefix/include" - VORBIS_LIBDIR="-L$vorbis_prefix/lib" - elif test "$prefix" != ""; then - vorbis_args="$vorbis_args --prefix=$prefix" - VORBIS_CFLAGS="-I$prefix/include" - VORBIS_LIBDIR="-L$prefix/lib" - fi - - VORBIS_LIBS="$VORBIS_LIBDIR -lvorbis -lm" - VORBISFILE_LIBS="-lvorbisfile" - VORBISENC_LIBS="-lvorbisenc" - - AC_MSG_CHECKING(for Vorbis) - no_vorbis="" - - - if test "x$enable_vorbistest" = "xyes" ; then - ac_save_CFLAGS="$CFLAGS" - ac_save_LIBS="$LIBS" - CFLAGS="$CFLAGS $VORBIS_CFLAGS" - LIBS="$LIBS $VORBIS_LIBS $OGG_LIBS" -dnl -dnl Now check if the installed Vorbis is sufficiently new. -dnl - rm -f conf.vorbistest - AC_TRY_RUN([ -#include -#include -#include -#include - -int main () -{ - system("touch conf.vorbistest"); - return 0; -} - -],, no_vorbis=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) - CFLAGS="$ac_save_CFLAGS" - LIBS="$ac_save_LIBS" - fi - - if test "x$no_vorbis" = "x" ; then - AC_MSG_RESULT(yes) - ifelse([$1], , :, [$1]) - else - AC_MSG_RESULT(no) - if test -f conf.vorbistest ; then - : - else - echo "*** Could not run Vorbis test program, checking why..." - CFLAGS="$CFLAGS $VORBIS_CFLAGS" - LIBS="$LIBS $VORBIS_LIBS $OGG_LIBS" - AC_TRY_LINK([ -#include -#include -], [ return 0; ], - [ echo "*** The test program compiled, but did not run. This usually means" - echo "*** that the run-time linker is not finding Vorbis or finding the wrong" - echo "*** version of Vorbis. If it is not finding Vorbis, you'll need to set your" - echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" - echo "*** to the installed location Also, make sure you have run ldconfig if that" - echo "*** is required on your system" - echo "***" - echo "*** If you have an old version installed, it is best to remove it, although" - echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], - [ echo "*** The test program failed to compile or link. See the file config.log for the" - echo "*** exact error that occured. This usually means Vorbis was incorrectly installed" - echo "*** or that you have moved Vorbis since it was installed." ]) - CFLAGS="$ac_save_CFLAGS" - LIBS="$ac_save_LIBS" - fi - VORBIS_CFLAGS="" - VORBIS_LIBS="" - VORBISFILE_LIBS="" - VORBISENC_LIBS="" - ifelse([$2], , :, [$2]) - fi - AC_SUBST(VORBIS_CFLAGS) - AC_SUBST(VORBIS_LIBS) - AC_SUBST(VORBISFILE_LIBS) - AC_SUBST(VORBISENC_LIBS) - rm -f conf.vorbistest -]) - -dnl AM_PATH_CURL([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) -dnl Test for libcurl, and define CURL_CFLAGS and CURL_LIBS -dnl -AC_DEFUN(AM_PATH_CURL, -[dnl -dnl Get the cflags and libraries -dnl -AC_ARG_WITH(curl,[ --with-curl=PFX Prefix where libcurl is installed (optional)], curl_prefix="$withval", curl_prefix="") -AC_ARG_WITH(curl-libraries,[ --with-curl-libraries=DIR Directory where libcurl library is installed (optional)], curl_libraries="$withval", curl_libraries="") -AC_ARG_WITH(curl-includes,[ --with-curl-includes=DIR Directory where libcurl header files are installed (optional)], curl_includes="$withval", curl_includes="") -AC_ARG_ENABLE(curltest, [ --disable-curltest Do not try to compile and run a test libcurl program],, enable_curltest=yes) - -if test "x$curl_prefix" != "xno" ; then - - if test "x$curl_libraries" != "x" ; then - CURL_LIBS="-L$curl_libraries" - elif test "x$curl_prefix" != "x" ; then - CURL_LIBS="-L$curl_prefix/lib" - elif test "x$prefix" != "xNONE" ; then - CURL_LIBS="-L$prefix/lib" - fi - - CURL_LIBS="$CURL_LIBS -lcurl" - - if test "x$curl_includes" != "x" ; then - CURL_CFLAGS="-I$curl_includes" - elif test "x$curl_prefix" != "x" ; then - CURL_CFLAGS="-I$curl_prefix/include" - elif test "x$prefix" != "xNONE"; then - CURL_CFLAGS="-I$prefix/include" - fi - - AC_MSG_CHECKING(for libcurl) - no_curl="" - - - if test "x$enable_curltest" = "xyes" ; then - ac_save_CFLAGS="$CFLAGS" - ac_save_LIBS="$LIBS" - CFLAGS="$CFLAGS $CURL_CFLAGS" - LIBS="$LIBS $CURL_LIBS" -dnl -dnl Now check if the installed libcurl is sufficiently new. -dnl - rm -f conf.curltest - AC_TRY_RUN([ -#include -#include -#include -#include - -int main () -{ - system("touch conf.curltest"); - return 0; -} - -],, no_curl=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) - CFLAGS="$ac_save_CFLAGS" - LIBS="$ac_save_LIBS" - fi - - if test "x$no_curl" = "x" ; then - AC_MSG_RESULT(yes) - ifelse([$1], , :, [$1]) - else - AC_MSG_RESULT(no) - if test -f conf.curltest ; then - : - else - echo "*** Could not run libcurl test program, checking why..." - CFLAGS="$CFLAGS $CURL_CFLAGS" - LIBS="$LIBS $CURL_LIBS" - AC_TRY_LINK([ -#include -#include -], [ return 0; ], - [ echo "*** The test program compiled, but did not run. This usually means" - echo "*** that the run-time linker is not finding libcurl or finding the wrong" - echo "*** version of libcurl. If it is not finding libcurl, you'll need to set your" - echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" - echo "*** to the installed location Also, make sure you have run ldconfig if that" - echo "*** is required on your system" - echo "***" - echo "*** If you have an old version installed, it is best to remove it, although" - echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], - [ echo "*** The test program failed to compile or link. See the file config.log for the" - echo "*** exact error that occured. This usually means libcurl was incorrectly installed" - echo "*** or that you have moved libcurl since it was installed." ]) - CFLAGS="$ac_save_CFLAGS" - LIBS="$ac_save_LIBS" - fi - CURL_CFLAGS="" - CURL_LIBS="" - ifelse([$2], , :, [$2]) - fi - AC_DEFINE(HAVE_CURL, 1, [Define if you have libcurl.]) -else - CURL_CFLAGS="" - CURL_LIBS="" -fi - AC_SUBST(CURL_CFLAGS) - AC_SUBST(CURL_LIBS) - rm -f conf.curltest -]) - -dnl ACX_PTHREAD macro by Steven G. Johnson and -dnl Alejandro Forero Cuervo . Found at: -dnl http://www.gnu.org/software/ac-archive/Installed_Packages/acx_pthread.html - -AC_DEFUN([ACX_PTHREAD], [ -AC_REQUIRE([AC_CANONICAL_HOST]) -acx_pthread_ok=no - -# First, check if the POSIX threads header, pthread.h, is available. -# If it isn't, don't bother looking for the threads libraries. -AC_CHECK_HEADER(pthread.h, , acx_pthread_ok=noheader) - -# We must check for the threads library under a number of different -# names; the ordering is very important because some systems -# (e.g. DEC) have both -lpthread and -lpthreads, where one of the -# libraries is broken (non-POSIX). - -# First of all, check if the user has set any of the PTHREAD_LIBS, -# etcetera environment variables, and if threads linking works using -# them: -if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then - save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS $PTHREAD_CFLAGS" - save_LIBS="$LIBS" - LIBS="$PTHREAD_LIBS $LIBS" - AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS]) - AC_TRY_LINK_FUNC(pthread_join, acx_pthread_ok=yes) - AC_MSG_RESULT($acx_pthread_ok) - if test x"$acx_pthread_ok" = xno; then - PTHREAD_LIBS="" - PTHREAD_CFLAGS="" - fi - LIBS="$save_LIBS" - CFLAGS="$save_CFLAGS" -fi - -# Create a list of thread flags to try. Items starting with a "-" are -# C compiler flags, and other items are library names, except for "none" -# which indicates that we try without any flags at all. - -acx_pthread_flags="pthreads none -Kthread -kthread lthread pthread -pthread -pthreads -mthreads --thread-safe -mt" - -# The ordering *is* (sometimes) important. Some notes on the -# individual items follow: - -# pthreads: AIX (must check this before -lpthread) -# none: in case threads are in libc; should be tried before -Kthread and -# other compiler flags to prevent continual compiler warnings -# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) -# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) -# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) -# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) -# -pthreads: Solaris/gcc -# -mthreads: Mingw32/gcc, Lynx/gcc -# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it -# doesn't hurt to check since this sometimes defines pthreads too; -# also defines -D_REENTRANT) -# pthread: Linux, etcetera -# --thread-safe: KAI C++ - -case "${host_cpu}-${host_os}" in - *solaris*) - - # On Solaris (at least, for some versions), libc contains stubbed - # (non-functional) versions of the pthreads routines, so link-based - # tests will erroneously succeed. (We need to link with -pthread or - # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather - # a function called by this macro, so we could check for that, but - # who knows whether they'll stub that too in a future libc.) So, - # we'll just look for -pthreads and -lpthread first: - acx_pthread_flags="-pthread -pthreads pthread -mt $acx_pthread_flags" - ;; -esac - -if test x"$acx_pthread_ok" = xno; then -for flag in $acx_pthread_flags; do - - case $flag in - none) - AC_MSG_CHECKING([whether pthreads work without any flags]) - ;; - - -*) - AC_MSG_CHECKING([whether pthreads work with $flag]) - PTHREAD_CFLAGS="$flag" - ;; - - *) - AC_MSG_CHECKING([for the pthreads library -l$flag]) - PTHREAD_LIBS="-l$flag" - ;; - esac - - save_LIBS="$LIBS" - save_CFLAGS="$CFLAGS" - LIBS="$PTHREAD_LIBS $LIBS" - CFLAGS="$CFLAGS $PTHREAD_CFLAGS" - - # Check for various functions. We must include pthread.h, - # since some functions may be macros. (On the Sequent, we - # need a special flag -Kthread to make this header compile.) - # We check for pthread_join because it is in -lpthread on IRIX - # while pthread_create is in libc. We check for pthread_attr_init - # due to DEC craziness with -lpthreads. We check for - # pthread_cleanup_push because it is one of the few pthread - # functions on Solaris that doesn't have a non-functional libc stub. - # We try pthread_create on general principles. - AC_TRY_LINK([#include ], - [pthread_t th; pthread_join(th, 0); - pthread_attr_init(0); pthread_cleanup_push(0, 0); - pthread_create(0,0,0,0); - pthread_cancel(0); pthread_cleanup_pop(0); ], - [acx_pthread_ok=yes]) - - LIBS="$save_LIBS" - CFLAGS="$save_CFLAGS" - - AC_MSG_RESULT($acx_pthread_ok) - if test "x$acx_pthread_ok" = xyes; then - break; - fi - - PTHREAD_LIBS="" - PTHREAD_CFLAGS="" -done -fi - -# Various other checks: -if test "x$acx_pthread_ok" = xyes; then - save_LIBS="$LIBS" - LIBS="$PTHREAD_LIBS $LIBS" - save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS $PTHREAD_CFLAGS" - - # Detect AIX lossage: threads are created detached by default - # and the JOINABLE attribute has a nonstandard name (UNDETACHED). - AC_MSG_CHECKING([for joinable pthread attribute]) - AC_TRY_LINK([#include ], - [int attr=PTHREAD_CREATE_JOINABLE;], - ok=PTHREAD_CREATE_JOINABLE, ok=unknown) - if test x"$ok" = xunknown; then - AC_TRY_LINK([#include ], - [int attr=PTHREAD_CREATE_UNDETACHED;], - ok=PTHREAD_CREATE_UNDETACHED, ok=unknown) - fi - if test x"$ok" != xPTHREAD_CREATE_JOINABLE; then - AC_DEFINE(PTHREAD_CREATE_JOINABLE, $ok, - [Define to the necessary symbol if this constant - uses a non-standard name on your system.]) - fi - AC_MSG_RESULT(${ok}) - if test x"$ok" = xunknown; then - AC_MSG_WARN([we do not know how to create joinable pthreads]) - fi - - AC_MSG_CHECKING([if more special flags are required for pthreads]) - flag=no - case "${host_cpu}-${host_os}" in - *-aix* | *-freebsd*) flag="-D_THREAD_SAFE";; - *solaris* | alpha*-osf*) flag="-D_REENTRANT";; - esac - AC_MSG_RESULT(${flag}) - if test "x$flag" != xno; then - PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" - fi - AC_CHECK_TYPES(pthread_rwlock_t,,,[#include ]) - - LIBS="$save_LIBS" - CFLAGS="$save_CFLAGS" - - # More AIX lossage: must compile with cc_r - AC_CHECK_PROG(PTHREAD_CC, cc_r, cc_r, ${CC}) -else - PTHREAD_CC="$CC" -fi - -AC_SUBST(PTHREAD_LIBS) -AC_SUBST(PTHREAD_CFLAGS) -AC_SUBST(PTHREAD_CC) - -# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: -if test x"$acx_pthread_ok" = xyes; then - ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1]) - : -else - acx_pthread_ok=no - $2 -fi - -]) diff --git a/autogen.sh b/autogen.sh index f33b4257..c9d0437c 100755 --- a/autogen.sh +++ b/autogen.sh @@ -18,20 +18,59 @@ DIE=0 echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" DIE=1 } - -(automake --version) < /dev/null > /dev/null 2>&1 || { +VERSIONGREP="sed -e s/.*[^0-9\.]\([0-9]\.[0-9]\).*/\1/" + +# do we need automake? +if test -r Makefile.am; then + options=`fgrep AUTOMAKE_OPTIONS Makefile.am` + AM_NEEDED=`echo "$options" | $VERSIONGREP` + if test -z "$AM_NEEDED" || test "x$AM_NEEDED" = "x$options"; then + echo -n "checking for automake..." + AUTOMAKE=automake + ACLOCAL=aclocal + if ($AUTOMAKE --version < /dev/null > /dev/null 2>&1); then + echo "yes" + else + echo "no" + AUTOMAKE="" + fi + else + echo -n "checking for automake $AM_NEEDED or later..." + for am in automake-$AM_NEEDED automake$AM_NEEDED automake; do + ($am --version < /dev/null > /dev/null 2>&1) || continue + ver=`$am --version < /dev/null | head -1 | $VERSIONGREP` + if test $ver = $AM_NEEDED; then + AUTOMAKE=$am + echo $AUTOMAKE + break + fi + done + test -z $AUTOMAKE && echo "no" + echo -n "checking for aclocal $AM_NEEDED or later..." + for ac in aclocal-$AM_NEEDED aclocal$AM_NEEDED aclocal; do + ($ac --version < /dev/null > /dev/null 2>&1) || continue + ver=`$ac --version < /dev/null | head -1 | $VERSIONGREP` + if test $ver = $AM_NEEDED; then + ACLOCAL=$ac + echo $ACLOCAL + break + fi + done + test -z $ACLOCAL && echo "no" + fi + test -z $AUTOMAKE || test -z $ACLOCAL && { echo echo "You must have automake installed to compile $package." - echo "Download the appropriate package for your system, - echo "or get the source from one of the GNU ftp sites" - echo "listed in http://www.gnu.org/order/ftp.html" + echo "Download the appropriate package for your distribution," + echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" DIE=1 -} + } +fi -(libtool --version) < /dev/null > /dev/null 2>&1 || { +(libtoolize --version) < /dev/null > /dev/null 2>&1 || { echo echo "You must have libtool installed to compile $package." - echo "Download the appropriate package for your system, + echo "Download the appropriate package for your system," echo "or get the source from one of the GNU ftp sites" echo "listed in http://www.gnu.org/order/ftp.html" DIE=1 @@ -41,23 +80,31 @@ if test "$DIE" -eq 1; then exit 1 fi +echo "Generating configuration files for $package, please wait...." + +ACLOCAL_FLAGS="$ACLOCAL_FLAGS -I m4" +if ! test -z $ACLOCAL; then + echo " $ACLOCAL $ACLOCAL_FLAGS" + $ACLOCAL $ACLOCAL_FLAGS +fi + +echo " autoheader" +autoheader + +echo " libtoolize --automake" +libtoolize --automake + +if ! test -z $AUTOMAKE; then + echo " $AUTOMAKE --add-missing" + $AUTOMAKE --add-missing +fi + +echo " autoconf" +autoconf + if test -z "$*"; then echo "I am going to run ./configure with no arguments - if you wish " echo "to pass any to it, please specify them on the $0 command line." fi - -echo "Generating configuration files for $package, please wait...." - -echo " aclocal $ACLOCAL_FLAGS" -aclocal $ACLOCAL_FLAGS -#echo " autoheader" -#autoheader -echo " libtoolize --automake" -libtoolize --automake -echo " automake --add-missing" -automake --add-missing -echo " autoconf" -autoconf - cd $olddir $srcdir/configure "$@" && echo diff --git a/configure.in b/configure.in index 24dfcae3..768f6b9d 100644 --- a/configure.in +++ b/configure.in @@ -1,8 +1,9 @@ -dnl Process this file with autoconf to produce a configure script. AC_INIT(src/main.c) AC_PREREQ(2.50) +dnl Process this file with autoconf to produce a configure script. AM_INIT_AUTOMAKE(icecast,2.0-alpha-2) +AM_CONFIG_HEADER(config.h) AC_PROG_CC AC_CANONICAL_HOST @@ -10,182 +11,103 @@ AM_PROG_LIBTOOL dnl Set some options based on environment -SOCKET_LIBS= - -case "$ac_cv_host" in +case "$host" in *openbsd*) ;; - *) AC_DEFINE(_XOPEN_SOURCE, 500, [Define if you have POSIX and XPG specifications]) + *) AC_DEFINE(_XOPEN_SOURCE, 600, [Define if you have POSIX and XPG specifications]) ;; esac if test -z "$GCC"; then - case $host in + case $host in *-*-irix*) DEBUG="-g -signed -D_REENTRANT" - CFLAGS="-O2 -w -signed -D_REENTRANT" + XIPH_CFLAGS="-O2 -w -signed -D_REENTRANT" PROFILE="-p -g3 -O2 -signed -D_REENTRANT" - ;; + ;; *-*-solaris*) DEBUG="-v -g -D_REENTRANT" - CFLAGS="-xO4 -fast -w -fsimple -native -xcg92 -D_REENTRANT" + XIPH_CFLAGS="-xO4 -fast -w -fsimple -native -xcg92 -D_REENTRANT" PROFILE="-v -xpg -g -xO4 -fast -native -fsimple -xcg92 -Dsuncc -D_REENTRANT" - SOCKET_LIBS="-lnsl -lsocket -lresolv" - ;; + ;; *) DEBUG="-g -D_REENTRANT" - CFLAGS="-O -D_REENTRANT" + XIPH_CFLAGS="-O -D_REENTRANT" PROFILE="-g -p -D_REENTRANT" - ;; - esac + ;; + esac else - case $host in + case $host in *-*-linux*) - DEBUG="-g -Wall -fsigned-char -D_REENTRANT -D_GNU_SOURCE" - CFLAGS="-O20 -ffast-math -fsigned-char -D_REENTRANT -D_GNU_SOURCE" - PROFILE="-Wall -W -pg -g -O20 -ffast-math -fsigned-char -D_REENTRANT -D_GNU_SOURCE" - ;; + DEBUG="-g -Wall -fsigned-char -D_GNU_SOURCE" + XIPH_CPPFLAGS="-ffast-math -fsigned-char -D_GNU_SOURCE" + PROFILE="-Wall -W -pg -g -ffast-math -fsigned-char -D_GNU_SOURCE" + ;; sparc-sun-solaris*) - DEBUG="-g -Wall -fsigned-char -mv8 -D_REENTRANT" - CFLAGS="-O20 -ffast-math -fsigned-char -mv8 -D_REENTRANT" - PROFILE="-pg -g -O20 -fsigned-char -mv8 -D_REENTRANT" - SOCKET_LIBS="-lnsl -lsocket -lresolv" - ;; - *-pc-solaris*) - DEBUG="-g -Wall -fsigned-char -D_REENTRANT" - CFLAGS="-O20 -ffast-math -fsigned-char -D_REENTRANT" - PROFILE="-pg -g -O20 -fsigned-char -D_REENTRANT" - SOCKET_LIBS="-lnsl -lsocket -lresolv" - ;; + AC_DEFINE(__EXTENSIONS__, 1, [define to 1 to get resolve header problem on solaris]) + DEBUG="-g -Wall -fsigned-char -mv8" + XIPH_CPPFLAGS="-ffast-math -fsigned-char -mv8" + PROFILE="-pg -g -fsigned-char -mv8" + ;; + *-pc-solaris*) + DEBUG="-g -Wall -fsigned-char" + XIPH_CPPFLAGS="-ffast-math -fsigned-char" + PROFILE="-pg -g -fsigned-char" + ;; *freebsd*) DEBUG="-g -Wall -fsigned-char" - CFLAGS="-O20 -fsigned-char" - PROFILE="-O20 -g -pg -fsigned-char" - ogg_prefix="/usr/local" - vorbis_prefix="/usr/local" - ;; + XIPH_CPPFLAGS="-fsigned-char" + PROFILE="-g -pg -fsigned-char" + ;; *) DEBUG="-g -Wall -fsigned-char" - CFLAGS="-O20 -Wall -fsigned-char" - PROFILE="-O20 -g -pg -Wall -fsigned-char" - ;; - esac + XIPH_CPPFLAGS="-Wall -fsigned-char" + PROFILE="-g -pg -Wall -fsigned-char" + ;; + esac fi dnl Checks for programs. dnl Checks for libraries. -dnl IPV6 -AC_SEARCH_LIBS(inet_pton, socket, - [AC_DEFINE([HAVE_INET_PTON], 1, [Define if you have the `inet_pton' function])]) -AC_SEARCH_LIBS(getipnodebyname, nsl, - [AC_DEFINE([HAVE_GETIPNODEBYNAME], 1, - [Define if you have the `getipnodebyname' function])]) - dnl Checks for header files. AC_HEADER_STDC -AC_CHECK_HEADER(stdint.h, AC_DEFINE(HAVE_STDINT_H, 1, [Define if you have stdint.h]),,) AC_CHECK_HEADER(pwd.h, AC_DEFINE(CHUID, 1, [Define if you have pwd.h]),,) AC_CHECK_HEADER(unistd.h, AC_DEFINE(CHROOT, 1, [Define if you have unistd.h]),,) -AC_CHECK_HEADER(sys/uio.h, AC_DEFINE(HAVE_SYS_UIO_H, 1, [Define if you have sys/uio.h]),,) dnl Checks for typedefs, structures, and compiler characteristics. -AC_C_CONST -AC_MSG_CHECKING([how to copy va_list]) - AC_TRY_LINK([#include ], [va_list ap1, ap2; va_copy(ap1, ap2);], - AC_MSG_RESULT([va_copy]), - [ AH_TEMPLATE([va_copy], [define if va_copy is not available]) - AC_TRY_LINK([#include ], [va_list ap1, ap2; __va_copy(ap1, ap2);], - [ AC_DEFINE([va_copy], [__va_copy]) - AC_MSG_RESULT([__va_copy])], - [ AC_DEFINE([va_copy(dest,src)], [memcpy(&dest,&src,sizeof(va_list))]) - AC_MSG_RESULT([memcpy])] - ) - ]) dnl Check for types -AC_CHECK_TYPE([socklen_t], int) dnl Checks for library functions. -AC_CHECK_FUNCS(nanosleep) -AC_CHECK_FUNCS(poll) -AC_CHECK_FUNCS(sethostent endhostent) -AC_CHECK_FUNCS(getnameinfo getaddrinfo inet_aton) +AC_CHECK_FUNCS(nanosleep poll) +XIPH_NET dnl -- configure options -- -AC_ARG_WITH(xslt-config, - [ --with-xslt-config=PATH use xslt-config in PATH to find libxslt ], - [if ! test -x "$with_xslt_config" - then - AC_MSG_ERROR([$with_xslt_config cannot be executed]) - fi - XSLTCONFIG="$with_xslt_config"] -) -if test -z "$XSLTCONFIG" -then - AC_CHECK_PROGS(XSLTCONFIG, [xslt-config]) -fi -if test -n "$XSLTCONFIG" -then - XSLT_LIBS="`$XSLTCONFIG --libs`" - XSLT_CFLAGS="`$XSLTCONFIG --cflags`" - save_LIBS="$LIBS" - save_CFLAGS="$CFLAGS" - LIBS="$LIBS $XSLT_LIBS" - CFLAGS="$CFLAGS $XSLT_CFLAGS" - AC_CHECK_FUNC(xsltParseStylesheetFile,, [AC_MSG_ERROR([There was a problem linking with libxslt])]) - LIBS="$save_LIBS" - CFLAGS="$save_CFLAGS" - save_LIBS= - save_CFLAGS= -else - AC_MSG_ERROR([xslt-config could not be found]) -fi +XIPH_PATH_XSLT +XIPH_VAR_APPEND([XIPH_CPPFLAGS],[$XSLT_CFLAGS]) +XIPH_VAR_PREPEND([XIPH_LIBS],[$XSLT_LIBS]) -AC_ARG_WITH(xml-config, - [ --with-xml-config=PATH use xml-config in PATH to find libxml ], - [if ! test -x "$with_xml_config" - then - AC_MSG_ERROR([$with_xml_config cannot be executed]) - fi - XMLCONFIG="$with_xml_config"] -) -if test -z "$XMLCONFIG" -then - AC_CHECK_PROGS(XMLCONFIG, [xml2-config xml-config]) -fi -if test -n "$XMLCONFIG" -then - XML_LIBS="`$XMLCONFIG --libs`" - XML_CFLAGS="`$XMLCONFIG --cflags`" - save_LIBS="$LIBS" - save_CFLAGS="$CFLAGS" - LIBS="$LIBS $XML_LIBS" - CFLAGS="$CFLAGS $XML_CFLAGS" - AC_CHECK_FUNC(xmlParseFile,, [AC_MSG_ERROR([There was a problem linking with libxml])]) - LIBS="$save_LIBS" - CFLAGS="$save_CFLAGS" - save_LIBS= - save_CFLAGS= -else - AC_MSG_ERROR([xml-config could not be found]) -fi +XIPH_PATH_VORBIS(, AC_MSG_ERROR([must have Ogg Vorbis v1.0 installed!])) +XIPH_VAR_APPEND([XIPH_CPPFLAGS],[$VORBIS_CFLAGS]) +XIPH_VAR_PREPEND([XIPH_LIBS],[$VORBIS_LIBS]) -AM_PATH_OGG(, AC_MSG_ERROR(must have Ogg installed!(Perhaps you need --with-ogg-prefix=/usr/local))) -AM_PATH_VORBIS(, AC_MSG_ERROR(must have Vorbis installed!(Perhaps you need --with-vorbis-prefix=/usr/local))) ACX_PTHREAD(, AC_MSG_ERROR([POSIX threads missing])) +XIPH_VAR_APPEND([XIPH_CFLAGS],[$PTHREAD_CFLAGS]) +XIPH_VAR_APPEND([XIPH_CPPFLAGS],[$PTHREAD_CPPFLAGS]) +XIPH_VAR_PREPEND([XIPH_LIBS],[$PTHREAD_LIBS]) dnl -- YP support -- AC_ARG_ENABLE([yp], - [ --disable-yp disable YP directory support]) + AC_HELP_STRING([--disable-yp],[disable YP directory support])) if test "x$enable_yp" != "xno" then -AM_PATH_CURL([ +XIPH_PATH_CURL([ AC_CHECK_DECL([CURLOPT_NOSIGNAL], [ AC_DEFINE([USE_YP], 1, [Define to compile in YP support code]) - ICECAST_OBJECTS="$ICECAST_OBJECTS geturl.o yp.o" + ICECAST_OPTIONAL="$ICECAST_OPTIONAL geturl.o yp.o" ], [ if test "x$enable_yp" != "xyes" then @@ -203,25 +125,22 @@ AM_PATH_CURL([ fi ]) fi +XIPH_VAR_APPEND([XIPH_CFLAGS],[$CURL_CFLAGS]) +XIPH_VAR_PREPEND([XIPH_LIBS],[$CURL_LIBS]) dnl Make substitutions -AC_SUBST(XSLT_CFLAGS) -AC_SUBST(XML_CFLAGS) -AC_SUBST(OGG_CFLAGS) -AC_SUBST(VORBIS_CFLAGS) -AC_SUBST(XSLT_LIBS) -AC_SUBST(XML_LIBS) -AC_SUBST(OGG_LIBS) -AC_SUBST(VORBIS_LIBS) -AC_SUBST(SOCKET_LIBS) +AC_SUBST(XIPH_CPPFLAGS) +AC_SUBST(XIPH_CFLAGS) +AC_SUBST(XIPH_LIBS) +AC_SUBST(PTHREAD_CPPFLAGS) +AC_SUBST(PTHREAD_CFLAGS) +AC_SUBST(PTHREAD_LIBS) AC_SUBST(LIBTOOL_DEPS) -AC_SUBST(OPT) AC_SUBST(LIBS) AC_SUBST(DEBUG) AC_SUBST(CFLAGS) AC_SUBST(PROFILE) -AC_SUBST(XIPH_CFLAGS) -AC_SUBST(ICECAST_OBJECTS) +AC_SUBST(ICECAST_OPTIONAL) AC_OUTPUT(Makefile conf/Makefile src/Makefile src/avl/Makefile src/httpp/Makefile src/thread/Makefile src/log/Makefile src/net/Makefile src/timing/Makefile doc/Makefile web/Makefile admin/Makefile win32/Makefile win32/res/Makefile) diff --git a/src/Makefile.am b/src/Makefile.am index d1710096..ca067cf9 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -6,24 +6,27 @@ SUBDIRS = avl thread httpp net log timing bin_PROGRAMS = icecast -noinst_HEADERS = admin.h config.h os.h logging.h sighandler.h connection.h global.h\ +noinst_HEADERS = admin.h cfgfile.h os.h logging.h sighandler.h connection.h global.h\ util.h slave.h source.h stats.h refbuf.h client.h format.h format_vorbis.h\ compat.h format_mp3.h fserve.h xslt.h geturl.h yp.h event.h -icecast_SOURCES = config.c main.c logging.c sighandler.c connection.c global.c\ +icecast_SOURCES = cfgfile.c main.c logging.c sighandler.c connection.c global.c\ util.c slave.c source.c stats.c refbuf.c client.c format.c format_vorbis.c\ format_mp3.c xslt.c fserve.c event.c admin.c EXTRA_icecast_SOURCES = geturl.c yp.c -icecast_LDADD = $(ICECAST_OBJECTS) net/libicenet.la thread/libicethread.la httpp/libicehttpp.la\ - log/libicelog.la avl/libiceavl.la timing/libicetiming.la -icecast_DEPENDENCIES = $(icecast_LDADD) +icecast_LDADD = @ICECAST_OPTIONAL@ net/libicenet.la thread/libicethread.la \ + httpp/libicehttpp.la log/libicelog.la avl/libiceavl.la \ + timing/libicetiming.la @XIPH_LIBS@ + +icecast_DEPENDENCIES = @ICECAST_OPTIONAL@ + +AM_CFLAGS = @XIPH_CFLAGS@ +AM_CPPFLAGS = @XIPH_CPPFLAGS@ -LIBS = @LIBS@ @XSLT_LIBS@ @SOCKET_LIBS@ @XML_LIBS@ @OGG_LIBS@ @VORBIS_LIBS@ @CURL_LIBS@ @PTHREAD_LIBS@ -CFLAGS = -g @CFLAGS@ @XML_CFLAGS@ @XSLT_CFLAGS@ @OGG_CFLAGS@ @VORBIS_CFLAGS@ @CURL_CFLAGS@ @PTHREAD_CFLAGS@ debug: - $(MAKE) all CFLAGS="@DEBUG@ @XML_CFLAGS@ @OGG_CFLAGS@ @VORBIS_CFLAGS@" + $(MAKE) all CFLAGS="@DEBUG@" profile: - $(MAKE) all CFLAGS="@PROFILE@ @XML_CFLAGS@ @OGG_CFLAGS@ @VORBIS_CFLAGS@" + $(MAKE) all CFLAGS="@PROFILE@" diff --git a/src/config.c b/src/config.c deleted file mode 100644 index ce355a99..00000000 --- a/src/config.c +++ /dev/null @@ -1,787 +0,0 @@ -#include -#include -#include -#include -#include - -#include "thread/thread.h" -#include "config.h" -#include "refbuf.h" -#include "client.h" -#include "logging.h" - -#define CATMODULE "CONFIG" -#define CONFIG_DEFAULT_LOCATION "Earth" -#define CONFIG_DEFAULT_ADMIN "icemaster@localhost" -#define CONFIG_DEFAULT_CLIENT_LIMIT 256 -#define CONFIG_DEFAULT_SOURCE_LIMIT 16 -#define CONFIG_DEFAULT_QUEUE_SIZE_LIMIT (100*1024) -#define CONFIG_DEFAULT_THREADPOOL_SIZE 4 -#define CONFIG_DEFAULT_CLIENT_TIMEOUT 30 -#define CONFIG_DEFAULT_HEADER_TIMEOUT 15 -#define CONFIG_DEFAULT_SOURCE_TIMEOUT 10 -#define CONFIG_DEFAULT_SOURCE_PASSWORD "changeme" -#define CONFIG_DEFAULT_RELAY_PASSWORD "changeme" -#define CONFIG_DEFAULT_ICE_LOGIN 0 -#define CONFIG_DEFAULT_FILESERVE 1 -#define CONFIG_DEFAULT_TOUCH_FREQ 5 -#define CONFIG_DEFAULT_HOSTNAME "localhost" -#define CONFIG_DEFAULT_ACCESS_LOG "access.log" -#define CONFIG_DEFAULT_ERROR_LOG "error.log" -#define CONFIG_DEFAULT_LOG_LEVEL 4 -#define CONFIG_DEFAULT_CHROOT 0 -#define CONFIG_DEFAULT_CHUID 0 -#define CONFIG_DEFAULT_USER NULL -#define CONFIG_DEFAULT_GROUP NULL -#define CONFIG_MASTER_UPDATE_INTERVAL 120 -#define CONFIG_YP_URL_TIMEOUT 10 - -#ifndef _WIN32 -#define CONFIG_DEFAULT_BASE_DIR "/usr/local/icecast" -#define CONFIG_DEFAULT_LOG_DIR "/usr/local/icecast/logs" -#define CONFIG_DEFAULT_WEBROOT_DIR "/usr/local/icecast/webroot" -#define CONFIG_DEFAULT_ADMINROOT_DIR "/usr/local/icecast/admin" -#else -#define CONFIG_DEFAULT_BASE_DIR ".\\" -#define CONFIG_DEFAULT_LOG_DIR ".\\logs" -#define CONFIG_DEFAULT_WEBROOT_DIR ".\\webroot" -#define CONFIG_DEFAULT_ADMINROOT_DIR ".\\admin" -#endif - -ice_config_t _current_configuration; -ice_config_locks _locks; - -static void _set_defaults(ice_config_t *c); -static void _parse_root(xmlDocPtr doc, xmlNodePtr node, ice_config_t *c); -static void _parse_limits(xmlDocPtr doc, xmlNodePtr node, ice_config_t *c); -static void _parse_directory(xmlDocPtr doc, xmlNodePtr node, ice_config_t *c); -static void _parse_paths(xmlDocPtr doc, xmlNodePtr node, ice_config_t *c); -static void _parse_logging(xmlDocPtr doc, xmlNodePtr node, ice_config_t *c); -static void _parse_security(xmlDocPtr doc, xmlNodePtr node, ice_config_t *c); -static void _parse_authentication(xmlDocPtr doc, xmlNodePtr node, - ice_config_t *c); -static void _parse_relay(xmlDocPtr doc, xmlNodePtr node, ice_config_t *c); -static void _parse_mount(xmlDocPtr doc, xmlNodePtr node, ice_config_t *c); -static void _parse_listen_socket(xmlDocPtr doc, xmlNodePtr node, - ice_config_t *c); -static void _add_server(xmlDocPtr doc, xmlNodePtr node, ice_config_t *c); - -static void create_locks() { - thread_mutex_create(&_locks.relay_lock); - thread_mutex_create(&_locks.mounts_lock); - thread_mutex_create(&_locks.config_lock); -} - -static void release_locks() { - thread_mutex_destroy(&_locks.relay_lock); - thread_mutex_destroy(&_locks.mounts_lock); - thread_mutex_destroy(&_locks.config_lock); -} - -void config_initialize(void) { - create_locks(); -} - -void config_shutdown(void) { - config_get_config(); - config_clear(&_current_configuration); - config_release_config(); - release_locks(); -} - -void config_init_configuration(ice_config_t *configuration) -{ - memset(configuration, 0, sizeof(ice_config_t)); - _set_defaults(configuration); -} - -void config_clear(ice_config_t *c) -{ - ice_config_dir_t *dirnode, *nextdirnode; - relay_server *relay, *nextrelay; - mount_proxy *mount, *nextmount; - aliases *alias, *nextalias; - int i; - - if (c->config_filename) - free(c->config_filename); - - if (c->location && c->location != CONFIG_DEFAULT_LOCATION) - xmlFree(c->location); - if (c->admin && c->admin != CONFIG_DEFAULT_ADMIN) - xmlFree(c->admin); - if (c->source_password && c->source_password != CONFIG_DEFAULT_SOURCE_PASSWORD) - xmlFree(c->source_password); - if (c->admin_username) - xmlFree(c->admin_username); - if (c->admin_password) - xmlFree(c->admin_password); - if (c->hostname && c->hostname != CONFIG_DEFAULT_HOSTNAME) - xmlFree(c->hostname); - if (c->base_dir && c->base_dir != CONFIG_DEFAULT_BASE_DIR) - xmlFree(c->base_dir); - if (c->log_dir && c->log_dir != CONFIG_DEFAULT_LOG_DIR) - xmlFree(c->log_dir); - if (c->webroot_dir && c->webroot_dir != CONFIG_DEFAULT_WEBROOT_DIR) - xmlFree(c->webroot_dir); - if (c->adminroot_dir && c->adminroot_dir != CONFIG_DEFAULT_ADMINROOT_DIR) - xmlFree(c->adminroot_dir); - if (c->access_log && c->access_log != CONFIG_DEFAULT_ACCESS_LOG) - xmlFree(c->access_log); - if (c->error_log && c->error_log != CONFIG_DEFAULT_ERROR_LOG) - xmlFree(c->error_log); - for(i=0; i < MAX_LISTEN_SOCKETS; i++) { - if (c->listeners[i].bind_address) xmlFree(c->listeners[i].bind_address); - } - if (c->master_server) xmlFree(c->master_server); - if (c->master_password) xmlFree(c->master_password); - if (c->user) xmlFree(c->user); - if (c->group) xmlFree(c->group); - - thread_mutex_lock(&(_locks.relay_lock)); - relay = c->relay; - while(relay) { - nextrelay = relay->next; - xmlFree(relay->server); - xmlFree(relay->mount); - if(relay->localmount) - xmlFree(relay->localmount); - free(relay); - relay = nextrelay; - } - thread_mutex_unlock(&(_locks.relay_lock)); - - thread_mutex_lock(&(_locks.mounts_lock)); - mount = c->mounts; - while(mount) { - nextmount = mount->next; - xmlFree(mount->mountname); - xmlFree(mount->username); - xmlFree(mount->password); - xmlFree(mount->dumpfile); - xmlFree(mount->fallback_mount); - free(mount); - mount = nextmount; - } - thread_mutex_unlock(&(_locks.mounts_lock)); - - alias = c->aliases; - while(alias) { - nextalias = alias->next; - xmlFree(alias->source); - xmlFree(alias->destination); - xmlFree(alias->bind_address); - free(alias); - alias = nextalias; - } - - dirnode = c->dir_list; - while(dirnode) { - nextdirnode = dirnode->next; - xmlFree(dirnode->host); - free(dirnode); - dirnode = nextdirnode; - } - - memset(c, 0, sizeof(ice_config_t)); -} - -int config_initial_parse_file(const char *filename) -{ - /* Since we're already pointing at it, we don't need to copy it in place */ - return config_parse_file(filename, &_current_configuration); -} - -int config_parse_file(const char *filename, ice_config_t *configuration) -{ - xmlDocPtr doc; - xmlNodePtr node; - - if (filename == NULL || strcmp(filename, "") == 0) return CONFIG_EINSANE; - - xmlInitParser(); - doc = xmlParseFile(filename); - if (doc == NULL) { - return CONFIG_EPARSE; - } - - node = xmlDocGetRootElement(doc); - if (node == NULL) { - xmlFreeDoc(doc); - xmlCleanupParser(); - return CONFIG_ENOROOT; - } - - if (strcmp(node->name, "icecast") != 0) { - xmlFreeDoc(doc); - xmlCleanupParser(); - return CONFIG_EBADROOT; - } - - config_init_configuration(configuration); - - configuration->config_filename = (char *)strdup(filename); - - _parse_root(doc, node->xmlChildrenNode, configuration); - - xmlFreeDoc(doc); - - return 0; -} - -int config_parse_cmdline(int arg, char **argv) -{ - return 0; -} - -ice_config_locks *config_locks(void) -{ - return &_locks; -} - -void config_release_config(void) -{ - thread_mutex_unlock(&(_locks.config_lock)); -} - -ice_config_t *config_get_config(void) -{ - thread_mutex_lock(&(_locks.config_lock)); - return &_current_configuration; -} - -/* MUST be called with the lock held! */ -void config_set_config(ice_config_t *config) { - memcpy(&_current_configuration, config, sizeof(ice_config_t)); -} - -ice_config_t *config_get_config_unlocked(void) -{ - return &_current_configuration; -} - -static void _set_defaults(ice_config_t *configuration) -{ - configuration->location = CONFIG_DEFAULT_LOCATION; - configuration->admin = CONFIG_DEFAULT_ADMIN; - configuration->client_limit = CONFIG_DEFAULT_CLIENT_LIMIT; - configuration->source_limit = CONFIG_DEFAULT_SOURCE_LIMIT; - configuration->queue_size_limit = CONFIG_DEFAULT_QUEUE_SIZE_LIMIT; - configuration->threadpool_size = CONFIG_DEFAULT_THREADPOOL_SIZE; - configuration->client_timeout = CONFIG_DEFAULT_CLIENT_TIMEOUT; - configuration->header_timeout = CONFIG_DEFAULT_HEADER_TIMEOUT; - configuration->source_timeout = CONFIG_DEFAULT_SOURCE_TIMEOUT; - configuration->source_password = CONFIG_DEFAULT_SOURCE_PASSWORD; - configuration->ice_login = CONFIG_DEFAULT_ICE_LOGIN; - configuration->fileserve = CONFIG_DEFAULT_FILESERVE; - configuration->touch_interval = CONFIG_DEFAULT_TOUCH_FREQ; - configuration->dir_list = NULL; - configuration->hostname = CONFIG_DEFAULT_HOSTNAME; - configuration->port = 0; - configuration->listeners[0].port = 0; - configuration->listeners[0].bind_address = NULL; - configuration->master_server = NULL; - configuration->master_server_port = 0; - configuration->master_update_interval = CONFIG_MASTER_UPDATE_INTERVAL; - configuration->master_password = NULL; - configuration->base_dir = CONFIG_DEFAULT_BASE_DIR; - configuration->log_dir = CONFIG_DEFAULT_LOG_DIR; - configuration->webroot_dir = CONFIG_DEFAULT_WEBROOT_DIR; - configuration->adminroot_dir = CONFIG_DEFAULT_ADMINROOT_DIR; - configuration->access_log = CONFIG_DEFAULT_ACCESS_LOG; - configuration->error_log = CONFIG_DEFAULT_ERROR_LOG; - configuration->loglevel = CONFIG_DEFAULT_LOG_LEVEL; - configuration->chroot = CONFIG_DEFAULT_CHROOT; - configuration->chuid = CONFIG_DEFAULT_CHUID; - configuration->user = CONFIG_DEFAULT_USER; - configuration->group = CONFIG_DEFAULT_GROUP; - configuration->num_yp_directories = 0; -} - -static void _parse_root(xmlDocPtr doc, xmlNodePtr node, - ice_config_t *configuration) -{ - char *tmp; - - do { - if (node == NULL) break; - if (xmlIsBlankNode(node)) continue; - - if (strcmp(node->name, "location") == 0) { - if (configuration->location && configuration->location != CONFIG_DEFAULT_LOCATION) xmlFree(configuration->location); - configuration->location = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); - } else if (strcmp(node->name, "admin") == 0) { - if (configuration->admin && configuration->admin != CONFIG_DEFAULT_ADMIN) xmlFree(configuration->admin); - configuration->admin = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); - } else if(strcmp(node->name, "authentication") == 0) { - _parse_authentication(doc, node->xmlChildrenNode, configuration); - } else if (strcmp(node->name, "source-password") == 0) { - /* TODO: This is the backwards-compatibility location */ - char *mount, *pass; - if ((mount = (char *)xmlGetProp(node, "mount")) != NULL) { - pass = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); - /* FIXME: This is a placeholder for per-mount passwords */ - } - else { - if (configuration->source_password && configuration->source_password != CONFIG_DEFAULT_SOURCE_PASSWORD) xmlFree(configuration->source_password); - configuration->source_password = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); - } - } else if (strcmp(node->name, "icelogin") == 0) { - tmp = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); - configuration->ice_login = atoi(tmp); - if (tmp) xmlFree(tmp); - } else if (strcmp(node->name, "fileserve") == 0) { - tmp = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); - configuration->fileserve = atoi(tmp); - if (tmp) xmlFree(tmp); - } else if (strcmp(node->name, "hostname") == 0) { - if (configuration->hostname && configuration->hostname != CONFIG_DEFAULT_HOSTNAME) xmlFree(configuration->hostname); - configuration->hostname = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); - } else if (strcmp(node->name, "listen-socket") == 0) { - _parse_listen_socket(doc, node->xmlChildrenNode, configuration); - } else if (strcmp(node->name, "port") == 0) { - tmp = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); - configuration->port = atoi(tmp); - configuration->listeners[0].port = atoi(tmp); - if (tmp) xmlFree(tmp); - } else if (strcmp(node->name, "bind-address") == 0) { - if (configuration->listeners[0].bind_address) - xmlFree(configuration->listeners[0].bind_address); - configuration->listeners[0].bind_address = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); - } else if (strcmp(node->name, "master-server") == 0) { - if (configuration->master_server) xmlFree(configuration->master_server); - configuration->master_server = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); - } else if (strcmp(node->name, "master-password") == 0) { - if (configuration->master_password) xmlFree(configuration->master_password); - configuration->master_password = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); - } else if (strcmp(node->name, "master-server-port") == 0) { - tmp = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); - configuration->master_server_port = atoi(tmp); - } else if (strcmp(node->name, "master-update-interval") == 0) { - tmp = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); - configuration->master_update_interval = atoi(tmp); - } else if (strcmp(node->name, "limits") == 0) { - _parse_limits(doc, node->xmlChildrenNode, configuration); - } else if (strcmp(node->name, "relay") == 0) { - _parse_relay(doc, node->xmlChildrenNode, configuration); - } else if (strcmp(node->name, "mount") == 0) { - _parse_mount(doc, node->xmlChildrenNode, configuration); - } else if (strcmp(node->name, "directory") == 0) { - _parse_directory(doc, node->xmlChildrenNode, configuration); - } else if (strcmp(node->name, "paths") == 0) { - _parse_paths(doc, node->xmlChildrenNode, configuration); - } else if (strcmp(node->name, "logging") == 0) { - _parse_logging(doc, node->xmlChildrenNode, configuration); - } else if (strcmp(node->name, "security") == 0) { - _parse_security(doc, node->xmlChildrenNode, configuration); - } - } while ((node = node->next)); -} - -static void _parse_limits(xmlDocPtr doc, xmlNodePtr node, - ice_config_t *configuration) -{ - char *tmp; - - do { - if (node == NULL) break; - if (xmlIsBlankNode(node)) continue; - - if (strcmp(node->name, "clients") == 0) { - tmp = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); - configuration->client_limit = atoi(tmp); - if (tmp) xmlFree(tmp); - } else if (strcmp(node->name, "sources") == 0) { - tmp = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); - configuration->source_limit = atoi(tmp); - if (tmp) xmlFree(tmp); - } else if (strcmp(node->name, "queue-size") == 0) { - tmp = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); - configuration->queue_size_limit = atoi(tmp); - if (tmp) xmlFree(tmp); - } else if (strcmp(node->name, "threadpool") == 0) { - tmp = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); - configuration->threadpool_size = atoi(tmp); - if (tmp) xmlFree(tmp); - } else if (strcmp(node->name, "client-timeout") == 0) { - tmp = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); - configuration->client_timeout = atoi(tmp); - if (tmp) xmlFree(tmp); - } else if (strcmp(node->name, "header-timeout") == 0) { - tmp = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); - configuration->header_timeout = atoi(tmp); - if (tmp) xmlFree(tmp); - } else if (strcmp(node->name, "source-timeout") == 0) { - tmp = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); - configuration->source_timeout = atoi(tmp); - if (tmp) xmlFree(tmp); - } - } while ((node = node->next)); -} - -static void _parse_mount(xmlDocPtr doc, xmlNodePtr node, - ice_config_t *configuration) -{ - char *tmp; - mount_proxy *mount = calloc(1, sizeof(mount_proxy)); - mount_proxy *current = configuration->mounts; - mount_proxy *last=NULL; - - while(current) { - last = current; - current = current->next; - } - - if(last) - last->next = mount; - else - configuration->mounts = mount; - - mount->max_listeners = -1; - mount->next = NULL; - - do { - if (node == NULL) break; - if (xmlIsBlankNode(node)) continue; - - if (strcmp(node->name, "mount-name") == 0) { - mount->mountname = (char *)xmlNodeListGetString( - doc, node->xmlChildrenNode, 1); - } - else if (strcmp(node->name, "username") == 0) { - mount->username = (char *)xmlNodeListGetString( - doc, node->xmlChildrenNode, 1); - } - else if (strcmp(node->name, "password") == 0) { - mount->password = (char *)xmlNodeListGetString( - doc, node->xmlChildrenNode, 1); - } - else if (strcmp(node->name, "dump-file") == 0) { - mount->dumpfile = (char *)xmlNodeListGetString( - doc, node->xmlChildrenNode, 1); - } - else if (strcmp(node->name, "fallback-mount") == 0) { - mount->fallback_mount = (char *)xmlNodeListGetString( - doc, node->xmlChildrenNode, 1); - } - else if (strcmp(node->name, "max-listeners") == 0) { - tmp = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); - mount->max_listeners = atoi(tmp); - if(tmp) xmlFree(tmp); - } - } while ((node = node->next)); -} - -static void _parse_relay(xmlDocPtr doc, xmlNodePtr node, - ice_config_t *configuration) -{ - char *tmp; - relay_server *relay = calloc(1, sizeof(relay_server)); - relay_server *current = configuration->relay; - relay_server *last=NULL; - - while(current) { - last = current; - current = current->next; - } - - if(last) - last->next = relay; - else - configuration->relay = relay; - - relay->next = NULL; - - do { - if (node == NULL) break; - if (xmlIsBlankNode(node)) continue; - - if (strcmp(node->name, "server") == 0) { - relay->server = (char *)xmlNodeListGetString( - doc, node->xmlChildrenNode, 1); - } - else if (strcmp(node->name, "port") == 0) { - tmp = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); - relay->port = atoi(tmp); - if(tmp) xmlFree(tmp); - } - else if (strcmp(node->name, "mount") == 0) { - relay->mount = (char *)xmlNodeListGetString( - doc, node->xmlChildrenNode, 1); - } - else if (strcmp(node->name, "local-mount") == 0) { - relay->localmount = (char *)xmlNodeListGetString( - doc, node->xmlChildrenNode, 1); - } - else if (strcmp(node->name, "relay-shoutcast-metadata") == 0) { - tmp = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); - relay->mp3metadata = atoi(tmp); - if(tmp) xmlFree(tmp); - } - } while ((node = node->next)); -} - -static void _parse_listen_socket(xmlDocPtr doc, xmlNodePtr node, - ice_config_t *configuration) -{ - listener_t *listener = NULL; - int i; - char *tmp; - - for(i=0; i < MAX_LISTEN_SOCKETS; i++) { - if(configuration->listeners[i].port <= 0) { - listener = &(configuration->listeners[i]); - break; - } - } - - do { - if (node == NULL) break; - if (xmlIsBlankNode(node)) continue; - - if (strcmp(node->name, "port") == 0) { - tmp = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); - if(configuration->port == 0) - configuration->port = atoi(tmp); - listener->port = atoi(tmp); - if(tmp) xmlFree(tmp); - } - else if (strcmp(node->name, "bind-address") == 0) { - listener->bind_address = (char *)xmlNodeListGetString(doc, - node->xmlChildrenNode, 1); - } - } while ((node = node->next)); -} - -static void _parse_authentication(xmlDocPtr doc, xmlNodePtr node, - ice_config_t *configuration) -{ - do { - if (node == NULL) break; - if (xmlIsBlankNode(node)) continue; - - if (strcmp(node->name, "source-password") == 0) { - char *mount, *pass; - if ((mount = (char *)xmlGetProp(node, "mount")) != NULL) { - pass = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); - /* FIXME: This is a placeholder for per-mount passwords */ - } - else { - if (configuration->source_password && - configuration->source_password != - CONFIG_DEFAULT_SOURCE_PASSWORD) - xmlFree(configuration->source_password); - configuration->source_password = - (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); - } - } else if (strcmp(node->name, "admin-password") == 0) { - if(configuration->admin_password) - xmlFree(configuration->admin_password); - configuration->admin_password = - (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); - } else if (strcmp(node->name, "admin-user") == 0) { - if(configuration->admin_username) - xmlFree(configuration->admin_username); - configuration->admin_username = - (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); - } - } while ((node = node->next)); -} - -static void _parse_directory(xmlDocPtr doc, xmlNodePtr node, - ice_config_t *configuration) -{ - char *tmp; - - if (configuration->num_yp_directories >= MAX_YP_DIRECTORIES) { - ERROR0("Maximum number of yp directories exceeded!"); - return; - } - do { - if (node == NULL) break; - if (xmlIsBlankNode(node)) continue; - - if (strcmp(node->name, "yp-url") == 0) { - if (configuration->yp_url[configuration->num_yp_directories]) - xmlFree(configuration->yp_url[configuration->num_yp_directories]); - configuration->yp_url[configuration->num_yp_directories] = - (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); - } else if (strcmp(node->name, "yp-url-timeout") == 0) { - tmp = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); - configuration->yp_url_timeout[configuration->num_yp_directories] = - atoi(tmp); - } else if (strcmp(node->name, "server") == 0) { - _add_server(doc, node->xmlChildrenNode, configuration); - } else if (strcmp(node->name, "touch-interval") == 0) { - tmp = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); - configuration->touch_interval = atoi(tmp); - if (tmp) xmlFree(tmp); - } - } while ((node = node->next)); - configuration->num_yp_directories++; -} - -static void _parse_paths(xmlDocPtr doc, xmlNodePtr node, - ice_config_t *configuration) -{ - char *temp; - aliases *alias, *current, *last; - - do { - if (node == NULL) break; - if (xmlIsBlankNode(node)) continue; - - if (strcmp(node->name, "basedir") == 0) { - if (configuration->base_dir && configuration->base_dir != CONFIG_DEFAULT_BASE_DIR) xmlFree(configuration->base_dir); - configuration->base_dir = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); - } else if (strcmp(node->name, "logdir") == 0) { - if (configuration->log_dir && configuration->log_dir != CONFIG_DEFAULT_LOG_DIR) xmlFree(configuration->log_dir); - configuration->log_dir = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); - } else if (strcmp(node->name, "webroot") == 0) { - if (configuration->webroot_dir && configuration->webroot_dir != CONFIG_DEFAULT_WEBROOT_DIR) xmlFree(configuration->webroot_dir); - configuration->webroot_dir = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); - if(configuration->webroot_dir[strlen(configuration->webroot_dir)-1] == '/') - configuration->webroot_dir[strlen(configuration->webroot_dir)-1] = 0; - } else if (strcmp(node->name, "adminroot") == 0) { - if (configuration->adminroot_dir && configuration->adminroot_dir != CONFIG_DEFAULT_ADMINROOT_DIR) - xmlFree(configuration->adminroot_dir); - configuration->adminroot_dir = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); - if(configuration->adminroot_dir[strlen(configuration->adminroot_dir)-1] == '/') - configuration->adminroot_dir[strlen(configuration->adminroot_dir)-1] = 0; - } else if (strcmp(node->name, "alias") == 0) { - alias = malloc(sizeof(aliases)); - alias->next = NULL; - alias->source = xmlGetProp(node, "source"); - if(alias->source == NULL) { - free(alias); - continue; - } - alias->destination = xmlGetProp(node, "dest"); - if(alias->destination == NULL) { - xmlFree(alias->source); - free(alias); - continue; - } - temp = NULL; - temp = xmlGetProp(node, "port"); - if(temp != NULL) { - alias->port = atoi(temp); - xmlFree(temp); - } - else - alias->port = -1; - alias->bind_address = xmlGetProp(node, "bind-address"); - current = configuration->aliases; - last = NULL; - while(current) { - last = current; - current = current->next; - } - if(last) - last->next = alias; - else - configuration->aliases = alias; - } - } while ((node = node->next)); -} - -static void _parse_logging(xmlDocPtr doc, xmlNodePtr node, - ice_config_t *configuration) -{ - do { - if (node == NULL) break; - if (xmlIsBlankNode(node)) continue; - - if (strcmp(node->name, "accesslog") == 0) { - if (configuration->access_log && configuration->access_log != CONFIG_DEFAULT_ACCESS_LOG) xmlFree(configuration->access_log); - configuration->access_log = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); - } else if (strcmp(node->name, "errorlog") == 0) { - if (configuration->error_log && configuration->error_log != CONFIG_DEFAULT_ERROR_LOG) xmlFree(configuration->error_log); - configuration->error_log = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); - } else if (strcmp(node->name, "loglevel") == 0) { - char *tmp = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); - configuration->loglevel = atoi(tmp); - if (tmp) xmlFree(tmp); - } - } while ((node = node->next)); -} - -static void _parse_security(xmlDocPtr doc, xmlNodePtr node, - ice_config_t *configuration) -{ - char *tmp; - xmlNodePtr oldnode; - - do { - if (node == NULL) break; - if (xmlIsBlankNode(node)) continue; - - if (strcmp(node->name, "chroot") == 0) { - tmp = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); - configuration->chroot = atoi(tmp); - if (tmp) xmlFree(tmp); - } else if (strcmp(node->name, "changeowner") == 0) { - configuration->chuid = 1; - oldnode = node; - node = node->xmlChildrenNode; - do { - if(node == NULL) break; - if(xmlIsBlankNode(node)) continue; - if(strcmp(node->name, "user") == 0) { - if(configuration->user) xmlFree(configuration->user); - configuration->user = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); - } else if(strcmp(node->name, "group") == 0) { - if(configuration->group) xmlFree(configuration->group); - configuration->group = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); - } - } while((node = node->next)); - node = oldnode; - } - } while ((node = node->next)); -} - -static void _add_server(xmlDocPtr doc, xmlNodePtr node, - ice_config_t *configuration) -{ - ice_config_dir_t *dirnode, *server; - int addnode; - char *tmp; - - server = (ice_config_dir_t *)malloc(sizeof(ice_config_dir_t)); - server->touch_interval = configuration->touch_interval; - server->host = NULL; - addnode = 0; - - do { - if (node == NULL) break; - if (xmlIsBlankNode(node)) continue; - - if (strcmp(node->name, "host") == 0) { - server->host = (char *)xmlNodeListGetString(doc, - node->xmlChildrenNode, 1); - addnode = 1; - } else if (strcmp(node->name, "touch-interval") == 0) { - tmp = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); - server->touch_interval = atoi(tmp); - if (tmp) xmlFree(tmp); - } - server->next = NULL; - } while ((node = node->next)); - - if (addnode) { - dirnode = configuration->dir_list; - if (dirnode == NULL) { - configuration->dir_list = server; - } else { - while (dirnode->next) dirnode = dirnode->next; - - dirnode->next = server; - } - - server = NULL; - addnode = 0; - } - -} - - diff --git a/src/config.h b/src/config.h deleted file mode 100644 index c7eeea74..00000000 --- a/src/config.h +++ /dev/null @@ -1,144 +0,0 @@ -#ifndef __CONFIG_H__ -#define __CONFIG_H__ - -#define CONFIG_EINSANE -1 -#define CONFIG_ENOROOT -2 -#define CONFIG_EBADROOT -3 -#define CONFIG_EPARSE -4 - -#define MAX_YP_DIRECTORIES 25 - - -#include "thread/thread.h" -#include "avl/avl.h" -#include "global.h" - -typedef struct ice_config_dir_tag -{ - char *host; - int touch_interval; - struct ice_config_dir_tag *next; -} ice_config_dir_t; - -typedef struct _relay_server { - char *server; - int port; - char *mount; - char *localmount; - int mp3metadata; - struct _relay_server *next; -} relay_server; - -typedef struct _mount_proxy { - char *mountname; /* The mountpoint this proxy is used for */ - - char *username; /* Username and password for this mountpoint. If unset, */ - char *password; /* falls back to global source password */ - - char *dumpfile; /* Filename to dump this stream to (will be appended). NULL - to not dump. */ - int max_listeners; /* Max listeners for this mountpoint only. -1 to not - limit here (i.e. only use the global limit) */ - char *fallback_mount; - struct _mount_proxy *next; -} mount_proxy; - -typedef struct _aliases { - char *source; - char *destination; - int port; - char *bind_address; - struct _aliases *next; -}aliases; - -typedef struct { - int port; - char *bind_address; -} listener_t; - -typedef struct ice_config_tag -{ - char *config_filename; - - char *location; - char *admin; - - int client_limit; - int source_limit; - long queue_size_limit; - int threadpool_size; - int client_timeout; - int header_timeout; - int source_timeout; - int ice_login; - int fileserve; - - char *source_password; - char *admin_username; - char *admin_password; - - int touch_interval; - ice_config_dir_t *dir_list; - - char *hostname; - int port; - - listener_t listeners[MAX_LISTEN_SOCKETS]; - - char *master_server; - int master_server_port; - int master_update_interval; - char *master_password; - - relay_server *relay; - - mount_proxy *mounts; - - char *base_dir; - char *log_dir; - char *webroot_dir; - char *adminroot_dir; - aliases *aliases; - - char *access_log; - char *error_log; - int loglevel; - - int chroot; - int chuid; - char *user; - char *group; - char *yp_url[MAX_YP_DIRECTORIES]; - int yp_url_timeout[MAX_YP_DIRECTORIES]; - int num_yp_directories; -} ice_config_t; - -typedef struct { - mutex_t config_lock; - mutex_t relay_lock; - mutex_t mounts_lock; -} ice_config_locks; - -void config_initialize(void); -void config_shutdown(void); - -int config_parse_file(const char *filename, ice_config_t *configuration); -int config_initial_parse_file(const char *filename); -int config_parse_cmdline(int arg, char **argv); -void config_set_config(ice_config_t *config); -void config_clear(ice_config_t *config); - -int config_rehash(void); - -ice_config_locks *config_locks(void); - -ice_config_t *config_get_config(void); -void config_release_config(void); - -/* To be used ONLY in one-time startup code */ -ice_config_t *config_get_config_unlocked(void); - -#endif /* __CONFIG_H__ */ - - -