1# Start, reconfigure and stop wpa_supplicant per wireless interface. 2# This is needed because wpa_supplicant lacks hotplugging of any kind 3# and the user should not be expected to have to wire it into their system 4# if the base system doesn't do this itself. 5 6if [ -z "$wpa_supplicant_conf" ]; then 7 for x in \ 8 /etc/wpa_supplicant/wpa_supplicant-"$interface".conf \ 9 /etc/wpa_supplicant/wpa_supplicant.conf \ 10 /etc/wpa_supplicant-"$interface".conf \ 11 /etc/wpa_supplicant.conf \ 12 ; do 13 if [ -s "$x" ]; then 14 wpa_supplicant_conf="$x" 15 break 16 fi 17 done 18fi 19: ${wpa_supplicant_conf:=/etc/wpa_supplicant.conf} 20 21wpa_supplicant_ctrldir() 22{ 23 dir=$(key_get_value "[[:space:]]*ctrl_interface=" \ 24 "$wpa_supplicant_conf") 25 dir=$(trim "$dir") 26 case "$dir" in 27 DIR=*) 28 dir=${dir##DIR=} 29 dir=${dir%%[[:space:]]GROUP=*} 30 dir=$(trim "$dir") 31 ;; 32 esac 33 printf %s "$dir" 34} 35 36wpa_supplicant_start() 37{ 38 # If the carrier is up, don't bother checking anything 39 [ "$ifcarrier" = "up" ] && return 0 40 41 # Pre flight checks 42 if [ ! -s "$wpa_supplicant_conf" ]; then 43 syslog warn \ 44 "$wpa_supplicant_conf does not exist" 45 syslog warn "not interacting with wpa_supplicant(8)" 46 return 1 47 fi 48 dir=$(wpa_supplicant_ctrldir) 49 if [ -z "$dir" ]; then 50 syslog warn \ 51 "ctrl_interface not defined in $wpa_supplicant_conf" 52 syslog warn "not interacting with wpa_supplicant(8)" 53 return 1 54 fi 55 56 wpa_cli -p "$dir" -i "$interface" status >/dev/null 2>&1 && return 0 57 syslog info "starting wpa_supplicant" 58 driver=${wpa_supplicant_driver:+-D}$wpa_supplicant_driver 59 err=$(wpa_supplicant -B -c"$wpa_supplicant_conf" -i"$interface" \ 60 "$driver" 2>&1) 61 errn=$? 62 if [ $errn != 0 ]; then 63 syslog err "failed to start wpa_supplicant" 64 syslog err "$err" 65 fi 66 return $errn 67} 68 69wpa_supplicant_reconfigure() 70{ 71 dir=$(wpa_supplicant_ctrldir) 72 [ -z "$dir" ] && return 1 73 if ! wpa_cli -p "$dir" -i "$interface" status >/dev/null 2>&1; then 74 wpa_supplicant_start 75 return $? 76 fi 77 syslog info "reconfiguring wpa_supplicant" 78 err=$(wpa_cli -p "$dir" -i "$interface" reconfigure 2>&1) 79 errn=$? 80 if [ $errn != 0 ]; then 81 syslog err "failed to reconfigure wpa_supplicant" 82 syslog err "$err" 83 fi 84 return $errn 85} 86 87wpa_supplicant_stop() 88{ 89 dir=$(wpa_supplicant_ctrldir) 90 [ -z "$dir" ] && return 1 91 wpa_cli -p "$dir" -i "$interface" status >/dev/null 2>&1 || return 0 92 syslog info "stopping wpa_supplicant" 93 err=$(wpa_cli -i"$interface" terminate 2>&1) 94 errn=$? 95 if [ $errn != 0 ]; then 96 syslog err "failed to start wpa_supplicant" 97 syslog err "$err" 98 fi 99 return $errn 100} 101 102if [ "$ifwireless" = "1" ] && \ 103 type wpa_supplicant >/dev/null 2>&1 && \ 104 type wpa_cli >/dev/null 2>&1 105then 106 case "$reason" in 107 PREINIT) wpa_supplicant_start;; 108 RECONFIGURE) wpa_supplicant_reconfigure;; 109 DEPARTED) wpa_supplicant_stop;; 110 esac 111fi 112