#!/bin/sh
# $Id: wpa_supplicant.SlackBuild,v 1.9 2006/09/20 22:15:23 root Exp root $
# Copyright (c) 2006 Eric Hameleers <alien@slackware.com>
# Distributed under the terms of the GNU General Public License, Version 2
# ------------------------------------------------------------------------------
#
# Slackware SlackBuild script 
# ===========================
# By:        Eric Hameleers <alien@slackware.com>
# For:       wpa_supplicant
# URL:       http://hostap.epitest.fi/wpa_supplicant/
# Descr:     WPA/WPA2/IEEE 802.1X Supplicant
# Requires:  Source code for supported wireless card drivers
#            openssl >= 0.9.7
# Changelog:
# 20040923CVS-1: * 23/sep/2004 by Eric Hameleers
#                First release.
# 0.3.8-1:       * 09/apr/2005 by Eric Hameleers
#                Update
# 0.3.8-2:       * 09/apr/2005 by Eric Hameleers
#                Enabled support for ndiswrapper.
#                Parametrized the location for the madwifi driver sources.
# 20050415-1:    * 15/apr/2005 by Eric Hameleers
#                Switched from 'stable' to 'development'.
#                The development branch has support for the 'any' ESSID, needed
#                to connect to 'any open' WiFi network (think: hotel/airport).
# 20050806-1:    * 06/aug/2005 by Eric Hameleers
#                This snapshot uses a madwifi-20050707 snapshot.
#                Make snapshot version visible in the program output.
# 20050809-1:    * 09/aug/2005 by Eric Hameleers
#                New snapshot, uses a madwifi-20050809 snapshot for testing
#                reportedly, tha last madwifi CVS snapshot to work with new
#                wpa_supplicant snapshots is 20050707.
# 20050913-1:    * 13/sep/2005 by Eric Hameleers
#                New snapshot from hostap cvs. Also, make the docs.
# 20051005-1:    * 05/oct/2005 by Eric Hameleers
#                New snapshot from hostap cvs, to test against today's madwifi
#                snapshot.
# 20051007-1:    * 07/oct/2005 by Eric Hameleers
#                New snapshot from hostap cvs, to test against today's madwifi.
#                This time, also incorporate a patch found here:
#                http://hostap.epitest.fi/bugz/show_bug.cgi?id=63 , which should
#                make madwifi/WPA work again.
# 20051008-1:    * 08/oct/2005 by Eric Hameleers
#                Looks like the patch made it into CVS! We can remove out patch.
# 20051014-1:    * 14/oct/2005 by Eric Hameleers
#                Update.
# 0.4.7-1:       * 31/jan/2006 by Eric Hameleers <alien@slackware.com>
#                Try a "stable" version for the madwifi-ng (Atheros driver) code
#                Also, get rid of the developer docs.
# 0.4.8-1:       * 17/feb/2006 by Eric Hameleers <alien@slackware.com>
#                Upgrade. This SlackBuild will now by default delete the
#                remainders of a previous compile in /tmp/tmp-$PRGNAM/.
# 0.4.9-1:       * 31/may/2006 by Eric Hameleers <alien@slackware.com>
#                Upgrade. This time, build the wpa_gui and man pages too.
#                Also, made support for madwifi/hermes/broadcom drivers
#                configurable using three *_INCLUDES variables.
# 0.4.9-2:       * 20/sep/2006 by Eric Hameleers <alien@slackware.com>
#                Changed the SlackBuild for Slackware 11.0 compatibility
# 0.4.9-1:       * 2006-09-29 by Patrick Volkerding <volkerdi@slackware.com>
#                Chopped out a bunch of logging in $CWD, which could be
#                a CD or DVD that can't be written to.  Wished this looked
#                like a traditional SlackBuild so that I could understand
#                it better, but beggars can't be choosers (as the saying
#                goes...)
#                Things like downloading sources, logging progress (use
#                'script' for "bob's" sake!), and other fluff doesn't
#                belong in a SlackBuild.  Just my MHO as the one who
#                interprets the SlackBuild specifications.  Take it or
#                leave it...
#                Backed the $BUILD up to -1, since this is the first
#                appearance of this package in Slackware.
#                Make the conf file only rw to root.  I figured since this
#                contains a secret key that it might be a good idea.
#
# ------------------------------------------------------------------------------
# 
# Run 'sh SlackBuild --cleanup' to build a Slackware package.
# The package (.tgz) plus descriptive .txt file and a .md5 file with
# the md5sum are created in /tmp .
# Install the package using 'installpkg <packagename>'. 
#
# ------------------------------------------------------------------------------


