From: Felix Fietkau <nbd@openwrt.org>
Date: Sun, 15 Oct 2006 21:03:30 +0000 (+0000)
Subject: init script cleanup, use /etc/rc.d/ for enabled scripts, /etc/init.d/<pkgname> (enabl... 
X-Git-Url: http://git.cdn.openwrt.org/?a=commitdiff_plain;h=8612d336918b408fd3abd844ccb8189f0d64acc5;p=openwrt%2Fstaging%2Fansuel.git

init script cleanup, use /etc/rc.d/ for enabled scripts, /etc/init.d/<pkgname> (enable|disable) manages symlinks

SVN-Revision: 5128
---

diff --git a/package/Makefile b/package/Makefile
index 304343a2aa..d1605afe9f 100644
--- a/package/Makefile
+++ b/package/Makefile
@@ -55,6 +55,13 @@ install-targets: base-files-install $(INSTALL_PACKAGES)
 install:
 	rm -rf $(BUILD_DIR)/root
 	$(MAKE) install-targets
+	@( \
+		cd $(BUILD_DIR)/root; \
+		for script in ./etc/init.d/*; do \
+			grep '#!/bin/sh /etc/rc.common' $$script >/dev/null || continue; \
+			IPKG_INSTROOT=$(BUILD_DIR)/root $(which bash) ./etc/rc.common $$script enable; \
+		done; \
+	)
 
 index: $(PACKAGE_DIR)/Packages
 
diff --git a/package/base-files/ar7-2.4/etc/init.d/S00adam2 b/package/base-files/ar7-2.4/etc/init.d/S00adam2
deleted file mode 100755
index 5f5b3504c2..0000000000
--- a/package/base-files/ar7-2.4/etc/init.d/S00adam2
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/bin/sh /etc/rc.common
-# ADAM2 patcher for Netgear DG834 and compatible
-# Copyright (C) 2006 OpenWrt.org
-
-start() {
-	MD5="$(md5sum /dev/mtdblock/0  | awk '{print $1}')"
-	[ "$MD5" = "0530bfdf00ec155f4182afd70da028c1" ] && {
-		mtd unlock adam2
-		/sbin/adam2patcher /dev/mtdblock/0
-	}
-	rm -f /etc/init.d/S00adam2 /sbin/adam2patcher >&- 2>&-
-}
diff --git a/package/base-files/ar7-2.4/etc/init.d/adam2 b/package/base-files/ar7-2.4/etc/init.d/adam2
new file mode 100755
index 0000000000..425bc15d69
--- /dev/null
+++ b/package/base-files/ar7-2.4/etc/init.d/adam2
@@ -0,0 +1,13 @@
+#!/bin/sh /etc/rc.common
+# ADAM2 patcher for Netgear DG834 and compatible
+# Copyright (C) 2006 OpenWrt.org
+
+START=00
+start() {
+	MD5="$(md5sum /dev/mtdblock/0  | awk '{print $1}')"
+	[ "$MD5" = "0530bfdf00ec155f4182afd70da028c1" ] && {
+		mtd unlock adam2
+		/sbin/adam2patcher /dev/mtdblock/0
+	}
+	rm -f /etc/init.d/S00adam2 /sbin/adam2patcher >&- 2>&-
+}
diff --git a/package/base-files/brcm-2.4/etc/init.d/S05netconfig b/package/base-files/brcm-2.4/etc/init.d/S05netconfig
deleted file mode 100755
index 7c36183896..0000000000
--- a/package/base-files/brcm-2.4/etc/init.d/S05netconfig
+++ /dev/null
@@ -1,86 +0,0 @@
-#!/bin/sh /etc/rc.common
-# Copyright (C) 2006 OpenWrt.org
-
-start() {
-	[ -e /etc/config/network ] && exit 0
-
-	mkdir -p /etc/config
-
-	(
-		if grep -E 'mtd0: 000(6|a)0000' /proc/mtd 2>&- >&-; then
-			# WGT634u
-			echo boardtype=wgt634u
-		else
-			strings /dev/mtdblock/3
-		fi
-	) | awk '
-	function p(cfgname, name) {
-		if (c[name] != "") print "	option " cfgname "	\"" c[name] "\""
-	}
-	
-	BEGIN {
-		FS="="
-		c["lan_ifname"]="eth0.0"
-		c["wan_ifname"]="eth0.1"
-		c["vlan0ports"]="1 2 3 4 5*"
-		c["vlan1ports"]="0 5"
-	}
-	
-	($1 == "boardnum") || ($1 == "boardtype") || ($1 == "boardflags") {
-		nvram[$1] = $2
-	}
-	
-	END {
-		# v1 hardware
-		if (nvram["boardtype"] == "bcm94710dev") {
-			# Asus WL-500g
-			if (nvram["boardnum"] == "asusX") {
-				c["lan_ifname"]="eth0 eth1" # FIXME
-				c["wan_ifname"]=""
-			}
-		}
-		if (nvram["boardtype"] == "wgt634u") {
-			c["vlan0ports"] = "0 1 2 3 5*"
-			c["vlan1ports"] = "4 5"
-		}
-		if ((nvram["boardtype"] == "0x0467") || (nvram["boardtype"] == "0x042f")) {
-			c["vlan0ports"] = "0 1 2 3 5*"
-			c["vlan1ports"] = "4 5"
-		}
-	
-		# WAP54G
-		if ((nvram["boardnum"] == "2") || \
-			(nvram["boardnum"] == "1024")) {
-			c["lan_ifname"]="eth0"
-			c["wan_ifname"]=""
-		}
-	
-		print "#### VLAN configuration "
-		print "config switch eth0"
-		p("vlan0", "vlan0ports")
-		p("vlan1", "vlan1ports")
-		print ""
-		print ""
-		print "#### Loopback configuration"
-		print "config interface loopback"
-		print "	option ifname	\"lo\""
-		print "	option proto	static"
-		print "	option ipaddr	127.0.0.1"
-		print "	option netmask	255.0.0.0"
-		print ""
-		print ""
-		print "#### LAN configuration"
-		print "config interface lan"
-		print "	option type 	bridge"
-		p("ifname", "lan_ifname")
-		print "	option proto	static"
-		print "	option ipaddr	192.168.1.1"
-		print "	option netmask	255.255.255.0"
-		print ""
-		print ""
-		print "#### WAN configuration"
-		print "config interface	wan"
-		p("ifname", "wan_ifname")
-		print "	option proto	dhcp"
-	}' > /etc/config/network
-}
diff --git a/package/base-files/brcm-2.4/etc/init.d/netconfig b/package/base-files/brcm-2.4/etc/init.d/netconfig
new file mode 100755
index 0000000000..ca52ee7c59
--- /dev/null
+++ b/package/base-files/brcm-2.4/etc/init.d/netconfig
@@ -0,0 +1,88 @@
+#!/bin/sh /etc/rc.common
+# Copyright (C) 2006 OpenWrt.org
+
+START=05
+
+start() {
+	[ -e /etc/config/network ] && exit 0
+
+	mkdir -p /etc/config
+
+	(
+		if grep -E 'mtd0: 000(6|a)0000' /proc/mtd 2>&- >&-; then
+			# WGT634u
+			echo boardtype=wgt634u
+		else
+			strings /dev/mtdblock/3
+		fi
+	) | awk '
+	function p(cfgname, name) {
+		if (c[name] != "") print "	option " cfgname "	\"" c[name] "\""
+	}
+	
+	BEGIN {
+		FS="="
+		c["lan_ifname"]="eth0.0"
+		c["wan_ifname"]="eth0.1"
+		c["vlan0ports"]="1 2 3 4 5*"
+		c["vlan1ports"]="0 5"
+	}
+	
+	($1 == "boardnum") || ($1 == "boardtype") || ($1 == "boardflags") {
+		nvram[$1] = $2
+	}
+	
+	END {
+		# v1 hardware
+		if (nvram["boardtype"] == "bcm94710dev") {
+			# Asus WL-500g
+			if (nvram["boardnum"] == "asusX") {
+				c["lan_ifname"]="eth0 eth1" # FIXME
+				c["wan_ifname"]=""
+			}
+		}
+		if (nvram["boardtype"] == "wgt634u") {
+			c["vlan0ports"] = "0 1 2 3 5*"
+			c["vlan1ports"] = "4 5"
+		}
+		if ((nvram["boardtype"] == "0x0467") || (nvram["boardtype"] == "0x042f")) {
+			c["vlan0ports"] = "0 1 2 3 5*"
+			c["vlan1ports"] = "4 5"
+		}
+	
+		# WAP54G
+		if ((nvram["boardnum"] == "2") || \
+			(nvram["boardnum"] == "1024")) {
+			c["lan_ifname"]="eth0"
+			c["wan_ifname"]=""
+		}
+	
+		print "#### VLAN configuration "
+		print "config switch eth0"
+		p("vlan0", "vlan0ports")
+		p("vlan1", "vlan1ports")
+		print ""
+		print ""
+		print "#### Loopback configuration"
+		print "config interface loopback"
+		print "	option ifname	\"lo\""
+		print "	option proto	static"
+		print "	option ipaddr	127.0.0.1"
+		print "	option netmask	255.0.0.0"
+		print ""
+		print ""
+		print "#### LAN configuration"
+		print "config interface lan"
+		print "	option type 	bridge"
+		p("ifname", "lan_ifname")
+		print "	option proto	static"
+		print "	option ipaddr	192.168.1.1"
+		print "	option netmask	255.255.255.0"
+		print ""
+		print ""
+		print "#### WAN configuration"
+		print "config interface	wan"
+		p("ifname", "wan_ifname")
+		print "	option proto	dhcp"
+	}' > /etc/config/network
+}
diff --git a/package/base-files/brcm-2.6/etc/init.d/S05netconfig b/package/base-files/brcm-2.6/etc/init.d/S05netconfig
deleted file mode 100755
index 846562690e..0000000000
--- a/package/base-files/brcm-2.6/etc/init.d/S05netconfig
+++ /dev/null
@@ -1,86 +0,0 @@
-#!/bin/sh /etc/rc.common
-# Copyright (C) 2006 OpenWrt.org
-
-start() {
-	[ -e /etc/config/network ] && exit 0
-	
-	mkdir -p /etc/config
-	
-	(
-		if grep -E 'mtd0: 000(6|a)0000' /proc/mtd 2>&- >&-; then
-			# WGT634u
-			echo boardtype=wgt634u
-		else
-			strings /dev/mtdblock/3
-		fi
-	) | awk '
-	function p(cfgname, name) {
-		if (c[name] != "") print "	option " cfgname "	\"" c[name] "\""
-	}
-	
-	BEGIN {
-		FS="="
-		c["lan_ifname"]="eth0.0"
-		c["wan_ifname"]="eth0.1"
-		c["vlan0ports"]="1 2 3 4 5*"
-		c["vlan1ports"]="0 5"
-	}
-	
-	($1 == "boardnum") || ($1 == "boardtype") || ($1 == "boardflags") {
-		nvram[$1] = $2
-	}
-	
-	END {
-		# v1 hardware
-		if (nvram["boardtype"] == "bcm94710dev") {
-			# Asus WL-500g
-			if (nvram["boardnum"] == "asusX") {
-				c["lan_ifname"]="eth0 eth1" # FIXME
-				c["wan_ifname"]=""
-			}
-		}
-		if (nvram["boardtype"] == "wgt634u") {
-			c["vlan0ports"] = "0 1 2 3 5*"
-			c["vlan1ports"] = "4 5"
-		}
-		if ((nvram["boardtype"] == "0x0467") || (nvram["boardtype"] == "0x042f")) {
-			c["vlan0ports"] = "0 1 2 3 5*"
-			c["vlan1ports"] = "4 5"
-		}
-	
-		# WAP54G
-		if ((nvram["boardnum"] == "2") || \
-			(nvram["boardnum"] == "1024")) {
-			c["lan_ifname"]="eth0"
-			c["wan_ifname"]=""
-		}
-	
-		print "#### VLAN configuration "
-		print "config switch eth0"
-		p("vlan0", "vlan0ports")
-		p("vlan1", "vlan1ports")
-		print ""
-		print ""
-		print "#### Loopback configuration"
-		print "config interface loopback"
-		print "	option ifname	\"lo\""
-		print "	option proto	static"
-		print "	option ipaddr	127.0.0.1"
-		print "	option netmask	255.0.0.0"
-		print ""
-		print ""
-		print "#### LAN configuration"
-		print "config interface lan"
-		print "	option type 	bridge"
-		p("ifname", "lan_ifname")
-		print "	option proto	static"
-		print "	option ipaddr	192.168.1.1"
-		print "	option netmask	255.255.255.0"
-		print ""
-		print ""
-		print "#### WAN configuration"
-		print "config interface	wan"
-		p("ifname", "wan_ifname")
-		print "	option proto	dhcp"
-	}' > /etc/config/network
-}
diff --git a/package/base-files/brcm-2.6/etc/init.d/netconfig b/package/base-files/brcm-2.6/etc/init.d/netconfig
new file mode 100755
index 0000000000..7a818dc5dd
--- /dev/null
+++ b/package/base-files/brcm-2.6/etc/init.d/netconfig
@@ -0,0 +1,87 @@
+#!/bin/sh /etc/rc.common
+# Copyright (C) 2006 OpenWrt.org
+
+START=05
+start() {
+	[ -e /etc/config/network ] && exit 0
+	
+	mkdir -p /etc/config
+	
+	(
+		if grep -E 'mtd0: 000(6|a)0000' /proc/mtd 2>&- >&-; then
+			# WGT634u
+			echo boardtype=wgt634u
+		else
+			strings /dev/mtdblock/3
+		fi
+	) | awk '
+	function p(cfgname, name) {
+		if (c[name] != "") print "	option " cfgname "	\"" c[name] "\""
+	}
+	
+	BEGIN {
+		FS="="
+		c["lan_ifname"]="eth0.0"
+		c["wan_ifname"]="eth0.1"
+		c["vlan0ports"]="1 2 3 4 5*"
+		c["vlan1ports"]="0 5"
+	}
+	
+	($1 == "boardnum") || ($1 == "boardtype") || ($1 == "boardflags") {
+		nvram[$1] = $2
+	}
+	
+	END {
+		# v1 hardware
+		if (nvram["boardtype"] == "bcm94710dev") {
+			# Asus WL-500g
+			if (nvram["boardnum"] == "asusX") {
+				c["lan_ifname"]="eth0 eth1" # FIXME
+				c["wan_ifname"]=""
+			}
+		}
+		if (nvram["boardtype"] == "wgt634u") {
+			c["vlan0ports"] = "0 1 2 3 5*"
+			c["vlan1ports"] = "4 5"
+		}
+		if ((nvram["boardtype"] == "0x0467") || (nvram["boardtype"] == "0x042f")) {
+			c["vlan0ports"] = "0 1 2 3 5*"
+			c["vlan1ports"] = "4 5"
+		}
+	
+		# WAP54G
+		if ((nvram["boardnum"] == "2") || \
+			(nvram["boardnum"] == "1024")) {
+			c["lan_ifname"]="eth0"
+			c["wan_ifname"]=""
+		}
+	
+		print "#### VLAN configuration "
+		print "config switch eth0"
+		p("vlan0", "vlan0ports")
+		p("vlan1", "vlan1ports")
+		print ""
+		print ""
+		print "#### Loopback configuration"
+		print "config interface loopback"
+		print "	option ifname	\"lo\""
+		print "	option proto	static"
+		print "	option ipaddr	127.0.0.1"
+		print "	option netmask	255.0.0.0"
+		print ""
+		print ""
+		print "#### LAN configuration"
+		print "config interface lan"
+		print "	option type 	bridge"
+		p("ifname", "lan_ifname")
+		print "	option proto	static"
+		print "	option ipaddr	192.168.1.1"
+		print "	option netmask	255.255.255.0"
+		print ""
+		print ""
+		print "#### WAN configuration"
+		print "config interface	wan"
+		p("ifname", "wan_ifname")
+		print "	option proto	dhcp"
+	}' > /etc/config/network
+}
diff --git a/package/base-files/default/etc/init.d/S10boot b/package/base-files/default/etc/init.d/S10boot
deleted file mode 100755
index 77b5ca72d5..0000000000
--- a/package/base-files/default/etc/init.d/S10boot
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/bin/sh /etc/rc.common
-# Copyright (C) 2006 OpenWrt.org
-
-start() {
-	[ -f /proc/mounts ] || /sbin/mount_root
-	[ -f /proc/jffs2_bbc ] && echo "S" > /proc/jffs2_bbc
-	vconfig set_name_type DEV_PLUS_VID_NO_PAD
-	
-	HOSTNAME=${wan_hostname%%.*}
-	echo ${HOSTNAME:=OpenWrt}>/proc/sys/kernel/hostname
-	
-	mkdir -p /var/run
-	mkdir -p /var/log
-	mkdir -p /var/lock
-	touch /var/log/wtmp
-	touch /var/log/lastlog
-	[ "$FAILSAFE" = "true" ] && touch /tmp/.failsafe
-	
-	# manually trigger hotplug before loading modules
-	for iface in $(awk -F: '/:/ {print $1}' /proc/net/dev); do
-		/usr/bin/env -i ACTION=add INTERFACE="$iface" /sbin/hotplug net
-	done
-	
-	load_modules /etc/modules /etc/modules.d/*
-}
diff --git a/package/base-files/default/etc/init.d/S40network b/package/base-files/default/etc/init.d/S40network
deleted file mode 100755
index c7720369fd..0000000000
--- a/package/base-files/default/etc/init.d/S40network
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/bin/sh /etc/rc.common
-# Copyright (C) 2006 OpenWrt.org
-
-start() {
-	setup_switch() { return 0; }
-
-	include /lib/network
-	setup_switch
-	[ -e /etc/config/wireless ] || \
-		/sbin/wifi detect > /etc/config/wireless
-	/sbin/wifi up
-}
-
diff --git a/package/base-files/default/etc/init.d/S50httpd b/package/base-files/default/etc/init.d/S50httpd
deleted file mode 100755
index a05b10c094..0000000000
--- a/package/base-files/default/etc/init.d/S50httpd
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/sh /etc/rc.common
-# Copyright (C) 2006 OpenWrt.org
-
-start() {
-	[ -d /www ] && httpd -p 80 -h /www -r OpenWrt
-}
-
-stop() {
-	killall httpd
-}
diff --git a/package/base-files/default/etc/init.d/S50telnet b/package/base-files/default/etc/init.d/S50telnet
deleted file mode 100755
index 228eac2b62..0000000000
--- a/package/base-files/default/etc/init.d/S50telnet
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/sh /etc/rc.common
-# Copyright (C) 2006 OpenWrt.org
-
-start() {
-	if awk -F: '/^root:/ && $2 !~ /\!/ {exit 1}' /etc/passwd 2>/dev/null; then telnetd -l /bin/login; fi
-}
-
-stop() {
-	killall telnetd
-}
diff --git a/package/base-files/default/etc/init.d/S60cron b/package/base-files/default/etc/init.d/S60cron
deleted file mode 100755
index a450c36dd2..0000000000
--- a/package/base-files/default/etc/init.d/S60cron
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/bin/sh /etc/rc.common
-# Copyright (C) 2006 OpenWrt.org
-
-start () {
-	mkdir -p /var/spool/cron
-	ln -s /etc/crontabs /var/spool/cron/crontabs
-	crond -c /etc/crontabs
-}
-
-stop() {
-	killall crond
-}
diff --git a/package/base-files/default/etc/init.d/boot b/package/base-files/default/etc/init.d/boot
new file mode 100755
index 0000000000..a5c8603a5d
--- /dev/null
+++ b/package/base-files/default/etc/init.d/boot
@@ -0,0 +1,26 @@
+#!/bin/sh /etc/rc.common
+# Copyright (C) 2006 OpenWrt.org
+
+START=10
+start() {
+	[ -f /proc/mounts ] || /sbin/mount_root
+	[ -f /proc/jffs2_bbc ] && echo "S" > /proc/jffs2_bbc
+	vconfig set_name_type DEV_PLUS_VID_NO_PAD
+	
+	HOSTNAME=${wan_hostname%%.*}
+	echo ${HOSTNAME:=OpenWrt}>/proc/sys/kernel/hostname
+	
+	mkdir -p /var/run
+	mkdir -p /var/log
+	mkdir -p /var/lock
+	touch /var/log/wtmp
+	touch /var/log/lastlog
+	[ "$FAILSAFE" = "true" ] && touch /tmp/.failsafe
+	
+	# manually trigger hotplug before loading modules
+	for iface in $(awk -F: '/:/ {print $1}' /proc/net/dev); do
+		/usr/bin/env -i ACTION=add INTERFACE="$iface" /sbin/hotplug net
+	done
+	
+	load_modules /etc/modules /etc/modules.d/*
+}
diff --git a/package/base-files/default/etc/init.d/cron b/package/base-files/default/etc/init.d/cron
new file mode 100755
index 0000000000..a450c36dd2
--- /dev/null
+++ b/package/base-files/default/etc/init.d/cron
@@ -0,0 +1,12 @@
+#!/bin/sh /etc/rc.common
+# Copyright (C) 2006 OpenWrt.org
+
+start () {
+	mkdir -p /var/spool/cron
+	ln -s /etc/crontabs /var/spool/cron/crontabs
+	crond -c /etc/crontabs
+}
+
+stop() {
+	killall crond
+}
diff --git a/package/base-files/default/etc/init.d/httpd b/package/base-files/default/etc/init.d/httpd
new file mode 100755
index 0000000000..a05b10c094
--- /dev/null
+++ b/package/base-files/default/etc/init.d/httpd
@@ -0,0 +1,10 @@
+#!/bin/sh /etc/rc.common
+# Copyright (C) 2006 OpenWrt.org
+
+start() {
+	[ -d /www ] && httpd -p 80 -h /www -r OpenWrt
+}
+
+stop() {
+	killall httpd
+}
diff --git a/package/base-files/default/etc/init.d/network b/package/base-files/default/etc/init.d/network
new file mode 100755
index 0000000000..45d5311a7a
--- /dev/null
+++ b/package/base-files/default/etc/init.d/network
@@ -0,0 +1,14 @@
+#!/bin/sh /etc/rc.common
+# Copyright (C) 2006 OpenWrt.org
+
+START=40
+start() {
+	setup_switch() { return 0; }
+
+	include /lib/network
+	setup_switch
+	[ -e /etc/config/wireless ] || \
+		/sbin/wifi detect > /etc/config/wireless
+	/sbin/wifi up
+}
+
diff --git a/package/base-files/default/etc/init.d/rcS b/package/base-files/default/etc/init.d/rcS
index 7fae7f5b05..27bc34b220 100755
--- a/package/base-files/default/etc/init.d/rcS
+++ b/package/base-files/default/etc/init.d/rcS
@@ -11,8 +11,8 @@ syslogd -C 16 #${log_ipaddr:+-L -R $log_ipaddr}
 klogd
 
 (
-	for i in /etc/init.d/S*; do
-		$i start 2>&1
+	for i in /etc/rc.d/S*; do
+		$i boot 2>&1
 	done 
 	
 	sysctl -p >&-
diff --git a/package/base-files/default/etc/init.d/telnet b/package/base-files/default/etc/init.d/telnet
new file mode 100755
index 0000000000..228eac2b62
--- /dev/null
+++ b/package/base-files/default/etc/init.d/telnet
@@ -0,0 +1,10 @@
+#!/bin/sh /etc/rc.common
+# Copyright (C) 2006 OpenWrt.org
+
+start() {
+	if awk -F: '/^root:/ && $2 !~ /\!/ {exit 1}' /etc/passwd 2>/dev/null; then telnetd -l /bin/login; fi
+}
+
+stop() {
+	killall telnetd
+}
diff --git a/package/base-files/default/etc/rc.common b/package/base-files/default/etc/rc.common
index 20d1efa402..a08f5e523c 100755
--- a/package/base-files/default/etc/rc.common
+++ b/package/base-files/default/etc/rc.common
@@ -1,5 +1,9 @@
 #!/bin/sh
-. /etc/functions.sh
+# Copyright (C) 2006 OpenWrt.org
+
+. $IPKG_INSTROOT/etc/functions.sh
+
+START=50
 
 start() {
 	return 0
@@ -27,12 +31,14 @@ shutdown() {
 }
 
 disable() {
-	rm -f /etc/rc.d/${initscript##*/}
+	name="$(basename "${initscript}")"
+	rm -f "$IPKG_INSTROOT/etc/rc.d/S??$name"
 }
 
 enable() {
+	name="$(basename "${initscript}")"
 	disable
-	ln -s /etc/init.d/${initscript##*/} /etc/rc.d/${initscript##*/}
+	ln -s "/etc/init.d/$name" "$IPKG_INSTROOT/etc/rc.d/S${START}${name##S[0-9][0-9]}"
 }
 
 depends() {
@@ -48,6 +54,8 @@ Available commands:
 	stop	Stop the service
 	restart	Restart the service
 	reload	Reload configuration files (or restart if that fails)
+	enable	Enable service autostart
+	disable	Disable service autostart
 $EXTRA_HELP
 EOF
 }
@@ -68,6 +76,8 @@ eval "case \"\$action\" in
 	restart) restart;;
 	boot) boot;;
 	shutdown) shutdown;;
