]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
basic/in-addr-util: add IN_ADDR_PREFIX_TO_STRING
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Fri, 3 Jun 2022 14:37:38 +0000 (16:37 +0200)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Mon, 6 Jun 2022 07:52:52 +0000 (09:52 +0200)
18 files changed:
src/basic/in-addr-util.c
src/basic/in-addr-util.h
src/core/cgroup.c
src/core/dbus-cgroup.c
src/libsystemd-network/sd-radv.c
src/network/generator/network-generator.c
src/network/netdev/wireguard.c
src/network/networkd-address-pool.c
src/network/networkd-address.c
src/network/networkd-dhcp-prefix-delegation.c
src/network/networkd-link.c
src/network/networkd-ndisc.c
src/network/networkd-radv.c
src/network/networkd-route.c
src/network/networkd-routing-policy-rule.c
src/systemctl/systemctl-show.c
src/test/test-in-addr-prefix-util.c
src/test/test-in-addr-util.c

index 6bf017260bee014eead4543c544f180480f9fa17..6f8ffaf25969f18c31c8e7d3ba6f15cf4ee55592 100644 (file)
@@ -14,6 +14,7 @@
 #include "macro.h"
 #include "parse-util.h"
 #include "random-util.h"
+#include "stdio-util.h"
 #include "string-util.h"
 #include "strxcpyx.h"
 #include "util.h"
@@ -451,34 +452,26 @@ 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;
+int in_addr_prefix_to_string(
+                int family,
+                const union in_addr_union *u,
+                unsigned prefixlen,
+                char *buf,
+                size_t buf_len) {
 
         assert(u);
-        assert(ret);
+        assert(buf);
 
-        if (family == AF_INET)
-                l = INET_ADDRSTRLEN + 1 + DECIMAL_STR_MAX(unsigned);
-        else if (family == AF_INET6)
-                l = INET6_ADDRSTRLEN + 1 + DECIMAL_STR_MAX(unsigned);
-        else
+        if (!IN_SET(family, AF_INET, AF_INET6))
                 return -EAFNOSUPPORT;
 
-        x = new(char, l);
-        if (!x)
-                return -ENOMEM;
-
         errno = 0;
-        if (!inet_ntop(family, u, x, l))
-                return errno_or_else(EINVAL);
+        if (!typesafe_inet_ntop(family, u, buf, buf_len))
+                return errno_or_else(ENOSPC);
 
-        p = x + strlen(x);
-        l -= strlen(x);
-        (void) strpcpyf(&p, l, "/%u", prefixlen);
-
-        *ret = TAKE_PTR(x);
+        size_t l = strlen(buf);
+        if (!snprintf_ok(buf + l, buf_len - l, "/%u", prefixlen))
+                return -ENOSPC;
         return 0;
 }
 
