X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fnetwork%2Fnetworkd-address.c;h=34863b2f69ab8507412abc4e491cd01e29e3209c;hb=9505d3c6deda0452c22ab2ed47bca74b98d87a17;hp=e6e3f8f06788bff8f58abb36fe7b19345ea3d398;hpb=3d3d425547a3f38473fcf8737b85dfebb630479d;p=elogind.git diff --git a/src/network/networkd-address.c b/src/network/networkd-address.c index e6e3f8f06..34863b2f6 100644 --- a/src/network/networkd-address.c +++ b/src/network/networkd-address.c @@ -313,7 +313,8 @@ int config_parse_dns(const char *unit, const char *rvalue, void *data, void *userdata) { - Set **dns = data; + Network *network = userdata; + Address *tail; _cleanup_address_free_ Address *n = NULL; int r; @@ -321,7 +322,7 @@ int config_parse_dns(const char *unit, assert(section); assert(lvalue); assert(rvalue); - assert(data); + assert(network); r = address_new_dynamic(&n); if (r < 0) @@ -334,7 +335,8 @@ int config_parse_dns(const char *unit, return 0; } - set_put(*dns, n); + LIST_FIND_TAIL(addresses, network->dns, tail); + LIST_INSERT_AFTER(addresses, network->dns, tail, n); n = NULL; return 0; @@ -506,3 +508,46 @@ int config_parse_label(const char *unit, return 0; } + +bool address_equal(Address *a1, Address *a2) { + /* same object */ + if (a1 == a2) + return true; + + /* one, but not both, is NULL */ + if (!a1 || !a2) + return false; + + if (a1->family != a2->family) + return false; + + switch (a1->family) { + /* use the same notion of equality as the kernel does */ + case AF_UNSPEC: + return true; + + case AF_INET: + if (a1->prefixlen != a2->prefixlen) + return false; + else { + uint32_t b1, b2; + + b1 = be32toh(a1->in_addr.in.s_addr); + b2 = be32toh(a2->in_addr.in.s_addr); + + return (b1 >> (32 - a1->prefixlen)) == (b2 >> (32 - a1->prefixlen)); + } + + case AF_INET6: + { + uint64_t *b1, *b2; + + b1 = (uint64_t*)&a1->in_addr.in6; + b2 = (uint64_t*)&a2->in_addr.in6; + + return (((b1[0] ^ b2[0]) | (b1[1] ^ b2[1])) == 0UL); + } + default: + assert_not_reached("Invalid address family"); + } +}