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