index 89d0505c137a45aa6360d2d1f95122407e4c5ef9..c1e7ef965da0117ab98cb0397d6da726a93f8767 100644 (file)
@@ -93,10 +93,38 @@ static inline const char* typesafe_inet_ntop6(const struct in6_addr *a, char *bu
 #define IN4_ADDR_TO_STRING(addr) typesafe_inet_ntop4(addr, (char[INET_ADDRSTRLEN]){}, INET_ADDRSTRLEN)
 #define IN6_ADDR_TO_STRING(addr) typesafe_inet_ntop6(addr, (char[INET6_ADDRSTRLEN]){}, INET6_ADDRSTRLEN)
 
-int in_addr_prefix_to_string(int family, const union in_addr_union *u, unsigned prefixlen, char **ret);
-static inline int in6_addr_prefix_to_string(const struct in6_addr *u, unsigned prefixlen, char **ret) {
-        return in_addr_prefix_to_string(AF_INET6, (const union in_addr_union*) u, prefixlen, ret);
+int in_addr_prefix_to_string(
+                int family,
+                const union in_addr_union *u,
+                unsigned prefixlen,
+                char *buf,
+                size_t buf_len);
+
+static inline const char* _in_addr_prefix_to_string(
+                int family,
+                const union in_addr_union *u,
+                unsigned prefixlen,
+                char *buf,
+                size_t buf_len) {
+        /* We assume that this is called with an appropriately sized buffer and can never fail. */
+        assert_se(in_addr_prefix_to_string(family, u, prefixlen, buf, buf_len) == 0);
+        return buf;
 }
+static inline const char* _in4_addr_prefix_to_string(const struct in_addr *a, unsigned prefixlen, char *buf, size_t buf_len) {
+        return _in_addr_prefix_to_string(AF_INET, (const union in_addr_union *) a, prefixlen, buf, buf_len);
+}
+static inline const char* _in6_addr_prefix_to_string(const struct in6_addr *a, unsigned prefixlen, char *buf, size_t buf_len) {
+        return _in_addr_prefix_to_string(AF_INET6, (const union in_addr_union *) a, prefixlen, buf, buf_len);
+}
+
+#define PREFIX_SUFFIX_MAX (1 + DECIMAL_STR_MAX(unsigned))
+#define IN_ADDR_PREFIX_TO_STRING(family, addr, prefixlen) \
+        _in_addr_prefix_to_string(family, addr, prefixlen, (char[IN_ADDR_MAX + PREFIX_SUFFIX_MAX]){}, IN_ADDR_MAX + PREFIX_SUFFIX_MAX)
+#define IN4_ADDR_PREFIX_TO_STRING(addr, prefixlen) \
+        _in4_addr_prefix_to_string(addr, prefixlen, (char[INET_ADDRSTRLEN + PREFIX_SUFFIX_MAX]){}, INET_ADDRSTRLEN + PREFIX_SUFFIX_MAX)
+#define IN6_ADDR_PREFIX_TO_STRING(addr, prefixlen) \
+        _in6_addr_prefix_to_string(addr, prefixlen, (char[INET6_ADDRSTRLEN + PREFIX_SUFFIX_MAX]){}, INET6_ADDRSTRLEN + PREFIX_SUFFIX_MAX)
+
 int in_addr_port_ifindex_name_to_string(int family, const union in_addr_union *u, uint16_t port, int ifindex, const char *server_name, char **ret);
 static inline int in_addr_ifindex_to_string(int family, const union in_addr_union *u, int ifindex, char **ret) {
         return in_addr_port_ifindex_name_to_string(family, u, 0, ifindex, NULL, ret);
index 9282b1ff200c2cf7cd02331c98f17753017a9c91..25707fce64250e93810ac7da4299a284a3c1a49c 100644 (file)
@@ -574,23 +574,15 @@ void cgroup_context_dump(Unit *u, FILE* f, const char *prefix) {
                                 FORMAT_BYTES(b->wbps));
         }
 
-        SET_FOREACH(iaai, c->ip_address_allow) {
-                _cleanup_free_ char *k = NULL;
-
-                (void) in_addr_prefix_to_string(iaai->family, &iaai->address, iaai->prefixlen, &k);
-                fprintf(f, "%sIPAddressAllow: %s\n", prefix, strnull(k));
-        }
-
-        SET_FOREACH(iaai, c->ip_address_deny) {
-                _cleanup_free_ char *k = NULL;
-
-                (void) in_addr_prefix_to_string(iaai->family, &iaai->address, iaai->prefixlen, &k);
-                fprintf(f, "%sIPAddressDeny: %s\n", prefix, strnull(k));
-        }
+        SET_FOREACH(iaai, c->ip_address_allow)
+                fprintf(f, "%sIPAddressAllow: %s\n", prefix,
+                        IN_ADDR_PREFIX_TO_STRING(iaai->family, &iaai->address, iaai->prefixlen));
+        SET_FOREACH(iaai, c->ip_address_deny)
+                fprintf(f, "%sIPAddressDeny: %s\n", prefix,
+                        IN_ADDR_PREFIX_TO_STRING(iaai->family, &iaai->address, iaai->prefixlen));
 
         STRV_FOREACH(path, c->ip_filters_ingress)
                 fprintf(f, "%sIPIngressFilterPath: %s\n", prefix, *path);
-
         STRV_FOREACH(path, c->ip_filters_egress)
                 fprintf(f, "%sIPEgressFilterPath: %s\n", prefix, *path);
 
index 9a31355a4da65e5e6adb880438a1fae90798779c..607370d7bfe7abbc5eeb68dac75910d935db58f4 100644 (file)
@@ -1817,25 +1817,16 @@ int bus_cgroup_set_property(
                                 fputs(name, f);
                                 fputs("=\n", f);
                         } else {
-                                struct in_addr_prefix *p;
-
                                 *reduced = false;
 
                                 r = in_addr_prefixes_merge(prefixes, new_prefixes);
                                 if (r < 0)
                                         return r;
 
-                                SET_FOREACH(p, new_prefixes) {
-                                        _cleanup_free_ char *buffer = NULL;
-
-                                        r = in_addr_prefix_to_string(p->family, &p->address, p->prefixlen, &buffer);
-                                        if (r == -ENOMEM)
-                                                return r;
-                                        if (r < 0)
-                                                continue;
-
-                                        fprintf(f, "%s=%s\n", name, buffer);
-                                }
+                                const struct in_addr_prefix *p;
+                                SET_FOREACH(p, new_prefixes)
+                                        fprintf(f, "%s=%s\n", name,
+                                                IN_ADDR_PREFIX_TO_STRING(p->family, &p->address, p->prefixlen));
                         }
 
                         r = fflush_and_check(f);
index db9c8a239b741546a829c2f73a4a9485c4ebba12..a1f50afce3ea122766332f7fca37b17c215da0b5 100644 (file)
@@ -572,7 +572,6 @@ int sd_radv_set_preference(sd_radv *ra, unsigned preference) {
 }
 
 int sd_radv_add_prefix(sd_radv *ra, sd_radv_prefix *p) {
-        _cleanup_free_ char *addr_p = NULL;
         sd_radv_prefix *found = NULL;
         int r;
 
@@ -583,10 +582,9 @@ int sd_radv_add_prefix(sd_radv *ra, sd_radv_prefix *p) {
         if (in6_addr_is_null(&p->opt.in6_addr))
                 return -ENOEXEC;
 
-        (void) in6_addr_prefix_to_string(&p->opt.in6_addr, p->opt.prefixlen, &addr_p);
+        const char *addr_p = IN6_ADDR_PREFIX_TO_STRING(&p->opt.in6_addr, p->opt.prefixlen);
 
         LIST_FOREACH(prefix, cur, ra->prefixes) {
-
                 r = in_addr_prefix_intersect(AF_INET6,
                                              (const union in_addr_union*) &cur->opt.in6_addr,
                                              cur->opt.prefixlen,
@@ -602,11 +600,10 @@ int sd_radv_add_prefix(sd_radv *ra, sd_radv_prefix *p) {
                         break;
                 }
 
-                _cleanup_free_ char *addr_cur = NULL;
-                (void) in6_addr_prefix_to_string(&cur->opt.in6_addr, cur->opt.prefixlen, &addr_cur);
                 return log_radv_errno(ra, SYNTHETIC_ERRNO(EEXIST),
                                       "IPv6 prefix %s conflicts with %s, ignoring.",
-                                      strna(addr_p), strna(addr_cur));
+                                      addr_p,
+                                      IN6_ADDR_PREFIX_TO_STRING(&cur->opt.in6_addr, cur->opt.prefixlen));
         }
 
         if (found) {
@@ -621,7 +618,7 @@ int sd_radv_add_prefix(sd_radv *ra, sd_radv_prefix *p) {
                 LIST_APPEND(prefix, ra->prefixes, p);
 
                 log_radv(ra, "Updated/replaced IPv6 prefix %s (preferred: %s, valid: %s)",
-                         strna(addr_p),
+                         addr_p,
                          FORMAT_TIMESPAN(p->lifetime_preferred_usec, USEC_PER_SEC),
                          FORMAT_TIMESPAN(p->lifetime_valid_usec, USEC_PER_SEC));
         } else {
@@ -631,7 +628,7 @@ int sd_radv_add_prefix(sd_radv *ra, sd_radv_prefix *p) {
                 LIST_APPEND(prefix, ra->prefixes, p);
                 ra->n_prefixes++;
 
-                log_radv(ra, "Added prefix %s", strna(addr_p));
+                log_radv(ra, "Added prefix %s", addr_p);
         }
 
         if (ra->state == RADV_STATE_IDLE)
@@ -643,10 +640,9 @@ int sd_radv_add_prefix(sd_radv *ra, sd_radv_prefix *p) {
         /* If RAs have already been sent, send an RA immediately to announce the newly-added prefix */
         r = radv_send(ra, NULL, ra->lifetime_usec);
         if (r < 0)
-                log_radv_errno(ra, r, "Unable to send Router Advertisement for added prefix %s: %m",
-                               strna(addr_p));
+                log_radv_errno(ra, r, "Unable to send Router Advertisement for added prefix %s: %m", addr_p);
         else
-                log_radv(ra, "Sent Router Advertisement for added/updated prefix %s.", strna(addr_p));
+                log_radv(ra, "Sent Router Advertisement for added/updated prefix %s.", addr_p);
 
         return 0;
 }
@@ -677,17 +673,15 @@ void sd_radv_remove_prefix(
 }
 
 int sd_radv_add_route_prefix(sd_radv *ra, sd_radv_route_prefix *p) {
-        _cleanup_free_ char *addr_p = NULL;
         sd_radv_route_prefix *found = NULL;
         int r;
 
         assert_return(ra, -EINVAL);
         assert_return(p, -EINVAL);
 
-        (void) in6_addr_prefix_to_string(&p->opt.in6_addr, p->opt.prefixlen, &addr_p);
+        const char *addr_p = IN6_ADDR_PREFIX_TO_STRING(&p->opt.in6_addr, p->opt.prefixlen);
 
         LIST_FOREACH(prefix, cur, ra->route_prefixes) {
-
                 r = in_addr_prefix_intersect(AF_INET6,
                                              (const union in_addr_union*) &cur->opt.in6_addr,
                                              cur->opt.prefixlen,
@@ -703,11 +697,10 @@ int sd_radv_add_route_prefix(sd_radv *ra, sd_radv_route_prefix *p) {
                         break;
                 }
 
-                _cleanup_free_ char *addr_cur = NULL;
-                (void) in6_addr_prefix_to_string(&cur->opt.in6_addr, cur->opt.prefixlen, &addr_cur);
                 return log_radv_errno(ra, SYNTHETIC_ERRNO(EEXIST),
                                       "IPv6 route prefix %s conflicts with %s, ignoring.",
-                                      strna(addr_p), strna(addr_cur));
+                                      addr_p,
+                                      IN6_ADDR_PREFIX_TO_STRING(&cur->opt.in6_addr, cur->opt.prefixlen));
         }
 
         if (found) {
index a1b5511338c4c4a4726e52ebfa842bf9ad912a36..fee222f88e1826599c321bdfc5da4adb0995f8ad 100644 (file)
@@ -1081,48 +1081,23 @@ void context_clear(Context *context) {
 }
 
 static int address_dump(Address *address, FILE *f) {
-        _cleanup_free_ char *addr = NULL, *peer = NULL;
-        int r;
-
-        r = in_addr_prefix_to_string(address->family, &address->address, address->prefixlen, &addr);
-        if (r < 0)
-                return r;
-
-        if (in_addr_is_set(address->family, &address->peer)) {
-                r = in_addr_to_string(address->family, &address->peer, &peer);
-                if (r < 0)
-                        return r;
-        }
-
         fprintf(f,
                 "\n[Address]\n"
                 "Address=%s\n",
-                addr);
-
-        if (peer)
-                fprintf(f, "Peer=%s\n", peer);
-
+                IN_ADDR_PREFIX_TO_STRING(address->family, &address->address, address->prefixlen));
+        if (in_addr_is_set(address->family, &address->peer))
+                fprintf(f, "Peer=%s\n",
+                        IN_ADDR_TO_STRING(address->family, &address->peer));
         return 0;
 }
 
 static int route_dump(Route *route, FILE *f) {
-        _cleanup_free_ char *dest = NULL, *gateway = NULL;
-        int r;
-
-        if (in_addr_is_set(route->family, &route->dest)) {
-                r = in_addr_prefix_to_string(route->family, &route->dest, route->prefixlen, &dest);
-                if (r < 0)
-                        return r;
-        }
-
-        r = in_addr_to_string(route->family, &route->gateway, &gateway);
-        if (r < 0)
-                return r;
-
         fputs("\n[Route]\n", f);
-        if (dest)
-                fprintf(f, "Destination=%s\n", dest);
-        fprintf(f, "Gateway=%s\n", gateway);
+        if (in_addr_is_set(route->family, &route->dest))
+                fprintf(f, "Destination=%s\n",
+                        IN_ADDR_PREFIX_TO_STRING(route->family, &route->dest, route->prefixlen));
+        fprintf(f, "Gateway=%s\n",
+                IN_ADDR_TO_STRING(route->family, &route->gateway));
 
         return 0;
 }
index fc2c6288ae95b0d316cf5acd283cc3414ae90677..2667a9fb2a581c8d2c6d8f85c8439b3ab9d451c0 100644 (file)
@@ -712,13 +712,11 @@ int config_parse_wireguard_allowed_ips(
 
                 masked = addr;
                 assert_se(in_addr_mask(family, &masked, prefixlen) >= 0);
-                if (!in_addr_equal(family, &masked, &addr)) {
-                        _cleanup_free_ char *buf = NULL;
-
-                        (void) in_addr_prefix_to_string(family, &masked, prefixlen, &buf);
+                if (!in_addr_equal(family, &masked, &addr))
                         log_syntax(unit, LOG_WARNING, filename, line, 0,
-                                   "Specified address '%s' is not properly masked, assuming '%s'.", word, strna(buf));
-                }
+                                   "Specified address '%s' is not properly masked, assuming '%s'.",
+                                   word,
+                                   IN_ADDR_PREFIX_TO_STRING(family, &masked, prefixlen));
 
                 ipmask = new(WireguardIPmask, 1);
                 if (!ipmask)
index 47dedfe6f20126eeb68a86d1c9f3dc2395bd3432..51f092ac69c15c26a8b02ddac44ed04d21c6116b 100644 (file)
@@ -146,12 +146,7 @@ static int address_pool_acquire_one(AddressPool *p, int family, unsigned prefixl
                         return r;
 
                 if (!address_pool_prefix_is_taken(p, &u, prefixlen)) {
-                        if (DEBUG_LOGGING) {
-                                _cleanup_free_ char *s = NULL;
-
-                                (void) in_addr_prefix_to_string(p->family, &u, prefixlen, &s);
-                                log_debug("Found range %s", strna(s));
-                        }
+                        log_debug("Found range %s", IN_ADDR_PREFIX_TO_STRING(p->family, &u, prefixlen));
 
                         *found = u;
                         return 1;
index 5e37dc9907f9dcecccc08725d445e7320cb45479..8e8d5f7781693de45c39c4cf7b00edd323d6bbfb 100644 (file)
@@ -1465,11 +1465,8 @@ int manager_rtnl_process_address(sd_netlink *rtnl, sd_netlink_message *message,
 
                         r = address_add(link, tmp);
                         if (r < 0) {
-                                _cleanup_free_ char *buf = NULL;
-
-                                (void) in_addr_prefix_to_string(tmp->family, &tmp->in_addr, tmp->prefixlen, &buf);
                                 log_link_warning_errno(link, r, "Failed to remember foreign address %s, ignoring: %m",
-                                                       strnull(buf));
+                                                       IN_ADDR_PREFIX_TO_STRING(tmp->family, &tmp->in_addr, tmp->prefixlen));                
                                 return 0;
                         }
 
@@ -2022,12 +2019,11 @@ int network_drop_invalid_addresses(Network *network) {
                 /* Always use the setting specified later. So, remove the previously assigned setting. */
                 dup = set_remove(addresses, address);
                 if (dup) {
-                        _cleanup_free_ char *buf = NULL;
-
-                        (void) in_addr_prefix_to_string(address->family, &address->in_addr, address->prefixlen, &buf);
                         log_warning("%s: Duplicated address %s is specified at line %u and %u, "
                                     "dropping the address setting specified at line %u.",
-                                    dup->section->filename, strna(buf), address->section->line,
+                                    dup->section->filename,
+                                    IN_ADDR_PREFIX_TO_STRING(address->family, &address->in_addr, address->prefixlen),
+                                    address->section->line,
                                     dup->section->line, dup->section->line);
                         /* address_free() will drop the address from addresses_by_section. */
                         address_free(dup);
index d8d9475635b051ccac09b8395602b8f851e0b7af..5c923c258c2a51db046665c14196e0c55f688273 100644 (file)
@@ -358,21 +358,16 @@ static int dhcp_pd_address_handler(sd_netlink *rtnl, sd_netlink_message *m, Requ
 }
 
 static void log_dhcp_pd_address(Link *link, const Address *address) {
-        _cleanup_free_ char *buffer = NULL;
-        int log_level;
-
         assert(address);
         assert(address->family == AF_INET6);
 
-        log_level = address_get(link, address, NULL) >= 0 ? LOG_DEBUG : LOG_INFO;
+        int log_level = address_get(link, address, NULL) >= 0 ? LOG_DEBUG : LOG_INFO;
 
         if (log_level < log_get_max_level())
                 return;
 
-        (void) in6_addr_prefix_to_string(&address->in_addr.in6, address->prefixlen, &buffer);
-
         log_link_full(link, log_level, "DHCP-PD address %s (valid %s, preferred %s)",
-                      strna(buffer),
+                      IN6_ADDR_PREFIX_TO_STRING(&address->in_addr.in6, address->prefixlen),
                       FORMAT_LIFETIME(address->lifetime_valid_usec),
                       FORMAT_LIFETIME(address->lifetime_preferred_usec));
 }
@@ -524,7 +519,6 @@ static int dhcp_pd_assign_subnet_prefix(
                 usec_t lifetime_valid_usec,
                 bool is_uplink) {
 
-        _cleanup_free_ char *buf = NULL;
         struct in6_addr prefix;
         int r;
 
@@ -536,7 +530,7 @@ static int dhcp_pd_assign_subnet_prefix(
         if (r < 0)
                 return r == -ERANGE ? 0 : r;
 
-        (void) in6_addr_prefix_to_string(&prefix, 64, &buf);
+        const char *pretty = IN6_ADDR_PREFIX_TO_STRING(&prefix, 64);
 
         if (link_radv_enabled(link) && link->network->dhcp_pd_announce) {
                 if (is_uplink)
@@ -546,23 +540,21 @@ static int dhcp_pd_assign_subnet_prefix(
                         if (r < 0)
                                 return log_link_warning_errno(link, r,
                                                               "Failed to assign/update prefix %s to IPv6 Router Advertisement: %m",
-                                                              strna(buf));
+                                                              pretty);
                 }
         }
 
         r = dhcp_pd_request_route(link, &prefix, lifetime_valid_usec);
         if (r < 0)
                 return log_link_warning_errno(link, r,
-                                              "Failed to assign/update route for prefix %s: %m",
-                                              strna(buf));
+                                              "Failed to assign/update route for prefix %s: %m", pretty);
 
         r = dhcp_pd_request_address(link, &prefix, lifetime_preferred_usec, lifetime_valid_usec);
         if (r < 0)
                 return log_link_warning_errno(link, r,
-                                              "Failed to assign/update address for prefix %s: %m",
-                                              strna(buf));
+                                              "Failed to assign/update address for prefix %s: %m", pretty);
 
-        log_link_debug(link, "Assigned prefix %s", strna(buf));
+        log_link_debug(link, "Assigned prefix %s", pretty);
         return 1;
 }
 
@@ -706,11 +698,8 @@ static int dhcp_request_unreachable_route(
         assert(callback);
 
         if (prefixlen >= 64) {
-                _cleanup_free_ char *buf = NULL;
-
-                (void) in6_addr_prefix_to_string(addr, prefixlen, &buf);
                 log_link_debug(link, "Not adding a blocking route for DHCP delegated prefix %s since the prefix has length >= 64.",
-                               strna(buf));
+                               IN6_ADDR_PREFIX_TO_STRING(addr, prefixlen));
                 return 0;
         }
 
@@ -734,13 +723,9 @@ static int dhcp_request_unreachable_route(
                 route_unmark(existing);
 
         r = link_request_route(link, TAKE_PTR(route), true, counter, callback, NULL);
-        if (r < 0) {
-                _cleanup_free_ char *buf = NULL;
-
-                (void) in6_addr_prefix_to_string(addr, prefixlen, &buf);
+        if (r < 0)
                 return log_link_error_errno(link, r, "Failed to request unreachable route for DHCP delegated prefix %s: %m",
-                                            strna(buf));
-        }
+                                            IN6_ADDR_PREFIX_TO_STRING(addr, prefixlen));
 
         return 0;
 }
@@ -770,7 +755,6 @@ static int dhcp6_request_unreachable_route(
 }
 
 static int dhcp_pd_prefix_add(Link *link, const struct in6_addr *prefix, uint8_t prefixlen) {
-        _cleanup_free_ char *buf = NULL;
         struct in_addr_prefix *p;
         int r;
 
@@ -787,21 +771,20 @@ static int dhcp_pd_prefix_add(Link *link, const struct in6_addr *prefix, uint8_t
                 .address.in6 = *prefix,
         };
 
-        (void) in6_addr_prefix_to_string(prefix, prefixlen, &buf);
-
+        int log_level = set_contains(link->dhcp_pd_prefixes, p) ? LOG_DEBUG :
+                               prefixlen > 64 || prefixlen < 48 ? LOG_WARNING : LOG_INFO;
         log_link_full(link,
-                      set_contains(link->dhcp_pd_prefixes, p) ? LOG_DEBUG :
-                      prefixlen > 64 || prefixlen < 48 ? LOG_WARNING : LOG_INFO,
+                      log_level,
                       "DHCP: received delegated prefix %s%s",
-                      strna(buf),
+                      IN6_ADDR_PREFIX_TO_STRING(prefix, prefixlen),
                       prefixlen > 64 ? " with prefix length > 64, ignoring." :
                       prefixlen < 48 ? " with prefix length < 48, looks unusual.": "");
 
         /* Store PD prefix even if prefixlen > 64, not to make logged at warning level so frequently. */
         r = set_ensure_consume(&link->dhcp_pd_prefixes, &in_addr_prefix_hash_ops_free, p);
         if (r < 0)
-                return log_link_error_errno(link, r, "Failed to store DHCP delegated prefix %s: %m", strna(buf));
-
+                return log_link_error_errno(link, r, "Failed to store DHCP delegated prefix %s: %m",
+                                            IN6_ADDR_PREFIX_TO_STRING(prefix, prefixlen));
         return 0;
 }
 
@@ -968,13 +951,11 @@ int dhcp4_pd_prefix_acquired(Link *uplink) {
         if (r < 0)
                 return log_link_warning_errno(uplink, r, "Failed to get DHCPv4 6rd option: %m");
 
-        if (DEBUG_LOGGING) {
-                _cleanup_free_ char *buf = NULL;
-
-                (void) in6_addr_prefix_to_string(&sixrd_prefix, sixrd_prefixlen, &buf);
+        if (DEBUG_LOGGING)
                 log_link_debug(uplink, "DHCPv4: 6rd option is acquired: IPv4_masklen=%u, 6rd_prefix=%s, br_address="IPV4_ADDRESS_FMT_STR,
-                               ipv4masklen, strna(buf), IPV4_ADDRESS_FMT_VAL(*br_addresses));
-        }
+                               ipv4masklen,
+                               IN6_ADDR_PREFIX_TO_STRING(&sixrd_prefix, sixrd_prefixlen),
+                               IPV4_ADDRESS_FMT_VAL(*br_addresses));
 
         /* Calculate PD prefix */
         dhcp4_calculate_pd_prefix(&ipv4address, ipv4masklen, &sixrd_prefix, sixrd_prefixlen, &pd_prefix, &pd_prefixlen);
index 63679505f70e728afbfdd73d949836298243b733..e781f54a3cd14d83459adede9e1cb7ff2814c0b1 100644 (file)
@@ -426,12 +426,9 @@ void link_check_ready(Link *link) {
                 return (void) log_link_debug(link, "%s(): static addresses are not configured.", __func__);
 
         SET_FOREACH(a, link->addresses)
-                if (!address_is_ready(a)) {
-                        _cleanup_free_ char *str = NULL;
-
-                        (void) in_addr_prefix_to_string(a->family, &a->in_addr, a->prefixlen, &str);
-                        return (void) log_link_debug(link, "%s(): address %s is not ready.", __func__, strna(str));
-                }
+                if (!address_is_ready(a))
+                        return (void) log_link_debug(link, "%s(): address %s is not ready.", __func__,
+                                                     IN_ADDR_PREFIX_TO_STRING(a->family, &a->in_addr, a->prefixlen));
 
         if (!link->static_address_labels_configured)
                 return (void) log_link_debug(link, "%s(): static address labels are not configured.", __func__);
index 66127f36c9a2d126639ebd7ec5c54355263ecc5b..2b663e57ccf87cb78939779d8d7df95de0ab83e5 100644 (file)
@@ -420,10 +420,8 @@ static int ndisc_router_process_autonomous_prefix(Link *link, sd_ndisc_router *r
 
         /* ndisc_generate_addresses() below requires the prefix length <= 64. */
         if (prefixlen > 64) {
-                _cleanup_free_ char *buf = NULL;
-
-                (void) in6_addr_prefix_to_string(&prefix, prefixlen, &buf);
-                log_link_debug(link, "Prefix is longer than 64, ignoring autonomous prefix %s.", strna(buf));
+                log_link_debug(link, "Prefix is longer than 64, ignoring autonomous prefix %s.",
+                               IN6_ADDR_PREFIX_TO_STRING(&prefix, prefixlen));
                 return 0;
         }
 
@@ -553,15 +551,11 @@ static int ndisc_router_process_prefix(Link *link, sd_ndisc_router *rt) {
                 return log_link_error_errno(link, r, "Failed to get prefix length: %m");
 
         if (in6_prefix_is_filtered(&a, prefixlen, link->network->ndisc_allow_listed_prefix, link->network->ndisc_deny_listed_prefix)) {
-                if (DEBUG_LOGGING) {
-                        _cleanup_free_ char *b = NULL;
-
-                        (void) in6_addr_prefix_to_string(&a, prefixlen, &b);
-                        if (!set_isempty(link->network->ndisc_allow_listed_prefix))
-                                log_link_debug(link, "Prefix '%s' is not in allow list, ignoring", strna(b));
-                        else
-                                log_link_debug(link, "Prefix '%s' is in deny list, ignoring", strna(b));
-                }
+                if (DEBUG_LOGGING)
+                        log_link_debug(link, "Prefix '%s' is %s, ignoring",
+                                       !set_isempty(link->network->ndisc_allow_listed_prefix) ? "not in allow list"
+                                                                                              : "in deny list",
+                                       IN6_ADDR_PREFIX_TO_STRING(&a, prefixlen));
                 return 0;
         }
 
@@ -617,16 +611,15 @@ static int ndisc_router_process_route(Link *link, sd_ndisc_router *rt) {
                 return 0;
         }
 
-        if (in6_prefix_is_filtered(&dst, prefixlen, link->network->ndisc_allow_listed_route_prefix, link->network->ndisc_deny_listed_route_prefix)) {
-                if (DEBUG_LOGGING) {
-                        _cleanup_free_ char *buf = NULL;
+        if (in6_prefix_is_filtered(&dst, prefixlen,
+                                   link->network->ndisc_allow_listed_route_prefix,
+                                   link->network->ndisc_deny_listed_route_prefix)) {
 
-                        (void) in6_addr_prefix_to_string(&dst, prefixlen, &buf);
-                        if (!set_isempty(link->network->ndisc_allow_listed_route_prefix))
-                                log_link_debug(link, "Route prefix '%s' is not in allow list, ignoring", strna(buf));
-                        else
-                                log_link_debug(link, "Route prefix '%s' is in deny list, ignoring", strna(buf));
-                }
+                if (DEBUG_LOGGING)
+                        log_link_debug(link, "Route prefix %s is %s, ignoring",
+                                       !set_isempty(link->network->ndisc_allow_listed_route_prefix) ? "not in allow list"
+                                                                                                    : "in deny list",
+                                       IN6_ADDR_PREFIX_TO_STRING(&dst, prefixlen));
                 return 0;
         }
 
index 7fc1306d199ac4d9c686da05ebc1c95814d92e41..26448b518d3dc4435e9fa9a93bfbea3c8dd1a075 100644 (file)
@@ -711,15 +711,11 @@ static int prefix_section_verify(Prefix *p) {
                                          p->section->filename, p->prefixlen, p->section->line);
 
         if (p->prefixlen > 64) {
-                _cleanup_free_ char *str = NULL;
-
-                if (p->assign)
-                        (void) in6_addr_prefix_to_string(&p->prefix, p->prefixlen, &str);
-
-                log_info("%s: Unusual prefix length %u (> 64) is specified in [IPv6Prefix] section from line %u%s%s.",
-                         p->section->filename, p->prefixlen, p->section->line,
+                log_info("%s:%u: Unusual prefix length %u (> 64) is specified in [IPv6Prefix] section from line %s%s.",
+                         p->section->filename, p->section->line,
+                         p->prefixlen,
                          p->assign ? ", refusing to assign an address in " : "",
-                         p->assign ? strna(str) : "");
+                         p->assign ? IN6_ADDR_PREFIX_TO_STRING(&p->prefix, p->prefixlen) : "");
 
                 p->assign = false;
         }
index 934fed3b7f32391d21be4c647188d15e0e44b4f9..2708f9d79dc057608e6db0e1c14023c1feea6e81 100644 (file)
@@ -544,9 +544,9 @@ void link_mark_routes(Link *link, NetworkConfigSource source, const struct in6_a
 }
 
 static void log_route_debug(const Route *route, const char *str, const Link *link, const Manager *manager) {
-        _cleanup_free_ char *state = NULL, *dst = NULL, *src = NULL, *gw_alloc = NULL, *prefsrc = NULL,
+        _cleanup_free_ char *state = NULL, *gw_alloc = NULL, *prefsrc = NULL,
                 *table = NULL, *scope = NULL, *proto = NULL, *flags = NULL;
-        const char *gw = NULL;
+        const char *gw = NULL, *dst, *src;
 
         assert(route);
         assert(str);
@@ -558,10 +558,12 @@ static void log_route_debug(const Route *route, const char *str, const Link *lin
                 return;
 
         (void) network_config_state_to_string_alloc(route->state, &state);
-        if (in_addr_is_set(route->family, &route->dst) || route->dst_prefixlen > 0)
-                (void) in_addr_prefix_to_string(route->family, &route->dst, route->dst_prefixlen, &dst);
-        if (in_addr_is_set(route->family, &route->src) || route->src_prefixlen > 0)
-                (void) in_addr_prefix_to_string(route->family, &route->src, route->src_prefixlen, &src);
+
+        dst = in_addr_is_set(route->family, &route->dst) || route->dst_prefixlen > 0 ?
+                IN_ADDR_PREFIX_TO_STRING(route->family, &route->dst, route->dst_prefixlen) : NULL;
+        src = in_addr_is_set(route->family, &route->src) || route->src_prefixlen > 0 ?
+                IN_ADDR_PREFIX_TO_STRING(route->family, &route->src, route->src_prefixlen) : NULL;
+
         if (in_addr_is_set(route->gw_family, &route->gw)) {
                 (void) in_addr_to_string(route->gw_family, &route->gw, &gw_alloc);
                 gw = gw_alloc;
index 8f4297a86add8e23961c27c511dc3ecd628f2c9e..71c4360fa3057fa656bafacd596d6cf795358d27 100644 (file)
@@ -414,7 +414,7 @@ static int routing_policy_rule_acquire_priority(Manager *manager, RoutingPolicyR
 }
 
 static void log_routing_policy_rule_debug(const RoutingPolicyRule *rule, const char *str, const Link *link, const Manager *m) {
-        _cleanup_free_ char *state = NULL, *from = NULL, *to = NULL, *table = NULL;
+        _cleanup_free_ char *state = NULL, *table = NULL;
 
         assert(rule);
         assert(IN_SET(rule->family, AF_INET, AF_INET6));
@@ -427,14 +427,14 @@ static void log_routing_policy_rule_debug(const RoutingPolicyRule *rule, const c
                 return;
 
         (void) network_config_state_to_string_alloc(rule->state, &state);
-        (void) in_addr_prefix_to_string(rule->family, &rule->from, rule->from_prefixlen, &from);
-        (void) in_addr_prefix_to_string(rule->family, &rule->to, rule->to_prefixlen, &to);
         (void) manager_get_route_table_to_string(m, rule->table, &table);
 
         log_link_debug(link,
                        "%s %s routing policy rule (%s): priority: %"PRIu32", %s -> %s, iif: %s, oif: %s, table: %s",
                        str, strna(network_config_source_to_string(rule->source)), strna(state),
-                       rule->priority, strna(from), strna(to),
+                       rule->priority,
+                       IN_ADDR_PREFIX_TO_STRING(rule->family, &rule->from, rule->from_prefixlen),
+                       IN_ADDR_PREFIX_TO_STRING(rule->family, &rule->to, rule->to_prefixlen),
                        strna(rule->iif), strna(rule->oif), strna(table));
 }
 
index cc7abca6df82fe3741e4a4555bce0f28615ed311..b24e5fd6badccbdac3c22d679dc20ff34a58f913 100644 (file)
@@ -1454,7 +1454,6 @@ static int print_property(const char *name, const char *expected_value, sd_bus_m
                                 return bus_log_parse_error(r);
 
                         for (;;) {
-                                _cleanup_free_ char *str = NULL;
                                 uint32_t prefixlen;
                                 int32_t family;
                                 const void *ap;
@@ -1491,10 +1490,8 @@ static int print_property(const char *name, const char *expected_value, sd_bus_m
                                 if (prefixlen > FAMILY_ADDRESS_SIZE(family) * 8)
                                         continue;
 
-                                if (in_addr_prefix_to_string(family, (const union in_addr_union*) ap, prefixlen, &str) < 0)
-                                        continue;
-
-                                if (!strextend_with_separator(&addresses, " ", str))
+                                if (!strextend_with_separator(&addresses, " ",
+                                                              IN_ADDR_PREFIX_TO_STRING(family, ap, prefixlen)))
                                         return log_oom();
                         }
 
index d2991b9d3d349d9dc5a2ebdfafe1efb3e3181596..661ca8fc81328e89af1a7d90f424ff9a8fad9e2b 100644 (file)
@@ -5,12 +5,15 @@
 
 static void test_in_addr_prefix_to_string_one(int f, const char *addr, unsigned prefixlen) {
         union in_addr_union ua;
-        _cleanup_free_ char *r;
-
         assert_se(in_addr_from_string(f, addr, &ua) >= 0);
-        assert_se(in_addr_prefix_to_string(f, &ua, prefixlen, &r) >= 0);
+
+        const char *r = IN_ADDR_PREFIX_TO_STRING(f, &ua, prefixlen);
+        assert_se(r);
         printf("%s: %s/%u == %s\n", __func__, addr, prefixlen, r);
         assert_se(startswith(r, addr));
+
+        assert_se(streq(r, IN_ADDR_PREFIX_TO_STRING(f, &ua, prefixlen)));
+        assert_se(streq(IN_ADDR_PREFIX_TO_STRING(f, &ua, prefixlen), r));
 }
 
 TEST(in_addr_to_string_prefix) {
@@ -27,10 +30,13 @@ TEST(in_addr_to_string_prefix) {
 }
 
 static void test_config_parse_in_addr_prefixes_one(int family, const union in_addr_union *addr, uint8_t prefixlen, Set **prefixes) {
-        _cleanup_free_ char *str = NULL;
+        const char *str = IN_ADDR_PREFIX_TO_STRING(family, addr, prefixlen);
+        assert_se(str);
 
-        assert_se(in_addr_prefix_to_string(family, addr, prefixlen, &str) >= 0);
         assert_se(config_parse_in_addr_prefixes("unit", "filename", 1, "Service", 1, "IPAddressAllow", 0, str, prefixes, NULL) >= 0);
+
+        assert_se(streq(str, IN_ADDR_PREFIX_TO_STRING(family, addr, prefixlen)));
+        assert_se(streq(IN_ADDR_PREFIX_TO_STRING(family, addr, prefixlen), str));
 }
 
 static void test_config_parse_in_addr_prefixes(Set **ret) {
index 296cd274345f5f781a9ea2a09be28b22c755b829..f5dcad65d5449ccecd95ae785d937c2bbf89251f 100644 (file)
@@ -86,28 +86,27 @@ TEST(in_addr_prefix_from_string) {
 }
 
 static void test_in_addr_prefix_to_string_valid(int family, const char *p) {
-        _cleanup_free_ char *str = NULL;
         union in_addr_union u;
         unsigned char l;
 
         log_info("%s: %s", __func__, p);
 
         assert_se(in_addr_prefix_from_string(p, family, &u, &l) >= 0);
-        assert_se(in_addr_prefix_to_string(family, &u, l, &str) >= 0);
-        assert_se(streq(str, p));
+        assert_se(streq(p, IN_ADDR_PREFIX_TO_STRING(family, &u, l)));
 }
 
 static void test_in_addr_prefix_to_string_unoptimized(int family, const char *p) {
-        _cleanup_free_ char *str1 = NULL, *str2 = NULL;
         union in_addr_union u1, u2;
         unsigned char len1, len2;
 
         log_info("%s: %s", __func__, p);
 
         assert_se(in_addr_prefix_from_string(p, family, &u1, &len1) >= 0);
-        assert_se(in_addr_prefix_to_string(family, &u1, len1, &str1) >= 0);
+        const char *str1 = IN_ADDR_PREFIX_TO_STRING(family, &u1, len1);
+        assert_se(str1);
         assert_se(in_addr_prefix_from_string(str1, family, &u2, &len2) >= 0);
-        assert_se(in_addr_prefix_to_string(family, &u2, len2, &str2) >= 0);
+        const char *str2 = IN_ADDR_PREFIX_TO_STRING(family, &u2, len2);
+        assert_se(str2);
 
         assert_se(streq(str1, str2));
         assert_se(len1 == len2);