/lib/functions.sh: move rarely used mtd and macaddr related functions to /lib/functio...
[openwrt/svn-archive/archive.git] / package / base-files / files / lib / functions / system.sh
diff --git a/package/base-files/files/lib/functions/system.sh b/package/base-files/files/lib/functions/system.sh
new file mode 100644 (file)
index 0000000..7655460
--- /dev/null
@@ -0,0 +1,118 @@
+# Copyright (C) 2006-2013 OpenWrt.org
+
+find_mtd_index() {
+       local PART="$(grep "\"$1\"" /proc/mtd | awk -F: '{print $1}')"
+       local INDEX="${PART##mtd}"
+
+       echo ${INDEX}
+}
+
+find_mtd_chardev() {
+       local INDEX=$(find_mtd_index "$1")
+       local PREFIX=/dev/mtd
+
+       [ -d /dev/mtd ] && PREFIX=/dev/mtd/
+       echo "${INDEX:+$PREFIX$INDEX}"
+}
+
+mtd_get_mac_ascii()
+{
+       local mtdname="$1"
+       local key="$2"
+       local part
+       local mac_dirty
+
+       part=$(find_mtd_part "$mtdname")
+       if [ -z "$part" ]; then
+               echo "mtd_get_mac_ascii: partition $mtdname not found!" >&2
+               return
+       fi
+
+       mac_dirty=$(strings "$part" | sed -n 's/^'"$key"'=//p')
+
+       # "canonicalize" mac
+       [ -n "$mac_dirty" ] && macaddr_canonicalize "$mac_dirty"
+}
+
+mtd_get_mac_binary() {
+       local mtdname="$1"
+       local offset="$2"
+       local part
+
+       part=$(find_mtd_part "$mtdname")
+       if [ -z "$part" ]; then
+               echo "mtd_get_mac_binary: partition $mtdname not found!" >&2
+               return
+       fi
+
+       dd bs=1 skip=$offset count=6 if=$part 2>/dev/null | hexdump -v -n 6 -e '5/1 "%02x:" 1/1 "%02x"'
+}
+
+mtd_get_part_size() {
+       local part_name=$1
+       local first dev size erasesize name
+       while read dev size erasesize name; do
+               name=${name#'"'}; name=${name%'"'}
+               if [ "$name" = "$part_name" ]; then
+                       echo $((0x$size))
+                       break
+               fi
+       done < /proc/mtd
+}
+
+macaddr_add() {
+       local mac=$1
+       local val=$2
+       local oui=${mac%:*:*:*}
+       local nic=${mac#*:*:*:}
+
+       nic=$(printf "%06x" $((0x${nic//:/} + $val & 0xffffff)) | sed 's/^\(.\{2\}\)\(.\{2\}\)\(.\{2\}\)/\1:\2:\3/')
+       echo $oui:$nic
+}
+
+macaddr_setbit_la()
+{
+       local mac=$1
+
+       printf "%02x:%s" $((0x${mac%%:*} | 0x02)) ${mac#*:}
+}
+
+macaddr_2bin()
+{
+       local mac=$1
+
+       echo -ne \\x${mac//:/\\x}
+}
+
+macaddr_canonicalize()
+{
+       local mac="$1"
+       local canon=""
+
+       [ ${#mac} -gt 17 ] && return
+       [ -n "${mac//[a-fA-F0-9\.: -]/}" ] && return
+
+       for octet in ${mac//[\.:-]/ }; do
+               case "${#octet}" in
+               1)
+                       octet="0${octet}"
+                       ;;
+               2)
+                       ;;
+               4)
+                       octet="${octet:0:2} ${octet:2:2}"
+                       ;;
+               12)
+                       octet="${octet:0:2} ${octet:2:2} ${octet:4:2} ${octet:6:2} ${octet:8:2} ${octet:10:2}"
+                       ;;
+               *)
+                       return
+                       ;;
+               esac
+               canon=${canon}${canon:+ }${octet}
+       done
+
+       [ ${#canon} -ne 17 ] && return
+
+       printf "%02x:%02x:%02x:%02x:%02x:%02x" 0x${canon// / 0x} 2>/dev/null
+}