mediatek: add Adtran SmartRG SDG-8733A
[openwrt/openwrt.git] / package / base-files / files / lib / functions.sh
index 9db0871d6ccbb5413c452c12a3864a780093c68e..e944d36505662fd0faf1d7c312c7e10ece6c75e1 100644 (file)
@@ -32,6 +32,30 @@ xor() {
        printf "%0${retlen}x" "$ret"
 }
 
+data_2bin() {
+       local data=$1
+       local len=${#1}
+       local bin_data
+
+       for i in $(seq 0 2 $(($len - 1))); do
+               bin_data="${bin_data}\x${data:i:2}"
+       done
+
+       echo -ne $bin_data
+}
+
+data_2xor_val() {
+       local data=$1
+       local len=${#1}
+       local xor_data
+
+       for i in $(seq 0 4 $(($len - 1))); do
+               xor_data="${xor_data}${data:i:4} "
+       done
+
+       echo -n ${xor_data:0:-1}
+}
+
 append() {
        local var="$1"
        local value="$2"
@@ -40,6 +64,14 @@ append() {
        eval "export ${NO_EXPORT:+-n} -- \"$var=\${$var:+\${$var}\${value:+\$sep}}\$value\""
 }
 
+prepend() {
+       local var="$1"
+       local value="$2"
+       local sep="${3:- }"
+
+       eval "export ${NO_EXPORT:+-n} -- \"$var=\$value\${$var:+\${sep}\${$var}}\""
+}
+
 list_contains() {
        local var="$1"
        local str="$2"
@@ -179,8 +211,10 @@ config_list_foreach() {
 
 default_prerm() {
        local root="${IPKG_INSTROOT}"
-       local pkgname="$(basename ${1%.*})"
+       [ -z "$pkgname" ] && local pkgname="$(basename ${1%.*})"
        local ret=0
+       local filelist="${root}/usr/lib/opkg/info/${pkgname}.list"
+       [ -f "$root/lib/apk/packages/${pkgname}.list" ] && filelist="$root/lib/apk/packages/${pkgname}.list"
 
        if [ -f "$root/usr/lib/opkg/info/${pkgname}.prerm-pkg" ]; then
                ( . "$root/usr/lib/opkg/info/${pkgname}.prerm-pkg" )
@@ -188,7 +222,7 @@ default_prerm() {
        fi
 
        local shell="$(command -v bash)"
-       for i in $(grep -s "^/etc/init.d/" "$root/usr/lib/opkg/info/${pkgname}.list"); do
+       for i in $(grep -s "^/etc/init.d/" "$filelist"); do
                if [ -n "$root" ]; then
                        ${shell:-/bin/sh} "$root/etc/rc.common" "$root$i" disable
                else
@@ -203,8 +237,11 @@ default_prerm() {
 }
 
 add_group_and_user() {
-       local pkgname="$1"
+       [ -z "$pkgname" ] && local pkgname="$(basename ${1%.*})"
        local rusers="$(sed -ne 's/^Require-User: *//p' $root/usr/lib/opkg/info/${pkgname}.control 2>/dev/null)"
+       if [ -f "$root/lib/apk/packages/${pkgname}.rusers" ]; then
+               local rusers="$(cat $root/lib/apk/packages/${pkgname}.rusers)"
+       fi
 
        if [ -n "$rusers" ]; then
                local tuple oIFS="$IFS"
@@ -254,17 +291,70 @@ add_group_and_user() {
        fi
 }
 
+update_alternatives() {
+       local root="${IPKG_INSTROOT}"
+       local action="$1"
+       local pkgname="$2"
+
+       if [ -f "$root/lib/apk/packages/${pkgname}.alternatives" ]; then
+               for pkg_alt in $(cat $root/lib/apk/packages/${pkgname}.alternatives); do
+                       local best_prio=0;
+                       local best_src="/bin/busybox";
+                       pkg_prio=${pkg_alt%%:*};
+                       pkg_target=${pkg_alt#*:};
+                       pkg_target=${pkg_target%:*};
+                       pkg_src=${pkg_alt##*:};
+
+                       if [ -e "$root/$target" ]; then
+                               for alts in $root/lib/apk/packages/*.alternatives; do
+                                       for alt in $(cat $alts); do
+                                               prio=${alt%%:*};
+                                               target=${alt#*:};
+                                               target=${target%:*};
+                                               src=${alt##*:};
+
+                                               if [ "$target" = "$pkg_target" ] &&
+                                                  [ "$src" != "$pkg_src" ] &&
+                                                  [ "$best_prio" -lt "$prio" ]; then
+                                                       best_prio=$prio;
+                                                       best_src=$src;
+                                               fi
+                                       done
+                               done
+                       fi
+                       case "$action" in
+                               install)
+                                       if [ "$best_prio" -lt "$pkg_prio" ]; then
+                                               ln -sf "$pkg_src" "$root/$pkg_target"
+                                               echo "add alternative: $pkg_target -> $pkg_src"
+                                       fi
+                               ;;
+                               remove)
+                                       if [ "$best_prio" -lt "$pkg_prio" ]; then
+                                               ln -sf "$best_src" "$root/$pkg_target"
+                                               echo "add alternative: $pkg_target -> $best_src"
+                                       fi
+                               ;;
+                       esac
+               done
+       fi
+}
+
 default_postinst() {
        local root="${IPKG_INSTROOT}"
-       local pkgname="$(basename ${1%.*})"
-       local filelist="/usr/lib/opkg/info/${pkgname}.list"
+       [ -z "$pkgname" ] && local pkgname="$(basename ${1%.*})"
+       local filelist="${root}/usr/lib/opkg/info/${pkgname}.list"
+       [ -f "$root/lib/apk/packages/${pkgname}.list" ] && filelist="$root/lib/apk/packages/${pkgname}.list"
        local ret=0
 
-       add_group_and_user "${pkgname}"
+       if [ -e "${root}/usr/lib/opkg/info/${pkgname}.list" ]; then
+               filelist="${root}/usr/lib/opkg/info/${pkgname}.list"
+               add_group_and_user "${pkgname}"
+       fi
 
-       if [ -f "$root/usr/lib/opkg/info/${pkgname}.postinst-pkg" ]; then
-               ( . "$root/usr/lib/opkg/info/${pkgname}.postinst-pkg" )
-               ret=$?
+       if [ -e "${root}/lib/apk/packages/${pkgname}.list" ]; then
+               filelist="${root}/lib/apk/packages/${pkgname}.list"
+               update_alternatives install "${pkgname}"
        fi
 
        if [ -d "$root/rootfs-overlay" ]; then
@@ -292,8 +382,13 @@ default_postinst() {
                rm -f /tmp/luci-indexcache
        fi
 
+       if [ -f "$root/usr/lib/opkg/info/${pkgname}.postinst-pkg" ]; then
+               ( . "$root/usr/lib/opkg/info/${pkgname}.postinst-pkg" )
+               ret=$?
+       fi
+
        local shell="$(command -v bash)"
-       for i in $(grep -s "^/etc/init.d/" "$root$filelist"); do
+       for i in $(grep -s "^/etc/init.d/" "$filelist"); do
                if [ -n "$root" ]; then
                        ${shell:-/bin/sh} "$root/etc/rc.common" "$root$i" enable
                else
@@ -315,6 +410,11 @@ include() {
        done
 }
 
+ipcalc() {
+       set -- $(ipcalc.sh "$@")
+       [ $? -eq 0 ] && export -- "$@"
+}
+
 find_mtd_index() {
        local PART="$(grep "\"$1\"" /proc/mtd | awk -F: '{print $1}')"
        local INDEX="${PART##mtd}"
@@ -371,7 +471,7 @@ group_add_next() {
                return
        fi
        gids=$(cut -d: -f3 ${IPKG_INSTROOT}/etc/group)
-       gid=65536
+       gid=32768
        while echo "$gids" | grep -q "^$gid$"; do
                gid=$((gid + 1))
        done
@@ -386,7 +486,9 @@ group_add_user() {
        echo "$grp" | grep -q ":$" && delim=""
        [ -n "$IPKG_INSTROOT" ] || lock /var/lock/passwd
        sed -i "s/$grp/$grp$delim$2/g" ${IPKG_INSTROOT}/etc/group
-       selinuxenabled 2>/dev/null && restorecon /etc/group
+       if [ -z "$IPKG_INSTROOT" ] && [ -x /usr/sbin/selinuxenabled ] && selinuxenabled; then
+               restorecon /etc/group
+       fi
        [ -n "$IPKG_INSTROOT" ] || lock -u /var/lock/passwd
 }
 
@@ -400,7 +502,7 @@ user_add() {
        local rc
        [ -z "$uid" ] && {
                uids=$(cut -d: -f3 ${IPKG_INSTROOT}/etc/passwd)
-               uid=65536
+               uid=32768
                while echo "$uids" | grep -q "^$uid$"; do
                        uid=$((uid + 1))
                done
@@ -431,4 +533,4 @@ cmdline_get_var() {
        done
 }
 
-[ -z "$IPKG_INSTROOT" ] && [ -f /lib/config/uci.sh ] && . /lib/config/uci.sh
+[ -z "$IPKG_INSTROOT" ] && [ -f /lib/config/uci.sh ] && . /lib/config/uci.sh || true