Merge branch wins-in-ip4-config

This commit is contained in:
Dan Williams 2009-01-04 19:09:39 -05:00
commit a10775c928
10 changed files with 196 additions and 14 deletions

View file

@ -8,6 +8,9 @@
<property name="Nameservers" type="au" access="read">
<tp:docstring>The nameservers in use.</tp:docstring>
</property>
<property name="WinsServers" type="au" access="read">
<tp:docstring>The Windows Internet Name Service servers associated with the connection.</tp:docstring>
</property>
<property name="Domains" type="as" access="read">
<tp:docstring>A list of domains this address belongs to.</tp:docstring>
</property>

View file

@ -128,6 +128,16 @@ dump_ip4_config (NMIP4Config *cfg)
for (i = 0; i < ptr_array->len; i++)
g_print ("\t%s\n", (const char *) g_ptr_array_index (ptr_array, i));
}
array = nm_ip4_config_get_wins_servers (cfg);
if (array) {
g_print ("IP4 WINS:\n");
for (i = 0; i < array->len; i++) {
tmp = ip4_address_as_string (g_array_index (array, guint32, i));
g_print ("\t%s\n", tmp);
g_free (tmp);
}
}
}
static void

View file

@ -94,6 +94,7 @@ global:
nm_ip4_config_get_domains;
nm_ip4_config_get_hostname;
nm_ip4_config_get_nameservers;
nm_ip4_config_get_wins_servers;
nm_ip4_config_get_routes;
nm_ip4_config_get_type;
nm_ip4_config_new;

View file

