diff --git a/src/dhcp-manager/nm-dhcp-client.c b/src/dhcp-manager/nm-dhcp-client.c index 5cebaa84ee..31a6f83c90 100644 --- a/src/dhcp-manager/nm-dhcp-client.c +++ b/src/dhcp-manager/nm-dhcp-client.c @@ -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: diff --git a/src/nm-ip4-config.c b/src/nm-ip4-config.c index 6dcc2dbcfe..0ae3d1bee4 100644 --- a/src/nm-ip4-config.c +++ b/src/nm-ip4-config.c @@ -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); } diff --git a/src/nm-ip4-config.h b/src/nm-ip4-config.h index 04999f8779..2d27acff03 100644 --- a/src/nm-ip4-config.h +++ b/src/nm-ip4-config.h @@ -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;