]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
in-addr-util: introduce in{4,6}_addr_mask()
authorYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 17 Sep 2021 12:38:00 +0000 (21:38 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 6 Oct 2021 16:03:06 +0000 (01:03 +0900)
src/basic/in-addr-util.c
src/basic/in-addr-util.h

index c262dfe15605eac73549c342f7301fb38493c713..af3724d9d1fb7300b08ef483f3ca2a8dff9cd350 100644 (file)
@@ -621,40 +621,49 @@ int in4_addr_default_subnet_mask(const struct in_addr *addr, struct in_addr *mas
         return 0;
 }
 
-int in_addr_mask(int family, union in_addr_union *addr, unsigned char prefixlen) {
-        assert(addr);
-
-        if (family == AF_INET) {
-                struct in_addr mask;
+int in4_addr_mask(struct in_addr *addr, unsigned char prefixlen) {
+        struct in_addr mask;
 
-                if (!in4_addr_prefixlen_to_netmask(&mask, prefixlen))
-                        return -EINVAL;
+        assert(addr);
 
-                addr->in.s_addr &= mask.s_addr;
-                return 0;
-        }
+        if (!in4_addr_prefixlen_to_netmask(&mask, prefixlen))
+                return -EINVAL;
 
-        if (family == AF_INET6) {
-                unsigned i;
+        addr->s_addr &= mask.s_addr;
+        return 0;
+}
 
-                for (i = 0; i < 16; i++) {
-                        uint8_t mask;
+int in6_addr_mask(struct in6_addr *addr, unsigned char prefixlen) {
+        unsigned i;
 
-                        if (prefixlen >= 8) {
-                                mask = 0xFF;
-                                prefixlen -= 8;
-                        } else {
-                                mask = 0xFF << (8 - prefixlen);
-                                prefixlen = 0;
-                        }
+        for (i = 0; i < 16; i++) {
+                uint8_t mask;
 
-                        addr->in6.s6_addr[i] &= mask;
+                if (prefixlen >= 8) {
+                        mask = 0xFF;
+                        prefixlen -= 8;
+                } else {
+                        mask = 0xFF << (8 - prefixlen);
+                        prefixlen = 0;
                 }
 
-                return 0;
+                addr->s6_addr[i] &= mask;
         }
 
-        return -EAFNOSUPPORT;
+        return 0;
+}
+
+int in_addr_mask(int family, union in_addr_union *addr, unsigned char prefixlen) {
+        assert(addr);
+
+        switch (family) {
+        case AF_INET:
+                return in4_addr_mask(&addr->in, prefixlen);
+        case AF_INET6:
+                return in6_addr_mask(&addr->in6, prefixlen);
+        default:
+                return -EAFNOSUPPORT;
+        }
 }
 
 int in_addr_prefix_covers(int family,
index 1d610c10c834ae3c6ac98b118aee77ea7d9ddfd0..50d51297e0bc9b8d63c7c0f3436d5cd1a97b5970 100644 (file)
@@ -89,6 +89,8 @@ unsigned char in4_addr_netmask_to_prefixlen(const struct in_addr *addr);
 struct in_addr* in4_addr_prefixlen_to_netmask(struct in_addr *addr, unsigned char prefixlen);
 int in4_addr_default_prefixlen(const struct in_addr *addr, unsigned char *prefixlen);
 int in4_addr_default_subnet_mask(const struct in_addr *addr, struct in_addr *mask);
+int in4_addr_mask(struct in_addr *addr, unsigned char prefixlen);
+int in6_addr_mask(struct in6_addr *addr, unsigned char prefixlen);
 int in_addr_mask(int family, union in_addr_union *addr, unsigned char prefixlen);
 int in_addr_prefix_covers(int family, const union in_addr_union *prefix, unsigned char prefixlen, const union in_addr_union *address);
 int in_addr_parse_prefixlen(int family, const char *p, unsigned char *ret);