X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fshared%2Fnet-util.c;h=ba21ae437f3da968aae980c584a32c07a0ffca1c;hp=8f8cfc9fdb6d7fe6ece6b9ede732c13a85ec4d95;hb=c50e4f95d8cfcd21bde2b0d1ff24b4de8fef4976;hpb=449f75549247b3b7b073a788f0f099ce6b7c5378 diff --git a/src/shared/net-util.c b/src/shared/net-util.c index 8f8cfc9fd..ba21ae437 100644 --- a/src/shared/net-util.c +++ b/src/shared/net-util.c @@ -58,6 +58,12 @@ bool net_match_config(const struct ether_addr *match_mac, return 1; } +unsigned net_netmask_to_prefixlen(const struct in_addr *addr) { + assert(addr); + + return 32 - u32ctz(be32toh(addr->s_addr)); +} + int config_parse_ifname(const char *unit, const char *filename, unsigned line, @@ -192,16 +198,24 @@ int net_parse_inaddr(const char *address, unsigned char *family, void *dst) { /* IPv4 */ r = inet_pton(AF_INET, address, dst); - if (r > 0) - *family = AF_INET; /* successfully parsed IPv4 address */ - else if (r < 0) + if (r > 0) { + /* succsefully parsed IPv4 address */ + if (*family == AF_UNSPEC) + *family = AF_INET; + else if (*family != AF_INET) + return -EINVAL; + } else if (r < 0) return -errno; else { /* not an IPv4 address, so let's try IPv6 */ r = inet_pton(AF_INET6, address, dst); - if (r > 0) - *family = AF_INET6; /* successfully parsed IPv6 address */ - else if (r < 0) + if (r > 0) { + /* successfully parsed IPv6 address */ + if (*family == AF_UNSPEC) + *family = AF_INET6; + else if (*family != AF_INET6) + return -EINVAL; + } else if (r < 0) return -errno; else return -EINVAL;