#!/bin/sh
# Copyright (c) 2003-2009 by Silvan Calarco <silvan.calarco@mambasoft.it>
# Copyright (c) 2003-2009 by Davide Madrisan <davide.madrisan@gmail.com>

# Only meant to be called from ifup.

unset WIRELESS_OPTS WIRELESS_OPTS2

if [ "$WIRELESS_ESSID" ]; then
   tmpfile=`tempfile`
   tmpfile1=`tempfile`

   if [ "$tmpfile" ]; then
      ifconfig ${DEVICE} up
#     sleep 1
      unset vname found_essid
      # Note: iwlist scan essid option does not work with all drivers (see man iwlist)
      #       so we split cell information below
      iwlist ${DEVICE} scan essid $WIRELESS_ESSID > $tmpfile
      # Note: sometimes iwlist scan fails with "Device or resource busy", so we try again
      [ -s $tmpfile ] || {
         ifconfig ${DEVICE} down
         ifconfig ${DEVICE} up
         iwlist ${DEVICE} scan essid $WIRELESS_ESSID > $tmpfile
      }
      cat $tmpfile | \
      while read line; do
         if [ "${line:0:5}" = "Cell " ]; then
            [ "$found_essid" ] && break || > $tmpfile1
         fi
         echo $line >> $tmpfile1
         [ "$line" = "ESSID:\"$WIRELESS_ESSID\"" ] && found_essid=1
      done
      > $tmpfile
      cat $tmpfile1 | \
      while read line; do
         vname=${line/:*}
         if [ "${line:0:4}" = "Cell" ]; then
            vname="${line/* }"
            vval=${line/*Address:}
            vname="Address"
         elif [ "${line/Unknown:}" != "$line" ]; then
            continue
         else
            vname=${line/:*}
            vname=`echo ${vname} | tr ' ' _`
            vname=${vname/_(1)}
            vval=${line/*:}
         fi
         vname=WIRELESS_AUTO_${vname/* }
         vval=${vval/ }
         vval=\"${vval/GHz*}\"
         if [ "$vname" = "WIRELESS_AUTO_Mode" -o "$vname" = "WIRELESS_AUTO_Channel" -o \
              "$vname" = "WIRELESS_AUTO_Address" -o "$vname" = "WIRELESS_AUTO_Frequency" -o \
              "$vname" = "WIRELESS_AUTO_IE" -o "$vname" = "WIRELESS_AUTO_Group_Cipher" -o \
              "$vname" = "WIRELESS_AUTO_Pairwise_Ciphers" -o "$vname" = "WIRELESS_AUTO_Authentication_Suites" ]; then
            echo $vname=$vval >> $tmpfile
         fi
      done
      . $tmpfile
      rm -f $tmpfile $tmpfile1
   else
      echo "Warning: unable to create temporary file; skipping wireless autodetection"
   fi
fi

if [ "$WIRELESS_MODE" ]; then
   WIRELESS_OPTS="$WIRELESS_OPTS mode $WIRELESS_MODE"
   #elif [ "$WIRELESS_AUTO_MODE" ]; then
   #  WIRELESS_OPTS="$WIRELESS_OPTS mode $WIRELESS_AUTO_Mode"
   #else
   #WIRELESS_OPTS="$WIRELESS_OPTS mode managed"
fi
if [ ! "$WIRELESS_ENCMODE" ]; then
   WIRELESS_ENCMODE="open"
fi
if [ "$WIRELESS_ESSID" ]; then
   WIRELESS_OPTS="$WIRELESS_OPTS essid $WIRELESS_ESSID"
fi
if [ "$WIRELESS_NWID" ]; then
   WIRELESS_OPTS="$WIRELESS_OPTS nwid $WIRELESS_NWID"
fi
if [ "$WIRELESS_CHANNEL" ]; then
   WIRELESS_OPTS="$WIRELESS_OPTS channel $WIRELESS_CHANNEL"
elif [ "$WIRELESS_AUTO_Channel" ]; then
   WIRELESS_OPTS="$WIRELESS_OPTS channel $WIRELESS_AUTO_Channel"
fi
if [ "$WIRELESS_FREQUENCY" ]; then
   WIRELESS_OPTS="$WIRELESS_OPTS freq $WIRELESS_FREQUENCY"
elif [ "$WIRELESS_AUTO_Frequency" ]; then
   WIRELESS_OPTS="$WIRELESS_OPTS freq ${WIRELESS_AUTO_Frequency}G"
fi
if [ "$WIRELESS_AP" ]; then
   WIRELESS_OPTS2="$WIRELESS_OPTS2 ap $WIRELESS_AP"
elif [ "$WIRELESS_AUTO_Address" ]; then
   WIRELESS_OPTS2="$WIRELESS_OPTS2 ap $WIRELESS_AUTO_Address"
fi
if [ "$WIRELESS_FREQ" ]; then
   WIRELESS_OPTS2="$WIRELESS_OPTS2 freq $WIRELESS_FREQ"
fi
if [ "$WIRELESS_RATE" ]; then
   WIRELESS_OPTS2="$WIRELESS_OPTS2 rate $WIRELESS_RATE"
fi
# Note: WIRELESS_ENC must appear as the last option
if [ "$WIRELESS_ENC" -a "${WIRELESS_AUTO_IE:0:3}" != "WPA" ]; then
   WIRELESS_OPTS="$WIRELESS_OPTS key $WIRELESS_ENCMODE $WIRELESS_ENC"
fi

if [ "$WIRELESS_ESSID" -o "$WIRELESS_ENC" ]; then
   echo -n "Setting wireless options for ${DEVICE}: "
   ifconfig ${DEVICE} down
   iwconfig ${DEVICE} $WIRELESS_OPTS
   if [ "$WIRELESS_OPTS2" ]; then
      iwconfig ${DEVICE} $WIRELESS_OPTS2
   fi
   evaluate_retval
   echo

   if [ "${WIRELESS_AUTO_IE:0:3}" == "WPA" -a ! -e /var/run/wpa_supplicant/${DEVICE} ]; then
         echo -n "Setting WPA options for ${DEVICE}: "
         [ "$WIRELESS_AUTO_Authentication_Suites" ] || WIRELESS_AUTO_Authentication_Suites=PSK
         [ "$WIRELESS_AUTO_Pairwise_Ciphers" ] || WIRELESS_AUTO_Pairwise_Ciphers=TKIP
         [ "$WIRELESS_AUTO_Group_Cipher" ] || WIRELESS_AUTO_Group_Cipher=TKIP
         if [ "${WIRELESS_ENC:0:2}" = "s:" ]; then
            WPA_PSK=\"${WIRELESS_ENC/s:}\"
         else
            WPA_PSK=${WIRELESS_ENC}
         fi
         tmpfile1=`tempfile`
         cat >> $tmpfile1 << _EOF
ctrl_interface=/var/run/wpa_supplicant
network={
scan_ssid=0
ssid="$WIRELESS_ESSID"
proto=WPA
key_mgmt=WPA-$WIRELESS_AUTO_Authentication_Suites
pairwise=$WIRELESS_AUTO_Pairwise_Ciphers
group=$WIRELESS_AUTO_Group_Cipher
psk=$WPA_PSK
}
_EOF
         wpa_supplicant -Dwext -i${DEVICE} -c $tmpfile1 -B
         evaluate_retval
         echo
   fi
fi