dhcp4: handle NIS servers and domains

This commit is contained in:
Dan Williams 2010-07-16 11:28:39 -07:00
parent 6bd918bcb9
commit a26b28b426
3 changed files with 111 additions and 0 deletions

View file

@ -891,6 +891,27 @@ ip4_options_to_config (NMDHCPClient *self)
nm_ip4_config_set_mtu (ip4_config, int_mtu);
}
str = g_hash_table_lookup (priv->options, "new_nis_domain");
if (str) {
nm_log_info (LOGD_DHCP4, " NIS domain '%s'", str);
nm_ip4_config_set_nis_domain (ip4_config, str);
}
str = g_hash_table_lookup (priv->options, "new_nis_servers");
if (str) {
char **searches = g_strsplit (str, " ", 0);
char **s;
for (s = searches; *s; s++) {
if (inet_pton (AF_INET, *s, &tmp_addr) > 0) {
nm_ip4_config_add_nis_server (ip4_config, tmp_addr.s_addr);
nm_log_info (LOGD_DHCP4, " nis '%s'", *s);
} else
nm_log_warn (LOGD_DHCP4, "ignoring invalid NIS server '%s'", *s);
}
g_strfreev (searches);
}
return ip4_config;
error:

View file

@ -56,6 +56,9 @@ typedef struct {
GArray *wins;
GArray *nis;
char * nis_domain;
GSList *routes;
gboolean never_default;
@ -488,6 +491,70 @@ nm_ip4_config_set_never_default (NMIP4Config *config, gboolean never_default)
NM_IP4_CONFIG_GET_PRIVATE (config)->never_default = never_default;
}
void nm_ip4_config_add_nis_server (NMIP4Config *config, guint32 nis)
{
NMIP4ConfigPrivate *priv;
int i;
g_return_if_fail (NM_IS_IP4_CONFIG (config));
g_return_if_fail (nis > 0);
priv = NM_IP4_CONFIG_GET_PRIVATE (config);
for (i = 0; i < priv->nis->len; i++) {
guint32 s = g_array_index (priv->nis, guint32, i);
/* No dupes */
g_return_if_fail (nis != s);
}
g_array_append_val (priv->nis, nis);
}
guint32 nm_ip4_config_get_nis_server (NMIP4Config *config, guint i)
{
g_return_val_if_fail (NM_IS_IP4_CONFIG (config), 0);
return g_array_index (NM_IP4_CONFIG_GET_PRIVATE (config)->nis, guint32, i);
}
guint32 nm_ip4_config_get_num_nis_servers (NMIP4Config *config)
{
g_return_val_if_fail (NM_IS_IP4_CONFIG (config), 0);
return NM_IP4_CONFIG_GET_PRIVATE (config)->nis->len;
}
void nm_ip4_config_reset_nis_servers (NMIP4Config *config)
{
NMIP4ConfigPrivate *priv;
g_return_if_fail (NM_IS_IP4_CONFIG (config));
priv = NM_IP4_CONFIG_GET_PRIVATE (config);
if (priv->nis->len)
g_array_remove_range (priv->nis, 0, priv->nis->len);
}
void
nm_ip4_config_set_nis_domain (NMIP4Config *config, const char *domain)
{
NMIP4ConfigPrivate *priv;
g_return_if_fail (NM_IS_IP4_CONFIG (config));
priv = NM_IP4_CONFIG_GET_PRIVATE (config);
g_free (priv->nis_domain);
priv->nis_domain = g_strdup (domain);
}
const char *
nm_ip4_config_get_nis_domain (NMIP4Config *config)
{
g_return_val_if_fail (NM_IS_IP4_CONFIG (config), 0);
return NM_IP4_CONFIG_GET_PRIVATE (config)->nis_domain;
}
/* libnl convenience/conversion functions */
static int ip4_addr_to_rtnl_local (guint32 ip4_address, struct rtnl_addr *addr)
@ -700,6 +767,15 @@ nm_ip4_config_diff (NMIP4Config *a, NMIP4Config *b)
|| !addr_array_compare (b_priv->wins, a_priv->wins))
flags |= NM_IP4_COMPARE_FLAG_WINS_SERVERS;
if ( (a_priv->nis->len != b_priv->nis->len)
|| !addr_array_compare (a_priv->nis, b_priv->nis)
|| !addr_array_compare (b_priv->nis, a_priv->nis))
flags |= NM_IP4_COMPARE_FLAG_NIS_SERVERS;
if ( (a_priv->nis_domain || b_priv->nis_domain)
&& (g_strcmp0 (a_priv->nis_domain, b_priv->nis_domain) != 0))
flags |= NM_IP4_COMPARE_FLAG_NIS_DOMAIN;
if ( !route_slist_compare (a_priv->routes, b_priv->routes)
|| !route_slist_compare (b_priv->routes, a_priv->routes))
flags |= NM_IP4_COMPARE_FLAG_ROUTES;
@ -732,6 +808,7 @@ nm_ip4_config_init (NMIP4Config *config)
priv->wins = g_array_new (FALSE, TRUE, sizeof (guint32));
priv->domains = g_ptr_array_sized_new (3);
priv->searches = g_ptr_array_sized_new (3);
priv->nis = g_array_new (FALSE, TRUE, sizeof (guint32));
}
static void
@ -745,6 +822,8 @@ finalize (GObject *object)
g_array_free (priv->nameservers, TRUE);
g_ptr_array_free (priv->domains, TRUE);
g_ptr_array_free (priv->searches, TRUE);
g_array_free (priv->nis, TRUE);
g_free (priv->nis_domain);
G_OBJECT_CLASS (nm_ip4_config_parent_class)->finalize (object);
}

View file

@ -99,6 +99,15 @@ void nm_ip4_config_set_mss (NMIP4Config *config, guint32 ms
gboolean nm_ip4_config_get_never_default (NMIP4Config *config);
void nm_ip4_config_set_never_default (NMIP4Config *config, gboolean never_default);
void nm_ip4_config_add_nis_server (NMIP4Config *config, guint32 nis);
guint32 nm_ip4_config_get_nis_server (NMIP4Config *config, guint i);
guint32 nm_ip4_config_get_num_nis_servers (NMIP4Config *config);
void nm_ip4_config_reset_nis_servers (NMIP4Config *config);
void nm_ip4_config_set_nis_domain (NMIP4Config *config, const char *domain);
const char * nm_ip4_config_get_nis_domain (NMIP4Config *config);
/* Flags for nm_ip4_config_to_rtnl_addr() */
#define NM_RTNL_ADDR_NONE 0x0000
#define NM_RTNL_ADDR_ADDR 0x0001
@ -122,6 +131,8 @@ typedef enum {
NM_IP4_COMPARE_FLAG_MTU = 0x00000040,
NM_IP4_COMPARE_FLAG_MSS = 0x00000080,
NM_IP4_COMPARE_FLAG_WINS_SERVERS= 0x00000100,
NM_IP4_COMPARE_FLAG_NIS_SERVERS = 0x00000200,
NM_IP4_COMPARE_FLAG_NIS_DOMAIN = 0x00000400,
NM_IP4_COMPARE_FLAG_ALL = 0xFFFFFFFF /* match everything */
} NMIP4ConfigCompareFlags;