#! /bin/bash

. /usr/lib/network/wireless.subr

wireless_up() {

    load_profile $1
    
    if [[ ! -d /sys/class/net/$INTERFACE/wireless ]]; then 
        err_append "Interface $INTERFACE is not a wireless interface"
        return 1
    fi

    # Was required by broadcom
    # iwlist $INTERFACE scan &> /dev/null
  
    # Required by atheros to enable device
    ifconfig $INTERFACE up 

    # Required by ipw3945 to properly re-associate
    eval "iwconfig $INTERFACE mode managed essid \"$ESSID\""

    # Kill any lingering wpa_supplicants.
    if [[ -f /var/run/wpa_supplicant_$INTERFACE.pid ]]; then
        kill $(cat /var/run/wpa_supplicant_$INTERFACE.pid)
    fi
    
    # Default SCAN to on
    [[ -z "$SCAN" ]] && SCAN="yes"

    if checkyesno $SCAN; then
        if ! find_essid $INTERFACE "$ESSID"; then
            err_append "Network unavailable"
            return 1
        fi 
    fi

    case $SECURITY in
    wep|none)
        # 'none' security uses iwconfig, like wep, so use same code, minus keysetting.
        # Use sane default if no alternative is specified
        if [[ "$SECURITY" = "wep" && "$WEP_OPTS" = "" ]]; then 
            WEP_OPTS="mode managed essid \"$ESSID\" key open $KEY"
        elif [[ "$SECURITY" = "none" && "$WEP_OPTS" = "" ]]; then
            WEP_OPTS="mode managed essid \"$ESSID\""
        fi 
        
        if ! eval iwconfig $INTERFACE $WEP_OPTS; then
            err_append "Could not set wireless configuration"
            return 1
        fi

        wep_check $INTERFACE $TIMEOUT|| return 1
        ;;    
    wpa)
        local WPA_CONF=`mktemp /tmp/wpa.XXXXXXXX`
        
        # Temporary bugfix for broken drivers... http://bbs.archlinux.org/viewtopic.php?id=36384
        if ! eval iwconfig $INTERFACE mode managed essid "\"$ESSID\""; then
            err_append "Could not set wireless configuration"
            return 1
        fi
        
        # Create a random file to store configuration, make it root only. 
        chmod 600 $WPA_CONF
        echo "ctrl_interface=/var/run/wpa_supplicant" >> $WPA_CONF
        echo "ctrl_interface_group=0" >> $WPA_CONF        
        
        # Generate configuration
        if ! wpa_passphrase "$ESSID" "$KEY" >> $WPA_CONF; then
            err_append "Configuration generation failed: `cat $WPA_CONF`"
            return 1
        fi

        # Connect!
        start_wpa $INTERFACE $WPA_CONF $WPA_OPTS || return 1
        wpa_check $INTERFACE $TIMEOUT || return 1
        ;;
    wpa-config)
        # If user hasnt defined one, use stock config.
        [[ -z "$WPA_CONF" ]] && WPA_CONF="/etc/wpa_supplicant.conf"
        start_wpa $INTERFACE $WPA_CONF $WPA_OPTS || return 1
        wpa_check $INTERFACE $TIMEOUT || return 1
        ;;        
    esac
    
    . $CONN_DIR/ethernet
    if ! ethernet_up $1; then
        wireless_down $1 YES
        return 1
    fi
}
 
wireless_down() {
    PROFILE=$1 NOETHERNETDOWN=$2
    if ! checkyesno $2; then
        . $CONN_DIR/ethernet
        ethernet_down $1
       fi
    wpa_cli terminate &> /dev/null 
    iwconfig $INTERFACE essid off key off &> /dev/null 
    #ifconfig $INTERFACE down
}

wireless_clean_scope() {
    unset INTERFACE CONNECTION
    unset TIMEOUT WPA_CONF WPA_OPTS KEY ESSID SECURITY WEP_OPTS
    . $CONN_DIR/ethernet
    ethernet_clean_scope
}


# vim: set ts=4 et sw=4:
