#! /bin/bash
# This is not an autoconf generated configure
#
INCLUDE=${1:-"$PWD/include"}

# Make a temp directory in build tree.
TMPDIR=$(mktemp -d config.XXXXXX)
trap 'status=$?; rm -rf $TMPDIR; exit $status' EXIT HUP INT QUIT TERM

check_prog()
{
    echo -n "$2"
    command -v $1 >/dev/null 2>&1 && (echo "$3:=y" >> Config; echo "yes") || (echo "no"; return 1)
}

check_docs()
{
    if check_prog latex " latex: " HAVE_LATEX; then
        check_prog pdflatex " pdflatex: " HAVE_PDFLATEX || echo " WARNING: no PDF docs can be built from LaTeX files"
        check_prog sgml2latex " sgml2latex: " HAVE_SGML2LATEX || echo " WARNING: no LaTeX files can be build from SGML files"
    else
        echo " WARNING: no docs can be built from LaTeX files"
    fi

    check_prog sgml2html " sgml2html: " HAVE_SGML2HTML || echo " WARNING: no HTML docs can be built from SGML"
}

check_toolchain()
{
    : ${PKG_CONFIG:=pkg-config}
    : ${AR=ar}
    : ${CC=gcc}
    echo "PKG_CONFIG:=${PKG_CONFIG}" >>Config
    echo "AR:=${AR}" >>Config
    echo "CC:=${CC}" >>Config
}

check_atm()
{
    cat >$TMPDIR/atmtest.c <<EOF
#include <atm.h>
int main(int argc, char **argv) {
	struct atm_qos qos;
	(void) text2qos("aal5,ubr:sdu=9180,rx:none",&qos,0);
	return 0;
}
EOF

    $CC -I$INCLUDE -o $TMPDIR/atmtest $TMPDIR/atmtest.c -latm >/dev/null 2>&1
    if [ $? -eq 0 ]
    then
	echo "TC_CONFIG_ATM:=y" >>Config
	echo yes
    else
	echo no
    fi
    rm -f $TMPDIR/atmtest.c $TMPDIR/atmtest
}

check_xtables()
{
	if ! ${PKG_CONFIG} xtables --exists
	then
		echo "TC_CONFIG_NO_XT:=y" >>Config
	fi
}

check_xt()
{
    #check if we have xtables from iptables >= 1.4.5.
    cat >$TMPDIR/ipttest.c <<EOF
#include <xtables.h>
#include <linux/netfilter.h>
static struct xtables_globals test_globals = {
	.option_offset = 0,
	.program_name = "tc-ipt",
	.program_version = XTABLES_VERSION,
	.orig_opts = NULL,
	.opts = NULL,
	.exit_err = NULL,
};

int main(int argc, char **argv)
{
	xtables_init_all(&test_globals, NFPROTO_IPV4);
	return 0;
}
EOF

    if $CC -I$INCLUDE $IPTC -o $TMPDIR/ipttest $TMPDIR/ipttest.c $IPTL \
	$(${PKG_CONFIG} xtables --cflags --libs) -ldl >/dev/null 2>&1
    then
	echo "TC_CONFIG_XT:=y" >>Config
	echo "using xtables"
    fi
    rm -f $TMPDIR/ipttest.c $TMPDIR/ipttest
}

check_xt_old()
{
    # bail if previous XT checks has already succeded.
    if grep -q TC_CONFIG_XT Config
    then
	return
    fi

    #check if we dont need our internal header ..
    cat >$TMPDIR/ipttest.c <<EOF
#include <xtables.h>
char *lib_dir;
unsigned int global_option_offset = 0;
const char *program_version = XTABLES_VERSION;
const char *program_name = "tc-ipt";
struct afinfo afinfo = {
	.libprefix      = "libxt_",
};

void exit_error(enum exittype status, const char *msg, ...)
{
}

int main(int argc, char **argv) {

	return 0;
}

EOF

    $CC -I$INCLUDE $IPTC -o $TMPDIR/ipttest $TMPDIR/ipttest.c $IPTL -ldl >/dev/null 2>&1
    if [ $? -eq 0 ]
    then
	echo "TC_CONFIG_XT_OLD:=y" >>Config
	echo "using old xtables (no need for xt-internal.h)"
    fi
    rm -f $TMPDIR/ipttest.c $TMPDIR/ipttest
}

check_xt_old_internal_h()
{
    # bail if previous XT checks has already succeded.
    if grep -q TC_CONFIG_XT Config
    then
	return
    fi

    #check if we need our own internal.h
    cat >$TMPDIR/ipttest.c <<EOF
#include <xtables.h>
#include "xt-internal.h"
char *lib_dir;
unsigned int global_option_offset = 0;
const char *program_version = XTABLES_VERSION;
const char *program_name = "tc-ipt";
struct afinfo afinfo = {
	.libprefix      = "libxt_",
};

void exit_error(enum exittype status, const char *msg, ...)
{
}

int main(int argc, char **argv) {

	return 0;
}

EOF
	$CC -I$INCLUDE $IPTC -o $TMPDIR/ipttest $TMPDIR/ipttest.c $IPTL -ldl >/dev/null 2>&1

	if [ $? -eq 0 ]
	then
	    echo "using old xtables with xt-internal.h"
	    echo "TC_CONFIG_XT_OLD_H:=y" >>Config
	fi
	rm -f $TMPDIR/ipttest.c $TMPDIR/ipttest
}

check_ipt()
{
	if ! grep TC_CONFIG_XT Config > /dev/null
	then
		echo "using iptables"
	fi
}

