]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
util: introduce in_addr_prefix_to_string()
authorYu Watanabe <watanabe.yu+github@gmail.com>
Sat, 2 Mar 2019 16:17:32 +0000 (01:17 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 4 Mar 2019 14:45:07 +0000 (23:45 +0900)
src/basic/in-addr-util.c
src/basic/in-addr-util.h

index 122bb17a9548f4132829bf00539c96b812db5e5e..f5cabc65346c97c40346226205fffaa23f9bcfc0 100644 (file)
@@ -12,6 +12,7 @@
 #include "macro.h"
 #include "parse-util.h"
 #include "random-util.h"
+#include "strxcpyx.h"
 #include "util.h"
 
 bool in4_addr_is_null(const struct in_addr *a) {
@@ -319,6 +320,40 @@ int in_addr_to_string(int family, const union in_addr_union *u, char **ret) {
         return 0;
 }
 
+int in_addr_prefix_to_string(int family, const union in_addr_union *u, unsigned prefixlen, char **ret) {
+        _cleanup_free_ char *x = NULL;
+        char *p;
+        size_t l;
+
+        assert(u);
+        assert(ret);
+
+        if (family == AF_INET)
+                l = INET_ADDRSTRLEN + 3;
+        else if (family == AF_INET6)
+                l = INET6_ADDRSTRLEN + 4;
+        else
+                return -EAFNOSUPPORT;
+
+        if (prefixlen > FAMILY_ADDRESS_SIZE(family) * 8)
+                return -EINVAL;
+
+        x = new(char, l);
+        if (!x)
+                return -ENOMEM;
+
+        errno = 0;
+        if (!inet_ntop(family, u, x, l))
+                return errno > 0 ? -errno : -EINVAL;
+
+        p = x + strlen(x);
+        l -= strlen(x);
+        (void) strpcpyf(&p, l, "/%u", prefixlen);
+
+        *ret = TAKE_PTR(x);
+        return 0;
+}
+
 int in_addr_ifindex_to_string(int family, const union in_addr_union *u, int ifindex, char **ret) {
         _cleanup_free_ char *x = NULL;
         size_t l;
index 3517fe1ea355d2e2b7c88d7206d3a531667f6af6..a6a685b9188b5084e1b699a0afbb535cf77a1c41 100644 (file)
@@ -37,6 +37,7 @@ int in_addr_prefix_intersect(int family, const union in_addr_union *a, unsigned
 int in_addr_prefix_next(int family, union in_addr_union *u, unsigned prefixlen);
 int in_addr_random_prefix(int family, union in_addr_union *u, unsigned prefixlen_fixed_part, unsigned prefixlen);
 int in_addr_to_string(int family, const union in_addr_union *u, char **ret);
+int in_addr_prefix_to_string(int family, const union in_addr_union *u, unsigned prefixlen, char **ret);
 int in_addr_ifindex_to_string(int family, const union in_addr_union *u, int ifindex, char **ret);
 int in_addr_from_string(int family, const char *s, union in_addr_union *ret);
 int in_addr_from_string_auto(const char *s, int *ret_family, union in_addr_union *ret);