[systemd-devel] [PATCH 1/1] sd-dhcp6-client: delay setting the DUID and don't fail constructor

Tom Gundersen teg at jklm.no
Wed Mar 4 02:02:00 PST 2015


Nicely done. Applied.

Though, I must say that a missing /etc/machine-id sounds like a pretty
serious problem, so not sure adding workarounds for that makes sense
(but that's anyway not part of this patch).

Cheers,

Tom

On Tue, Mar 3, 2015 at 9:06 PM, Thomas Haller <thaller at redhat.com> wrote:
> sd_dhcp6_client_new() tried to set the DUID based on the machine id.
> If the host has no /etc/machine-id, the constructor would fail
> making it impossible to create an sd_dhcp6_client instance.
>
> Relax this and create a DUID only later as needed. This way a caller
> caller can workaround a missing machine-id file and set a DUID of his
> choosing via sd_dhcp6_client_set_duid().
> ---
>  src/libsystemd-network/sd-dhcp6-client.c | 18 ++++++++++++------
>  1 file changed, 12 insertions(+), 6 deletions(-)
>
> diff --git a/src/libsystemd-network/sd-dhcp6-client.c b/src/libsystemd-network/sd-dhcp6-client.c
> index a432bbf..3db1cb0 100644
> --- a/src/libsystemd-network/sd-dhcp6-client.c
> +++ b/src/libsystemd-network/sd-dhcp6-client.c
> @@ -158,6 +158,13 @@ int sd_dhcp6_client_set_mac(sd_dhcp6_client *client, const uint8_t *addr,
>          return 0;
>  }
>
> +static int client_ensure_duid(sd_dhcp6_client *client)
> +{
> +        if (client->duid_len != 0)
> +                return 0;
> +        return dhcp_identifier_set_duid_en(&client->duid, &client->duid_len);
> +}
> +
>  int sd_dhcp6_client_set_duid(sd_dhcp6_client *client, uint16_t type, uint8_t *duid,
>                               size_t duid_len)
>  {
> @@ -378,6 +385,7 @@ static int client_send_message(sd_dhcp6_client *client, usec_t time_now) {
>          if (r < 0)
>                  return r;
>
> +        assert (client->duid_len);
>          r = dhcp6_option_append(&opt, &optlen, DHCP6_OPTION_CLIENTID,
>                                  client->duid_len, &client->duid);
>          if (r < 0)
> @@ -1108,6 +1116,10 @@ int sd_dhcp6_client_start(sd_dhcp6_client *client)
>          if (r < 0)
>                  return r;
>
> +        r = client_ensure_duid(client);
> +        if (r < 0)
> +                return r;
> +
>          r = dhcp6_network_bind_udp_socket(client->index, NULL);
>          if (r < 0)
>                  return r;
> @@ -1205,7 +1217,6 @@ sd_dhcp6_client *sd_dhcp6_client_unref(sd_dhcp6_client *client) {
>  int sd_dhcp6_client_new(sd_dhcp6_client **ret)
>  {
>          _cleanup_dhcp6_client_unref_ sd_dhcp6_client *client = NULL;
> -        int r;
>          size_t t;
>
>          assert_return(ret, -EINVAL);
> @@ -1222,11 +1233,6 @@ int sd_dhcp6_client_new(sd_dhcp6_client **ret)
>
>          client->fd = -1;
>
> -        /* initialize DUID */
> -        r = dhcp_identifier_set_duid_en(&client->duid, &client->duid_len);
> -        if (r < 0)
> -                return r;
> -
>          client->req_opts_len = ELEMENTSOF(default_req_opts);
>
>          client->req_opts = new0(be16_t, client->req_opts_len);
> --
> 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