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