#!/bin/sh
#
#  uAnytun
#
#  uAnytun is a tiny implementation of SATP. Unlike Anytun which is a full
#  featured implementation uAnytun has no support for multiple connections
#  or synchronisation. It is a small single threaded implementation intended
#  to act as a client on small platforms.
#  The secure anycast tunneling protocol (satp) defines a protocol used
#  for communication between any combination of unicast and anycast
#  tunnel endpoints.  It has less protocol overhead than IPSec in Tunnel
#  mode and allows tunneling of every ETHER TYPE protocol (e.g.
#  ethernet, ip, arp ...). satp directly includes cryptography and
#  message authentication based on the methodes used by SRTP.  It is
#  intended to deliver a generic, scaleable and secure solution for
#  tunneling and relaying of packets of any protocol.
#  
#
#  Copyright (C) 2007-2010 Christian Pointner <equinox@anytun.org>
#
#  This file is part of uAnytun.
#
#  uAnytun is free software: you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation, either version 3 of the License, or
#  any later version.
#
#  uAnytun is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#
#  You should have received a copy of the GNU General Public License
#  along with uAnytun. If not, see <http://www.gnu.org/licenses/>.
#

TARGET=`uname -s`

EBUILD_COMPAT=0

CFLAGS='-g -O2'
LDFLAGS='-g -Wall -O2'

CRYPTO_LIB='gcrypt'
PASSPHRASE=1

PREFIX='/usr/local'
SBINDIR=''
ETCDIR=''
MANDIR=''
INSTALLMANPAGE=1
EXAMPLESDIR=''
INSTALLEXAMPLES=1

print_usage() {
  echo "configure --help                    print this"
  echo "          --target=<TARGET>         build target i.e. Linux (default: autodetect)"
  echo "          --prefix=<PREFIX>         the installation prefix (default: /usr/local)"
  echo "          --sbindir=<DIR>           the path to the sbin directory (default: $PREFIX/sbin)"
  echo "          --sysconfdir=<DIR>        the path to the system configuration directory (default: $PREFIX/etc"
  echo "          --mandir=<DIR>            the path to the system man pages (default: $PREFIX/share/man)"
  echo "          --no-manpage              dont't install manpage"
  echo "          --examplesdir=<DIR>       the path to the examples files (default: $PREFIX/share/examples)"
  echo "          --no-examples             dont't install example files"
  echo "          --use-ssl-crypto          use ssl crypto library instead of libgcrypt"
  echo "          --no-crypto               disable crypto at all (only NULL cipher)"
  echo "          --disable-passphrase      disable master key and salt passphrase"
  echo "          --enable-passphrase       enable master key and salt passphrase"
}

for arg
do
  case $arg in
  --target=*)
    TARGET=${arg#--target=}
  ;;
  --prefix=*)
    PREFIX=${arg#--prefix=}
  ;;
  --sbindir=*)
    SBINDIR=${arg#--sbindir=}
  ;;
  --sysconfdir=*)
    ETCDIR=${arg#--sysconfdir=}
  ;;
  --mandir=*)
    MANDIR=${arg#--mandir=}
  ;;
  --no-manpage)
    INSTALLMANPAGE=0
  ;;
  --examplesdir=*)
    EXAMPLESDIR=${arg#--examplesdir=}
  ;;
  --no-examples)
    INSTALLEXAMPLES=0
  ;;
  --use-ssl-crypto)
    CRYPTO_LIB='ssl'
  ;;
  --no-crypto)
    CRYPTO_LIB='none'
  ;; 
  --disable-passphrase)
    PASSPHRASE=0
  ;;
  --enable-passphrase)
    PASSPHRASE=1
  ;;
  --ebuild-compat)
    EBUILD_COMPAT=1
  ;;
  --help)
    print_usage
    exit 0
  ;;
  *)
    ERRORS="$ERRORS $arg"
  ;;
  esac
done

if [ -n "$ERRORS" ] && [ $EBUILD_COMPAT -ne 1 ]; then
  for error in $ERRORS; do
    echo "Unknown argument: $error"
  done

  print_usage
  exit 1
fi

rm -f version.h
rm -f include.mk
case $TARGET in 
  Linux)
    rm -f tun.c
    ln -sf linux/tun.c
    echo "loading Linux specific TUN Device"
  ;;
  OpenBSD|FreeBSD|NetBSD|GNU/kFreeBSD)
    rm -f tun.c
    ln -sf bsd/tun.c
    echo "loading BSD specific TUN Device"
    CFLAGS=$CFLAGS' -I/usr/local/include'
    LDFLAGS=$LDFLAGS' -L/usr/local/lib'
  ;;
  *)
    echo "platform not supported"
    exit 1;
  ;;
esac


case $CRYPTO_LIB in
  gcrypt)
    LDFLAGS=$LDFLAGS' -lgcrypt'
    echo "using libgcrypt library"
  ;;
  ssl)
    CFLAGS=$CFLAGS' -DUSE_SSL_CRYPTO'
    LDFLAGS=$LDFLAGS' -lcrypto'
    echo "using ssl crypto library"
  ;;
  none)
    CFLAGS=$CFLAGS' -DNO_CRYPT'
    echo "NO_CRYPT_OBJ = 1" >> include.mk
    echo "disabling crypto"
  ;;
esac

if [ $PASSPHRASE -eq 0 ]; then
  CFLAGS=$CFLAGS' -DNO_PASSPHRASE'
  echo "disabling master key and salt passphrase"
fi

if [ -z "$SBINDIR" ]; then
  SBINDIR=$PREFIX/sbin
fi

if [ -z "$ETCDIR" ]; then
  ETCDIR=$PREFIX/etc
fi

if [ -z "$MANDIR" ]; then
  MANDIR=$PREFIX/share/man
fi

if [ -z "$EXAMPLESDIR" ]; then
  EXAMPLESDIR=$PREFIX/share/examples
fi

cat >> include.mk <<EOF
# this file was created automatically
# do not edit this file directly 
# use ./configure instead

TARGET := $TARGET
CC := gcc
CFLAGS := $CFLAGS
LDFLAGS := $LDFLAGS
STRIP := strip
INSTALL := install

PREFIX := $PREFIX
SBINDIR := $SBINDIR
ETCDIR := $ETCDIR
EOF

if [ $INSTALLMANPAGE -eq 1 ]; then
  echo "MANDIR := $MANDIR" >> include.mk
  echo "installing manpage"
else
  echo "not installing manpage"
fi

if [ $INSTALLEXAMPLES -eq 1 ]; then
  echo "EXAMPLESDIR := $EXAMPLESDIR" >> include.mk
  echo "installing example files"
else
  echo "not installing example files"
fi

VERSION=`cat ../version`
if which svn >/dev/null; then
  SVN_REV=`svn info | grep "^Revision: " | awk '{print($2)}'`
  if [ -n "$SVN_REV" ]; then
    VERSION="$VERSION (svn$SVN_REV)"
  fi
fi
HOSTNAME=`hostname`
DATE=`date +"%d.%m.%Y %H:%M:%S %Z"`

cat >> version.h <<EOF
/* 
 * uanytun version info
 *
 * this file was created automatically
 * do not edit this file directly
 * use ./configure instead
 */

#ifndef UANYTUN_version_h_INCLUDED
#define UANYTUN_version_h_INCLUDED

#define VERSION_STRING_0 "uanytun version $VERSION"
#define VERSION_STRING_1 "built on $HOSTNAME, $DATE"

#endif

EOF

exit 0
