14e3ebfccSroy# Start, reconfigure and stop wpa_supplicant per wireless interface.
25ebc262aSroy#
35ebc262aSroy# This is only needed when using wpa_supplicant-2.5 or older, OR
45ebc262aSroy# when wpa_supplicant has not been built with CONFIG_MATCH_IFACE, OR
55ebc262aSroy# wpa_supplicant was launched without the -M flag to activate
65ebc262aSroy# interface matching.
74e3ebfccSroy
84e3ebfccSroyif [ -z "$wpa_supplicant_conf" ]; then
94e3ebfccSroy	for x in \
104e3ebfccSroy		/etc/wpa_supplicant/wpa_supplicant-"$interface".conf \
114e3ebfccSroy		/etc/wpa_supplicant/wpa_supplicant.conf \
124e3ebfccSroy		/etc/wpa_supplicant-"$interface".conf \
134e3ebfccSroy		/etc/wpa_supplicant.conf \
144e3ebfccSroy	; do
154e3ebfccSroy		if [ -s "$x" ]; then
164e3ebfccSroy			wpa_supplicant_conf="$x"
174e3ebfccSroy			break
184e3ebfccSroy		fi
194e3ebfccSroy	done
204e3ebfccSroyfi
214e3ebfccSroy: ${wpa_supplicant_conf:=/etc/wpa_supplicant.conf}
224e3ebfccSroy
234e3ebfccSroywpa_supplicant_ctrldir()
244e3ebfccSroy{
254e3ebfccSroy	dir=$(key_get_value "[[:space:]]*ctrl_interface=" \
264e3ebfccSroy		"$wpa_supplicant_conf")
274e3ebfccSroy	dir=$(trim "$dir")
284e3ebfccSroy	case "$dir" in
294e3ebfccSroy	DIR=*)
304e3ebfccSroy		dir=${dir##DIR=}
314e3ebfccSroy		dir=${dir%%[[:space:]]GROUP=*}
324e3ebfccSroy		dir=$(trim "$dir")
334e3ebfccSroy		;;
344e3ebfccSroy	esac
354e3ebfccSroy	printf %s "$dir"
364e3ebfccSroy}
374e3ebfccSroy
384e3ebfccSroywpa_supplicant_start()
394e3ebfccSroy{
404e3ebfccSroy	# If the carrier is up, don't bother checking anything
414e3ebfccSroy	[ "$ifcarrier" = "up" ] && return 0
424e3ebfccSroy
434e3ebfccSroy	# Pre flight checks
444e3ebfccSroy	if [ ! -s "$wpa_supplicant_conf" ]; then
454e3ebfccSroy		syslog warn \
464e3ebfccSroy			"$wpa_supplicant_conf does not exist"
474e3ebfccSroy		syslog warn "not interacting with wpa_supplicant(8)"
484e3ebfccSroy		return 1
494e3ebfccSroy	fi
504e3ebfccSroy	dir=$(wpa_supplicant_ctrldir)
514e3ebfccSroy	if [ -z "$dir" ]; then
524e3ebfccSroy		syslog warn \
534e3ebfccSroy			"ctrl_interface not defined in $wpa_supplicant_conf"
544e3ebfccSroy		syslog warn "not interacting with wpa_supplicant(8)"
554e3ebfccSroy		return 1
564e3ebfccSroy	fi
574e3ebfccSroy
584e3ebfccSroy	wpa_cli -p "$dir" -i "$interface" status >/dev/null 2>&1 && return 0
594e3ebfccSroy	syslog info "starting wpa_supplicant"
604e3ebfccSroy	driver=${wpa_supplicant_driver:+-D}$wpa_supplicant_driver
614e3ebfccSroy	err=$(wpa_supplicant -B -c"$wpa_supplicant_conf" -i"$interface" \
624e3ebfccSroy	    "$driver" 2>&1)
634e3ebfccSroy	errn=$?
644e3ebfccSroy	if [ $errn != 0 ]; then
654e3ebfccSroy		syslog err "failed to start wpa_supplicant"
664e3ebfccSroy		syslog err "$err"
674e3ebfccSroy	fi
684e3ebfccSroy	return $errn
694e3ebfccSroy}
704e3ebfccSroy
714e3ebfccSroywpa_supplicant_reconfigure()
724e3ebfccSroy{
734e3ebfccSroy	dir=$(wpa_supplicant_ctrldir)
744e3ebfccSroy	[ -z "$dir" ] && return 1
754e3ebfccSroy	if ! wpa_cli -p "$dir" -i "$interface" status >/dev/null 2>&1; then
764e3ebfccSroy		wpa_supplicant_start
774e3ebfccSroy		return $?
784e3ebfccSroy	fi
794e3ebfccSroy	syslog info "reconfiguring wpa_supplicant"
804e3ebfccSroy	err=$(wpa_cli -p "$dir" -i "$interface" reconfigure 2>&1)
814e3ebfccSroy	errn=$?
824e3ebfccSroy	if [ $errn != 0 ]; then
834e3ebfccSroy		syslog err "failed to reconfigure wpa_supplicant"
844e3ebfccSroy		syslog err "$err"
854e3ebfccSroy	fi
864e3ebfccSroy	return $errn
874e3ebfccSroy}
884e3ebfccSroy
894e3ebfccSroywpa_supplicant_stop()
904e3ebfccSroy{
914e3ebfccSroy	dir=$(wpa_supplicant_ctrldir)
924e3ebfccSroy	[ -z "$dir" ] && return 1
934e3ebfccSroy	wpa_cli -p "$dir" -i "$interface" status >/dev/null 2>&1 || return 0
944e3ebfccSroy	syslog info "stopping wpa_supplicant"
954e3ebfccSroy	err=$(wpa_cli -i"$interface" terminate 2>&1)
964e3ebfccSroy	errn=$?
974e3ebfccSroy	if [ $errn != 0 ]; then
980d34b412Sroy		syslog err "failed to stop wpa_supplicant"
994e3ebfccSroy		syslog err "$err"
1004e3ebfccSroy	fi
1014e3ebfccSroy	return $errn
1024e3ebfccSroy}
1034e3ebfccSroy
1044e3ebfccSroyif [ "$ifwireless" = "1" ] && \
105*3ee74c9aSroy    command -v wpa_supplicant >/dev/null 2>&1 && \
106*3ee74c9aSroy    command -v wpa_cli >/dev/null 2>&1
1074e3ebfccSroythen
1084e3ebfccSroy	case "$reason" in
1094e3ebfccSroy	PREINIT)	wpa_supplicant_start;;
1104e3ebfccSroy	RECONFIGURE)	wpa_supplicant_reconfigure;;
1114e3ebfccSroy	DEPARTED)	wpa_supplicant_stop;;
1124e3ebfccSroy	esac
1134e3ebfccSroyfi
114