mirror of
https://github.com/coolsnowwolf/lede.git
synced 2025-04-16 04:13:31 +00:00
base-files: ipcalc.sh: check for params before calculating start/end
This commit is contained in:
parent
864e344469
commit
8527c75281
@ -1,6 +1,5 @@
|
|||||||
#!/bin/sh
|
#!/usr/bin/awk -f
|
||||||
|
|
||||||
awk -f - $* <<EOF
|
|
||||||
function bitcount(c) {
|
function bitcount(c) {
|
||||||
c=and(rshift(c, 1),0x55555555)+and(c,0x55555555)
|
c=and(rshift(c, 1),0x55555555)+and(c,0x55555555)
|
||||||
c=and(rshift(c, 2),0x33333333)+and(c,0x33333333)
|
c=and(rshift(c, 2),0x33333333)+and(c,0x33333333)
|
||||||
@ -11,14 +10,20 @@ function bitcount(c) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function ip2int(ip) {
|
function ip2int(ip) {
|
||||||
for (ret=0,n=split(ip,a,"\."),x=1;x<=n;x++) ret=or(lshift(ret,8),a[x])
|
ret=0
|
||||||
|
n=split(ip,a,"\\.")
|
||||||
|
for (x=1;x<=n;x++)
|
||||||
|
ret=or(lshift(ret,8),a[x])
|
||||||
return ret
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
function int2ip(ip,ret,x) {
|
function int2ip(ip,ret,x) {
|
||||||
ret=and(ip,255)
|
ret=and(ip,255)
|
||||||
ip=rshift(ip,8)
|
ip=rshift(ip,8)
|
||||||
for(;x<3;ret=and(ip,255)"."ret,ip=rshift(ip,8),x++);
|
for(;x<3;x++) {
|
||||||
|
ret=and(ip,255)"."ret
|
||||||
|
ip=rshift(ip,8)
|
||||||
|
}
|
||||||
return ret
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -44,28 +49,40 @@ BEGIN {
|
|||||||
}
|
}
|
||||||
|
|
||||||
network=and(ipaddr,netmask)
|
network=and(ipaddr,netmask)
|
||||||
|
prefix=32-bitcount(compl32(netmask))
|
||||||
broadcast=or(network,compl32(netmask))
|
broadcast=or(network,compl32(netmask))
|
||||||
|
|
||||||
start=or(network,and(ip2int(ARGV[3]),compl32(netmask)))
|
|
||||||
limit=network+1
|
|
||||||
if (start<limit) start=limit
|
|
||||||
|
|
||||||
end=start+ARGV[4]
|
|
||||||
limit=or(network,compl32(netmask))-1
|
|
||||||
if (end>limit) end=limit
|
|
||||||
|
|
||||||
print "IP="int2ip(ipaddr)
|
print "IP="int2ip(ipaddr)
|
||||||
print "NETMASK="int2ip(netmask)
|
print "NETMASK="int2ip(netmask)
|
||||||
print "BROADCAST="int2ip(broadcast)
|
print "BROADCAST="int2ip(broadcast)
|
||||||
print "NETWORK="int2ip(network)
|
print "NETWORK="int2ip(network)
|
||||||
print "PREFIX="32-bitcount(compl32(netmask))
|
print "PREFIX="prefix
|
||||||
|
|
||||||
# range calculations:
|
# range calculations:
|
||||||
# ipcalc <ip> <netmask> <start> <num>
|
# ipcalc <ip> <netmask> <start> <num>
|
||||||
|
|
||||||
if (ARGC > 3) {
|
if (ARGC <= 3)
|
||||||
print "START="int2ip(start)
|
exit(0)
|
||||||
print "END="int2ip(end)
|
|
||||||
|
start=or(network,and(ip2int(ARGV[3]),compl32(netmask)))
|
||||||
|
limit=network+1
|
||||||
|
if (start<limit) start=limit
|
||||||
|
if (start==ipaddr) start=ipaddr+1
|
||||||
|
|
||||||
|
end=start+ARGV[4]
|
||||||
|
limit=or(network,compl32(netmask))-1
|
||||||
|
if (end>limit) end=limit
|
||||||
|
if (end==ipaddr) end=ipaddr-1
|
||||||
|
|
||||||
|
if (start>end) {
|
||||||
|
print "network ("int2ip(network)"/"prefix") too small" > "/dev/stderr"
|
||||||
|
exit(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ipaddr > start && ipaddr < end) {
|
||||||
|
print "warning: ipaddr inside range - this might not be supported in future releases of Openwrt" > "/dev/stderr"
|
||||||
|
}
|
||||||
|
|
||||||
|
print "START="int2ip(start)
|
||||||
|
print "END="int2ip(end)
|
||||||
}
|
}
|
||||||
EOF
|
|
||||||
|
Loading…
Reference in New Issue
Block a user