# --- INIT ---
# Set initial variables:

SNAPSHOT=""   # set to "yes" if you're building from CVS
SRCNAM=hostap
PRGNAM=wpa_supplicant
VERSION=${VERSION:-0.4.9}
ARCH=${ARCH:-i486}
BUILD=1

DOC="ChangeLog COPYING README* examples \
     wpa_supplicant.conf.sample"

# Support for some of the wireless drivers needs the header files of those
# drivers.
# Change these *_INCLUDES variables to where _your_ driver include directory
# is located. If any of these directories is found, support for the driver
# will be added to wpa_supplicant.
# My madwifi package for Slackware installs the headers here:
MADWIFI_INCLUDES="/usr/include/madwifi"
HERMES_INCLUDES=""
BROADCOM_INCLUDES=""

if [ -z $SNAPSHOT ]; then   # build a stable release
  SOURCE="${PRGNAM}-${VERSION}.tar.gz"
  SRCURL="http://hostap.epitest.fi/releases/${PRGNAM}-${VERSION}.tar.gz"
fi

# Where do we look for sources?
CWD=`pwd`
SRCDIR=`dirname $0`
[ "${SRCDIR:0:1}" == "." ] && SRCDIR=${CWD}/${SRCDIR}

# Place to build (TMP) package (PKG) and output (OUTPUT) the program:
TMP=${TMP:-/tmp/build}
PKG=$TMP/package-$PRGNAM
OUTPUT=${OUTPUT:-/tmp}

# Exit the script on errors:
set -e
trap 'echo "$0 FAILED!"' ERR
# Catch unitialized variables:
set -u
P1=${1:-1}

##
## --- with a little luck, you won't have to edit below this point --- ##
##

# Slackware 11 and up need other option (gcc > 3.3.x)
if [ `gcc -dumpversion | tr -d  '.' |cut -c 1-2` -gt 33 ]; then
  MOPT=tune
else
  MOPT=cpu
fi

case "$ARCH" in
  i386)      SLKCFLAGS="-O2 -march=i386 -m${MOPT}=i686"
             SLKLDFLAGS=""; LIBDIRSUFFIX=""
             ;;
  i486)      SLKCFLAGS="-O2 -march=i486 -m${MOPT}=i686"
             SLKLDFLAGS=""; LIBDIRSUFFIX=""
             ;;
  s390)      SLKCFLAGS="-O2"
             SLKLDFLAGS=""; LIBDIRSUFFIX=""
             ;;
  powerpc)   SLKCFLAGS="-O2"
             SLKLDFLAGS=""; LIBDIRSUFFIX=""
             ;;
  x86_64)    SLKCFLAGS="-O2 -fPIC"
             SLKLDFLAGS="-L/usr/lib64"; LIBDIRSUFFIX="64"
             ;;
  athlon-xp) SLKCFLAGS="-march=athlon-xp -O3 -pipe -fomit-frame-pointer"
             SLKLDFLAGS=""; LIBDIRSUFFIX=""
             ;;
esac

if [ ! -d $TMP/tmp-$PRGNAM ]; then
  mkdir -p $TMP/tmp-$PRGNAM # location to build the source
