return false;
},
+ 'ipmask': function()
+ {
+ return cbi_validators.ipmask4.apply(this) ||
+ cbi_validators.ipmask6.apply(this);
+ },
+
+ 'ipmask4': function()
+ {
+ var ip = this, mask = 32;
+
+ if (ip.match(/^(\S+)\/(\S+)$/))
+ {
+ ip = RegExp.$1;
+ mask = RegExp.$2;
+ }
+
+ if (!isNaN(mask) && (mask < 0 || mask > 32))
+ return false;
+
+ if (isNaN(mask) && !cbi_validators.ip4addr.apply(mask))
+ return false;
+
+ return cbi_validators.ip4addr.apply(ip);
+ },
+
+ 'ipmask6': function()
+ {
+ var ip = this, mask = 128;
+
+ if (ip.match(/^(\S+)\/(\S+)$/))
+ {
+ ip = RegExp.$1;
+ mask = RegExp.$2;
+ }
+
+ if (!isNaN(mask) && (mask < 0 || mask > 128))
+ return false;
+
+ if (isNaN(mask) && !cbi_validators.ip6addr.apply(mask))
+ return false;
+
+ return cbi_validators.ip6addr.apply(ip);
+ },
+
'port': function()
{
var p = Int(this);
return ( val and val >= 0 and val <= 128 )
end
+function ipmask(val)
+ return ipmask4(val) or ipmask6(val)
+end
+
+function ipmask4(val)
+ local ip, mask = val:match("^([^/]+)/([^/]+)$")
+ local bits = tonumber(mask)
+
+ if bits and bits < 0 or bits > 32 then
+ return false
+ end
+
+ if not bits and not ip4addr(mask) then
+ return false
+ end
+
+ return ip4addr(ip or val)
+end
+
+function ipmask6(val)
+ local ip, mask = val:match("^([^/]+)/([^/]+)$")
+ local bits = tonumber(mask)
+
+ if bits and bits < 0 or bits > 128 then
+ return false
+ end
+
+ if not bits and not ip6addr(mask) then
+ return false
+ end
+
+ return ip6addr(ip or val)
+end
+
function port(val)
val = tonumber(val)
return ( val and val >= 0 and val <= 65535 )