summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'net-scripts/net.modules.d/wpa_supplicant')
-rw-r--r--net-scripts/net.modules.d/wpa_supplicant123
1 files changed, 71 insertions, 52 deletions
diff --git a/net-scripts/net.modules.d/wpa_supplicant b/net-scripts/net.modules.d/wpa_supplicant
index acedeab..c03774d 100644
--- a/net-scripts/net.modules.d/wpa_supplicant
+++ b/net-scripts/net.modules.d/wpa_supplicant
@@ -25,7 +25,7 @@ wpa_supplicant_provides() {
#
# Sets up the dependancies for the module
wpa_supplicant_depend() {
- after macnet
+ after macnet plug
before interface
}
@@ -38,13 +38,6 @@ wpa_supplicant_check_installed() {
installed="1"
${report} && eerror "For WPA support (wpa_supplicant) support, emerge net-wireless/wpa_supplicant"
fi
- if [[ ! -e /proc/net/wireless ]]; then
- installed="1"
- if ${report} ; then
- eerror "wpa_supplicant requires wireless support"
- eerror "(CONFIG_NET_WIRELESS=y) enabled in the kernel"
- fi
- fi
if [[ ! -e /proc/net/packet ]]; then
installed="1"
if ${report} ; then
@@ -109,14 +102,13 @@ wpa_supplicant_get_ap_mac_address() {
# Returns 0 if we're associated correctly or 1 if not
# Note that just because we are associated does not mean we are using the
# correct encryption keys
-# We only need this for wpa_supplicant-0.3.x
wpa_supplicant_associated() {
local -a status=( "$( wpa_cli -i"$1" status | sed -n -e 's/^\(key_mgmt\|wpa_state\|EAP state\)=\([^=]\+\).*/\U\2/p' )" )
case "${status[0]}" in
- "NONE") [[ ${status[1]} == "ASSOCIATED" ]] ;;
+ "NONE") [[ ${status[1]} == "ASSOCIATED" ]] ;;
"IEEE 802.1X (no WPA)") [[ ${status[2]} == "SUCCESS" ]] ;;
- *) [[ ${status[1]} == "COMPLETED" ]] ;;
+ *) [[ ${status[1]} == "COMPLETED" ]] ;;
esac
return $?
@@ -134,8 +126,7 @@ wpa_supplicant_kill() {
pidfile="/var/run/wpa_cli-${iface}.pid"
if ! clean_pidfile "${pidfile}" ; then
${report} && ebegin "Stopping wpa_cli on ${iface}"
- start-stop-daemon --stop --exec /bin/wpa_cli \
- --pidfile "${pidfile}"
+ start-stop-daemon --stop --exec /bin/wpa_cli --pidfile "${pidfile}"
${report} && eend "$?"
fi
@@ -144,7 +135,7 @@ wpa_supplicant_kill() {
if ! clean_pidfile "${pidfile}" ; then
${report} && ebegin "Stopping wpa_supplicant on ${iface}"
start-stop-daemon --stop --exec /sbin/wpa_supplicant \
- --pidfile "${pidfile}"
+ --pidfile "${pidfile}"
${report} && eend "$?"
else
# Support wpa_supplicant-0.3.x
@@ -158,7 +149,7 @@ wpa_supplicant_kill() {
# If wpa_supplicant exits uncleanly, we need to remove the stale dir
[[ -S "/var/run/wpa_supplicant/${iface}" ]] \
- && rm -f "/var/run/wpa_supplicant/${iface}"
+ && rm -f "/var/run/wpa_supplicant/${iface}"
}
# bool wpa_supplicant_associate(char *interface)
@@ -215,29 +206,40 @@ wpa_supplicant_associate() {
# Start wpa_supplicant on an interface and wait for association
# Returns 0 (true) when successful, non-zero otherwise
wpa_supplicant_pre_start() {
- local iface="$1" opts timeout action=false
- local cfgfile="/etc/wpa_supplicant.conf"
+ local iface="$1" opts timeout action=false cfgfile
local actfile="/sbin/wpa_cli.action"
# We don't configure wireless if we're being called from
- # the background
+ # the background unless we're not currently running
if ${IN_BACKGROUND} ; then
- ESSID=$( wpa_supplicant_get_essid "${iface}" )
- ESSIDVAR=$( bash_variable "${ESSID}" )
- save_options "ESSID" "${ESSID}"
- return 0
+ if service_started_daemon "net.${iface}" /sbin/wpa_supplicant ; then
+ if wpa_supplicant_check_extensions "${iface}" ; then
+ ESSID=$( wpa_supplicant_get_essid "${iface}" )
+ ESSIDVAR=$( bash_variable "${ESSID}" )
+ save_options "ESSID" "${ESSID}"
+ fi
+ return 0
+ fi
fi
save_options "ESSID" ""
- # We only work on wirelesss interfaces
- wpa_supplicant_check_extensions "${iface}" || return 0
-
- # Kill off any existing wpa_supplicant on this interface
- # This is so we can re-read the configuration file and clean any stale
- # directories
- wpa_supplicant_kill "${iface}" true
+ local ifvar=$( bash_variable "${iface}" )
+ eval opts=\" \$\{wpa_supplicant_${ifvar}\} \"
+
+ # We only work on wirelesss interfaces unless a driver for wired
+ # has been defined
+ if [[ ${opts} != *" -Dwired "* && ${opts} != *" -D wired "* ]]; then
+ if ! wpa_supplicant_check_extensions "${iface}" ; then
+ veinfo "wpa_supplicant only works on wireless interfaces"
+ veinfo "unless the -D wired option is specified"
+ return 0
+ fi
+ fi
+ [[ ${opts} != *" -D"* ]] \
+ && ewarn "wpa_supplicant_${ifvar} does not define a driver"
+
# Check for rf_kill - only ipw supports this at present, but other
# cards may in the future
if [[ -e "/sys/class/net/${iface}/device/rf_kill" ]]; then
@@ -251,12 +253,23 @@ wpa_supplicant_pre_start() {
# This is needed for some drivers - such as hostap because they start
# the card in Master mode which causes problems with wpa_supplicant.
if [[ $( type -t iwconfig_defaults ) == "function" ]]; then
- iwconfig_defaults "${iface}"
- iwconfig_user_config "${iface}"
+ if wpa_supplicant_check_extensions "${iface}" ; then
+ iwconfig_defaults "${iface}"
+ iwconfig_user_config "${iface}"
+ fi
fi
ebegin "Starting wpa_supplicant on ${iface}"
+ cfgfile="${opts##* -c}"
+ if [[ -n ${cfgfile} && ${cfgfile} != "${opts}" ]]; then
+ [[ ${cfgfile:0:1} == " " ]] && cfgfile="${cfgfile# *}"
+ cfgfile="${cfgfile%% *}"
+ else
+ cfgfile="/etc/wpa_supplicant.conf"
+ opts="${opts} -c/etc/wpa_supplicant.conf"
+ fi
+
if [[ ! -f ${cfgfile} ]]; then
eend 1 "configuration file ${cfgfile} not found!"
return 1
@@ -270,11 +283,6 @@ wpa_supplicant_pre_start() {
return 1
fi
- local ifvar=$( bash_variable "${iface}" )
- eval opts=\" \$\{wpa_supplicant_${ifvar}\}\"
- [[ ${opts} != *" -D"* ]] \
- && ewarn "wpa_supplicant_${ifvar} does not define a driver"
-
# Some drivers require the interface to be up
interface_up "${iface}"
@@ -295,7 +303,8 @@ wpa_supplicant_pre_start() {
fi
start-stop-daemon --start --exec /sbin/wpa_supplicant \
- -- ${opts} -B -c/etc/wpa_supplicant.conf -i"${iface}"
+ --pidfile "/var/run/wpa_supplicant-${iface}.pid" \
+ -- ${opts} -B -i"${iface}"
eend "$?" || return 1
# Starting wpa_supplication-0.4.0, we can get wpa_cli to
@@ -304,8 +313,9 @@ wpa_supplicant_pre_start() {
mark_service_inactive "net.${iface}"
ebegin "Starting wpa_cli on ${iface}"
start-stop-daemon --start --exec /bin/wpa_cli \
- -- -a"${actfile}" -i"${iface}" \
- -P"/var/run/wpa_cli-${iface}.pid" -B
+ --pidfile "/var/run/wpa_cli-${iface}.pid" \
+ -- -a"${actfile}" -i"${iface}" \
+ -P"/var/run/wpa_cli-${iface}.pid" -B
eend "$?" || return 1
fi
@@ -325,24 +335,29 @@ wpa_supplicant_pre_start() {
wpa_supplicant_associate "${iface}" || return 1
- # Set ESSID for essidnet and report
- ESSID=$( wpa_supplicant_get_essid "${iface}" )
- ESSIDVAR=$( bash_variable "${ESSID}" )
- save_options "ESSID" "${ESSID}"
+ # Only report wireless info for wireless interfaces
+ if wpa_supplicant_check_extensions "${iface}" ; then
+ # Set ESSID for essidnet and report
+ ESSID=$( wpa_supplicant_get_essid "${iface}" )
+ ESSIDVAR=$( bash_variable "${ESSID}" )
+ save_options "ESSID" "${ESSID}"
- local -a status=( "$( wpa_cli -i${iface} status | sed -n -e 's/^\(bssid\|pairwise_cipher\|key_mgmt\)=\([^=]\+\).*/\U\2/p' | tr '[:lower:]' '[:upper:]' )" )
- einfo "${iface} connected to \"${ESSID//\\\\/\\\\}\" at ${status[0]}"
+ local -a status=( "$( wpa_cli -i${iface} status | sed -n -e 's/^\(bssid\|pairwise_cipher\|key_mgmt\)=\([^=]\+\).*/\U\2/p' | tr '[:lower:]' '[:upper:]' )" )
+ einfo "${iface} connected to \"${ESSID//\\\\/\\\\}\" at ${status[0]}"
- if [[ ${status[2]} == "NONE" ]]; then
- if [[ ${status[1]} == "NONE" ]]; then
- ewarn "not using any encryption"
+ if [[ ${status[2]} == "NONE" ]]; then
+ if [[ ${status[1]} == "NONE" ]]; then
+ ewarn "not using any encryption"
+ else
+ veinfo "using ${status[1]}"
+ fi
else
- veinfo "using ${status[1]}"
+ veinfo "using ${status[2]}/${status[1]}"
fi
+ eoutdent
else
- veinfo "using ${status[2]}/${status[1]}"
+ einfo "${iface} connected"
fi
- eoutdent
if ${action} ; then
local addr=$( interface_get_address "${iface}" )
@@ -358,7 +373,11 @@ wpa_supplicant_pre_start() {
# Stops wpa_supplicant on an interface
# Returns 0 (true) when successful, non-zero otherwise
wpa_supplicant_post_stop() {
- ! ${IN_BACKGROUND} && wpa_supplicant_kill "$1" true
+ if ${IN_BACKGROUND} ; then
+ # Only stop wpa_supplicant if it's not the controlling daemon
+ ! service_started_daemon "net.$1" /sbin/wpa_supplicant 0
+ fi
+ [[ $? == 0 ]] && wpa_supplicant_kill "$1" true
return 0
}