@ -41,6 +41,7 @@ typedef struct {
GArray *nameservers;
GPtrArray *domains;
GSList *routes;
GArray *wins;
} NMIP4ConfigPrivate;
enum {
@ -50,6 +51,7 @@ enum {
PROP_NAMESERVERS,
PROP_DOMAINS,
PROP_ROUTES,
PROP_WINS_SERVERS,
LAST_PROP
};
@ -82,6 +84,9 @@ demarshal_ip4_array (NMObject *object, GParamSpec *pspec, GValue *value, gpointe
if (!strcmp (pspec->name, NM_IP4_CONFIG_NAMESERVERS))
_nm_object_queue_notify (object, NM_IP4_CONFIG_NAMESERVERS);
else if (!strcmp (pspec->name, NM_IP4_CONFIG_WINS_SERVERS))
_nm_object_queue_notify (object, NM_IP4_CONFIG_WINS_SERVERS);
return TRUE;
}
@ -115,10 +120,11 @@ register_for_property_changed (NMIP4Config *config)
{
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (config);
const NMPropertiesChangedInfo property_changed_info[] = {
{ NM_IP4_CONFIG_ADDRESSES, demarshal_ip4_address_array, &priv->addresses },
{ NM_IP4_CONFIG_NAMESERVERS, demarshal_ip4_array, &priv->nameservers },
{ NM_IP4_CONFIG_DOMAINS, demarshal_domains, &priv->domains },
{ NM_IP4_CONFIG_ROUTES, demarshal_ip4_routes_array, &priv->routes },
{ NM_IP4_CONFIG_ADDRESSES, demarshal_ip4_address_array, &priv->addresses },
{ NM_IP4_CONFIG_NAMESERVERS, demarshal_ip4_array, &priv->nameservers },
{ NM_IP4_CONFIG_DOMAINS, demarshal_domains, &priv->domains },
{ NM_IP4_CONFIG_ROUTES, demarshal_ip4_routes_array, &priv->routes },
{ NM_IP4_CONFIG_WINS_SERVERS, demarshal_ip4_array, &priv->wins },
{ NULL },
};
@ -169,6 +175,9 @@ finalize (GObject *object)
if (priv->nameservers)
g_array_free (priv->nameservers, TRUE);
if (priv->wins)
g_array_free (priv->wins, TRUE);
if (priv->domains) {
g_ptr_array_foreach (priv->domains, (GFunc) g_free, NULL);
g_ptr_array_free (priv->domains, TRUE);
@ -204,6 +213,9 @@ get_property (GObject *object,
case PROP_ROUTES:
nm_utils_ip4_routes_to_gvalue (priv->routes, value);
break;
case PROP_WINS_SERVERS:
g_value_set_boxed (value, nm_ip4_config_get_wins_servers (self));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@ -286,6 +298,19 @@ nm_ip4_config_class_init (NMIP4ConfigClass *config_class)
"Routes",
"Routes",
G_PARAM_READABLE));
/**
* NMIP4Config:wins-servers:
*
* The #GArray containing WINS servers (%guint32<!-- -->es) of the configuration.
**/
g_object_class_install_property
(object_class, PROP_WINS_SERVERS,
g_param_spec_boxed (NM_IP4_CONFIG_WINS_SERVERS,
"WINS Servers",
"WINS Servers",
NM_TYPE_UINT_ARRAY,
G_PARAM_READABLE));
}
/**
@ -389,6 +414,7 @@ nm_ip4_config_get_nameservers (NMIP4Config *config)
return priv->nameservers;
}
/**
* nm_ip4_config_get_domains:
* @config: a #NMIP4Config
@ -428,6 +454,42 @@ nm_ip4_config_get_domains (NMIP4Config *config)
return handle_ptr_array_return (priv->domains);
}
/**
* nm_ip4_config_get_wins_servers:
* @config: a #NMIP4Config
*
* Gets the Windows Internet Name Service servers (WINS).
*
* Returns: the #GArray containing %guint32<!-- -->s. This is the internal copy used by the
* configuration and must not be modified.
**/
const GArray *
nm_ip4_config_get_wins_servers (NMIP4Config *config)
{
NMIP4ConfigPrivate *priv;
GArray *array = NULL;
GValue value = {0,};
g_return_val_if_fail (NM_IS_IP4_CONFIG (config), NULL);
priv = NM_IP4_CONFIG_GET_PRIVATE (config);
if (!priv->nameservers) {
if (_nm_object_get_property (NM_OBJECT (config),
NM_DBUS_INTERFACE_IP4_CONFIG,
"Nameservers",
&value)) {
array = (GArray *) g_value_get_boxed (&value);
if (array && array->len) {
priv->nameservers = g_array_sized_new (FALSE, TRUE, sizeof (guint32), array->len);
g_array_append_vals (priv->nameservers, array->data, array->len);
}
g_value_unset (&value);
}
}
return priv->nameservers;
}
/**
* nm_ip4_config_get_routes:
* @config: a #NMIP4Config

View file

@ -51,16 +51,18 @@ typedef struct {
#define NM_IP4_CONFIG_NAMESERVERS "nameservers"
#define NM_IP4_CONFIG_DOMAINS "domains"
#define NM_IP4_CONFIG_ROUTES "routes"
#define NM_IP4_CONFIG_WINS_SERVERS "wins-servers"
GType nm_ip4_config_get_type (void);
GObject *nm_ip4_config_new (DBusGConnection *connection, const char *object_path);
const GSList * nm_ip4_config_get_addresses (NMIP4Config *config);
const char * nm_ip4_config_get_hostname (NMIP4Config *config); /* DEPRECATED */
const GArray * nm_ip4_config_get_nameservers (NMIP4Config *config);
const GPtrArray *nm_ip4_config_get_domains (NMIP4Config *config);
const GSList * nm_ip4_config_get_routes (NMIP4Config *config);
const GSList * nm_ip4_config_get_addresses (NMIP4Config *config);
const char * nm_ip4_config_get_hostname (NMIP4Config *config); /* DEPRECATED */
const GArray * nm_ip4_config_get_nameservers (NMIP4Config *config);
const GPtrArray *nm_ip4_config_get_domains (NMIP4Config *config);
const GSList * nm_ip4_config_get_routes (NMIP4Config *config);
const GArray * nm_ip4_config_get_wins_servers (NMIP4Config *config);
G_END_DECLS

View file

@ -842,6 +842,21 @@ nm_dhcp_manager_get_ip4_config (NMDHCPManager *manager,
g_strfreev (searches);
}
str = g_hash_table_lookup (device->options, "new_netbios_name_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_wins (ip4_config, tmp_addr.s_addr);
nm_info (" wins '%s'", *s);
} else
nm_warning ("Ignoring invalid WINS server '%s'", *s);
}
g_strfreev (searches);
}
str = g_hash_table_lookup (device->options, "new_static_routes");
if (str) {
char **searches = g_strsplit (str, " ", 0);

View file

@ -54,6 +54,8 @@ typedef struct {
GPtrArray *domains;
GPtrArray *searches;
GArray *wins;
GSList *routes;
gboolean never_default;
@ -66,6 +68,7 @@ enum {
PROP_NAMESERVERS,
PROP_DOMAINS,
PROP_ROUTES,
PROP_WINS_SERVERS,
LAST_PROP
};
@ -179,10 +182,21 @@ void nm_ip4_config_set_ptp_address (NMIP4Config *config, guint32 ptp_addr)
void nm_ip4_config_add_nameserver (NMIP4Config *config, guint32 nameserver)
{
g_return_if_fail (NM_IS_IP4_CONFIG (config));
NMIP4ConfigPrivate *priv;
int i;
if (nameserver != 0)
g_array_append_val (NM_IP4_CONFIG_GET_PRIVATE (config)->nameservers, nameserver);
g_return_if_fail (NM_IS_IP4_CONFIG (config));
g_return_if_fail (nameserver > 0);
priv = NM_IP4_CONFIG_GET_PRIVATE (config);
for (i = 0; i < priv->nameservers->len; i++) {
guint32 s = g_array_index (priv->nameservers, guint32, i);
/* No dupes */
g_return_if_fail (nameserver != s);
}
g_array_append_val (priv->nameservers, nameserver);
}
guint32 nm_ip4_config_get_nameserver (NMIP4Config *config, guint i)
@ -210,6 +224,50 @@ void nm_ip4_config_reset_nameservers (NMIP4Config *config)
g_array_remove_range (priv->nameservers, 0, priv->nameservers->len);
}
void nm_ip4_config_add_wins (NMIP4Config *config, guint32 wins)
{
NMIP4ConfigPrivate *priv;
int i;
g_return_if_fail (NM_IS_IP4_CONFIG (config));
g_return_if_fail (wins > 0);
priv = NM_IP4_CONFIG_GET_PRIVATE (config);
for (i = 0; i < priv->wins->len; i++) {
guint32 s = g_array_index (priv->wins, guint32, i);
/* No dupes */
g_return_if_fail (wins != s);
}
g_array_append_val (priv->wins, wins);
}
guint32 nm_ip4_config_get_wins (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)->wins, guint32, i);
}
guint32 nm_ip4_config_get_num_wins (NMIP4Config *config)
{
g_return_val_if_fail (NM_IS_IP4_CONFIG (config), 0);
return NM_IP4_CONFIG_GET_PRIVATE (config)->wins->len;
}
void nm_ip4_config_reset_wins (NMIP4Config *config)
{
NMIP4ConfigPrivate *priv;
g_return_if_fail (NM_IS_IP4_CONFIG (config));
priv = NM_IP4_CONFIG_GET_PRIVATE (config);
if (priv->wins->len)
g_array_remove_range (priv->wins, 0, priv->wins->len);
}
void
nm_ip4_config_take_route (NMIP4Config *config, NMIP4Route *route)
{
@ -589,6 +647,11 @@ nm_ip4_config_diff (NMIP4Config *a, NMIP4Config *b)
|| !addr_array_compare (b_priv->nameservers, a_priv->nameservers))
flags |= NM_IP4_COMPARE_FLAG_NAMESERVERS;
if ( (a_priv->wins->len != b_priv->wins->len)
|| !addr_array_compare (a_priv->wins, b_priv->wins)
|| !addr_array_compare (b_priv->wins, a_priv->wins))
flags |= NM_IP4_COMPARE_FLAG_WINS_SERVERS;
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;
@ -618,6 +681,7 @@ nm_ip4_config_init (NMIP4Config *config)
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (config);
priv->nameservers = g_array_new (FALSE, TRUE, sizeof (guint32));
priv->wins = g_array_new (FALSE, TRUE, sizeof (guint32));
priv->domains = g_ptr_array_new ();
priv->searches = g_ptr_array_new ();
}
@ -629,6 +693,7 @@ finalize (GObject *object)
nm_utils_slist_free (priv->addresses, (GDestroyNotify) nm_ip4_address_unref);
nm_utils_slist_free (priv->routes, (GDestroyNotify) nm_ip4_route_unref);
g_array_free (priv->wins, TRUE);
g_array_free (priv->nameservers, TRUE);
g_ptr_array_free (priv->domains, TRUE);
g_ptr_array_free (priv->searches, TRUE);
@ -653,6 +718,9 @@ get_property (GObject *object, guint prop_id,
case PROP_ROUTES:
nm_utils_ip4_routes_to_gvalue (priv->routes, value);
break;
case PROP_WINS_SERVERS:
g_value_set_boxed (value, priv->wins);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@ -692,7 +760,6 @@ nm_ip4_config_class_init (NMIP4ConfigClass *config_class)
"Domains",
DBUS_TYPE_G_ARRAY_OF_STRING,
G_PARAM_READABLE));
g_object_class_install_property
(object_class, PROP_ROUTES,
g_param_spec_boxed (NM_IP4_CONFIG_ROUTES,
@ -700,6 +767,13 @@ nm_ip4_config_class_init (NMIP4ConfigClass *config_class)
"Routes",
DBUS_TYPE_G_ARRAY_OF_ARRAY_OF_UINT,
G_PARAM_READABLE));
g_object_class_install_property
(object_class, PROP_WINS_SERVERS,
g_param_spec_boxed (NM_IP4_CONFIG_WINS_SERVERS,
"WinsServers",
"WINS server list",
DBUS_TYPE_G_UINT_ARRAY,
G_PARAM_READABLE));
dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (config_class),
&dbus_glib_nm_ip4_config_object_info);