+	enable) enable;;
+	disable) disable;;
 	$cmds
 	*) help;;
 esac"
diff --git a/package/dnsmasq/Makefile b/package/dnsmasq/Makefile
index 6283fdc898..d7e5f18b61 100644
--- a/package/dnsmasq/Makefile
+++ b/package/dnsmasq/Makefile
@@ -49,7 +49,7 @@ define Package/dnsmasq/install
 	install -m0755 -d $(1)/etc
 	install -m0644 ./files/dnsmasq.conf $(1)/etc/dnsmasq.conf
 	install -m0755 -d $(1)/etc/init.d
-	install -m0755 ./files/dnsmasq.init $(1)/etc/init.d/S50dnsmasq
+	install -m0755 ./files/dnsmasq.init $(1)/etc/init.d/dnsmasq
 endef
 
 $(eval $(call BuildPackage,dnsmasq))
diff --git a/package/dropbear/Makefile b/package/dropbear/Makefile
index b28b44ef9e..18e4a45708 100644
--- a/package/dropbear/Makefile
+++ b/package/dropbear/Makefile
@@ -107,7 +107,7 @@ define Package/dropbear/install
 	ln -sf ../sbin/dropbear $(1)/usr/bin/dbclient
 	ln -sf ../sbin/dropbear $(1)/usr/bin/dropbearkey
 	install -d -m0755 $(1)/etc/init.d
