[Feature][YUKUAI_patch]add 18.02 code

Only Configure: No
Affected branch: master
Affected module: unknow
Is it affected on both ZXIC and MTK: only ZXIC
Self-test: Yes
Doc Update: No

Change-Id: I7f71153004f10fc0ea5adfa083866aaeeb1053ac
diff --git a/rootfs/usr/sbin/update-rc.d b/rootfs/usr/sbin/update-rc.d
new file mode 100755
index 0000000..95d1c22
--- /dev/null
+++ b/rootfs/usr/sbin/update-rc.d
@@ -0,0 +1,332 @@
+#!/bin/sh
+#
+# update-rc.d	Update the links in /etc/rc[0-9S].d/
+#
+# (c) 2003, 2004 Phil Blundell <pb@handhelds.org>
+#
+# SPDX-License-Identifier: GPL-2.0-or-later
+#
+
+initd="/etc/init.d"
+etcd="/etc/rc"
+notreally=0
+force=0
+dostart=0
+verbose=0
+
+usage()
+{
+	cat >&2 <<EOF
+usage: update-rc.d [-n] [-f] [-r <root>] <basename> remove
+       update-rc.d [-n] [-r <root>] [-s] <basename> defaults [NN | sNN kNN]
+       update-rc.d [-n] [-r <root>] [-s] <basename> start|stop NN runlvl [runlvl] [...] .
+       update-rc.d [-n] [-r <root>] [-s] <basename> enable|disable [S|2|3|4|5]
+		-n: not really
+		-f: force
+		-v: verbose
+		-r: alternate root path (default is /)
+		-s: invoke start methods if appropriate to current runlevel
+EOF
+}
+
+checklinks()
+{
+	local i dn fn remove=0
+	if [ "x$1" = "xremove" ]; then
+		echo " Removing any system startup links for $bn ..."
+		remove=1
+	fi
+
+	for i in 0 1 2 3 4 5 6 7 8 9 S; do
+		dn="${etcd}${i}.d"
+		if [ ! -d $dn ]; then
+			continue;
+		fi
+		for f in ${dn}/[SK]??${bn}; do
+			if [ -L $f ]; then
+				if [ $remove -eq 0 ]; then
+					return 1
+				fi
+				echo "  $f"
+				if [ $notreally -eq 1 ]; then
+					continue
+				fi
+				rm $f
+			fi
+		done
+	done
+
+	return 0
+}
+
+dolink()
+{
+	startstop=$1
+	lev=`echo $2 | cut -d/ -f1`
+	nn=`echo $2 | cut -d/ -f2`
+	fn="${etcd}${lev}.d/${startstop}${nn}${bn}"
+	[ $verbose -eq 1 ] && echo "  $fn -> ../init.d/$bn"
+	if [ $notreally -eq 0 ]; then
+		mkdir -p `dirname $fn`
+ 		ln -s ../init.d/$bn $fn
+	fi
+	if [ $dostart -eq 1 ] && [ $startstop = "S" ] && [ $lev = $RUNLEVEL ]; then
+		$fn start || true
+	fi
+}
+
+makelinks()
+{
+	if ! checklinks; then
+		echo " System startup links for $initd/$bn already exist."
+		if [ $dostart -eq 1 ] && [ $notreally -eq 0 ] && [ -L ${etcd}${RUNLEVEL}.d/S??${bn} ]; then
+			${etcd}${RUNLEVEL}.d/S??${bn} restart || true
+		fi
+		exit 0
+	fi
+
+	echo " Adding system startup for $initd/$bn."
+
+	for i in $startlinks; do
+		dolink S $i
+	done
+	for i in $stoplinks; do
+		dolink K $i
+	done
+}
+
+# function to disable/enable init script link of one run level
+# $1 should be K/S, means to disable/enable
+# $2 means which run level to disable/enable 
+renamelink()
+{
+	local oldstartstop newstartstop lev oldnn newnn
+	if [ "x$1" = "xS" ]; then
+		oldstartstop="K"
+		newstartstop="S"
+	else
+		oldstartstop="S"
+		newstartstop="K"
+	fi
+
+	lev=$2
+	# modifies existing runlevel links for the script /etc/init.d/name by renaming start links to stop link
+        # or stop link to start link with a sequence number equal to the difference of 100 minus the original sequence number.
+	if ls ${etcd}${lev}.d/${oldstartstop}*${bn} >/dev/null 2>&1; then
+		oldnn=`basename ${etcd}${lev}.d/${oldstartstop}*${bn}|cut -c2-3`
+		newnn=$(printf "%02d" $((100-${oldnn#0})))
+		[ $verbose -eq 1 ] && echo "rename ${etcd}${lev}.d/${oldstartstop}${oldnn}${bn} -> ${etcd}${lev}.d/${newstartstop}${newnn}${bn}"
+		if [ $notreally -eq 0 ];then
+			mv ${etcd}${lev}.d/${oldstartstop}${oldnn}${bn} ${etcd}${lev}.d/${newstartstop}${newnn}${bn}
+		fi
+		if [ $dostart -eq 1 ] && [ $newstartstop = "S" ] && [ $lev = $RUNLEVEL ]; then
+			$fn start || true
+		fi
+	fi
+
+}
+
+# function to disable/enable init script link
+# $1 should be K/S, means to disable/enable
+# $2 run level [S|2|3|4|5], optional, If no start runlevel is 
+# specified after the disable or enable keywords 
+# the script will attempt to modify links in all start runlevels
+renamelinks()
+{
+	if [ $# -eq 2 ]; then
+		renamelink $1 $2
+	else
+		for i in 2 3 4 5 S; do
+			renamelink $1 $i
+		done
+	fi
+}
+
+while [ $# -gt 0 ]; do
+	case $1 in
+		-n)	notreally=1
+			shift
+			continue
+			;;
+		-v)	verbose=1
+			shift
+			continue
+			;;
+		-f)	force=1
+			shift
+			continue
+			;;
+		-s)	dostart=1
+			shift
+			continue
+			;;
+		-r)     shift
+			root=$1
+			initd="${root}${initd}"
+			etcd="${root}${etcd}"
+			shift
+			;;
+		-h | --help)
+			usage
+			exit 0
+			;;
+		-*)
+			usage
+			exit 1
+			;;
+		*)
+			break
+			;;
+	esac
+done
+
+if [ $# -lt 2 ]; then
+	usage
+	exit 1
+fi
+
+bn=$1
+shift
+
+sn=$initd/$bn
+if [ -L "$sn" -a -n "$root" ]; then
+	if which readlink >/dev/null; then
+		while true; do
+			linksn="$(readlink "$sn")"
+			if [ -z "$linksn" ]; then
+				break
+			fi
+
+			sn="$linksn"
+			case "$sn" in
+				/*) sn="$root$sn" ;;
+				*)  sn="$initd/$sn" ;;
+			esac
+		done
+	else
+		echo "update-rc.d: readlink tool not present, cannot check whether \
+				$sn symlink points to a valid file." >&2
+	fi
+fi
+
+if [ $1 != "remove" ]; then
+	if [ ! -f "$sn" ]; then
+		echo "update-rc.d: $initd/$bn: file does not exist" >&2
+		exit 1
+	fi
+else
+	if [ -f "$sn" ]; then
+		if [ $force -eq 1 ]; then
+			echo "update-rc.d: $initd/$bn exists during rc.d purge (continuing)" >&2
+		else
+			echo "update-rc.d: $initd/$bn exists during rc.d purge (use -f to force)" >&2
+			exit 1
+		fi
+	fi
+fi
+
+if [ $dostart -eq 1 ]; then
+	#RUNLEVEL=`sed 's/.*\[\(.*\)\]/\1/' < /proc/1/cmdline`
+	RUNLEVEL=`runlevel | cut -d" " -f2`
+	if [ "x$RUNLEVEL" = "x" ]; then
+		echo "Unable to determine current runlevel" >&2
+		exit 1
+	fi
+fi
+
+case $1 in
+	remove)
+		checklinks "remove"
+		;;
+
+	defaults)
+		if [ $# -gt 3 ]; then
+			echo "defaults takes only one or two arguments" >&2
+			usage
+			exit 1
+		fi
+		start=20
+		stop=20
+		if [ $# -gt 1 ]; then
+			start=$2
+			stop=$2
+		fi
+		if [ $# -gt 2 ]; then
+			stop=$3
+		fi
+		start=`printf %02d $start`
+		stop=`printf %02d $stop`
+		stoplinks="0/$stop 1/$stop 6/$stop"
+		startlinks="2/$start 3/$start 4/$start 5/$start"
+		makelinks
+		;;
+
+	start | stop)
+		if [ $# -lt 4 ]
+		then
+			echo "Not enough arguments"
+			usage
+			exit 1
+		fi
+
+		while [ $# -gt 0 ]; do
+			if [ $1 = "start" ]; then
+				letter=S
+			elif [ $1 = "stop" ]; then
+				letter=K
+			else
+				echo "expected start or stop" >&2
+				usage
+				exit 1
+			fi
+			shift
+			NN=`printf %02d $(expr $1 + 0)`
+			shift
+			while [ "x$1" != "x." ]; do
+				if [ $# -eq 0 ]; then
+					echo "action with list of runlevels not terminated by \`.'" >&2
+					exit 1
+				fi
+				level=$1
+				shift
+				case $letter in
+					S) startlinks="$startlinks $level/$NN" ;;
+					K) stoplinks="$stoplinks $level/$NN" ;;
+				esac
+			done
+			shift
+		done
+		makelinks
+		;;
+
+	enable | disable)
+		if [ $1 = "enable" ]; then
+			letter=S
+		elif [ $1 = "disable" ]; then
+			letter=K
+		else
+			usage
+			exit 1
+		fi
+		shift
+		# 
+		if [ $# -gt 0 ]
+		then
+			case $1 in
+				S|2|3|4|5)
+					renamelinks $letter $1
+					;;
+				*)
+					usage
+					exit 1
+					;;
+			esac
+		else
+			renamelinks $letter
+		fi
+		;;
+	*)
+		usage
+		exit 1
+		;;
+esac