]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
dhcp: introduce sd_dhcp_duid_to_string() 30593/head
authorYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 15 Nov 2023 02:39:49 +0000 (11:39 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 22 Dec 2023 19:15:09 +0000 (04:15 +0900)
This also renames sd_dhcp6_client_duid_as_string() ->
sd_dhcp6_client_get_duid_as_string(), and make it use
sd_dhcp_duid_to_string().

src/libsystemd-network/dhcp-duid-internal.h
src/libsystemd-network/sd-dhcp-duid.c
src/libsystemd-network/sd-dhcp6-client.c
src/network/networkd-dhcp6.c
src/systemd/sd-dhcp-duid.h
src/systemd/sd-dhcp6-client.h

index ae888f789aa37697eb1fcf5544248525927d77a1..f8bc15c47eeadbc6a56f1c9be0def833f5e1d86b 100644 (file)
@@ -74,6 +74,7 @@ static inline bool duid_data_size_is_valid(size_t size) {
 }
 
 const char *duid_type_to_string(DUIDType t) _const_;
+int dhcp_duid_to_string_internal(uint16_t type, const void *data, size_t data_size, char **ret);
 
 int dhcp_identifier_set_iaid(
                 sd_device *dev,
index 303e332320e829da82afc5dcac5ab8f03045c8c6..297deb8a5d60e38a01715f8559587dd8b3403bbb 100644 (file)
@@ -5,6 +5,7 @@
 #include <net/if_arp.h>
 
 #include "dhcp-duid-internal.h"
+#include "hexdecoct.h"
 #include "netif-util.h"
 #include "network-common.h"
 #include "siphash24.h"
@@ -203,6 +204,46 @@ int sd_dhcp_duid_set_uuid(sd_dhcp_duid *duid) {
         return 0;
 }
 
+int dhcp_duid_to_string_internal(uint16_t type, const void *data, size_t data_size, char **ret) {
+        _cleanup_free_ char *p = NULL, *x = NULL;
+        const char *t;
+
+        assert(data);
+        assert(duid_data_size_is_valid(data_size));
+        assert(ret);
+
+        x = hexmem(data, data_size);
+        if (!x)
+                return -ENOMEM;
+
+        t = duid_type_to_string(type);
+        if (!t)
+                return asprintf(ret, "%04x:%s", htobe16(type), x);
+
+        p = strjoin(t, ":", x);
+        if (!p)
+                return -ENOMEM;
+
+        *ret = TAKE_PTR(p);
+        return 0;
+}
+
+int sd_dhcp_duid_to_string(const sd_dhcp_duid *duid, char **ret) {
+        uint16_t type;
+        const void *data;
+        size_t data_size;
+        int r;
+
+        assert_return(sd_dhcp_duid_is_set(duid), -EINVAL);
+        assert_return(ret, -EINVAL);
+
+        r = sd_dhcp_duid_get(duid, &type, &data, &data_size);
+        if (r < 0)
+                return r;
+
+        return dhcp_duid_to_string_internal(type, data, data_size, ret);
+}
+
 int dhcp_identifier_set_iaid(
                 sd_device *dev,
                 const struct hw_addr_data *hw_addr,
index 14f397a85ab3aefa46f7e14b0243d37cfc2ab472..db4e0f9c5919ffa99ea43beb978e0969b7e37096 100644 (file)
@@ -18,7 +18,6 @@
 #include "dns-domain.h"
 #include "event-util.h"
 #include "fd-util.h"
-#include "hexdecoct.h"
 #include "hostname-util.h"
 #include "in-addr-util.h"
 #include "iovec-util.h"
@@ -288,39 +287,14 @@ int sd_dhcp6_client_get_duid(sd_dhcp6_client *client, const sd_dhcp_duid **ret)
         return 0;
 }
 
-int sd_dhcp6_client_duid_as_string(
-                sd_dhcp6_client *client,
-                char **duid) {
-        _cleanup_free_ char *p = NULL, *s = NULL, *t = NULL;
-        const char *v;
-        int r;
-
+int sd_dhcp6_client_get_duid_as_string(sd_dhcp6_client *client, char **ret) {
         assert_return(client, -EINVAL);
-        assert_return(sd_dhcp_duid_is_set(&client->duid), -ENODATA);
-        assert_return(duid, -EINVAL);
-
-        v = duid_type_to_string(be16toh(client->duid.duid.type));
-        if (v) {
-                s = strdup(v);
-                if (!s)
-                        return -ENOMEM;
-        } else {
-                r = asprintf(&s, "%0x", client->duid.duid.type);
-                if (r < 0)
-                        return -ENOMEM;
-        }
-
-        t = hexmem(client->duid.duid.data, client->duid.size - offsetof(struct duid, data));
-        if (!t)
-                return -ENOMEM;
-
-        p = strjoin(s, ":", t);
-        if (!p)
-                return -ENOMEM;
+        assert_return(ret, -EINVAL);
 
-        *duid = TAKE_PTR(p);
+        if (!sd_dhcp_duid_is_set(&client->duid))
+                return -ENODATA;
 
-        return 0;
+        return sd_dhcp_duid_to_string(&client->duid, ret);
 }
 
 int sd_dhcp6_client_set_iaid(sd_dhcp6_client *client, uint32_t iaid) {
index ee20d0ed50a6ba29f52b2b6ee78f11b0badb1442..fee9d95c0d4f554a1571eadc3b2395cc46eb225f 100644 (file)
@@ -832,7 +832,7 @@ int link_serialize_dhcp6_client(Link *link, FILE *f) {
         if (r >= 0)
                 fprintf(f, "DHCP6_CLIENT_IAID=0x%x\n", iaid);
 
-        r = sd_dhcp6_client_duid_as_string(link->dhcp6_client, &duid);
+        r = sd_dhcp6_client_get_duid_as_string(link->dhcp6_client, &duid);
         if (r >= 0)
                 fprintf(f, "DHCP6_CLIENT_DUID=%s\n", duid);
 
index 06e3f8af1718495d26b227554ff802cf2222e178..b1d2772a3eb93d325d493d8794d06e48a0bf7853 100644 (file)
@@ -64,6 +64,8 @@ int sd_dhcp_duid_set_ll(
 int sd_dhcp_duid_set_en(sd_dhcp_duid *duid);
 int sd_dhcp_duid_set_uuid(sd_dhcp_duid *duid);
 
+int sd_dhcp_duid_to_string(const sd_dhcp_duid *duid, char **ret);
+
 _SD_END_DECLARATIONS;
 
 #endif
index 65392580da5c954e92fe0ba31d96a4323f1bf9e0..d551b4dd901826a53ee0f6b636a7e6ef5ea6ffd4 100644 (file)
@@ -71,15 +71,13 @@ int sd_dhcp6_client_set_duid_uuid(sd_dhcp6_client *client);
 int sd_dhcp6_client_set_duid_raw(sd_dhcp6_client *client, uint16_t duid_type, const uint8_t *duid, size_t duid_len);
 int sd_dhcp6_client_set_duid(sd_dhcp6_client *client, const sd_dhcp_duid *duid);
 int sd_dhcp6_client_get_duid(sd_dhcp6_client *client, const sd_dhcp_duid **ret);
+int sd_dhcp6_client_get_duid_as_string(sd_dhcp6_client *client, char **ret);
 int sd_dhcp6_client_set_iaid(
                 sd_dhcp6_client *client,
                 uint32_t iaid);
 int sd_dhcp6_client_get_iaid(
                 sd_dhcp6_client *client,
                 uint32_t *iaid);
-int sd_dhcp6_client_duid_as_string(
-                sd_dhcp6_client *client,
-                char **duid);
 int sd_dhcp6_client_set_fqdn(
                 sd_dhcp6_client *client,
                 const char *fqdn);