X-Git-Url: https://git.rohieb.name/openwrt.git/blobdiff_plain/c13b2a5d979d5c35737a0d0ed847b9ed5b0dcc27..88c82cdc9cdd90afa71d4c98a265fd6f5a75f7b2:/package/base-files/files/etc/functions.sh?ds=sidebyside

diff --git a/package/base-files/files/etc/functions.sh b/package/base-files/files/etc/functions.sh
index f757ffaf2..eb7faac1f 100755
--- a/package/base-files/files/etc/functions.sh
+++ b/package/base-files/files/etc/functions.sh
@@ -3,6 +3,7 @@
 # Copyright (C) 2006 Fokus Fraunhofer <carsten.tittel@fokus.fraunhofer.de>
 
 alias debug=${DEBUG:-:}
+alias mount='busybox mount'
 
 # newline
 N="
@@ -10,6 +11,8 @@ N="
 
 _C=0
 NO_EXPORT=1
+LOAD_STATE=1
+LIST_SEP=" "
 
 hotplug_dev() {
 	env -i ACTION=$1 INTERFACE=$2 /sbin/hotplug-call net
@@ -23,12 +26,46 @@ append() {
 	eval "export ${NO_EXPORT:+-n} -- \"$var=\${$var:+\${$var}\${value:+\$sep}}\$value\""
 }
 
+list_contains() {
+	local var="$1"
+	local str="$2"
+	local val
+
+	eval "val=\" \${$var} \""
+	[ "${val%% $str *}" != "$val" ]
+}
+
+list_remove() {
+	local var="$1"
+	local remove="$2"
+	local val
+
+	eval "val=\" \${$var} \""
+	val1="${val%% $remove *}"
+	[ "$val1" = "$val" ] && return
+	val2="${val##* $remove }"
+	[ "$val2" = "$val" ] && return
+	val="${val1## } ${val2%% }"
+	val="${val%% }"
+	eval "export ${NO_EXPORT:+-n} -- \"$var=\$val\""
+}
+
+config_load() {
+	[ -n "$IPKG_INSTROOT" ] && return 0
+	uci_load "$@"
+}
+
 reset_cb() {
 	config_cb() { return 0; }
 	option_cb() { return 0; }
+	list_cb() { return 0; }
 }
 reset_cb
 
+package() {
+	return 0
+}
+
 config () {
 	local cfgtype="$1"
 	local name="$2"
@@ -44,18 +81,31 @@ config () {
 option () {
 	local varname="$1"; shift
 	local value="$*"
-	
+
 	export ${NO_EXPORT:+-n} "CONFIG_${CONFIG_SECTION}_${varname}=$value"
 	[ -n "$NO_CALLBACK" ] || option_cb "$varname" "$*"
 }
 
+list() {
+	local varname="$1"; shift
+	local value="$*"
+	local len
+
+	config_get len "$CONFIG_SECTION" "${varname}_LENGTH" 0
+	len=$(($len + 1))
+	config_set "$CONFIG_SECTION" "${varname}_ITEM$len" "$value"
+	config_set "$CONFIG_SECTION" "${varname}_LENGTH" "$len"
+	append "CONFIG_${CONFIG_SECTION}_${varname}" "$value" "$LIST_SEP"
+	list_cb "$varname" "$*"
+}
+
 config_rename() {
 	local OLD="$1"
 	local NEW="$2"
 	local oldvar
 	local newvar
 	
-	[ "$OLD" -a "$NEW" ] || return
+	[ -n "$OLD" -a -n "$NEW" ] || return
 	for oldvar in `set | grep ^CONFIG_${OLD}_ | \
 		sed -e 's/\(.*\)=.*$/\1/'` ; do
 		newvar="CONFIG_${NEW}_${oldvar##CONFIG_${OLD}_}"
@@ -74,8 +124,8 @@ config_unset() {
 config_clear() {
 	local SECTION="$1"
 	local oldvar
-	
-	export ${NO_EXPORT:+-n} CONFIG_SECTIONS="$(echo " $CONFIG_SECTIONS " | sed -e "s, $OLD , ,")"
+
+	list_remove CONFIG_SECTIONS "$SECTION"
 	export ${NO_EXPORT:+-n} CONFIG_SECTIONS="${SECTION:+$CONFIG_SECTIONS}"
 
 	for oldvar in `set | grep ^CONFIG_${SECTION:+${SECTION}_} | \
@@ -84,36 +134,25 @@ config_clear() {
 	done
 }
 
-config_load() {
-	local file="$UCI_ROOT/etc/config/$1"
-	_C=0
-	export ${NO_EXPORT:+-n} CONFIG_SECTIONS=
-	export ${NO_EXPORT:+-n} CONFIG_NUM_SECTIONS=0
-	export ${NO_EXPORT:+-n} CONFIG_SECTION=
-	
-	[ -e "$file" ] && {
-		. $file
-	} || return 1
-	
-	${CONFIG_SECTION:+config_cb}
-}
-
+# config_get <variable> <section> <option> [<default>]
+# config_get <section> <option>
 config_get() {
 	case "$3" in
-		"") eval "echo \"\${CONFIG_${1}_${2}}\"";;
-		*)  eval "export ${NO_EXPORT:+-n} -- \"$1=\${CONFIG_${2}_${3}}\"";;
+		"") eval echo "\${CONFIG_${1}_${2}:-\${4}}";;
+		*)  eval export ${NO_EXPORT:+-n} -- "${1}=\${CONFIG_${2}_${3}:-\${4}}";;
 	esac
 }
 
 # config_get_bool <variable> <section> <option> [<default>]
 config_get_bool() {
 	local _tmp
-	config_get "_tmp" "$2" "$3"
+	config_get _tmp "$2" "$3" "$4"
 	case "$_tmp" in
-		1|on|enabled) export ${NO_EXPORT:+-n} "$1=1";;
-		0|off|disabled) export ${NO_EXPORT:+-n} "$1=0";;
-		*) eval "$1=${4:-0}";;
+		1|on|true|enabled) _tmp=1;;
+		0|off|false|disabled) _tmp=0;;
+		*) _tmp="$4";;
 	esac
+	export ${NO_EXPORT:+-n} "$1=$_tmp"
 }
 
 config_set() {
@@ -129,14 +168,34 @@ config_set() {
 
 config_foreach() {
 	local function="$1"
-	local type="$2"
+	[ "$#" -ge 1 ] && shift
+	local type="$1"
+	[ "$#" -ge 1 ] && shift
 	local section cfgtype
 	
 	[ -z "$CONFIG_SECTIONS" ] && return 0
 	for section in ${CONFIG_SECTIONS}; do
 		config_get cfgtype "$section" TYPE
-		[ -n "$type" -a "$cfgtype" != "$type" ] && continue
-		eval "$function \"\$section\""
+		[ -n "$type" -a "x$cfgtype" != "x$type" ] && continue
+		eval "$function \"\$section\" \"\$@\""
+	done
+}
+
+config_list_foreach() {
+	[ "$#" -ge 3 ] || return 0
+	local section="$1"; shift
+	local option="$1"; shift
+	local function="$1"; shift
+	local val
+	local len
+	local c=1
+
+	config_get len "${section}" "${option}_LENGTH"
+	[ -z "$len" ] && return 0
+	while [ $c -le "$len" ]; do
+		config_get val "${section}" "${option}_ITEM$c"
+		eval "$function \"\$val\" \"$@\""
+		c="$(($c + 1))"
 	done
 }
 
@@ -182,7 +241,7 @@ strtok() { # <string> { <variable> [<separator>] ... }
 		shift 2
 	done
 
-	if [ $# -gt 0 -a "$val" ]; then
+	if [ $# -gt 0 -a -n "$val" ]; then
 		export ${NO_EXPORT:+-n} "$1=$val"; count=$((count+1))
 	fi
 
@@ -198,3 +257,16 @@ jffs2_mark_erase() {
 	}
 	echo -e "\xde\xad\xc0\xde" | mtd -qq write - "$1"
 }
+
+uci_apply_defaults() {(
+	cd /etc/uci-defaults || return 0
+	files="$(ls)"
+	[ -z "$files" ] && return 0
+	mkdir -p /tmp/.uci
+	for file in $files; do
+		( . "./$(basename $file)" ) && rm -f "$file"
+	done
+	uci commit
+)}
+
+[ -z "$IPKG_INSTROOT" -a -f /lib/config/uci.sh ] && . /lib/config/uci.sh