[systemd-devel] [PATCH] sd-dhcp-lease: load/save client ID
Tom Gundersen
teg at jklm.no
Tue Nov 18 15:59:14 PST 2014
Applied. Thanks!
On Wed, Nov 19, 2014 at 12:13 AM, Dan Williams <dcbw at redhat.com> wrote:
> The lease is usually tied to the client ID, so users of the
> lease may want to know what client ID it was acquired with.
> ---
> src/libsystemd-network/dhcp-lease-internal.h | 5 +++
> src/libsystemd-network/sd-dhcp-client.c | 16 ++++++++
> src/libsystemd-network/sd-dhcp-lease.c | 58 +++++++++++++++++++++++++++-
> src/systemd/sd-dhcp-lease.h | 2 +
> 4 files changed, 80 insertions(+), 1 deletion(-)
>
> diff --git a/src/libsystemd-network/dhcp-lease-internal.h b/src/libsystemd-network/dhcp-lease-internal.h
> index 8806351..9e184ac 100644
> --- a/src/libsystemd-network/dhcp-lease-internal.h
> +++ b/src/libsystemd-network/dhcp-lease-internal.h
> @@ -70,6 +70,8 @@ struct sd_dhcp_lease {
> char *domainname;
> char *hostname;
> char *root_path;
> + uint8_t *client_id;
> + size_t client_id_len;
> };
>
> int dhcp_lease_new(sd_dhcp_lease **ret);
> @@ -78,5 +80,8 @@ int dhcp_lease_parse_options(uint8_t code, uint8_t len, const uint8_t *option,
>
> int dhcp_lease_set_default_subnet_mask(sd_dhcp_lease *lease);
>
> +int dhcp_lease_set_client_id(sd_dhcp_lease *lease, const uint8_t *client_id,
> + size_t client_id_len);
> +
> DEFINE_TRIVIAL_CLEANUP_FUNC(sd_dhcp_lease*, sd_dhcp_lease_unref);
> #define _cleanup_dhcp_lease_unref_ _cleanup_(sd_dhcp_lease_unrefp)
> diff --git a/src/libsystemd-network/sd-dhcp-client.c b/src/libsystemd-network/sd-dhcp-client.c
> index 8503f19..b2b72be 100644
> --- a/src/libsystemd-network/sd-dhcp-client.c
> +++ b/src/libsystemd-network/sd-dhcp-client.c
> @@ -1029,6 +1029,14 @@ static int client_handle_offer(sd_dhcp_client *client, DHCPMessage *offer,
> if (r < 0)
> return r;
>
> + if (client->client_id_len) {
> + r = dhcp_lease_set_client_id(lease,
> + (uint8_t *) &client->client_id.raw,
> + client->client_id_len);
> + if (r < 0)
> + return r;
> + }
> +
> r = dhcp_option_parse(offer, len, dhcp_lease_parse_options, lease);
> if (r != DHCP_OFFER) {
> log_dhcp_client(client, "received message was not an OFFER, ignoring");
> @@ -1088,6 +1096,14 @@ static int client_handle_ack(sd_dhcp_client *client, DHCPMessage *ack,
> if (r < 0)
> return r;
>
> + if (client->client_id_len) {
> + r = dhcp_lease_set_client_id(lease,
> + (uint8_t *) &client->client_id.raw,
> + client->client_id_len);
> + if (r < 0)
> + return r;
> + }
> +
> r = dhcp_option_parse(ack, len, dhcp_lease_parse_options, lease);
> if (r == DHCP_NAK) {
> log_dhcp_client(client, "NAK");
> diff --git a/src/libsystemd-network/sd-dhcp-lease.c b/src/libsystemd-network/sd-dhcp-lease.c
> index 1a6add0..f046ac5 100644
> --- a/src/libsystemd-network/sd-dhcp-lease.c
> +++ b/src/libsystemd-network/sd-dhcp-lease.c
> @@ -199,6 +199,7 @@ sd_dhcp_lease *sd_dhcp_lease_unref(sd_dhcp_lease *lease) {
> free(lease->dns);
> free(lease->ntp);
> free(lease->static_route);
> + free(lease->client_id);
> free(lease);
> }
>
> @@ -585,6 +586,8 @@ int sd_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 uint8_t *client_id;
> + size_t client_id_len;
> const char *string;
> uint16_t mtu;
> struct sd_dhcp_route *routes;
> @@ -658,6 +661,18 @@ int sd_dhcp_lease_save(sd_dhcp_lease *lease, const char *lease_file) {
> if (r >= 0)
> serialize_dhcp_routes(f, "ROUTES", routes, r);
>
> + r = sd_dhcp_lease_get_client_id(lease, &client_id, &client_id_len);
> + if (r >= 0) {
> + _cleanup_free_ char *client_id_hex;
> +
> + client_id_hex = hexmem (client_id, client_id_len);
> + if (!client_id_hex) {
> + r = -ENOMEM;
> + goto finish;
> + }
> + fprintf(f, "CLIENTID=%s\n", client_id_hex);
> + }
> +
> r = 0;
>
> fflush(f);
> @@ -679,7 +694,8 @@ int sd_dhcp_lease_load(sd_dhcp_lease **ret, const char *lease_file) {
> _cleanup_dhcp_lease_unref_ sd_dhcp_lease *lease = NULL;
> _cleanup_free_ char *address = NULL, *router = NULL, *netmask = NULL,
> *server_address = NULL, *next_server = NULL,
> - *dns = NULL, *ntp = NULL, *mtu = NULL, *routes = NULL;
> + *dns = NULL, *ntp = NULL, *mtu = NULL,
> + *routes = NULL, *client_id_hex = NULL;
> struct in_addr addr;
> int r;
>
> @@ -703,6 +719,7 @@ int sd_dhcp_lease_load(sd_dhcp_lease **ret, const char *lease_file) {
> "HOSTNAME", &lease->hostname,
> "ROOT_PATH", &lease->root_path,
> "ROUTES", &routes,
> + "CLIENTID", &client_id_hex,
> NULL);
> if (r < 0) {
> if (r == -ENOENT)
> @@ -777,6 +794,16 @@ int sd_dhcp_lease_load(sd_dhcp_lease **ret, const char *lease_file) {
> return r;
> }
>
> + if (client_id_hex) {
> + if (strlen (client_id_hex) % 2)
> + return -EINVAL;
> +
> + lease->client_id = unhexmem (client_id_hex, strlen (client_id_hex));
> + if (!lease->client_id)
> + return -ENOMEM;
> + lease->client_id_len = strlen (client_id_hex) / 2;
> + }
> +
> *ret = lease;
> lease = NULL;
>
> @@ -801,3 +828,32 @@ 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 uint8_t **client_id,
> + size_t *client_id_len) {
> + assert_return(lease, -EINVAL);
> + assert_return(client_id, -EINVAL);
> + assert_return(client_id_len, -EINVAL);
> +
> + *client_id = lease->client_id;
> + *client_id_len = lease->client_id_len;
> + return 0;
> +}
> +
> +int dhcp_lease_set_client_id(sd_dhcp_lease *lease, const uint8_t *client_id,
> + size_t client_id_len) {
> + assert_return(lease, -EINVAL);
> + assert_return((!client_id && !client_id_len) ||
> + (client_id && client_id_len), -EINVAL);
> +
> + free (lease->client_id);
> + lease->client_id = NULL;
> + lease->client_id_len = 0;
> +
> + if (client_id) {
> + lease->client_id = memdup (client_id, client_id_len);
> + lease->client_id_len = client_id_len;
> + }
> +
> + return 0;
> +}
> diff --git a/src/systemd/sd-dhcp-lease.h b/src/systemd/sd-dhcp-lease.h
> index 3527907..4296b91 100644
> --- a/src/systemd/sd-dhcp-lease.h
> +++ b/src/systemd/sd-dhcp-lease.h
> @@ -45,6 +45,8 @@ int sd_dhcp_lease_get_domainname(sd_dhcp_lease *lease, const char **domainname);
> int sd_dhcp_lease_get_hostname(sd_dhcp_lease *lease, const char **hostname);
> int sd_dhcp_lease_get_root_path(sd_dhcp_lease *lease, const char **root_path);
> int sd_dhcp_lease_get_routes(sd_dhcp_lease *lease, struct sd_dhcp_route **routesgn);
> +int sd_dhcp_lease_get_client_id(sd_dhcp_lease *lease, const uint8_t **client_id,
> + size_t *client_id_len);
>
> int sd_dhcp_lease_save(sd_dhcp_lease *lease, const char *lease_file);
> int sd_dhcp_lease_load(sd_dhcp_lease **ret, const char *lease_file);
> --
> 1.9.3
>
>
> _______________________________________________
> systemd-devel mailing list
> systemd-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/systemd-devel
More information about the systemd-devel
mailing list