1#! /bin/bash
2# This is not an autoconf generated configure
3#
4INCLUDE=${1:-"$PWD/include"}
5
6# Make a temp directory in build tree.
7TMPDIR=$(mktemp -d config.XXXXXX)
8trap 'status=$?; rm -rf $TMPDIR; exit $status' EXIT HUP INT QUIT TERM
9
10check_prog()
11{
12    echo -n "$2"
13    command -v $1 >/dev/null 2>&1 && (echo "$3:=y" >> Config; echo "yes") || (echo "no"; return 1)
14}
15
16check_docs()
17{
18    if check_prog latex " latex: " HAVE_LATEX; then
19        check_prog pdflatex " pdflatex: " HAVE_PDFLATEX || echo " WARNING: no PDF docs can be built from LaTeX files"
20        check_prog sgml2latex " sgml2latex: " HAVE_SGML2LATEX || echo " WARNING: no LaTeX files can be build from SGML files"
21    else
22        echo " WARNING: no docs can be built from LaTeX files"
23    fi
24
25    check_prog sgml2html " sgml2html: " HAVE_SGML2HTML || echo " WARNING: no HTML docs can be built from SGML"
26}
27
28check_toolchain()
29{
30    : ${PKG_CONFIG:=pkg-config}
31    : ${AR=ar}
32    : ${CC=gcc}
33    echo "PKG_CONFIG:=${PKG_CONFIG}" >>Config
34    echo "AR:=${AR}" >>Config
35    echo "CC:=${CC}" >>Config
36}
37
38check_atm()
39{
40    cat >$TMPDIR/atmtest.c <<EOF
41#include <atm.h>
42int main(int argc, char **argv) {
43	struct atm_qos qos;
44	(void) text2qos("aal5,ubr:sdu=9180,rx:none",&qos,0);
45	return 0;
46}
47EOF
48
49    $CC -I$INCLUDE -o $TMPDIR/atmtest $TMPDIR/atmtest.c -latm >/dev/null 2>&1
50    if [ $? -eq 0 ]
51    then
52	echo "TC_CONFIG_ATM:=y" >>Config
53	echo yes
54    else
55	echo no
56    fi
57    rm -f $TMPDIR/atmtest.c $TMPDIR/atmtest
58}
59
60check_xt()
61{
62    #check if we have xtables from iptables >= 1.4.5.
63    cat >$TMPDIR/ipttest.c <<EOF
64#include <xtables.h>
65#include <linux/netfilter.h>
66static struct xtables_globals test_globals = {
67	.option_offset = 0,
68	.program_name = "tc-ipt",
69	.program_version = XTABLES_VERSION,
70	.orig_opts = NULL,
71	.opts = NULL,
72	.exit_err = NULL,
73};
74
75int main(int argc, char **argv)
76{
77	xtables_init_all(&test_globals, NFPROTO_IPV4);
78	return 0;
79}
80EOF
81
82    if $CC -I$INCLUDE $IPTC -o $TMPDIR/ipttest $TMPDIR/ipttest.c $IPTL \
83	$(${PKG_CONFIG} xtables --cflags --libs) -ldl >/dev/null 2>&1
84    then
85	echo "TC_CONFIG_XT:=y" >>Config
86	echo "using xtables"
87    fi
88    rm -f $TMPDIR/ipttest.c $TMPDIR/ipttest
89}
90
91check_xt_old()
92{
93    # bail if previous XT checks has already succeded.
94    if grep -q TC_CONFIG_XT Config
95    then
96	return
97    fi
98
99    #check if we dont need our internal header ..
100    cat >$TMPDIR/ipttest.c <<EOF
101#include <xtables.h>
102char *lib_dir;
103unsigned int global_option_offset = 0;
104const char *program_version = XTABLES_VERSION;
105const char *program_name = "tc-ipt";
106struct afinfo afinfo = {
107	.libprefix      = "libxt_",
108};
109
110void exit_error(enum exittype status, const char *msg, ...)
111{
112}
113
114int main(int argc, char **argv) {
115
116	return 0;
117}
118
119EOF
120
121    $CC -I$INCLUDE $IPTC -o $TMPDIR/ipttest $TMPDIR/ipttest.c $IPTL -ldl >/dev/null 2>&1
122    if [ $? -eq 0 ]
123    then
124	echo "TC_CONFIG_XT_OLD:=y" >>Config
125	echo "using old xtables (no need for xt-internal.h)"
126    fi
127    rm -f $TMPDIR/ipttest.c $TMPDIR/ipttest
128}
129
130check_xt_old_internal_h()
131{
132    # bail if previous XT checks has already succeded.
133    if grep -q TC_CONFIG_XT Config
134    then
135	return
136    fi
137
138    #check if we need our own internal.h
139    cat >$TMPDIR/ipttest.c <<EOF
140#include <xtables.h>
141#include "xt-internal.h"
142char *lib_dir;
143unsigned int global_option_offset = 0;
144const char *program_version = XTABLES_VERSION;
145const char *program_name = "tc-ipt";
146struct afinfo afinfo = {
147	.libprefix      = "libxt_",
148};
149
150void exit_error(enum exittype status, const char *msg, ...)
151{
152}
153
154int main(int argc, char **argv) {
155
156	return 0;
157}
158
159EOF
160	$CC -I$INCLUDE $IPTC -o $TMPDIR/ipttest $TMPDIR/ipttest.c $IPTL -ldl >/dev/null 2>&1
161
162	if [ $? -eq 0 ]
163	then
164	    echo "using old xtables with xt-internal.h"
165	    echo "TC_CONFIG_XT_OLD_H:=y" >>Config
166	fi
167	rm -f $TMPDIR/ipttest.c $TMPDIR/ipttest
168}
169
170check_ipt()
171{
172	if ! grep TC_CONFIG_XT Config > /dev/null
173	then
174		echo "using iptables"
175	fi
176}
177
178check_ipt_lib_dir()
179{
180	IPT_LIB_DIR=$(${PKG_CONFIG} --variable=xtlibdir xtables)
181	if [ -n "$IPT_LIB_DIR" ]; then
182		echo $IPT_LIB_DIR
183		echo "IPT_LIB_DIR:=$IPT_LIB_DIR" >> Config
184		return
185	fi
186
187	for dir in /lib /usr/lib /usr/local/lib
188	do
189		for file in $dir/{xtables,iptables}/lib*t_*so ; do
190			if [ -f $file ]; then
191				echo ${file%/*}
192				echo "IPT_LIB_DIR:=${file%/*}" >> Config
193				return
194			fi
195		done
196	done
197	echo "not found!"
198}
199
200check_setns()
201{
202    cat >$TMPDIR/setnstest.c <<EOF
203#include <sched.h>
204int main(int argc, char **argv)
205{
206	(void)setns(0,0);
207	return 0;
208}
209EOF
210    $CC -I$INCLUDE -o $TMPDIR/setnstest $TMPDIR/setnstest.c >/dev/null 2>&1
211    if [ $? -eq 0 ]
212    then
213	echo "IP_CONFIG_SETNS:=y" >>Config
214	echo "yes"
215    else
216	echo "no"
217    fi
218    rm -f $TMPDIR/setnstest.c $TMPDIR/setnstest
219}
220
221check_ipset()
222{
223    cat >$TMPDIR/ipsettest.c <<EOF
224#include <linux/netfilter/ipset/ip_set.h>
225#ifndef IP_SET_INVALID
226#define IPSET_DIM_MAX 3
227typedef unsigned short ip_set_id_t;
228#endif
229#include <linux/netfilter/xt_set.h>
230
231struct xt_set_info info;
232#if IPSET_PROTOCOL == 6
233int main(void)
234{
235	return IPSET_MAXNAMELEN;
236}
237#else
238#error unknown ipset version
239#endif
240EOF
241
242    if $CC -I$INCLUDE -o $TMPDIR/ipsettest $TMPDIR/ipsettest.c >/dev/null 2>&1
243    then
244	echo "TC_CONFIG_IPSET:=y" >>Config
245	echo "yes"
246    else
247	echo "no"
248    fi
249    rm -f $TMPDIR/ipsettest.c $TMPDIR/ipsettest
250}
251
252check_elf()
253{
254    cat >$TMPDIR/elftest.c <<EOF
255#include <libelf.h>
256#include <gelf.h>
257int main(void)
258{
259	Elf_Scn *scn;
260	GElf_Shdr shdr;
261	return elf_version(EV_CURRENT);
262}
263EOF
264
265    if $CC -I$INCLUDE -o $TMPDIR/elftest $TMPDIR/elftest.c -lelf >/dev/null 2>&1
266    then
267	echo "TC_CONFIG_ELF:=y" >>Config
268	echo "yes"
269    else
270	echo "no"
271    fi
272    rm -f $TMPDIR/elftest.c $TMPDIR/elftest
273}
274
275check_selinux()
276# SELinux is a compile time option in the ss utility
277{
278	if ${PKG_CONFIG} libselinux --exists
279	then
280		echo "HAVE_SELINUX:=y" >>Config
281		echo "yes"
282	else
283		echo "no"
284	fi
285}
286
287check_mnl()
288{
289	if ${PKG_CONFIG} libmnl --exists
290	then
291		echo "HAVE_MNL:=y" >>Config
292		echo "yes"
293	else
294		echo "no"
295	fi
296}
297
298check_berkeley_db()
299{
300    cat >$TMPDIR/dbtest.c <<EOF
301#include <fcntl.h>
302#include <stdlib.h>
303#include <db_185.h>
304int main(int argc, char **argv) {
305	dbopen("/tmp/xxx_test_db.db", O_CREAT|O_RDWR, 0644, DB_HASH, NULL);
306	return 0;
307}
308EOF
309    $CC -I$INCLUDE -o $TMPDIR/dbtest $TMPDIR/dbtest.c -ldb >/dev/null 2>&1
310    if [ $? -eq 0 ]
311    then
312	echo "HAVE_BERKELEY_DB:=y" >>Config
313	echo "yes"
314    else
315	echo "no"
316    fi
317    rm -f $TMPDIR/dbtest.c $TMPDIR/dbtest
318}
319
320echo "# Generated config based on" $INCLUDE >Config
321check_toolchain
322
323echo "TC schedulers"
324
325echo -n " ATM	"
326check_atm
327
328echo -n " IPT	"
329check_xt
330check_xt_old
331check_xt_old_internal_h
332check_ipt
333
334echo -n " IPSET  "
335check_ipset
336
337echo
338echo -n "iptables modules directory: "
339check_ipt_lib_dir
340
341echo -n "libc has setns: "
342check_setns
343
344echo -n "SELinux support: "
345check_selinux
346
347echo -n "ELF support: "
348check_elf
349
350echo -n "libmnl support: "
351check_mnl
352
353echo -n "Berkeley DB: "
354check_berkeley_db
355
356echo
357echo -n "docs:"
358check_docs
359echo
360