elif [ "$P1" != "--oldbuild" ]; then
  # If the "--oldbuild" parameter is present, we keep
  #  the old build files and continue;
  # By default we remove the remnants of previous build and continue:
  rm -rf $TMP/tmp-$PRGNAM/*
fi

if [ "$PKG" = "" -o "$PKG" = "/" ] ; then
  echo "Please provide a sane value for the variable 'PKG'."
  exit 1
elif [ ! -d $PKG ]; then
  mkdir -p $PKG  # place for the package to be built
else
  rm -rf $PKG/*  # We always erase old package's contents:
fi

if [ ! -d $OUTPUT ]; then
  mkdir -p $OUTPUT  # place for the package to be saved
fi


# --- SOURCE FILE AVAILABILITY ---

if [ -z $SNAPSHOT ]; then   # download stable release
  if ! [ -f ${SRCDIR}/${SOURCE} ]; then
    if ! [ "x${SRCURL}" == "x" ]; then
      echo "Source '${SOURCE}' not available yet... will download now:"
      wget -O "${SRCDIR}/${SOURCE}" "${SRCURL}" || true
      if [ $? -ne 0 ]; then
        echo "Downloading '${SOURCE}' failed... aborting the build."
        mv -f "${SRCDIR}/${SOURCE}" "${SRCDIR}/${SOURCE}".FAIL
        exit 1
      fi
    else
      echo "File '${SOURCE}' not available... aborting the build."
      exit 1
    fi
  fi
fi
if [ "$P1" == "--download" ]; then
  echo "Download complete."
  exit 0
fi


# --- PACKAGE BUILDING ---

echo "++"
echo "|| $PRGNAM-$VERSION"
echo "++"

# Explode the package framework:
if [ -e $SRCDIR/_$PRGNAM.tar.gz ]; then
  (cd $PKG &&
  explodepkg $SRCDIR/_$PRGNAM.tar.gz )
fi

cd $TMP/tmp-$PRGNAM

#
# Extract the source archive, patch and modify
#

if ! [ -f $SRCDIR/${PRGNAM}-${VERSION}.defconfig ]; then
  echo "Could not find ${PRGNAM}-${VERSION}.defconfig!"
  echo "You need to create that file using ${SRCNAM}-${VERSION}/${PRGNAM}/defconfig as example."
  exit 1
fi

if [ -z "$SNAPSHOT" ]; then
  tar -xzvf $SRCDIR/${PRGNAM}-${VERSION}.tar.gz
  cd ${PRGNAM}-${VERSION}
else
  tar -xzvf $SRCDIR/${SRCNAM}-${VERSION}.tar.gz
  cd ${SRCNAM}-${VERSION}/${PRGNAM}
  sed -i -e \
    "s/^#define VERSION_STR \"\(.*\)\"/#define VERSION_STR \"\1_$VERSION\"/" \
    version.h
fi

# Create the configuration file for wpa_supplicant:
cat $SRCDIR/${PRGNAM}-${VERSION}.defconfig > .config
if [ ! -z $MADWIFI_INCLUDES -a -d $MADWIFI_INCLUDES ]; then
  echo "Adding madwifi driver (Atheros) support"
  cat <<-EOT >> .config
	CONFIG_DRIVER_MADWIFI=y
	CFLAGS += -I${MADWIFI_INCLUDES}
	EOT
fi
if [ ! -z $HERMES_INCLUDES -a -d $HERMES_INCLUDES ]; then
  echo "Adding hermes driver (Agere) support"
  cat <<-EOT >> .config
	CONFIG_DRIVER_HERMES=y
	CFLAGS += -I${HERMES_INCLUDES}
	EOT
fi
if [ ! -z $BROADCOM_INCLUDES -a -d $BROADCOM_INCLUDES ]; then
  echo "Adding broadcom driver support"
  cat <<-EOT >> .config
	CONFIG_DRIVER_BROADCOM=y
	CFLAGS += -I${BROADCOM_INCLUDES}
	EOT
fi

chown -R root:root .

make || exit 1
# Build the GUI client
make wpa_gui || exit 1
# Make man pages if needed
(
  cd doc/docbook
  if ! ls *.? >/dev/null 2>&1 ; then
    make man || exit 1
  fi
)

# Do not build the developer docs
#PATH=".:$PATH" make docs 2>&1 || exit 1

# This goes in the doc directory later on:
cp wpa_supplicant.conf wpa_supplicant.conf.sample

# Install binaries
mkdir -p $PKG/usr/sbin $PKG/usr/X11R6/bin
cp wpa_supplicant wpa_passphrase wpa_cli $PKG/usr/sbin/
cp wpa_gui/wpa_gui $PKG/usr/X11R6/bin/

# Install man pages
for m in 5 8; do
  mkdir -p $PKG/usr/man/man${m}
  cp doc/docbook/*.${m} $PKG/usr/man/man${m}/
done

# Install configuration file
mkdir -p $PKG/etc
cat <<-_EOT_ > $PKG/etc/wpa_supplicant.conf.new
	# See /usr/doc/${PRGNAM}-${VERSION}/wpa_supplicant.conf.sample
	# for many more options that you can use in this file.
	
	# This line enables the use of wpa_cli which is used by rc.wireless
	# if possible (to check for successful association)
	ctrl_interface=/var/run/wpa_supplicant
	# By default, only root (group 0) may use wpa_cli
	ctrl_interface_group=0
	eapol_version=1
	ap_scan=1
	fast_reauth=1
	
	# WPA protected network, supply your own ESSID and WPAPSK here:
	network={
	  scan_ssid=0
	  ssid="your_essid_here"
	  proto=WPA
	  key_mgmt=WPA-PSK
	  pairwise=CCMP TKIP
	  group=CCMP TKIP WEP104 WEP40
	  psk=your_psk_here
	}
	
	# Plaintext connection (no WPA, no IEEE 802.1X),
	# nice for hotel/airport types of WiFi network.
	# You'll need a recent version of wireless-tools for this!
	network={
	  ssid="any"
	  key_mgmt=NONE
	  priority=2	
	}
	_EOT_

# This should only be read/write by root:
chmod 600 $PKG/etc/wpa_supplicant.conf.new

# Strip binaries and libs, fix ownership:
chown -R root:root $PKG
chmod -R o-w $PKG

( cd $PKG
  find . | xargs file | grep "executable" | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null
  find . | xargs file | grep "shared object" | grep ELF | cut -f 1 -d : | xargs
strip --strip-unneeded 2> /dev/null
)


# --- 'doinst.sh' script: ------

mkdir -p $PKG/install 2>/dev/null || true
cat <<EOINS > $PKG/install/doinst.sh
# Handle the incoming configuration files:
config() {
  for infile in \$1; do
    NEW="\$infile"
    OLD="\`dirname \$NEW\`/\`basename \$NEW .new\`"
    # If there's no config file by that name, mv it over:
    if [ ! -r \$OLD ]; then
      mv \$NEW \$OLD
    elif [ "\`cat \$OLD | md5sum\`" = "\`cat \$NEW | md5sum\`" ]; then
      # toss the redundant copy
      rm \$NEW
    fi
    # Otherwise, we leave the .new copy for the admin to consider...
  done
}
config etc/wpa_supplicant.conf.new

EOINS

# --- DOCUMENTATION ---
# Copy the documentation:
mkdir -p $PKG/usr/doc/${PRGNAM}-${VERSION}
cp -a $DOC $PKG/usr/doc/${PRGNAM}-${VERSION}/ || true
cp -a $SRCDIR/README.slackware $PKG/usr/doc/${PRGNAM}-${VERSION}/ || true
chmod -R a-w $PKG/usr/doc/${PRGNAM}-${VERSION}/*

# Compress the man page(s)
[ -d $PKG/usr/man ] && \
  find $PKG/usr/man -type f -name "*.?" -exec gzip -9f {} \;


# --- PACKAGE DESCRIPTION ---
mkdir -p $PKG/install 2>/dev/null || true
cat $SRCDIR/slack-desc > $PKG/install/slack-desc


# --- PACKAGE CREATION ---
# Build the package and compute its md5 checksum:
cd $PKG
makepkg --linkadd y --chown n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD.tgz

#cat $PKG/install/slack-desc | grep "^${PRGNAM}" > $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD.txt
#(cd $OUTPUT && md5sum $PRGNAM-$VERSION-$ARCH-$BUILD.tgz > $PRGNAM-$VERSION-$ARCH-$BUILD.tgz.md5)


# --- CLEANUP ---
# Clean up the extra stuff:
if [ "$P1" = "--cleanup" ]; then
  rm -rf $TMP/tmp-$PRGNAM
  rm -rf $PKG
fi