Skip to content

Commit dc32ea5

Browse files
committed
fix: mask_to_prefix function
1 parent 28db026 commit dc32ea5

2 files changed

Lines changed: 44 additions & 11 deletions

File tree

‎system/cuos/init.sh‎

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -197,18 +197,28 @@ mask_to_prefix() {
197197
echo ""
198198
return
199199
fi
200-
# convert to binary and count bits
201-
local bin
202-
bin=$(printf '%08d' "$(bc <<< "obase=2;$oct")" 2>/dev/null || true)
203-
# fallback if bc missing: use printf + awk (POSIX-friendly)
204-
if [ -z "$bin" ] || [ "$bin" = "00000000" ]; then
205-
# portable conversion
206-
bin=$(printf '%08d' "$(echo "obase=2;$oct" | bc)" 2>/dev/null || printf '%08d' "$oct")
200+
if [[ "$bits" != 0 && "$bits" != 8 && "$bits" != 16 && "$bits" != 24 && $oct != 0 ]]; then
201+
# invalid/non-contiguous octet (e.g., 127, 3, 31)
202+
echo ""
203+
return
207204
fi
208-
# Count ones
209-
local ones
210-
ones=$(echo -n "$bin" | tr -cd '1' | wc -c)
211-
bits=$((bits + ones))
205+
# count ones in the octet
206+
case $oct in
207+
0) bits=$((bits+0)) ;;
208+
128) bits=$((bits+1)) ;;
209+
192) bits=$((bits+2)) ;;
210+
224) bits=$((bits+3)) ;;
211+
240) bits=$((bits+4)) ;;
212+
248) bits=$((bits+5)) ;;
213+
252) bits=$((bits+6)) ;;
214+
254) bits=$((bits+7)) ;;
215+
255) bits=$((bits+8)) ;;
216+
*)
217+
# invalid/non-contiguous octet (e.g., 127, 3, 31)
218+
echo ""
219+
return
220+
;;
221+
esac
212222
done
213223
echo "$bits"
214224
}

‎system/cuos/init.test.sh‎

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,29 @@ source "${SCRIPT_DIR}/lib-test.sh"
1616
# shellcheck source=/dev/null
1717
source "${SCRIPT_DIR}/init.sh"
1818

19+
expect "mask_to_prefix cdr" \
20+
"25" \
21+
mask_to_prefix "25"
22+
23+
expect "mask_to_prefix 16" "16" mask_to_prefix "255.255.0.0"
24+
expect "mask_to_prefix 17" "17" mask_to_prefix "255.255.128.0"
25+
expect "mask_to_prefix 18" "18" mask_to_prefix "255.255.192.0"
26+
expect "mask_to_prefix 19" "19" mask_to_prefix "255.255.224.0"
27+
expect "mask_to_prefix 20" "20" mask_to_prefix "255.255.240.0"
28+
expect "mask_to_prefix 21" "21" mask_to_prefix "255.255.248.0"
29+
expect "mask_to_prefix 22" "22" mask_to_prefix "255.255.252.0"
30+
expect "mask_to_prefix 23" "23" mask_to_prefix "255.255.254.0"
31+
expect "mask_to_prefix 24" "24" mask_to_prefix "255.255.255.0"
32+
expect "mask_to_prefix 25" "25" mask_to_prefix "255.255.255.128"
33+
expect "mask_to_prefix 26" "26" mask_to_prefix "255.255.255.192"
34+
expect "mask_to_prefix 27" "27" mask_to_prefix "255.255.255.224"
35+
expect "mask_to_prefix 28" "28" mask_to_prefix "255.255.255.240"
36+
expect "mask_to_prefix 29" "29" mask_to_prefix "255.255.255.248"
37+
expect "mask_to_prefix 30" "30" mask_to_prefix "255.255.255.252"
38+
expect "mask_to_prefix 31" "31" mask_to_prefix "255.255.255.254"
39+
expect "mask_to_prefix 32" "32" mask_to_prefix "255.255.255.255"
40+
41+
expect "mask_to_prefix invalid" "" mask_to_prefix "255.255.252.128"
1942

2043
export CONFIG_PATH="${SCRIPT_DIR}/init.test.system.json"
2144
export T_FILE_DOCKER_DAEMON="/dev/stdout"

0 commit comments

Comments
 (0)