From b86652832e9bfe8e0d2697f18266778afb9f90c3 Mon Sep 17 00:00:00 2001
From: Felix Fietkau <nbd@openwrt.org>
Date: Wed, 23 May 2012 21:49:28 +0000
Subject: [PATCH] netifd: improve /sbin/ifup wifi hack, make it work properly
 with -a. fold /etc/init.d/netifd into /etc/init.d/network

SVN-Revision: 31850
---
 package/netifd/files/etc/init.d/netifd  | 31 ---------
 package/netifd/files/etc/init.d/network | 32 +++++++--
 package/netifd/files/sbin/ifup          | 87 ++++++++++++++++---------
 3 files changed, 84 insertions(+), 66 deletions(-)
 delete mode 100755 package/netifd/files/etc/init.d/netifd

diff --git a/package/netifd/files/etc/init.d/netifd b/package/netifd/files/etc/init.d/netifd
deleted file mode 100755
index 840083b61f..0000000000
--- a/package/netifd/files/etc/init.d/netifd
+++ /dev/null
@@ -1,31 +0,0 @@
-#!/bin/sh /etc/rc.common
-
-START=20
-
-SERVICE_DAEMONIZE=1
-SERVICE_WRITE_PID=1
-
-start() {
-	stop
-	[ -e /proc/sys/kernel/core_pattern ] && {
-		ulimit -c unlimited
-		echo '/tmp/%e.%p.%s.%t.core' > /proc/sys/kernel/core_pattern
-	}
-	service_start /sbin/netifd
-	sleep 1
-}
-
-restart() {
-	ifdown -a
-	sleep 1
-	stop
-	start
-}
-
-stop() {
-	service_stop /sbin/netifd
-}
-
-reload() {
-	ubus call network reload
-}
diff --git a/package/netifd/files/etc/init.d/network b/package/netifd/files/etc/init.d/network
index 9ef2506dea..078a285957 100755
--- a/package/netifd/files/etc/init.d/network
+++ b/package/netifd/files/etc/init.d/network
@@ -1,23 +1,43 @@
 #!/bin/sh /etc/rc.common
-START=40
+
+START=20
 STOP=90
 
+SERVICE_DAEMONIZE=1
+SERVICE_WRITE_PID=1
+
 start() {
+	stop
+	[ -e /proc/sys/kernel/core_pattern ] && {
+		ulimit -c unlimited
+		echo '/tmp/%e.%p.%s.%t.core' > /proc/sys/kernel/core_pattern
+	}
+	service_start /sbin/netifd
+
 	setup_switch() { return 0; }
 
 	include /lib/network
 	setup_switch
 
-	ifup -a
-	grep -qs config /etc/config/wireless && {
-		/sbin/wifi up
-	}
+	sleep 1
 }
 
 restart() {
+	ifdown -a
+	sleep 1
 	start
+	wifi
+}
+
+shutdown() {
+	ifdown -a
+	stop
 }
 
 stop() {
-	/sbin/ifdown -a
+	service_stop /sbin/netifd
+}
+
+reload() {
+	ubus call network reload
 }
diff --git a/package/netifd/files/sbin/ifup b/package/netifd/files/sbin/ifup
index a3ff10ec5a..e17b67de5c 100755
--- a/package/netifd/files/sbin/ifup
+++ b/package/netifd/files/sbin/ifup
@@ -1,10 +1,7 @@
 #!/bin/sh
 
-case "$0" in
-	*ifdown) modes=down;;
-	*ifup) modes="down up";;
-	*) echo "Invalid command: $0";;
-esac
+ifup_all=
+setup_wifi=
 
 if_call() {
 	local interface="$1"
@@ -13,34 +10,66 @@ if_call() {
 	done
 }
 
+case "$0" in
+	*ifdown) modes=down;;
+	*ifup)
+		modes="down up"
+		setup_wifi=1
+	;;
+	*) echo "Invalid command: $0";;
+esac
+
+while :; do
+	case "$1" in
+		-a)
+			ifup_all=1
+			shift
+		;;
+		-w)
+			setup_wifi=
+			shift
+		;;
+		*)
+			break
+		;;
+	esac
+done
+
 [ "$modes" = "down up" ] && ubus call network reload
-[[ "$1" == "-a" ]] && {
+if [ -n "$ifup_all" ]; then
 	for interface in `ubus -S list 'network.interface.*'`; do
 		if_call "$interface"
 	done
+	[ -n "$setup_wifi" ] && /sbin/wifi up
 	exit
-}
+else
+	ubus -S list "network.interface.$1" > /dev/null || {
+		echo "Interface $1 not found"
+		exit
+	}
+	if_call "network.interface.$1"
+fi
 
-ubus -S list "network.interface.$1" > /dev/null || {
-	echo "Interface $1 not found"
-	exit
-}
-if_call "network.interface.$1"
-
-grep -sq ^config /etc/config/wireless && {
-	local wdev
-	for wdev in $(
-		find_radio() {
-			local wdev wnet
-			config_get wdev "$1" device
-			config_get wnet "$1" network
-			[ -n "$wdev" ] && [ "$wnet" = "$2" ] && echo "$wdev"
-		}
-
-		source /lib/functions.sh
-		config_load wireless
-		config_foreach find_radio wifi-iface "$1" | sort -u
-	); do
-		/sbin/wifi up "$wdev"
+if [ -n "$setup_wifi" ] && grep -q config /etc/config/wireless; then
+	. /etc/functions.sh
+
+	find_related_radios() {
+		local wdev wnet
+		config_get wdev "$1" device
+		config_get wnet "$1" network
+
+		if [ -n "$wdev" ] && [ "$wnet" = "$network" ]; then
+			append radio_devs "$wdev" "$N"
+		fi
+	}
+
+	local radio_devs
+	local network="$1"
+	config_load wireless
+	config_foreach find_related_radios wifi-iface
+
+	local dev
+	for dev in $(echo "$radio_devs" | sort -u); do
+		/sbin/wifi up "$dev"
 	done
-}
+fi
-- 
2.30.2