17827cba2SAaron LI# Start, reconfigure and stop wpa_supplicant per wireless interface.
28d36e1dfSRoy Marples#
38d36e1dfSRoy Marples# This is only needed when using wpa_supplicant-2.5 or older, OR
48d36e1dfSRoy Marples# when wpa_supplicant has not been built with CONFIG_MATCH_IFACE, OR
58d36e1dfSRoy Marples# wpa_supplicant was launched without the -M flag to activate
68d36e1dfSRoy Marples# interface matching.
77827cba2SAaron LI
87827cba2SAaron LIif [ -z "$wpa_supplicant_conf" ]; then
97827cba2SAaron LI	for x in \
107827cba2SAaron LI		/etc/wpa_supplicant/wpa_supplicant-"$interface".conf \
117827cba2SAaron LI		/etc/wpa_supplicant/wpa_supplicant.conf \
127827cba2SAaron LI		/etc/wpa_supplicant-"$interface".conf \
137827cba2SAaron LI		/etc/wpa_supplicant.conf \
147827cba2SAaron LI	; do
157827cba2SAaron LI		if [ -s "$x" ]; then
167827cba2SAaron LI			wpa_supplicant_conf="$x"
177827cba2SAaron LI			break
187827cba2SAaron LI		fi
197827cba2SAaron LI	done
207827cba2SAaron LIfi
217827cba2SAaron LI: ${wpa_supplicant_conf:=/etc/wpa_supplicant.conf}
227827cba2SAaron LI
237827cba2SAaron LIwpa_supplicant_ctrldir()
247827cba2SAaron LI{
257827cba2SAaron LI	dir=$(key_get_value "[[:space:]]*ctrl_interface=" \
267827cba2SAaron LI		"$wpa_supplicant_conf")
277827cba2SAaron LI	dir=$(trim "$dir")
287827cba2SAaron LI	case "$dir" in
297827cba2SAaron LI	DIR=*)
307827cba2SAaron LI		dir=${dir##DIR=}
317827cba2SAaron LI		dir=${dir%%[[:space:]]GROUP=*}
327827cba2SAaron LI		dir=$(trim "$dir")
337827cba2SAaron LI		;;
347827cba2SAaron LI	esac
357827cba2SAaron LI	printf %s "$dir"
367827cba2SAaron LI}
377827cba2SAaron LI
387827cba2SAaron LIwpa_supplicant_start()
397827cba2SAaron LI{
407827cba2SAaron LI	# If the carrier is up, don't bother checking anything
417827cba2SAaron LI	[ "$ifcarrier" = "up" ] && return 0
427827cba2SAaron LI
437827cba2SAaron LI	# Pre flight checks
447827cba2SAaron LI	if [ ! -s "$wpa_supplicant_conf" ]; then
457827cba2SAaron LI		syslog warn \
467827cba2SAaron LI			"$wpa_supplicant_conf does not exist"
477827cba2SAaron LI		syslog warn "not interacting with wpa_supplicant(8)"
487827cba2SAaron LI		return 1
497827cba2SAaron LI	fi
507827cba2SAaron LI	dir=$(wpa_supplicant_ctrldir)
517827cba2SAaron LI	if [ -z "$dir" ]; then
527827cba2SAaron LI		syslog warn \
537827cba2SAaron LI			"ctrl_interface not defined in $wpa_supplicant_conf"
547827cba2SAaron LI		syslog warn "not interacting with wpa_supplicant(8)"
557827cba2SAaron LI		return 1
567827cba2SAaron LI	fi
577827cba2SAaron LI
587827cba2SAaron LI	wpa_cli -p "$dir" -i "$interface" status >/dev/null 2>&1 && return 0
597827cba2SAaron LI	syslog info "starting wpa_supplicant"
607827cba2SAaron LI	driver=${wpa_supplicant_driver:+-D}$wpa_supplicant_driver
617827cba2SAaron LI	err=$(wpa_supplicant -B -c"$wpa_supplicant_conf" -i"$interface" \
627827cba2SAaron LI	    "$driver" 2>&1)
637827cba2SAaron LI	errn=$?
647827cba2SAaron LI	if [ $errn != 0 ]; then
657827cba2SAaron LI		syslog err "failed to start wpa_supplicant"
667827cba2SAaron LI		syslog err "$err"
677827cba2SAaron LI	fi
687827cba2SAaron LI	return $errn
697827cba2SAaron LI}
707827cba2SAaron LI
717827cba2SAaron LIwpa_supplicant_reconfigure()
727827cba2SAaron LI{
737827cba2SAaron LI	dir=$(wpa_supplicant_ctrldir)
747827cba2SAaron LI	[ -z "$dir" ] && return 1
757827cba2SAaron LI	if ! wpa_cli -p "$dir" -i "$interface" status >/dev/null 2>&1; then
767827cba2SAaron LI		wpa_supplicant_start
777827cba2SAaron LI		return $?
787827cba2SAaron LI	fi
797827cba2SAaron LI	syslog info "reconfiguring wpa_supplicant"
807827cba2SAaron LI	err=$(wpa_cli -p "$dir" -i "$interface" reconfigure 2>&1)
817827cba2SAaron LI	errn=$?
827827cba2SAaron LI	if [ $errn != 0 ]; then
837827cba2SAaron LI		syslog err "failed to reconfigure wpa_supplicant"
847827cba2SAaron LI		syslog err "$err"
857827cba2SAaron LI	fi
867827cba2SAaron LI	return $errn
877827cba2SAaron LI}
887827cba2SAaron LI
897827cba2SAaron LIwpa_supplicant_stop()
907827cba2SAaron LI{
917827cba2SAaron LI	dir=$(wpa_supplicant_ctrldir)
927827cba2SAaron LI	[ -z "$dir" ] && return 1
937827cba2SAaron LI	wpa_cli -p "$dir" -i "$interface" status >/dev/null 2>&1 || return 0
947827cba2SAaron LI	syslog info "stopping wpa_supplicant"
957827cba2SAaron LI	err=$(wpa_cli -i"$interface" terminate 2>&1)
967827cba2SAaron LI	errn=$?
977827cba2SAaron LI	if [ $errn != 0 ]; then
988d36e1dfSRoy Marples		syslog err "failed to stop wpa_supplicant"
997827cba2SAaron LI		syslog err "$err"
1007827cba2SAaron LI	fi
1017827cba2SAaron LI	return $errn
1027827cba2SAaron LI}
1037827cba2SAaron LI
1047827cba2SAaron LIif [ "$ifwireless" = "1" ] && \
10580aa9461SRoy Marples    command -v wpa_supplicant >/dev/null 2>&1 && \
10680aa9461SRoy Marples    command -v wpa_cli >/dev/null 2>&1
1077827cba2SAaron LIthen
1087827cba2SAaron LI	case "$reason" in
1097827cba2SAaron LI	PREINIT)		wpa_supplicant_start;;
1107827cba2SAaron LI	RECONFIGURE)		wpa_supplicant_reconfigure;;
111*54175cefSRoy Marples	DEPARTED|STOPPED)	wpa_supplicant_stop;;
1127827cba2SAaron LI	esac
1137827cba2SAaron LIfi
114