dhclient: fill IPv4 config more completely when reading lease files

This commit is contained in:
Dan Williams
2013-10-31 17:43:42 -05:00
parent 15f9a27d2e
commit 11e17856c9

View File

@@ -176,12 +176,12 @@ add_lease_option (GHashTable *hash, char *line)
g_hash_table_insert (hash, g_strdup (line), g_strdup (spc)); g_hash_table_insert (hash, g_strdup (line), g_strdup (spc));
} }
static gboolean static GTimeSpan
lease_valid (const char *str_expire) lease_validity_span (const char *str_expire)
{ {
GDateTime *expire = NULL, *now = NULL; GDateTime *expire = NULL, *now = NULL;
struct tm expire_tm; struct tm expire_tm;
gboolean valid = FALSE; GTimeSpan span = -1;
g_return_val_if_fail (str_expire != NULL, FALSE); g_return_val_if_fail (str_expire != NULL, FALSE);
@@ -203,17 +203,14 @@ lease_valid (const char *str_expire)
expire_tm.tm_hour, expire_tm.tm_hour,
expire_tm.tm_min, expire_tm.tm_min,
expire_tm.tm_sec); expire_tm.tm_sec);
g_warn_if_fail (expire);
if (expire) { if (expire) {
now = g_date_time_new_now_utc (); now = g_date_time_new_now_utc ();
valid = (g_date_time_difference (expire, now) > 0); span = g_date_time_difference (expire, now);
g_date_time_unref (expire); g_date_time_unref (expire);
g_date_time_unref (now); g_date_time_unref (now);
} else {
nm_log_warn (LOGD_DHCP, "couldn't convert DHCP lease file expire time '%s'",
str_expire);
} }
return span;
return valid;
} }
GSList * GSList *
@@ -281,6 +278,7 @@ nm_dhcp_dhclient_get_lease_ip_configs (const char *iface,
NMIP4Config *ip4; NMIP4Config *ip4;
NMPlatformIP4Address address; NMPlatformIP4Address address;
const char *data; const char *data;
GTimeSpan expiry;
guint32 tmp; guint32 tmp;
guint32 plen; guint32 plen;
@@ -292,8 +290,9 @@ nm_dhcp_dhclient_get_lease_ip_configs (const char *iface,
continue; continue;
data = g_hash_table_lookup (hash, "expire"); data = g_hash_table_lookup (hash, "expire");
if (data && !lease_valid (data)) if (!data)
continue; continue;
expiry = lease_validity_span (data);
data = g_hash_table_lookup (hash, "fixed-address"); data = g_hash_table_lookup (hash, "fixed-address");
if (!data) if (!data)
@@ -322,6 +321,8 @@ nm_dhcp_dhclient_get_lease_ip_configs (const char *iface,
plen = nm_utils_ip4_get_default_prefix (address.address); plen = nm_utils_ip4_get_default_prefix (address.address);
} }
address.plen = plen; address.plen = plen;
address.lifetime = address.preferred = expiry / G_TIME_SPAN_SECOND;
nm_ip4_config_add_address (ip4, &address);
/* Gateway */ /* Gateway */
data = g_hash_table_lookup (hash, "option routers"); data = g_hash_table_lookup (hash, "option routers");
@@ -333,7 +334,32 @@ nm_dhcp_dhclient_get_lease_ip_configs (const char *iface,
nm_ip4_config_set_gateway (ip4, tmp); nm_ip4_config_set_gateway (ip4, tmp);
} }
nm_ip4_config_add_address (ip4, &address); data = g_hash_table_lookup (hash, "option domain-name-servers");
if (data) {
char **dns, **dns_iter;
dns = g_strsplit_set (data, ",", -1);
for (dns_iter = dns; dns_iter && *dns_iter; dns_iter++) {
if (inet_pton (AF_INET, *dns_iter, &tmp))
nm_ip4_config_add_nameserver (ip4, tmp);
}
if (dns)
g_strfreev (dns);
}
data = g_hash_table_lookup (hash, "option domain-name");
if (data) {
char *unquoted, *p;
/* strip quotes */
p = unquoted = g_strdup (data[0] == '"' ? data + 1 : data);
if ((strlen (p) > 1) && (p[strlen (p) - 1] == '"'))
p[strlen (p) - 1] = '\0';
nm_ip4_config_add_domain (ip4, unquoted);
g_free (unquoted);
}
leases = g_slist_append (leases, ip4); leases = g_slist_append (leases, ip4);
continue; continue;