# Copyright (C) 2006 OpenWrt.org
# Copyright (C) 2006 Fokus Fraunhofer <carsten.tittel@fokus.fraunhofer.de>
-alias debug=${DEBUG:-:}
+
+debug () {
+ ${DEBUG:-:} "$@"
+}
+mount() {
+ busybox mount "$@"
+}
# newline
N="
_C=0
NO_EXPORT=1
+LOAD_STATE=1
+LIST_SEP=" "
hotplug_dev() {
env -i ACTION=$1 INTERFACE=$2 /sbin/hotplug-call net
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"
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 = 0 ] && append CONFIG_LIST_STATE "${CONFIG_SECTION}_${varname}"
+ 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"
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}_} | \
done
}
-config_load() {
- local cfg
- local uci
- local PACKAGE="$1"
-
- case "$PACKAGE" in
- /*) cfg="$PACKAGE"
- uci=""
- ;;
- *) cfg="$UCI_ROOT/etc/config/$PACKAGE"
- uci="/tmp/.uci/${PACKAGE}"
- ;;
- esac
-
- [ -e "$cfg" ] || cfg=""
- [ -e "$uci" ] || uci=""
-
- # no config
- [ -z "$cfg" -a -z "$uci" ] && return 1
-
- _C=0
- export ${NO_EXPORT:+-n} CONFIG_SECTIONS=
- export ${NO_EXPORT:+-n} CONFIG_NUM_SECTIONS=0
- export ${NO_EXPORT:+-n} CONFIG_SECTION=
-
- ${cfg:+. "$cfg"}
- ${uci:+. "$uci"}
-
- ${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() {
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 "x$cfgtype" != "x$type" ] && continue
- eval "$function \"\$section\""
+ 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
}
}
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
+}
+
+service_kill() {
+ local name="${1}"
+ local pid="${2:-$(pidof "$name")}"
+ local grace="${3:-5}"
+
+ [ -f "$pid" ] && pid="$(head -n1 "$pid" 2>/dev/null)"
+
+ for pid in $pid; do
+ [ -d "/proc/$pid" ] || continue
+ local try=0
+ kill -TERM $pid 2>/dev/null && \
+ while grep -qs "$name" "/proc/$pid/cmdline" && [ $((try++)) -lt $grace ]; do sleep 1; done
+ kill -KILL $pid 2>/dev/null && \
+ while grep -qs "$name" "/proc/$pid/cmdline"; do sleep 1; done
+ done
+}
+
+
+pi_include() {
+ if [ -f "/tmp/overlay/$1" ]; then
+ . "/tmp/overlay/$1"
+ elif [ -f "$1" ]; then
+ . "$1"
+ elif [ -d "/tmp/overlay/$1" ]; then
+ if [ -n "$(ls /tmp/overlay/$1/*.sh 2>/dev/null)" ]; then
+ for src_script in /tmp/overlay/$1/*.sh; do
+ . "$src_script"
+ done
+ fi
+ elif [ -d "$1" ]; then
+ if [ -n "$(ls $1/*.sh 2>/dev/null)" ]; then
+ for src_script in $1/*.sh; do
+ . "$src_script"
+ done
+ fi
+ else
+ echo "WARNING: $1 not found"
+ return 1
+ fi
+ return 0
+}
+
+[ -z "$IPKG_INSTROOT" -a -f /lib/config/uci.sh ] && . /lib/config/uci.sh