check_ipt_lib_dir()
{
	IPT_LIB_DIR=$(${PKG_CONFIG} --variable=xtlibdir xtables)
	if [ -n "$IPT_LIB_DIR" ]; then
		echo $IPT_LIB_DIR
		echo "IPT_LIB_DIR:=$IPT_LIB_DIR" >> Config
		return
	fi

	for dir in /lib /usr/lib /usr/local/lib
	do
		for file in $dir/{xtables,iptables}/lib*t_*so ; do
			if [ -f $file ]; then
				echo ${file%/*}
				echo "IPT_LIB_DIR:=${file%/*}" >> Config
				return
			fi
		done
	done
	echo "not found!"
}

check_setns()
{
    cat >$TMPDIR/setnstest.c <<EOF
#include <sched.h>
int main(int argc, char **argv)
{
	(void)setns(0,0);
	return 0;
}
EOF
    $CC -I$INCLUDE -o $TMPDIR/setnstest $TMPDIR/setnstest.c >/dev/null 2>&1
    if [ $? -eq 0 ]
    then
	echo "IP_CONFIG_SETNS:=y" >>Config
	echo "yes"
    else
	echo "no"
    fi
    rm -f $TMPDIR/setnstest.c $TMPDIR/setnstest
}

check_ipset()
{
    cat >$TMPDIR/ipsettest.c <<EOF
#include <linux/netfilter/ipset/ip_set.h>
#ifndef IP_SET_INVALID
#define IPSET_DIM_MAX 3
typedef unsigned short ip_set_id_t;
#endif
#include <linux/netfilter/xt_set.h>

struct xt_set_info info;
#if IPSET_PROTOCOL == 6
int main(void)
{
	return IPSET_MAXNAMELEN;
}
#else
#error unknown ipset version
#endif
EOF

    if $CC -I$INCLUDE -o $TMPDIR/ipsettest $TMPDIR/ipsettest.c >/dev/null 2>&1
    then
	echo "TC_CONFIG_IPSET:=y" >>Config
	echo "yes"
    else
	echo "no"
    fi
    rm -f $TMPDIR/ipsettest.c $TMPDIR/ipsettest
}

check_elf()
{
    cat >$TMPDIR/elftest.c <<EOF
#include <libelf.h>
#include <gelf.h>
int main(void)
{
	Elf_Scn *scn __attribute__((__unused__));
	GElf_Shdr shdr  __attribute__((__unused__));;
	return elf_version(EV_CURRENT);
}
EOF

    if $CC -I$INCLUDE -o $TMPDIR/elftest $TMPDIR/elftest.c -lelf >/dev/null 2>&1
    then
	echo "HAVE_ELF:=y" >>Config
	echo "yes"
    else
	echo "no"
    fi
    rm -f $TMPDIR/elftest.c $TMPDIR/elftest
}

check_selinux()
# SELinux is a compile time option in the ss utility
{
	if ${PKG_CONFIG} libselinux --exists
	then
		echo "HAVE_SELINUX:=y" >>Config
		echo "yes"
	else
		echo "no"
	fi
}

check_mnl()
{
	if ${PKG_CONFIG} libmnl --exists
	then
		echo "HAVE_MNL:=y" >>Config
		echo "yes"
	else
		echo "no"
	fi
}

check_berkeley_db()
{
    cat >$TMPDIR/dbtest.c <<EOF
#include <fcntl.h>
#include <stdlib.h>
#include <db_185.h>
int main(int argc, char **argv) {
	dbopen("/tmp/xxx_test_db.db", O_CREAT|O_RDWR, 0644, DB_HASH, NULL);
	return 0;
}
EOF
    $CC -I$INCLUDE -o $TMPDIR/dbtest $TMPDIR/dbtest.c -ldb >/dev/null 2>&1
    if [ $? -eq 0 ]
    then
	echo "HAVE_BERKELEY_DB:=y" >>Config
	echo "yes"
    else
	echo "no"
    fi
    rm -f $TMPDIR/dbtest.c $TMPDIR/dbtest
}

quiet_config()
{
	cat <<EOF
# user can control verbosity similar to kernel builds (e.g., V=1)
ifeq ("\$(origin V)", "command line")
  VERBOSE = \$(V)
endif
ifndef VERBOSE
  VERBOSE = 0
endif
ifeq (\$(VERBOSE),1)
  Q =
else
  Q = @
endif

ifeq (\$(VERBOSE), 0)
    QUIET_CC       = @echo '    CC       '\$@;
    QUIET_AR       = @echo '    AR       '\$@;
    QUIET_LINK     = @echo '    LINK     '\$@;
    QUIET_YACC     = @echo '    YACC     '\$@;
    QUIET_LEX      = @echo '    LEX      '\$@;
endif
EOF
}

echo "# Generated config based on" $INCLUDE >Config
quiet_config >> Config

check_toolchain

echo "TC schedulers"

echo -n " ATM	"
check_atm

check_xtables
if ! grep -q TC_CONFIG_NO_XT Config
then
	echo -n " IPT	"
	check_xt
	check_xt_old
	check_xt_old_internal_h
	check_ipt

	echo -n " IPSET  "
	check_ipset
fi

echo
if ! grep -q TC_CONFIG_NO_XT Config
then
	echo -n "iptables modules directory: "
	check_ipt_lib_dir
fi

echo -n "libc has setns: "
check_setns

echo -n "SELinux support: "
check_selinux

echo -n "ELF support: "
check_elf

echo -n "libmnl support: "
check_mnl

echo -n "Berkeley DB: "
check_berkeley_db

echo
echo -n "docs:"
check_docs
echo

echo >> Config
echo "%.o: %.c" >> Config
echo '	$(QUIET_CC)$(CC) $(CFLAGS) $(EXTRA_CFLAGS) -c -o $@ $<' >> Config
