dovecot-1.1: Moved net_is_in_network() to lib/network.c.
dovecot at dovecot.org
dovecot at dovecot.org
Thu May 15 07:43:17 EEST 2008
details: http://hg.dovecot.org/dovecot-1.1/rev/e0007da64cdc
changeset: 7517:e0007da64cdc
user: Timo Sirainen <tss at iki.fi>
date: Thu May 15 07:43:13 2008 +0300
description:
Moved net_is_in_network() to lib/network.c.
diffstat:
4 files changed, 91 insertions(+), 41 deletions(-)
src/auth/auth-request.c | 43 ++-----------------------------------------
src/lib/network.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++
src/lib/network.h | 4 ++++
src/tests/test-lib.c | 38 ++++++++++++++++++++++++++++++++++++++
diffs (190 lines):
diff -r 7a7cf6662302 -r e0007da64cdc src/auth/auth-request.c
--- a/src/auth/auth-request.c Thu May 15 07:01:40 2008 +0300
+++ b/src/auth/auth-request.c Thu May 15 07:43:13 2008 +0300
@@ -870,11 +870,9 @@ bool auth_request_set_login_username(str
static int is_ip_in_network(const char *network, const struct ip_addr *ip)
{
- const uint32_t *ip1, *ip2;
struct ip_addr src_ip, net_ip;
const char *p;
- unsigned int max_bits, bits, pos, i;
- uint32_t mask;
+ unsigned int max_bits, bits;
if (net_ipv6_mapped_ipv4_convert(ip, &src_ip) == 0)
ip = &src_ip;
@@ -895,44 +893,7 @@ static int is_ip_in_network(const char *
if (net_addr2ip(network, &net_ip) < 0)
return -1;
- if (IPADDR_IS_V4(ip) != IPADDR_IS_V4(&net_ip)) {
- /* one is IPv6 and one is IPv4 */
- return 0;
- }
- i_assert(IPADDR_IS_V6(ip) == IPADDR_IS_V6(&net_ip));
-
- if (IPADDR_IS_V4(ip)) {
- ip1 = &ip->u.ip4.s_addr;
- ip2 = &net_ip.u.ip4.s_addr;
- } else {
-#ifdef HAVE_IPV6
- ip1 = (const void *)&ip->u.ip6;
- ip2 = (const void *)&net_ip.u.ip6;
-#else
- /* shouldn't get here */
- return -1;
-#endif
- }
-
- /* check first the full 32bit ints */
- for (pos = 0, i = 0; pos + 32 <= bits; pos += 32, i++) {
- if (ip1[i] != ip2[i])
- return 0;
- }
-
- /* check the last full bytes */
- for (mask = 0xff; pos + 8 <= bits; pos += 8, mask <<= 8) {
- if ((ip1[i] & mask) != (ip2[i] & mask))
- return 0;
- }
-
- /* check the last bits, they're reversed in bytes */
- bits -= pos;
- for (mask = 0x80 << (pos % 32); bits > 0; bits--, mask >>= 1) {
- if ((ip1[i] & mask) != (ip2[i] & mask))
- return 0;
- }
- return 1;
+ return net_is_in_network(ip, &net_ip, bits);
}
static void auth_request_validate_networks(struct auth_request *request,
diff -r 7a7cf6662302 -r e0007da64cdc src/lib/network.c
--- a/src/lib/network.c Thu May 15 07:01:40 2008 +0300
+++ b/src/lib/network.c Thu May 15 07:43:13 2008 +0300
@@ -703,3 +703,50 @@ bool is_ipv6_address(const char *addr)
return TRUE;
}
+
+bool net_is_in_network(const struct ip_addr *ip,
+ const struct ip_addr *net_ip, unsigned int bits)
+{
+ const uint32_t *ip1, *ip2;
+ uint32_t mask;
+ unsigned int pos, i;
+
+ if (IPADDR_IS_V4(ip) != IPADDR_IS_V4(net_ip)) {
+ /* one is IPv6 and one is IPv4 */
+ return FALSE;
+ }
+ i_assert(IPADDR_IS_V6(ip) == IPADDR_IS_V6(net_ip));
+
+ if (IPADDR_IS_V4(ip)) {
+ ip1 = &ip->u.ip4.s_addr;
+ ip2 = &net_ip->u.ip4.s_addr;
+ } else {
+#ifdef HAVE_IPV6
+ ip1 = (const void *)&ip->u.ip6;
+ ip2 = (const void *)&net_ip->u.ip6;
+#else
+ /* shouldn't get here */
+ return FALSE;
+#endif
+ }
+
+ /* check first the full 32bit ints */
+ for (pos = 0, i = 0; pos + 32 <= bits; pos += 32, i++) {
+ if (ip1[i] != ip2[i])
+ return FALSE;
+ }
+
+ /* check the last full bytes */
+ for (mask = 0xff; pos + 8 <= bits; pos += 8, mask <<= 8) {
+ if ((ip1[i] & mask) != (ip2[i] & mask))
+ return FALSE;
+ }
+
+ /* check the last bits, they're reversed in bytes */
+ bits -= pos;
+ for (mask = 0x80 << (pos % 32); bits > 0; bits--, mask >>= 1) {
+ if ((ip1[i] & mask) != (ip2[i] & mask))
+ return FALSE;
+ }
+ return TRUE;
+}
diff -r 7a7cf6662302 -r e0007da64cdc src/lib/network.h
--- a/src/lib/network.h Thu May 15 07:01:40 2008 +0300
+++ b/src/lib/network.h Thu May 15 07:43:13 2008 +0300
@@ -110,4 +110,8 @@ bool is_ipv4_address(const char *addr);
bool is_ipv4_address(const char *addr);
bool is_ipv6_address(const char *addr);
+/* Returns TRUE if ip is in net_ip/bits network. */
+bool net_is_in_network(const struct ip_addr *ip,
+ const struct ip_addr *net_ip, unsigned int bits);
+
#endif
diff -r 7a7cf6662302 -r e0007da64cdc src/tests/test-lib.c
--- a/src/tests/test-lib.c Thu May 15 07:01:40 2008 +0300
+++ b/src/tests/test-lib.c Thu May 15 07:43:13 2008 +0300
@@ -6,6 +6,7 @@
#include "base64.h"
#include "bsearch-insert-pos.h"
#include "aqueue.h"
+#include "network.h"
#include "priorityq.h"
#include "seq-range-array.h"
#include "str-sanitize.h"
@@ -366,6 +367,42 @@ static void test_mempool_alloconly(void)
test_out("mempool_alloconly", success);
}
+struct test_net_is_in_network_input {
+ const char *ip;
+ const char *net;
+ unsigned int bits;
+ bool ret;
+};
+
+static void test_net_is_in_network(void)
+{
+ static struct test_net_is_in_network_input input[] = {
+ { "1.2.3.4", "1.2.3.4", 32, TRUE },
+ { "1.2.3.4", "1.2.3.3", 32, FALSE },
+ { "1.2.3.4", "1.2.3.5", 32, FALSE },
+ { "1.2.3.4", "1.2.2.4", 32, FALSE },
+ { "1.2.3.4", "1.1.3.4", 32, FALSE },
+ { "1.2.3.4", "0.2.3.4", 32, FALSE },
+ { "1.2.3.253", "1.2.3.254", 31, FALSE },
+ { "1.2.3.254", "1.2.3.254", 31, TRUE },
+ { "1.2.3.255", "1.2.3.254", 31, TRUE },
+ { "1.2.3.255", "1.2.3.0", 24, TRUE },
+ { "1.2.255.255", "1.2.254.0", 23, TRUE },
+ { "255.255.255.255", "128.0.0.0", 1, TRUE }
+ };
+ struct ip_addr ip, net_ip;
+ unsigned int i;
+ bool success;
+
+ for (i = 0; i < N_ELEMENTS(input); i++) {
+ net_addr2ip(input[i].ip, &ip);
+ net_addr2ip(input[i].net, &net_ip);
+ success = net_is_in_network(&ip, &net_ip, input[i].bits) ==
+ input[i].ret;
+ test_out(t_strdup_printf("net_is_in_network(%u)", i), success);
+ }
+}
+
struct pq_test_item {
struct priorityq_item item;
int num;
@@ -680,6 +717,7 @@ int main(void)
test_bsearch_insert_pos,
test_buffer,
test_mempool_alloconly,
+ test_net_is_in_network,
test_priorityq,
test_seq_range_array,
test_str_sanitize,
More information about the dovecot-cvs
mailing list