mirror of
https://gitlab.xiph.org/xiph/icecast-server.git
synced 2024-12-04 14:46:30 -05:00
Make icecast use the shared M4 macros. Cleanup the other files.
svn path=/trunk/icecast/; revision=5157
This commit is contained in:
parent
43953202a2
commit
52b917d2c3
10
Makefile.am
10
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@"
|
||||
|
@ -1,2 +0,0 @@
|
||||
/* Define if you lack the socklen_t type */
|
||||
#undef socklen_t
|
492
acinclude.m4
492
acinclude.m4
@ -1,492 +0,0 @@
|
||||
# Configure paths for libogg
|
||||
# Jack Moffitt <jack@icecast.org> 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 <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <ogg/ogg.h>
|
||||
|
||||
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 <stdio.h>
|
||||
#include <ogg/ogg.h>
|
||||
], [ 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 <jack@icecast.org> 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 <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <vorbis/codec.h>
|
||||
|
||||
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 <stdio.h>
|
||||
#include <vorbis/codec.h>
|
||||
], [ 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 <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <curl/curl.h>
|
||||
|
||||
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 <stdio.h>
|
||||
#include <curl/curl.h>
|
||||
], [ 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 <stevenj@alum.mit.edu> and
|
||||
dnl Alejandro Forero Cuervo <bachue@bachue.com>. 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.h>],
|
||||
[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 <pthread.h>],
|
||||
[int attr=PTHREAD_CREATE_JOINABLE;],
|
||||
ok=PTHREAD_CREATE_JOINABLE, ok=unknown)
|
||||
if test x"$ok" = xunknown; then
|
||||
AC_TRY_LINK([#include <pthread.h>],
|
||||
[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 <pthread.h>])
|
||||
|
||||
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
|
||||
|
||||
])
|
91
autogen.sh
91
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
|
||||
|
195
configure.in
195
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 <stdarg.h>], [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 <stdarg.h>], [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)
|
||||
|
@ -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@"
|
||||
|
||||
|
787
src/config.c
787
src/config.c
@ -1,787 +0,0 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <libxml/xmlmemory.h>
|
||||
#include <libxml/parser.h>
|
||||
|
||||
#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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
144
src/config.h
144
src/config.h
@ -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__ */
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user