From f4189fdd1de998703feb9ca221b700fdaee5cd31 Mon Sep 17 00:00:00 2001
From: Yu Watanabe <watanabe.yu+github@gmail.com>
Date: Mon, 16 Sep 2024 04:45:13 +0900
Subject: [PATCH 0949/1160] network/dhcp6: set hostname even if UseAddress=no

Follow-up for f963f8953daeab03b892616ce0c65f7572932187 and
1536b7b2d00819615bf8eba194de7ccd20c3689f.

(cherry picked from commit 8fead9c9e46e5f71ae6f6b038ff7f72c5a13b663)
(cherry picked from commit 30cf66855b6e31e7de2bff6d79d5c2d9fc17d684)
---
 src/network/networkd-dhcp6.c | 52 +++++++++++++++++++++++-------------
 1 file changed, 33 insertions(+), 19 deletions(-)

diff --git a/src/network/networkd-dhcp6.c b/src/network/networkd-dhcp6.c
index f499d0369c..3e7b456317 100644
--- a/src/network/networkd-dhcp6.c
+++ b/src/network/networkd-dhcp6.c
@@ -269,25 +269,35 @@ static int dhcp6_address_acquired(Link *link) {
                         return r;
         }
 
-        if (link->network->dhcp6_use_hostname) {
-                const char *dhcpname = NULL;
-                _cleanup_free_ char *hostname = NULL;
-
-                (void) sd_dhcp6_lease_get_fqdn(link->dhcp6_lease, &dhcpname);
-
-                if (dhcpname) {
-                        r = shorten_overlong(dhcpname, &hostname);
-                        if (r < 0)
-                                log_link_warning_errno(link, r, "Unable to shorten overlong DHCP hostname '%s', ignoring: %m", dhcpname);
-                        if (r == 1)
-                                log_link_notice(link, "Overlong DHCP hostname received, shortened from '%s' to '%s'", dhcpname, hostname);
-                }
-                if (hostname) {
-                        r = manager_set_hostname(link->manager, hostname);
-                        if (r < 0)
-                                log_link_error_errno(link, r, "Failed to set transient hostname to '%s': %m", hostname);
-                }
-        }
+        return 0;
+}
+
+static int dhcp6_request_hostname(Link *link) {
+        _cleanup_free_ char *hostname = NULL;
+        const char *dhcpname = NULL;
+        int r;
+
+        assert(link);
+        assert(link->network);
+
+        if (!link->network->dhcp6_use_hostname)
+                return 0;
+
+        r = sd_dhcp6_lease_get_fqdn(link->dhcp6_lease, &dhcpname);
+        if (r == -ENODATA)
+                return 0;
+        if (r < 0)
+                return r;
+
+        r = shorten_overlong(dhcpname, &hostname);
+        if (r < 0)
+                return log_link_warning_errno(link, r, "Unable to shorten overlong DHCP hostname '%s': %m", dhcpname);
+        if (r == 1)
+                log_link_notice(link, "Overlong DHCP hostname received, shortened from '%s' to '%s'", dhcpname, hostname);
+
+        r = manager_set_hostname(link->manager, hostname);
+        if (r < 0)
+                log_link_warning_errno(link, r, "Failed to set transient hostname to '%s', ignoring: %m", hostname);
 
         return 0;
 }
@@ -307,6 +317,10 @@ static int dhcp6_lease_ip_acquired(sd_dhcp6_client *client, Link *link) {
         lease_old = TAKE_PTR(link->dhcp6_lease);
         link->dhcp6_lease = sd_dhcp6_lease_ref(lease);
 
+        r = dhcp6_request_hostname(link);
+        if (r < 0)
+                return r;
+
         r = dhcp6_address_acquired(link);
         if (r < 0)
                 return r;
-- 
2.33.0