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