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