public function check($ip, $list) { $v4 = !nforum_is_ipv6($ip); foreach ((array) $list as $v) { if (!is_string($v[0])) { continue; } $tv4 = strpos($v[0], ':') === false; if ($v4 && $tv4) { if (mask_equal(ip2long($ip), ip2long($v[0]), $v[1])) { return $v[2]; } } else { if (!$v4 && !$tv4) { $arr1 = ipv62long($ip); $arr2 = ipv62long($v[0]); if ($v[1] > MASK_NUM_V6) { if (!mask_equal_v6($arr1[1], $arr2[1], $v[1] - MASK_NUM_V6)) { continue; } } $mask = $v[1] > MASK_NUM_V6 ? MASK_NUM_V6 : $v[1]; if (mask_equal_v6($arr1[0], $arr2[0], $mask)) { return $v[2]; } } } } return true; }
/** * test whether $ip1 and $ip2 will include each other return the wide one * @param $ip1(array("ip", "mask")) number of ip * @param $ip2(array("ip", "mask")) number of ip * @param $type(int) max number of mask MASK_NUM_V4 default * @return the wide one or false * @author xw */ function ip_conflict($ip1, $ip2, $type = MASK_NUM_V4) { /*{{{*/ if ($ip1['mask'] > $ip2['mask']) { $mask = $ip2['mask']; if (mask_equal($ip1['ip'], $ip2['ip'], $mask, $type)) { return $ip1; } } else { if ($ip1['mask'] < $ip2['mask']) { $mask = $ip1['mask']; if (mask_equal($ip1['ip'], $ip2['ip'], $mask, $type)) { return $ip2; } } else { if ($ip1['ip'] == $ip2['ip']) { return $ip1; } } } return false; }