-	install -m0755 ./files/dropbear.init $(1)/etc/init.d/S50dropbear
+	install -m0755 ./files/dropbear.init $(1)/etc/init.d/dropbear
 endef
 
 define Package/dropbearconvert/install
diff --git a/package/iptables/Makefile b/package/iptables/Makefile
index d198a9271a..ee0c0941b1 100644
--- a/package/iptables/Makefile
+++ b/package/iptables/Makefile
@@ -195,7 +195,7 @@ define Package/iptables/install
 	install -d -m0755 $(1)/etc/config
 	install -m0644 ./files/firewall.config $(1)/etc/config/firewall
 	install -d -m0755 $(1)/etc/init.d
-	install -m0755 ./files/firewall.init $(1)/etc/init.d/S45firewall
+	install -m0755 ./files/firewall.init $(1)/etc/init.d/firewall
 	install -m0755 ./files/firewall.user $(1)/etc/
 	install -d -m0755 $(1)/usr/lib
 	install -m0644 ./files/firewall.awk $(1)/usr/lib
diff --git a/package/iptables/files/firewall.init b/package/iptables/files/firewall.init
index 731485bcdd..1e39d05fd9 100755
--- a/package/iptables/files/firewall.init
+++ b/package/iptables/files/firewall.init
@@ -2,7 +2,7 @@
 # Copyright (C) 2006 OpenWrt.org
 
 ## Please make changes in /etc/firewall.user
