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