]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: introduce FORMAT_LIFETIME()
authorYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 15 Jul 2021 09:48:56 +0000 (18:48 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 15 Jul 2021 10:17:32 +0000 (19:17 +0900)
Fixes a bug introduced by 5291f26d4a6450d1fbf3656640ef20c5e78aa6a5.

Fixes #20227.

src/network/networkd-address.c
src/network/networkd-address.h
src/network/networkd-dhcp6.c

index 3a4ab629f8739005f870ab2524e5bfc1ec86262b..c244175088f1e6dcfb07993a6066f59a80b8170b 100644 (file)
@@ -16,6 +16,7 @@
 #include "parse-util.h"
 #include "string-util.h"
 #include "strv.h"
+#include "strxcpyx.h"
 
 #define ADDRESSES_PER_LINK_MAX 2048U
 #define STATIC_ADDRESSES_PER_NETWORK_MAX 1024U
@@ -620,9 +621,23 @@ int manager_has_address(Manager *manager, int family, const union in_addr_union
         return false;
 }
 
+char *format_lifetime(char *buf, size_t l, uint32_t lifetime) {
+        char *p = buf;
+
+        assert(buf);
+        assert(l > 0);
+
+        if (lifetime == CACHE_INFO_INFINITY_LIFE_TIME) {
+                strscpy(buf, l, "forever");
+                return buf;
+        }
+
+        l -= strpcpy(&p, l, "for ");
+        return format_timespan(p, l, lifetime * USEC_PER_SEC, USEC_PER_SEC);
+}
+
 static void log_address_debug(const Address *address, const char *str, const Link *link) {
         _cleanup_free_ char *addr = NULL, *peer = NULL, *flags_str = NULL;
-        const char *valid_str = NULL, *preferred_str = NULL;
         bool has_peer;
 
         assert(address);
@@ -637,19 +652,13 @@ static void log_address_debug(const Address *address, const char *str, const Lin
         if (has_peer)
                 (void) in_addr_to_string(address->family, &address->in_addr_peer, &peer);
 
-        if (address->cinfo.ifa_valid != CACHE_INFO_INFINITY_LIFE_TIME)
-                valid_str = FORMAT_TIMESPAN(address->cinfo.ifa_valid * USEC_PER_SEC, USEC_PER_SEC);
-
-        if (address->cinfo.ifa_prefered != CACHE_INFO_INFINITY_LIFE_TIME)
-                preferred_str = FORMAT_TIMESPAN(address->cinfo.ifa_prefered * USEC_PER_SEC, USEC_PER_SEC);
-
         (void) address_flags_to_string_alloc(address->flags, address->family, &flags_str);
 
-        log_link_debug(link, "%s address: %s%s%s/%u (valid %s%s, preferred %s%s), flags: %s",
+        log_link_debug(link, "%s address: %s%s%s/%u (valid %s, preferred %s), flags: %s",
                        str, strnull(addr), has_peer ? " peer " : "",
                        has_peer ? strnull(peer) : "", address->prefixlen,
-                       valid_str ? "for " : "forever", strempty(valid_str),
-                       preferred_str ? "for " : "forever", strempty(preferred_str),
+                       FORMAT_LIFETIME(address->cinfo.ifa_valid),
+                       FORMAT_LIFETIME(address->cinfo.ifa_prefered),
                        strna(flags_str));
 }
 
index ff3d46abdddad05aeb064343d2ec873a01479015..1569b588a024e64b6f547e221649fbaee217c1de 100644 (file)
@@ -50,6 +50,13 @@ typedef struct Address {
         address_ready_callback_t callback;
 } Address;
 
+char *format_lifetime(char *buf, size_t l, uint32_t lifetime) _warn_unused_result_;
+/* Note: the lifetime of the compound literal is the immediately surrounding block,
+ * see C11 ยง6.5.2.5, and
+ * https://stackoverflow.com/questions/34880638/compound-literal-lifetime-and-if-blocks */
+#define FORMAT_LIFETIME(lifetime) \
+        format_lifetime((char[FORMAT_TIMESPAN_MAX+STRLEN("for ")]){}, FORMAT_TIMESPAN_MAX+STRLEN("for "), lifetime)
+
 int address_new(Address **ret);
 Address *address_free(Address *address);
 int address_get(Link *link, const Address *in, Address **ret);
index 2445acbe077fc9a1a683213af3e688794f9824ec..f03bf0651b182ac7e1f6b6be3f2a9e49b95dea50 100644 (file)
@@ -373,7 +373,6 @@ static int dhcp6_pd_address_handler(sd_netlink *rtnl, sd_netlink_message *m, Lin
 }
 
 static void log_dhcp6_pd_address(Link *link, const Address *address) {
-        const char *valid_str = NULL, *preferred_str = NULL;
         _cleanup_free_ char *buffer = NULL;
         int log_level;
 
@@ -386,15 +385,11 @@ static void log_dhcp6_pd_address(Link *link, const Address *address) {
                 return;
 
         (void) in6_addr_prefix_to_string(&address->in_addr.in6, address->prefixlen, &buffer);
-        if (address->cinfo.ifa_valid != CACHE_INFO_INFINITY_LIFE_TIME)
-                valid_str = FORMAT_TIMESPAN(address->cinfo.ifa_valid * USEC_PER_SEC, USEC_PER_SEC);
-        if (address->cinfo.ifa_prefered != CACHE_INFO_INFINITY_LIFE_TIME)
-                preferred_str = FORMAT_TIMESPAN(address->cinfo.ifa_prefered * USEC_PER_SEC, USEC_PER_SEC);
 
-        log_link_full(link, log_level, "DHCPv6-PD address %s (valid %s%s, preferred %s%s)",
+        log_link_full(link, log_level, "DHCPv6-PD address %s (valid %s, preferred %s)",
                       strna(buffer),
-                      valid_str ? "for " : "forever", strempty(valid_str),
-                      preferred_str ? "for " : "forever", strempty(preferred_str));
+                      FORMAT_LIFETIME(address->cinfo.ifa_valid),
+                      FORMAT_LIFETIME(address->cinfo.ifa_prefered));
 }
 
 static int dhcp6_pd_after_address_configure(Request *req, void *object) {
@@ -1068,11 +1063,6 @@ static void log_dhcp6_address(Link *link, const Address *address, char **ret) {
 
         (void) in6_addr_prefix_to_string(&address->in_addr.in6, address->prefixlen, &buffer);
 
-        const char *valid_str = address->cinfo.ifa_valid == CACHE_INFO_INFINITY_LIFE_TIME ? NULL :
-                FORMAT_TIMESPAN(address->cinfo.ifa_valid * USEC_PER_SEC, USEC_PER_SEC);
-        const char *preferred_str = address->cinfo.ifa_prefered == CACHE_INFO_INFINITY_LIFE_TIME ? NULL :
-                FORMAT_TIMESPAN(address->cinfo.ifa_prefered * USEC_PER_SEC, USEC_PER_SEC);
-
         r = address_get(link, address, &existing);
         if (r < 0) {
                 /* New address. */
@@ -1095,20 +1085,20 @@ static void log_dhcp6_address(Link *link, const Address *address, char **ret) {
                         break;
                 }
 
-        log_link_warning(link, "DHCPv6 address %s (valid %s%s, preferred %s%s) conflicts the existing address %s %s.",
+        log_link_warning(link, "DHCPv6 address %s (valid %s, preferred %s) conflicts the existing address %s %s.",
                          strna(buffer),
-                         valid_str ? "for " : "forever", strempty(valid_str),
-                         preferred_str ? "for " : "forever", strempty(preferred_str),
+                         FORMAT_LIFETIME(address->cinfo.ifa_valid),
+                         FORMAT_LIFETIME(address->cinfo.ifa_prefered),
                          strna(buffer),
                          by_ndisc ? "assigned by NDISC. Please try to use or update IPv6Token= setting "
                          "to change the address generated by NDISC, or disable UseAutonomousPrefix=" : "");
         goto finalize;
 
 simple_log:
-        log_link_full(link, log_level, "DHCPv6 address %s (valid %s%s, preferred %s%s)",
+        log_link_full(link, log_level, "DHCPv6 address %s (valid %s, preferred %s)",
                       strna(buffer),
-                      valid_str ? "for " : "forever", strempty(valid_str),
-                      preferred_str ? "for " : "forever", strempty(preferred_str));
+                      FORMAT_LIFETIME(address->cinfo.ifa_valid),
+                      FORMAT_LIFETIME(address->cinfo.ifa_prefered));
 
 finalize:
         if (ret)