-
+START=45
 start() {
 	include /lib/network
 	scan_interfaces
diff --git a/package/madwifi/Makefile b/package/madwifi/Makefile
index a4180063f4..7d06fe1897 100644
--- a/package/madwifi/Makefile
+++ b/package/madwifi/Makefile
@@ -120,7 +120,7 @@ endif
 ifeq ($(findstring PCI,$(BUS)),PCI)
 	echo ath_pci >> $(1)/etc/modules.d/20-madwifi
 endif
-	install -m0755 ./files/madwifi.init $(1)/etc/init.d/S20madwifi
+	install -m0755 ./files/madwifi.init $(1)/etc/init.d/madwifi
 	$(CP) \
 		$(PKG_BUILD_DIR)/ath/ath_hal.$(LINUX_KMOD_SUFFIX) \
 		$(BUS_MODULES) \
diff --git a/package/madwifi/files/madwifi.init b/package/madwifi/files/madwifi.init
index 73eb11017e..0c3ad3c3c1 100644
--- a/package/madwifi/files/madwifi.init
+++ b/package/madwifi/files/madwifi.init
@@ -1,4 +1,5 @@
 #!/bin/sh /etc/rc.common
-start() {
+START=20
+boot() {
 	iwpriv ath0 mode 3
 }
diff --git a/package/openswan/Makefile b/package/openswan/Makefile
index 54b565efdd..b5adc54257 100644
--- a/package/openswan/Makefile
+++ b/package/openswan/Makefile
@@ -21,8 +21,6 @@ PKG_CAT:=zcat
 PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
 PKG_INSTALL_DIR:=$(PKG_BUILD_DIR)/ipkg-install
 
-PKG_INIT_PRIO:=60
-
 include $(INCLUDE_DIR)/package.mk
 
 define Package/openswan/Default
@@ -76,7 +74,7 @@ endef
 define Package/openswan/install
 	$(CP) $(PKG_INSTALL_DIR)/* $(1)
 	install -d -m0755 $(1)/etc/init.d
-	$(CP) $(1)/etc/rc.d/init.d/ipsec $(1)/etc/init.d/S$(PKG_INIT_PRIO)ipsec
+	$(CP) ./files/ipsec.init $(1)/etc/init.d/ipsec
 	rm -rf $(1)/usr/share
 	rm -rf $(1)/usr/man
 	rm -rf $(1)/var
diff --git a/package/openswan/files/ipsec.init b/package/openswan/files/ipsec.init
new file mode 100755
index 0000000000..33c416351d
--- /dev/null
+++ b/package/openswan/files/ipsec.init
@@ -0,0 +1,158 @@
+#!/bin/sh /etc/rc.common
+# IPsec startup and shutdown script
+# Copyright (C) 1998, 1999, 2001  Henry Spencer.
+# Copyright (C) 2002              Michael Richardson <mcr@freeswan.org>
+# Copyright (C) 2006              OpenWrt.org
+# 
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
+# 
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# RCSID $Id: setup.in,v 1.122.6.1 2005/07/25 19:17:03 ken Exp $
+#
+# ipsec         init.d script for starting and stopping
+#               the IPsec security subsystem (KLIPS and Pluto).
+#
+# This script becomes /etc/rc.d/init.d/ipsec (or possibly /etc/init.d/ipsec)
+# and is also accessible as "ipsec setup" (the preferred route for human
+# invocation).
+#
+# The startup and shutdown times are a difficult compromise (in particular,
+# it is almost impossible to reconcile them with the insanely early/late
+# times of NFS filesystem startup/shutdown).  Startup is after startup of
+# syslog and pcmcia support; shutdown is just before shutdown of syslog.
+#
+# chkconfig: 2345 47 76
+# description: IPsec provides encrypted and authenticated communications; \
+# KLIPS is the kernel half of it, Pluto is the user-level management daemon.
+
+START=60
+script_init() {
+	me='ipsec setup'		# for messages
+
+	# where the private directory and the config files are
+	IPSEC_EXECDIR="${IPSEC_EXECDIR-/usr/libexec/ipsec}"
+	IPSEC_LIBDIR="${IPSEC_LIBDIR-/usr/lib/ipsec}"
+	IPSEC_SBINDIR="${IPSEC_SBINDIR-/usr/sbin}"
+	IPSEC_CONFS="${IPSEC_CONFS-/etc}"
+
+	if test " $IPSEC_DIR" = " "	# if we were not called by the ipsec command
+	then
+	    # we must establish a suitable PATH ourselves
+	    PATH="${IPSEC_SBINDIR}":/sbin:/usr/sbin:/usr/local/bin:/bin:/usr/bin
+	    export PATH
+
+	    IPSEC_DIR="$IPSEC_LIBDIR"
+	    export IPSEC_DIR IPSEC_CONFS IPSEC_LIBDIR IPSEC_EXECDIR
+	fi
+
+	# Check that the ipsec command is available.
+	found=
+	for dir in `echo $PATH | tr ':' ' '`
+	do
+		if test -f $dir/ipsec -a -x $dir/ipsec
+		then
+			found=yes
+			break			# NOTE BREAK OUT
+		fi
+	done
+	if ! test "$found"
+	then
+		echo "cannot find ipsec command -- \`$1' aborted" |
+			logger -s -p daemon.error -t ipsec_setup
+		exit 1
+	fi
+
+	# Pick up IPsec configuration (until we have done this, successfully, we
+	# do not know where errors should go, hence the explicit "daemon.error"s.)
+	# Note the "--export", which exports the variables created.
+	eval `ipsec _confread $config --optional --varprefix IPSEC --export --type config setup`
+
+	if test " $IPSEC_confreadstatus" != " "
+	then
+	    case $1 in 
+	    stop|--stop|_autostop) 
+		echo "$IPSEC_confreadstatus -- \`$1' may not work" |
+			logger -s -p daemon.error -t ipsec_setup;;
+
+	    *) echo "$IPSEC_confreadstatus -- \`$1' aborted" |
+		    logger -s -p daemon.error -t ipsec_setup;
+		exit 1;;
+	    esac
+	fi
+
+	IPSEC_confreadsection=${IPSEC_confreadsection:-setup}
+	export IPSEC_confreadsection
+
+	IPSECsyslog=${IPSECsyslog-daemon.error}
+	export IPSECsyslog
+
+	# misc setup
+	umask 022
+
+	mkdir -p /var/run/pluto
+}
+
+script_command() {
+	if [ "${USER}" != "root" ]
+	then
+		echo "permission denied (must be superuser)" |
+			logger -s -p $IPSECsyslog -t ipsec_setup 2>&1
+		exit 1
+	fi
+	# make sure all required directories exist
+	if [ ! -d /var/run/pluto ]
+	then
+		mkdir -p /var/run/pluto
+	fi
+	if [ ! -d /var/lock/subsys ]
+	then
+		mkdir -p /var/lock/subsys
+	fi
+	tmp=/var/run/pluto/ipsec_setup.st
+	outtmp=/var/run/pluto/ipsec_setup.out
+	(
+		ipsec _realsetup $1
+		echo "$?" >$tmp
+	) > ${outtmp} 2>&1
+	st=$?
+	if test -f $tmp
+	then
+		st=`cat $tmp`
+		rm -f $tmp
+	fi
+	if [ -f ${outtmp} ]; then
+		cat ${outtmp} | logger -s -p $IPSECsyslog -t ipsec_setup 2>&1
+		rm -f ${outtmp}
+	fi
+}
+
+
+start() {
+	script_init start "$@"
+	script_command start "$@"
+}
+
+stop() {
+	script_init stop "$@"
+	script_command stop "$@"
+}
+
+restart() {
+	script_init stop "$@"
+	script_command stop "$@"
+	script_command start "$@"
+}
+
+status() {
+	script_init status "$@"
+	ipsec _realsetup status
+}
+EXTRA_COMMANDS=status
+EXTRA_HELP="	status	Show the status of the service"
diff --git a/package/qos-scripts/files/etc/init.d/S50qos b/package/qos-scripts/files/etc/init.d/S50qos
deleted file mode 100755
index 87e18fb28d..0000000000
--- a/package/qos-scripts/files/etc/init.d/S50qos
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/sh /etc/rc.common
-# Copyright (C) 2006 OpenWrt.org
-
-boot() {
-	/usr/lib/qos.sh firewall | sh
-}
-
-start() {
-#	FIXME: after init script migration
-#	qos-start
-#
-
-	boot
-}
-
-stop() {
-	qos-stop
-}
diff --git a/package/qos-scripts/files/etc/init.d/qos b/package/qos-scripts/files/etc/init.d/qos
new file mode 100755
index 0000000000..4fa42d4a24
--- /dev/null
+++ b/package/qos-scripts/files/etc/init.d/qos
@@ -0,0 +1,16 @@
+#!/bin/sh /etc/rc.common
+# Copyright (C) 2006 OpenWrt.org
+
+START=50
+
+boot() {
+	/usr/lib/qos.sh firewall | sh
+}
+
+start() {
+	qos-start
+}
+
+stop() {
+	qos-stop
+}