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
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	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
38wpa_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
71wpa_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
89wpa_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
104if [ "$ifwireless" = "1" ] && \
105    command -v wpa_supplicant >/dev/null 2>&1 && \
106    command -v wpa_cli >/dev/null 2>&1
107then
108	case "$reason" in
109	PREINIT)	wpa_supplicant_start;;
110	RECONFIGURE)	wpa_supplicant_reconfigure;;
111	DEPARTED)	wpa_supplicant_stop;;
112	esac
113fi
114