dhcp: add special machine-id parse function
The original used uuid_parse() but that function did not work properly since the format of the machine-id is not compatable with a real uuid. This patch adds a new machine_id_parse() routine to correctly convert the character string of hex digits to a 16 byte binary string.
This commit is contained in:

committed by
Dan Williams

parent
b54a4e601d
commit
c0efef8c92
@@ -323,6 +323,32 @@ nm_dhcp_client_start_ip4 (NMDHCPClient *self,
|
|||||||
return priv->pid ? TRUE : FALSE;
|
return priv->pid ? TRUE : FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* uuid_parse does not work for machine-id, so we use our own converter */
|
||||||
|
static gboolean
|
||||||
|
machine_id_parse (const char *in, uuid_t uu)
|
||||||
|
{
|
||||||
|
const char *cp;
|
||||||
|
int i;
|
||||||
|
char buf[3];
|
||||||
|
|
||||||
|
g_return_val_if_fail (in != NULL, FALSE);
|
||||||
|
g_return_val_if_fail (strlen (in) == 32, FALSE);
|
||||||
|
|
||||||
|
for (i = 0; i < 32; i++, cp++) {
|
||||||
|
if (!g_ascii_isxdigit (in[i]))
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
buf[2] = 0;
|
||||||
|
cp = in;
|
||||||
|
for (i = 0; i < 16; i++) {
|
||||||
|
buf[0] = *cp++;
|
||||||
|
buf[1] = *cp++;
|
||||||
|
uu[i] = ((unsigned char) strtoul (buf, NULL, 16)) & 0xFF;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
static GByteArray *
|
static GByteArray *
|
||||||
generate_duid_from_machine_id (void)
|
generate_duid_from_machine_id (void)
|
||||||
{
|
{
|
||||||
@@ -334,7 +360,7 @@ generate_duid_from_machine_id (void)
|
|||||||
gsize sumlen = sizeof (buffer);
|
gsize sumlen = sizeof (buffer);
|
||||||
const guint16 duid_type = g_htons (4);
|
const guint16 duid_type = g_htons (4);
|
||||||
uuid_t uuid;
|
uuid_t uuid;
|
||||||
int ret;
|
gboolean success;
|
||||||
|
|
||||||
/* Get the machine ID from /etc/machine-id; it's always in /etc no matter
|
/* Get the machine ID from /etc/machine-id; it's always in /etc no matter
|
||||||
* where our configured SYSCONFDIR is.
|
* where our configured SYSCONFDIR is.
|
||||||
@@ -348,10 +374,10 @@ generate_duid_from_machine_id (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
contents = g_strstrip (contents);
|
contents = g_strstrip (contents);
|
||||||
ret = uuid_parse (contents, uuid);
|
success = machine_id_parse (contents, uuid);
|
||||||
g_free (contents);
|
g_free (contents);
|
||||||
|
|
||||||
if (ret != 0) {
|
if (!success) {
|
||||||
nm_log_warn (LOGD_DHCP6, "Failed to parse " SYSCONFDIR "/machine-id to generate DHCPv6 DUID.");
|
nm_log_warn (LOGD_DHCP6, "Failed to parse " SYSCONFDIR "/machine-id to generate DHCPv6 DUID.");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user