e6592e2b4a417630d0e0a9b617099697c1653e03
3 .
/lib
/functions
/ipv4.sh
5 PROG
="$(basename "$0")"
7 # hook for library function
10 assert_uint32
"$n" ||
exit 1
12 if [ "$decimal" -ne 0 ]; then
14 elif [ "$hexadecimal" -ne 0 ]; then
15 export -- "$var=$(printf "%x
" "$n")"
22 echo "Usage: $PROG [ -d | -x ] address/prefix [ start limit ]" >&2
28 if [ "$1" = "-d" ]; then
31 elif [ "$1" = "-x" ]; then
42 str2ip ipaddr
"${1%/*}" ||
exit 1
43 str2ip netmask
"${1#*/}" ||
exit 1
47 str2ip ipaddr
"${1%/*}" ||
exit 1
49 assert_uint32
"$prefix" ||
exit 1
50 if [ "$prefix" -gt 32 ]; then
51 printf "Prefix out of range (%s)\n" "$prefix" >&2
54 netmask
=$
(((0xffffffff << (32 - prefix
)) & 0xffffffff))
58 str2ip ipaddr
"$1" ||
exit 1
59 str2ip netmask
"$2" ||
exit 1
64 if [ $# -ne 0 ] && [ $# -ne 2 ]; then
68 if ! bitcount prefix
"$netmask"; then
69 printf "Invalid netmask (%s)\n" "$netmask" >&2
73 # complement of the netmask, i.e. the hostmask
74 hostmask
=$
((netmask ^
0xffffffff))
75 network
=$
((ipaddr
& netmask
))
76 broadcast
=$
((network | hostmask
))
79 _ip2str NETMASK
"$netmask"
80 _ip2str NETWORK
"$network"
83 echo "NETMASK=$NETMASK"
84 if [ "$prefix" -le 30 ]; then
85 _ip2str BROADCAST
"$broadcast"
86 echo "BROADCAST=$BROADCAST"
88 echo "NETWORK=$NETWORK"
91 [ $# -eq 0 ] && exit 0
93 if [ "$prefix" -le 30 ]; then
94 lower
=$
((network
+ 1))
100 assert_uint32
"$start" ||
exit 1
101 start
=$
((network |
(start
& hostmask
)))
102 [ "$start" -lt "$lower" ] && start
="$lower"
103 [ "$start" -eq "$ipaddr" ] && start
=$
((start
+ 1))
105 if [ "$prefix" -le 30 ]; then
106 upper
=$
(((network | hostmask
) - 1))
112 assert_uint32
"$range" ||
exit 1
113 end
=$
((start
+ range
- 1))
114 [ "$end" -gt "$upper" ] && end
="$upper"
115 [ "$end" -eq "$ipaddr" ] && end
=$
((end
- 1))
117 if [ "$start" -gt "$end" ]; then
118 echo "network ($NETWORK/$prefix) too small" >&2
122 _ip2str START
"$start"
125 if [ "$start" -le "$ipaddr" ] && [ "$ipaddr" -le "$end" ]; then
126 echo "error: address $IP inside range $START..$END" >&2