View file

@ -45,6 +45,7 @@ typedef struct {
#define NM_IP4_CONFIG_NAMESERVERS "nameservers"
#define NM_IP4_CONFIG_DOMAINS "domains"
#define NM_IP4_CONFIG_ROUTES "routes"
#define NM_IP4_CONFIG_WINS_SERVERS "wins-servers"
GType nm_ip4_config_get_type (void);
@ -67,6 +68,11 @@ guint32 nm_ip4_config_get_nameserver (NMIP4Config *config, guint i);
guint32 nm_ip4_config_get_num_nameservers (NMIP4Config *config);
void nm_ip4_config_reset_nameservers (NMIP4Config *config);
void nm_ip4_config_add_wins (NMIP4Config *config, guint32 wins);
guint32 nm_ip4_config_get_wins (NMIP4Config *config, guint i);
guint32 nm_ip4_config_get_num_wins (NMIP4Config *config);
void nm_ip4_config_reset_wins (NMIP4Config *config);
void nm_ip4_config_take_route (NMIP4Config *config, NMIP4Route *route);
void nm_ip4_config_add_route (NMIP4Config *config, NMIP4Route *route);
void nm_ip4_config_replace_route (NMIP4Config *config, guint32 i, NMIP4Route *new_route);
@ -114,6 +120,7 @@ typedef enum {
NM_IP4_COMPARE_FLAG_SEARCHES = 0x00000020,
NM_IP4_COMPARE_FLAG_MTU = 0x00000040,
NM_IP4_COMPARE_FLAG_MSS = 0x00000080,
NM_IP4_COMPARE_FLAG_WINS_SERVERS= 0x00000100,
NM_IP4_COMPARE_FLAG_ALL = 0xFFFFFFFF /* match everything */
} NMIP4ConfigCompareFlags;

View file

@ -509,6 +509,14 @@ impl_ppp_manager_set_ip4_config (NMPPPManager *manager,
nm_ip4_config_add_nameserver (config, g_array_index (dns, guint, i));
}
val = (GValue *) g_hash_table_lookup (config_hash, NM_PPP_IP4_CONFIG_WINS);
if (val) {
GArray *wins = (GArray *) g_value_get_boxed (val);
for (i = 0; i < wins->len; i++)
nm_ip4_config_add_wins (config, g_array_index (wins, guint, i));
}
val = (GValue *) g_hash_table_lookup (config_hash, NM_PPP_IP4_CONFIG_INTERFACE);
if (!val || !G_VALUE_HOLDS_STRING (val)) {
nm_warning ("No interface");

View file

@ -456,7 +456,7 @@ nm_vpn_connection_ip4_config_get (DBusGProxy *proxy,
GArray *nbns = (GArray *) g_value_get_boxed (val);
for (i = 0; i < nbns->len; i++)
nm_ip4_config_add_nameserver (config, g_array_index (nbns, guint, i));
nm_ip4_config_add_wins (config, g_array_index (nbns, guint, i));
}
val = (GValue *) g_hash_table_lookup (config_hash, NM_VPN_PLUGIN_IP4_CONFIG_MSS);