0a8e4e4d8d
this addition follow: The patch implements a simple reverse proxy (with one funky extra feature). It has all the regular features: mapping remote servers to local namespace (ReversePath), disabling forward proxying (ReverseOnly) and HTTP redirect rewriting (ReverseBaseURL). The funky feature is this: You map Google to /google/ and the Google front page opens up fine. Type in stuff and click "Google Search" and you'll get an error from tinyproxy. Reason for this is that Google's form submits to "/search" which unfortunately bypasses our /google/ mapping (if they'd submit to "search" without the slash it would have worked ok). Turn on ReverseMagic and it starts working.... ReverseMagic "hijacks" one cookie which it sends to the client browser. This cookie contains the current reverse proxy path mapping (in the above case /google/) so that even if the site uses absolute links the reverse proxy still knows where to map the request. And yes, it works. No, I've never seen this done before - I couldn't find _any_ working OSS reverse proxies, and the commercial ones I've seen try to parse the page and fix all links (in the above case changing "/search" to "/google/search"). The problem with modifying the html is that it might not be parsable (very common) or it might be encoded so that the proxy can't read it (mod_gzip or likes). Hope you like that patch. One caveat - I haven't coded with C in like three years so my code might be a bit messy.... There shouldn't be any security problems thou, but you never know. I did all the stuff out of my memory without reading any RFC's, but I tested everything with Moz, Konq, IE6, Links and Lynx and they all worked fine.
358 lines
11 KiB
Plaintext
358 lines
11 KiB
Plaintext
dnl $Id: configure.ac,v 2.65 2004-01-26 19:11:52 rjkaes Exp $
|
|
|
|
dnl Devlopers, please strive to achieve this order:
|
|
dnl
|
|
dnl 0. Initialization and options processing
|
|
dnl 1. Programs
|
|
dnl 2. Libraries
|
|
dnl 3. Header files
|
|
dnl 4. Types
|
|
dnl 5. Structures
|
|
dnl 6. Compiler characteristics
|
|
dnl 7. Functions, global variables
|
|
dnl 8. System services
|
|
dnl
|
|
dnl Read the Autoconf manual for details.
|
|
|
|
AC_INIT([tinyproxy], [1.7.0], [rjkaes@users.sourceforge.net])
|
|
AC_CONFIG_SRCDIR([src/tinyproxy.c])
|
|
AC_PREREQ(2.52)
|
|
|
|
AC_CANONICAL_TARGET
|
|
|
|
AH_TEMPLATE([TARGET_SYSTEM],
|
|
[A string containing the target system for which tinyproxy was built.])
|
|
AC_DEFINE_UNQUOTED(TARGET_SYSTEM, ["$target"])
|
|
|
|
AM_INIT_AUTOMAKE($PACKAGE_NAME, $PACKAGE_VERSION)
|
|
AM_CONFIG_HEADER(config.h)
|
|
|
|
dnl Check if we're compiling on a weird platform :)
|
|
AC_AIX
|
|
AC_GNU_SOURCE
|
|
AC_MINIX
|
|
|
|
dnl
|
|
dnl Command line options
|
|
dnl
|
|
|
|
dnl Set the URL name for find the statistics of tinyproxy
|
|
AH_TEMPLATE([DEFAULT_STATHOST],
|
|
[This controls remote proxy stats display.])
|
|
AC_ARG_WITH(stathost,
|
|
[AC_HELP_STRING([--with-stathost=HOST], [Default status host])],
|
|
[AC_DEFINE_UNQUOTED(DEFAULT_STATHOST, "$withval")],
|
|
[AC_DEFINE_UNQUOTED(DEFAULT_STATHOST, "tinyproxy.stats")])
|
|
|
|
dnl Set the default configuration file location
|
|
test "$prefix" = "NONE" && prefix=/usr/local
|
|
|
|
AH_TEMPLATE([DEFAULT_CONF_FILE],
|
|
[This is the default file name for the configuration file.])
|
|
AC_ARG_WITH(config,
|
|
[AC_HELP_STRING([--with-config=FILE],
|
|
[Set the default location of the config file])],
|
|
[tp_config_file="$withval"],
|
|
[tp_config_file="tinyproxy.conf"])
|
|
|
|
# If the first character is a slash, it's an absolute path
|
|
if [[ `echo $tp_config_file | cut -c1` = "/" ]]; then
|
|
TINYPROXY_CONFIG_DIR=`echo "$tp_config_file" | sed 's/^\(.*\)\/[[^\/]]*$/\1/'`
|
|
TINYPROXY_CONFIG_FILE=`echo "$tp_config_file" | sed 's/^.*\/\([[^\/]]*\)$/\1/'`
|
|
else
|
|
# If sysconfdir is /usr/etc, change it to /etc (since /usr/etc doesn't exist)
|
|
if [[ "/usr/etc" = `eval echo $sysconfdir` -a "/usr" = "$prefix" ]]; then
|
|
TINYPROXY_CONFIG_DIR="/etc/tinyproxy"
|
|
else
|
|
TINYPROXY_CONFIG_DIR=`eval echo $sysconfdir/tinyproxy`
|
|
fi
|
|
TINYPROXY_CONFIG_FILE="$tp_config_file"
|
|
fi
|
|
|
|
AC_DEFINE_UNQUOTED(DEFAULT_CONF_FILE, "$TINYPROXY_CONFIG_DIR/$TINYPROXY_CONFIG_FILE")
|
|
|
|
AC_MSG_NOTICE([Default config location and file is: $TINYPROXY_CONFIG_DIR/$TINYPROXY_CONFIG_FILE])
|
|
|
|
dnl Add compiler-specific optimization flags
|
|
AC_ARG_ENABLE(debug,
|
|
[AC_HELP_STRING([--enable-debug],
|
|
[Disable aggressive optimizations (default is NO)])],
|
|
debug_enabled=$enableval, debug_enabled=no)
|
|
|
|
dnl Add in profiling information
|
|
AC_ARG_ENABLE(profiling,
|
|
[AC_HELP_STRING([--enable-profiling],
|
|
[Enable profiling information (default is NO)])],
|
|
profiling_enabled=$enableval, profiling_enabled=no)
|
|
|
|
dnl Include SOCKS support
|
|
AC_ARG_ENABLE(socks,
|
|
[AC_HELP_STRING([--enable-socks],
|
|
[Enable SOCKS support (default is NO)])],
|
|
socks_enabled=$enableval, socks_enabled=no)
|
|
|
|
dnl Check to see if the XTinyproxy header is to be included
|
|
AH_TEMPLATE([XTINYPROXY_ENABLE],
|
|
[Define if you want to have the peer's IP address included in a XTinyproxy header sent to the server.])
|
|
AC_ARG_ENABLE(xtinyproxy,
|
|
[AC_HELP_STRING([--enable-xtinyproxy],
|
|
[Include X-Tinyproxy header (default is YES)])],
|
|
xtinyproxy_enabled=$enableval, xtinyproxy_enabled=yes)
|
|
|
|
if test x"$xtinyproxy_enabled" = x"yes"; then
|
|
AC_DEFINE(XTINYPROXY_ENABLE)
|
|
fi
|
|
|
|
dnl Include filtering for domain/URLs
|
|
AH_TEMPLATE([FILTER_ENABLE],
|
|
[Defined if you would like filtering code included.])
|
|
AC_ARG_ENABLE(filter,
|
|
[AC_HELP_STRING([--enable-filter],
|
|
[Enable filtering of domains/URLs (default is YES)])],
|
|
filter_enabled=$enableval, filter_enabled=yes)
|
|
|
|
if test x"$filter_enabled" = x"yes"; then
|
|
ADDITIONAL_OBJECTS="$ADDITIONAL_OBJECTS filter.o"
|
|
AC_DEFINE(FILTER_ENABLE)
|
|
fi
|
|
|
|
dnl Include support for upstream proxies?
|
|
AH_TEMPLATE([UPSTREAM_SUPPORT],
|
|
[Include support for connecting to an upstream proxy.])
|
|
AC_ARG_ENABLE(upstream,
|
|
[AC_HELP_STRING([--enable-upstream],
|
|
[Enable support for upstream proxies (default is YES)])],
|
|
upstream_enabled=$enableval, upstream_enabled=yes)
|
|
if test x"$upstream_enabled" = x"yes"; then
|
|
AC_DEFINE(UPSTREAM_SUPPORT)
|
|
fi
|
|
|
|
dnl Include support for reverse proxy?
|
|
AH_TEMPLATE([REVERSE_SUPPORT],
|
|
[Include support for reverse proxy.])
|
|
AC_ARG_ENABLE(reverse,
|
|
[AC_HELP_STRING([--enable-reverse],
|
|
[Enable support for reverse proxy (default is NO)])],
|
|
reverse_enabled=$enableval, reverse_enabled=no)
|
|
if test x"$reverse_enabled" = x"yes"; then
|
|
AC_DEFINE(REVERSE_SUPPORT)
|
|
fi
|
|
|
|
dnl Include the transparent proxy support
|
|
AH_TEMPLATE([TRANSPARENT_PROXY],
|
|
[Include support for using tinyproxy as a transparent proxy.])
|
|
AC_ARG_ENABLE(transparent-proxy,
|
|
[AC_HELP_STRING([--enable-transparent-proxy],
|
|
[Enable transparent proxy support (default is NO)])],
|
|
transparent_enabled=$enableval, transparent_enabled=no)
|
|
if test x"$transparent_enabled" = x"yes"; then
|
|
AC_DEFINE(TRANSPARENT_PROXY)
|
|
fi
|
|
|
|
dnl Include support for a statically compiled tinyproxy
|
|
AC_ARG_ENABLE(static,
|
|
[AC_HELP_STRING([--enable-static],
|
|
[Statically link tinyproxy (default is NO)])],
|
|
[LDFLAGS="-static $LDFLAGS"])
|
|
|
|
|
|
dnl
|
|
dnl Checks for programs
|
|
dnl
|
|
|
|
AC_PROG_MAKE_SET
|
|
AC_PROG_CC
|
|
AC_ISC_POSIX
|
|
AC_PROG_INSTALL
|
|
AC_PROG_LN_S
|
|
AM_PROG_LEX
|
|
AC_PROG_YACC
|
|
AC_PROG_LIBTOOL
|
|
|
|
dnl If a CFLAGS variable was passed during configure, set the initial
|
|
dnl CFLAGS variable to it; otherwise, start with an empty CFLAGS
|
|
if test x"$ac_env_CFLAGS_set" = x"set" ; then
|
|
CFLAGS=$ac_env_CFLAGS_value
|
|
else
|
|
CFLAGS=""
|
|
fi
|
|
|
|
dnl Make sure YACC is actually bison
|
|
if test x"$YACC" != x"bison -y"; then
|
|
AC_MSG_WARN([You will need bison if you want to regenerate the parser.])
|
|
fi
|
|
|
|
dnl
|
|
dnl Checks for libraries
|
|
dnl
|
|
AC_CHECK_LIB(socket, socket, , [AC_CHECK_LIB(socket, htonl)])
|
|
|
|
dnl Some systems (OpenServer 5) dislike -lsocket -lnsl, so we try to
|
|
dnl avoid -lnsl checks, if we already have the functions which are
|
|
dnl usually in libnsl
|
|
|
|
unset ac_cv_func_yp_get_default_domain
|
|
AC_CHECK_FUNC(yp_get_default_domain,
|
|
tinyproxy_no_nsl_checks=yes,
|
|
tinyproxy_no_nsl_checks=no)
|
|
unset ac_cv_func_yp_get_default_domain
|
|
|
|
if test x"$tinyproxy_no_nsl_checks" != x"yes"; then
|
|
AC_CHECK_LIB(nsl, gethostname, , [AC_CHECK_LIB(nsl, gethostbyaddr)])
|
|
fi
|
|
|
|
AC_CHECK_LIB(resolv, inet_aton)
|
|
AC_CHECK_LIB(socks, main, socks_library=yes, socks_library=no)
|
|
|
|
dnl
|
|
dnl Checks for headers
|
|
dnl
|
|
AC_HEADER_STDC
|
|
AC_HEADER_TIME
|
|
AC_CHECK_HEADERS([sys/ioctl.h sys/mman.h sys/resource.h \
|
|
sys/select.h sys/socket.h sys/time.h sys/uio.h \
|
|
sys/un.h sys/wait.h arpa/inet.h netinet/in.h alloca.h \
|
|
assert.h ctype.h errno.h fcntl.h grp.h io.h libintl.h \
|
|
netdb.h pwd.h regex.h signal.h stdarg.h stddef.h stdio.h \
|
|
sysexits.h syslog.h time.h wchar.h wctype.h])
|
|
|
|
dnl OpenBSD machines don't like having malloc included (even if it's present)
|
|
dnl as they expect you to use stdlib.h
|
|
case "$target" in
|
|
*-openbsd*) ;;
|
|
*) AC_CHECK_HEADER(malloc.h);;
|
|
esac
|
|
|
|
AC_CHECK_HEADER(socks.h, socks_header=yes, socks_header=no)
|
|
|
|
|
|
dnl
|
|
dnl Checks for types
|
|
dnl
|
|
AM_C_PROTOTYPES
|
|
AC_C_CONST
|
|
AC_C_INLINE
|
|
AC_TYPE_SIZE_T
|
|
AC_TYPE_PID_T
|
|
AC_TYPE_SIGNAL
|
|
AC_UNP_CHECK_TYPE(uint8_t, unsigned char)
|
|
AC_UNP_CHECK_TYPE(int16_t, short)
|
|
AC_UNP_CHECK_TYPE(uint16_t, unsigned short)
|
|
AC_UNP_CHECK_TYPE(int32_t, int)
|
|
AC_UNP_CHECK_TYPE(uint32_t, unsigned int)
|
|
AC_UNP_CHECK_TYPE(ssize_t, int)
|
|
AC_UNP_CHECK_TYPE(socklen_t, unsigned int)
|
|
AC_UNP_CHECK_TYPE(in_addr_t, uint32_t)
|
|
|
|
|
|
dnl
|
|
dnl Checks for libary functions
|
|
dnl
|
|
AC_FUNC_ALLOCA
|
|
|
|
AC_CHECK_FUNCS([isascii memcpy setrlimit ftruncate regexec])
|
|
AC_CHECK_FUNCS([strlcpy strlcat])
|
|
|
|
dnl
|
|
dnl Compiler characteristics
|
|
dnl
|
|
|
|
dnl If profiling is enabled, then enable the debugging code
|
|
if test x"$profiling_enabled" = x"yes" ; then
|
|
AC_MSG_NOTICE([profiling is enabled, therefore enabling debugging code.])
|
|
debug_enabled=yes
|
|
fi
|
|
|
|
dnl Enable the debugging flags (by checking for the GCC compiler)
|
|
if test x"$debug_enabled" = x"yes" ; then
|
|
dnl Add the warnings if we have the GCC compiler
|
|
if test x"$GCC" = x"yes" ; then
|
|
if test x"$profiling_enabled" = x"yes" ; then
|
|
CFLAGS="-pg -fprofile-arcs $CFLAGS"
|
|
fi
|
|
CFLAGS="-Wshadow -Wcast-qual -Wcast-align -Wstrict-prototypes $CFLAGS"
|
|
CFLAGS="-Wmissing-prototypes -Wmissing-declarations $CFLAGS"
|
|
CFLAGS="-Wpointer-arith -Waggregate-return -Wnested-externs $CFLAGS"
|
|
fi
|
|
CFLAGS="-Wall -g -DYYDEBUG $CFLAGS"
|
|
YFLAGS="-v -d"
|
|
|
|
if test x"$ac_cv_prog_LEX" = x"flex" ; then
|
|
LEX_FLAGS="--warn --debug"
|
|
fi
|
|
else
|
|
dnl No debugging information, include the optimizations
|
|
CFLAGS="-O2 -DNDEBUG $CFLAGS"
|
|
YFLAGS="-d"
|
|
fi
|
|
|
|
dnl
|
|
dnl Make sure we can actually handle the "--with-*" and "--enable-*" stuff.
|
|
dnl
|
|
|
|
dnl Handle the SOCKS support
|
|
if test x"$socks_enabled" = x"yes"; then
|
|
if test x"$socks_header" = x"yes" -a x"$socks_library" = x"yes"; then
|
|
CFLAGS="-I/usr/include/sock.h -DSOCKS $CFLAGS"
|
|
LIBS="-lsocks $LIBS"
|
|
else
|
|
AC_MSG_ERROR([Could not include the SOCKS library or header])
|
|
fi
|
|
fi
|
|
|
|
dnl Handle the REGEX library
|
|
if test x"$ac_cv_func_regexec" != x"yes"; then
|
|
AC_MSG_ERROR([Could not locate the regexec() function])
|
|
else
|
|
AC_MSG_CHECKING([whether the system's regex library is broken])
|
|
AC_CACHE_VAL(tinyproxy_cv_regex_broken,
|
|
[AC_TRY_RUN([
|
|
#if HAVE_SYS_TYPES_H
|
|
# include <sys/types.h>
|
|
#endif
|
|
#if HAVE_UNISTD_H
|
|
# include <unistd.h>
|
|
#endif
|
|
#if HAVE_REGEX_H
|
|
# include <regex.h>
|
|
#endif
|
|
int main(void)
|
|
{
|
|
regex_t blah;
|
|
if (regcomp(&blah, "foo.*bar", REG_NOSUB) != 0)
|
|
exit(1);
|
|
if (regexec(&blah, "foobar", 0, NULL, 0) != 0)
|
|
exit(1);
|
|
else
|
|
exit(0);
|
|
|
|
return 0;
|
|
}
|
|
],
|
|
tinyproxy_cv_regex_broken=no,
|
|
tinyproxy_cv_regex_broken=yes,
|
|
tinyproxy_cv_regex_broken=yes)])
|
|
|
|
AC_MSG_RESULT([$tinyproxy_cv_regex_broken])
|
|
|
|
if test x"$tinyproxy_cv_regex_broken" = x"yes" ; then
|
|
AC_MSG_ERROR([Your system's regexec() function is broken.])
|
|
fi
|
|
fi
|
|
|
|
dnl
|
|
dnl Substitute the variables into the various Makefiles
|
|
dnl
|
|
AC_SUBST(CFLAGS)
|
|
AC_SUBST(LDFLAGS)
|
|
AC_SUBST(YFLAGS)
|
|
AC_SUBST(CPPFLAGS)
|
|
AC_SUBST(LEX_FLAGS)
|
|
AC_SUBST(LIBS)
|
|
AC_SUBST(ADDITIONAL_OBJECTS)
|
|
AC_SUBST(TINYPROXY_CONFIG_DIR)
|
|
AC_SUBST(TINYPROXY_CONFIG_FILE)
|
|
|
|
AC_CONFIG_FILES([Makefile src/Makefile doc/Makefile])
|
|
AC_OUTPUT
|