]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sd-dhcp-lease: use sd_dhcp_client_id 30702/head
authorYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 2 Jan 2024 21:06:38 +0000 (06:06 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 2 Jan 2024 21:06:39 +0000 (06:06 +0900)
src/libsystemd-network/dhcp-lease-internal.h
src/libsystemd-network/sd-dhcp-client.c
src/libsystemd-network/sd-dhcp-lease.c
src/network/networkctl.c
src/systemd/sd-dhcp-lease.h

index a3d8bb45b397ae527e3d9ce29cfdb88f282394e0..b7bc142ef78f3652f77ff5f77da5bb7f52e7cfc8 100644 (file)
@@ -8,6 +8,7 @@
 #include "sd-dhcp-client.h"
 
 #include "alloc-util.h"
+#include "dhcp-client-id-internal.h"
 #include "dhcp-option.h"
 #include "list.h"
 #include "time-util.h"
@@ -67,8 +68,7 @@ struct sd_dhcp_lease {
         char *root_path;
         char *captive_portal;
 
-        void *client_id;
-        size_t client_id_len;
+        sd_dhcp_client_id client_id;
 
         void *vendor_specific;
         size_t vendor_specific_len;
@@ -92,7 +92,7 @@ int dhcp_lease_insert_private_option(sd_dhcp_lease *lease, uint8_t tag, const vo
 
 void dhcp_lease_set_timestamp(sd_dhcp_lease *lease, const triple_timestamp *timestamp);
 int dhcp_lease_set_default_subnet_mask(sd_dhcp_lease *lease);
-int dhcp_lease_set_client_id(sd_dhcp_lease *lease, const void *client_id, size_t client_id_len);
+int dhcp_lease_set_client_id(sd_dhcp_lease *lease, const sd_dhcp_client_id *client_id);
 
 #define dhcp_lease_unref_and_replace(a, b)                              \
         unref_and_replace_full(a, b, sd_dhcp_lease_ref, sd_dhcp_lease_unref)
index e901e99a3b71a1b21e618b68981b5700b4e0b6e6..dc1c17035d1ff01e20fb94b34737b3aba9b6570c 100644 (file)
@@ -1436,9 +1436,7 @@ static int client_parse_message(
                 return r;
 
         if (sd_dhcp_client_id_is_set(&client->client_id)) {
-                r = dhcp_lease_set_client_id(lease,
-                                             client->client_id.raw,
-                                             client->client_id.size);
+                r = dhcp_lease_set_client_id(lease, &client->client_id);
                 if (r < 0)
                         return r;
         }
index 4e3be98a33a2001890987c04c369ca30aa6e3d02..fd32fbb049028a2be1bc110de9418cb51c1bea5e 100644 (file)
@@ -420,7 +420,6 @@ static sd_dhcp_lease *dhcp_lease_free(sd_dhcp_lease *lease) {
 
         free(lease->static_routes);
         free(lease->classless_routes);
-        free(lease->client_id);
         free(lease->vendor_specific);
         strv_free(lease->search_domains);
         free(lease->sixrd_br_addresses);
@@ -1066,8 +1065,8 @@ int dhcp_lease_save(sd_dhcp_lease *lease, const char *lease_file) {
         _cleanup_fclose_ FILE *f = NULL;
         struct in_addr address;
         const struct in_addr *addresses;
-        const void *client_id, *data;
-        size_t client_id_len, data_len;
+        const void *data;
+        size_t data_len;
         const char *string;
         uint16_t mtu;
         _cleanup_free_ sd_dhcp_route **routes = NULL;
@@ -1183,11 +1182,10 @@ int dhcp_lease_save(sd_dhcp_lease *lease, const char *lease_file) {
         if (r >= 0)
                 fprintf(f, "TIMEZONE=%s\n", string);
 
-        r = sd_dhcp_lease_get_client_id(lease, &client_id, &client_id_len);
-        if (r >= 0) {
+        if (sd_dhcp_client_id_is_set(&lease->client_id)) {
                 _cleanup_free_ char *client_id_hex = NULL;
 
-                client_id_hex = hexmem(client_id, client_id_len);
+                client_id_hex = hexmem(lease->client_id.raw, lease->client_id.size);
                 if (!client_id_hex)
                         return -ENOMEM;
                 fprintf(f, "CLIENTID=%s\n", client_id_hex);
@@ -1478,9 +1476,16 @@ int dhcp_lease_load(sd_dhcp_lease **ret, const char *lease_file) {
         }
 
         if (client_id_hex) {
-                r = unhexmem(client_id_hex, SIZE_MAX, &lease->client_id, &lease->client_id_len);
+                _cleanup_free_ void *data = NULL;
+                size_t data_size;
+
+                r = unhexmem(client_id_hex, SIZE_MAX, &data, &data_size);
                 if (r < 0)
                         log_debug_errno(r, "Failed to parse client ID %s, ignoring: %m", client_id_hex);
+
+                r = sd_dhcp_client_id_set_raw(&lease->client_id, data, data_size);
+                if (r < 0)
+                        log_debug_errno(r, "Failed to assign client ID, ignoring: %m");
         }
 
         if (vendor_specific_hex) {
@@ -1537,36 +1542,25 @@ int dhcp_lease_set_default_subnet_mask(sd_dhcp_lease *lease) {
         return 0;
 }
 
-int sd_dhcp_lease_get_client_id(sd_dhcp_lease *lease, const void **client_id, size_t *client_id_len) {
+int sd_dhcp_lease_get_client_id(sd_dhcp_lease *lease, const sd_dhcp_client_id **ret) {
         assert_return(lease, -EINVAL);
-        assert_return(client_id, -EINVAL);
-        assert_return(client_id_len, -EINVAL);
+        assert_return(ret, -EINVAL);
 
-        if (!lease->client_id)
+        if (!sd_dhcp_client_id_is_set(&lease->client_id))
                 return -ENODATA;
 
-        *client_id = lease->client_id;
-        *client_id_len = lease->client_id_len;
+        *ret = &lease->client_id;
 
         return 0;
 }
 
-int dhcp_lease_set_client_id(sd_dhcp_lease *lease, const void *client_id, size_t client_id_len) {
+int dhcp_lease_set_client_id(sd_dhcp_lease *lease, const sd_dhcp_client_id *client_id) {
         assert_return(lease, -EINVAL);
-        assert_return(client_id || client_id_len <= 0, -EINVAL);
-
-        if (client_id_len <= 0)
-                lease->client_id = mfree(lease->client_id);
-        else {
-                void *p;
 
-                p = memdup(client_id, client_id_len);
-                if (!p)
-                        return -ENOMEM;
+        if (!sd_dhcp_client_id_is_set(client_id))
+                return sd_dhcp_client_id_clear(&lease->client_id);
 
-                free_and_replace(lease->client_id, p);
-                lease->client_id_len = client_id_len;
-        }
+        lease->client_id = *client_id;
 
         return 0;
 }
index d72eac0dda174cc8c3b3d6f6bc5933750c1415b4..8e677cc01085b4b0ac706994cc2b071f942d9d4c 100644 (file)
@@ -2271,8 +2271,7 @@ static int link_status_one(
         }
 
         if (lease) {
-                const void *client_id;
-                size_t client_id_len;
+                const sd_dhcp_client_id *client_id;
                 const char *tz;
 
                 r = sd_dhcp_lease_get_timezone(lease, &tz);
@@ -2284,11 +2283,11 @@ static int link_status_one(
                                 return table_log_add_error(r);
                 }
 
-                r = sd_dhcp_lease_get_client_id(lease, &client_id, &client_id_len);
+                r = sd_dhcp_lease_get_client_id(lease, &client_id);
                 if (r >= 0) {
                         _cleanup_free_ char *id = NULL;
 
-                        r = sd_dhcp_client_id_to_string_from_raw(client_id, client_id_len, &id);
+                        r = sd_dhcp_client_id_to_string(client_id, &id);
                         if (r >= 0) {
                                 r = table_add_many(table,
                                                    TABLE_FIELD, "DHCP4 Client ID",
index 1ef53ccf1ea83a10ecae933aae026ddb8c9943c6..95b0dfef22c098cff5c4c2e57cfcb5e3fb6ec2a9 100644 (file)
@@ -24,6 +24,8 @@
 #include <netinet/in.h>
 #include <sys/types.h>
 
+#include "sd-dhcp-client-id.h"
+
 #include "_sd-common.h"
 
 _SD_BEGIN_DECLARATIONS;
@@ -76,7 +78,7 @@ int sd_dhcp_lease_get_captive_portal(sd_dhcp_lease *lease, const char **captive_
 int sd_dhcp_lease_get_static_routes(sd_dhcp_lease *lease, sd_dhcp_route ***ret);
 int sd_dhcp_lease_get_classless_routes(sd_dhcp_lease *lease, sd_dhcp_route ***ret);
 int sd_dhcp_lease_get_vendor_specific(sd_dhcp_lease *lease, const void **data, size_t *data_len);
-int sd_dhcp_lease_get_client_id(sd_dhcp_lease *lease, const void **client_id, size_t *client_id_len);
+int sd_dhcp_lease_get_client_id(sd_dhcp_lease *lease, const sd_dhcp_client_id **ret);
 int sd_dhcp_lease_get_timezone(sd_dhcp_lease *lease, const char **timezone);
 int sd_dhcp_lease_get_6rd(
                 sd_dhcp_lease *lease,