libnm: drop libnm IP-address-array types, use G_TYPE_STRV

Make NMIP4Config:nameservers, NMIP4Config:wins-servers, and
NMIP6Config:nameservers be G_TYPE_STRV, with stringified IP addresses,
and update the APIs accordingly.
This commit is contained in:
Dan Winship 2014-07-02 14:25:43 -04:00
parent 3e5b3833aa
commit 356fb7d77e
9 changed files with 75 additions and 248 deletions

View file

@ -80,7 +80,6 @@ print_ip4_config (NMIP4Config *cfg4,
const char *one_field)
{
GSList *list, *iter;
const GArray *array;
char **addr_arr = NULL;
char **route_arr = NULL;
char **dns_arr = NULL;
@ -139,27 +138,13 @@ print_ip4_config (NMIP4Config *cfg4,
route_arr[i] = NULL;
/* DNS */
array = nm_ip4_config_get_nameservers (cfg4);
if (array) {
dns_arr = g_new (char *, array->len + 1);
for (i = 0; i < array->len; i++)
dns_arr[i] = nmc_ip4_address_as_string (g_array_index (array, guint32, i), NULL);
dns_arr[i] = NULL;
}
dns_arr = g_strdupv ((char **) nm_ip4_config_get_nameservers (cfg4));
/* domains */
domain_arr = g_strdupv ((char **) nm_ip4_config_get_domains (cfg4));
/* WINS */
array = nm_ip4_config_get_wins_servers (cfg4);
if (array) {
wins_arr = g_new (char *, array->len + 1);
for (i = 0; i < array->len; i++)
wins_arr[i] = nmc_ip4_address_as_string (g_array_index (array, guint32, i), NULL);
wins_arr[i] = NULL;
}
wins_arr = g_strdupv ((char **) nm_ip4_config_get_wins_servers (cfg4));
arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX);
set_val_strc (arr, 0, group_prefix);
@ -242,13 +227,7 @@ print_ip6_config (NMIP6Config *cfg6,
route_arr[i] = NULL;
/* DNS */
list = (GSList *) nm_ip6_config_get_nameservers (cfg6);
dns_arr = g_new (char *, g_slist_length (list) + 1);
i = 0;
for (iter = list; iter; iter = g_slist_next (iter))
dns_arr[i++] = nmc_ip6_address_as_string (iter->data, NULL);
dns_arr[i] = NULL;
dns_arr = g_strdupv ((char **) nm_ip6_config_get_nameservers (cfg6));
/* domains */
domain_arr = g_strdupv ((char **) nm_ip6_config_get_domains (cfg6));

View file

@ -299,7 +299,6 @@ global:
nm_ip4_route_set_next_hop;
nm_ip4_route_set_prefix;
nm_ip4_route_unref;
nm_ip6_address_array_get_type;
nm_ip6_address_compare;
nm_ip6_address_dup;
nm_ip6_address_get_address;
@ -316,9 +315,7 @@ global:
nm_ip6_config_get_addresses;
nm_ip6_config_get_domains;
nm_ip6_config_get_gateway;
nm_ip6_config_get_nameserver;
nm_ip6_config_get_nameservers;
nm_ip6_config_get_num_nameservers;
nm_ip6_config_get_routes;
nm_ip6_config_get_searches;
nm_ip6_config_get_type;
@ -862,7 +859,6 @@ global:
nm_simple_connection_new_clone;
nm_simple_connection_new_from_dbus;
nm_state_get_type;
nm_uint_array_get_type;
nm_utils_ap_mode_security_valid;
nm_utils_bin2hexstr;
nm_utils_check_virtual_device_compatibility;

View file

@ -38,10 +38,10 @@ typedef struct {
char *gateway;
GSList *addresses;
GSList *routes;
GArray *nameservers;
char **nameservers;
char **domains;
char **searches;
GArray *wins;
char **wins;
} NMIP4ConfigPrivate;
enum {
@ -62,8 +62,10 @@ nm_ip4_config_init (NMIP4Config *config)
{
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (config);
priv->nameservers = g_new0 (char *, 1);
priv->domains = g_new0 (char *, 1);
priv->searches = g_new0 (char *, 1);
priv->wins = g_new0 (char *, 1);
}
static gboolean
@ -83,14 +85,30 @@ demarshal_ip4_address_array (NMObject *object, GParamSpec *pspec, GValue *value,
static gboolean
demarshal_ip4_array (NMObject *object, GParamSpec *pspec, GValue *value, gpointer field)
{
if (!_nm_uint_array_demarshal (value, (GArray **) field))
GArray *ip_array;
char ***obj_field;
int i;
if (!G_VALUE_HOLDS (value, DBUS_TYPE_G_UINT_ARRAY))
return FALSE;
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);
ip_array = g_value_get_boxed (value);
obj_field = field;
if (*obj_field)
g_strfreev (*obj_field);
*obj_field = g_new (char *, ip_array->len + 1);
for (i = 0; i < ip_array->len; i++) {
guint32 ip = g_array_index (ip_array, guint32, i);
const char *str;
str = nm_utils_inet4_ntop (ip, NULL);
(*obj_field)[i] = g_strdup (str);
}
(*obj_field)[i] = NULL;
_nm_object_queue_notify (object, pspec->name);
return TRUE;
}
@ -141,14 +159,10 @@ finalize (GObject *object)
g_slist_free_full (priv->addresses, (GDestroyNotify) nm_ip4_address_unref);
g_slist_free_full (priv->routes, (GDestroyNotify) nm_ip4_route_unref);
if (priv->nameservers)
g_array_free (priv->nameservers, TRUE);
if (priv->wins)
g_array_free (priv->wins, TRUE);
g_strfreev (priv->nameservers);
g_strfreev (priv->domains);
g_strfreev (priv->searches);
g_strfreev (priv->wins);
g_object_unref (priv->proxy);
@ -175,7 +189,7 @@ get_property (GObject *object,
nm_utils_ip4_routes_to_gvalue (priv->routes, value);
break;
case PROP_NAMESERVERS:
g_value_set_boxed (value, nm_ip4_config_get_nameservers (self));
g_value_set_boxed (value, (char **) nm_ip4_config_get_nameservers (self));
break;
case PROP_DOMAINS:
g_value_set_boxed (value, (char **) nm_ip4_config_get_domains (self));
@ -184,7 +198,7 @@ get_property (GObject *object,
g_value_set_boxed (value, (char **) nm_ip4_config_get_searches (self));
break;
case PROP_WINS_SERVERS:
g_value_set_boxed (value, nm_ip4_config_get_wins_servers (self));
g_value_set_boxed (value, (char **) nm_ip4_config_get_wins_servers (self));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@ -245,12 +259,12 @@ nm_ip4_config_class_init (NMIP4ConfigClass *config_class)
/**
* NMIP4Config:nameservers:
*
* The #GArray containing name servers (#guint32s) of the configuration.
* The array containing name server IP addresses of the configuration.
**/
g_object_class_install_property
(object_class, PROP_NAMESERVERS,
g_param_spec_boxed (NM_IP4_CONFIG_NAMESERVERS, "", "",
NM_TYPE_UINT_ARRAY,
G_TYPE_STRV,
G_PARAM_READABLE |
G_PARAM_STATIC_STRINGS));
@ -281,12 +295,12 @@ nm_ip4_config_class_init (NMIP4ConfigClass *config_class)
/**
* NMIP4Config:wins-servers:
*
* The #GArray containing WINS servers (#guint32s) of the configuration.
* The array containing WINS server IP addresses of the configuration.
**/
g_object_class_install_property
(object_class, PROP_WINS_SERVERS,
g_param_spec_boxed (NM_IP4_CONFIG_WINS_SERVERS, "", "",
NM_TYPE_UINT_ARRAY,
G_TYPE_STRV,
G_PARAM_READABLE |
G_PARAM_STATIC_STRINGS));
}
@ -330,16 +344,14 @@ nm_ip4_config_get_addresses (NMIP4Config *config)
*
* Gets the domain name servers (DNS).
*
* Returns: (element-type guint32): the #GArray containing #guint32s.
* This is the internal copy used by the configuration and must not be
* modified.
* Returns: the array of nameserver IP addresses
**/
const GArray *
const char * const *
nm_ip4_config_get_nameservers (NMIP4Config *config)
{
g_return_val_if_fail (NM_IS_IP4_CONFIG (config), NULL);
return NM_IP4_CONFIG_GET_PRIVATE (config)->nameservers;
return (const char * const *) NM_IP4_CONFIG_GET_PRIVATE (config)->nameservers;
}
/**
@ -384,12 +396,12 @@ nm_ip4_config_get_searches (NMIP4Config *config)
* This is the internal copy used by the configuration and must not be
* modified.
**/
const GArray *
const char * const *
nm_ip4_config_get_wins_servers (NMIP4Config *config)
{
g_return_val_if_fail (NM_IS_IP4_CONFIG (config), NULL);
return NM_IP4_CONFIG_GET_PRIVATE (config)->wins;
return (const char * const *) NM_IP4_CONFIG_GET_PRIVATE (config)->wins;
}
/**

View file

@ -63,10 +63,10 @@ GType nm_ip4_config_get_type (void);
const char * nm_ip4_config_get_gateway (NMIP4Config *config);
const GSList * nm_ip4_config_get_addresses (NMIP4Config *config);
const GSList * nm_ip4_config_get_routes (NMIP4Config *config);
const GArray * nm_ip4_config_get_nameservers (NMIP4Config *config);
const char * const *nm_ip4_config_get_nameservers (NMIP4Config *config);
const char * const *nm_ip4_config_get_domains (NMIP4Config *config);
const char * const *nm_ip4_config_get_searches (NMIP4Config *config);
const GArray * nm_ip4_config_get_wins_servers (NMIP4Config *config);
const char * const *nm_ip4_config_get_wins_servers (NMIP4Config *config);
G_END_DECLS

View file

@ -27,6 +27,7 @@
#include "nm-types-private.h"
#include "nm-object-private.h"
#include "nm-utils.h"
#include "nm-dbus-glib-types.h"
G_DEFINE_TYPE (NMIP6Config, nm_ip6_config, NM_TYPE_OBJECT)
@ -38,7 +39,7 @@ typedef struct {
char *gateway;
GSList *addresses;
GSList *routes;
GSList *nameservers;
char **nameservers;
char **domains;
char **searches;
} NMIP6ConfigPrivate;
@ -72,12 +73,30 @@ demarshal_ip6_address_array (NMObject *object, GParamSpec *pspec, GValue *value,
static gboolean
demarshal_ip6_nameserver_array (NMObject *object, GParamSpec *pspec, GValue *value, gpointer field)
{
if (!_nm_ip6_address_array_demarshal (value, (GSList **) field))
GPtrArray *ip_array;
char ***obj_field;
int i;
if (!G_VALUE_HOLDS (value, DBUS_TYPE_G_ARRAY_OF_ARRAY_OF_UCHAR))
return FALSE;
if (pspec && !strcmp (pspec->name, NM_IP6_CONFIG_NAMESERVERS))
_nm_object_queue_notify (object, NM_IP6_CONFIG_NAMESERVERS);
ip_array = g_value_get_boxed (value);
obj_field = field;
if (*obj_field)
g_strfreev (*obj_field);
*obj_field = g_new (char *, ip_array ? ip_array->len + 1 : 1);
for (i = 0; ip_array && i < ip_array->len; i++) {
GByteArray *ip = g_ptr_array_index (ip_array, i);
const char *str;
str = nm_utils_inet6_ntop ((struct in6_addr *) ip->data, NULL);
(*obj_field)[i] = g_strdup (str);
}
(*obj_field)[i] = NULL;
_nm_object_queue_notify (object, pspec->name);
return TRUE;
}
@ -152,66 +171,19 @@ nm_ip6_config_get_addresses (NMIP6Config *config)
}
/**
* nm_ip6_config_get_num_nameservers:
* @config: a #NMIP6Config
*
* Gets the number of the domain name servers in the configuration.
*
* Returns: the number of domain name servers
**/
guint32
nm_ip6_config_get_num_nameservers (NMIP6Config *config)
{
g_return_val_if_fail (NM_IS_IP6_CONFIG (config), 0);
return g_slist_length (NM_IP6_CONFIG_GET_PRIVATE (config)->nameservers);
}
/**
* nm_ip6_config_get_nameserver:
* @config: a #NMIP6Config
* @idx: index of the nameserver to return
*
* Gets the domain name server at index @idx in the configuration.
*
* Returns: (array fixed-size=16) (element-type guint8) (transfer none):
* the IPv6 address of domain name server at index @iidx
**/
const struct in6_addr *
nm_ip6_config_get_nameserver (NMIP6Config *config, guint32 idx)
{
NMIP6ConfigPrivate *priv;
GSList *item;
guint32 i = 0;
g_return_val_if_fail (NM_IS_IP6_CONFIG (config), NULL);
priv = NM_IP6_CONFIG_GET_PRIVATE (config);
for (item = priv->nameservers; item && i < idx; i++)
item = item->next;
g_return_val_if_fail (item, NULL);
return item ? (const struct in6_addr *) item->data : NULL;
}
/* FIXME: like in libnm_util, in6_addr is not introspectable, so skipping here */
/**
* nm_ip6_config_get_nameservers: (skip)
* nm_ip6_config_get_nameservers:
* @config: a #NMIP6Config
*
* Gets the domain name servers (DNS).
*
* Returns: a #GSList containing elements of type 'struct in6_addr' which
* contain the addresses of nameservers of the configuration. This is the
* internal copy used by the configuration and must not be modified.
* Returns: the array of nameserver IP addresses
**/
const GSList *
const char * const *
nm_ip6_config_get_nameservers (NMIP6Config *config)
{
g_return_val_if_fail (NM_IS_IP6_CONFIG (config), NULL);
return NM_IP6_CONFIG_GET_PRIVATE (config)->nameservers;
return (const char * const *) NM_IP6_CONFIG_GET_PRIVATE (config)->nameservers;
}
/**
@ -273,8 +245,8 @@ finalize (GObject *object)
g_slist_free_full (priv->addresses, (GDestroyNotify) nm_ip6_address_unref);
g_slist_free_full (priv->routes, (GDestroyNotify) nm_ip6_route_unref);
g_slist_free_full (priv->nameservers, g_free);
g_strfreev (priv->nameservers);
g_strfreev (priv->domains);
g_strfreev (priv->searches);
@ -303,7 +275,7 @@ get_property (GObject *object,
nm_utils_ip6_routes_to_gvalue (priv->routes, value);
break;
case PROP_NAMESERVERS:
g_value_set_boxed (value, nm_ip6_config_get_nameservers (self));
g_value_set_boxed (value, (char **) nm_ip6_config_get_nameservers (self));
break;
case PROP_DOMAINS:
g_value_set_boxed (value, (char **) nm_ip6_config_get_domains (self));
@ -322,6 +294,7 @@ nm_ip6_config_init (NMIP6Config *config)
{
NMIP6ConfigPrivate *priv = NM_IP6_CONFIG_GET_PRIVATE (config);
priv->nameservers = g_new0 (char *, 1);
priv->domains = g_new0 (char *, 1);
priv->searches = g_new0 (char *, 1);
}
@ -391,7 +364,7 @@ nm_ip6_config_class_init (NMIP6ConfigClass *config_class)
g_object_class_install_property
(object_class, PROP_NAMESERVERS,
g_param_spec_boxed (NM_IP6_CONFIG_NAMESERVERS, "", "",
NM_TYPE_IP6_ADDRESS_ARRAY,
G_TYPE_STRV,
G_PARAM_READABLE |
G_PARAM_STATIC_STRINGS));

View file

@ -62,9 +62,7 @@ GType nm_ip6_config_get_type (void);
const char * nm_ip6_config_get_gateway (NMIP6Config *config);
const GSList * nm_ip6_config_get_addresses (NMIP6Config *config);
const GSList * nm_ip6_config_get_routes (NMIP6Config *config);
guint32 nm_ip6_config_get_num_nameservers (NMIP6Config *config);
const struct in6_addr *nm_ip6_config_get_nameserver (NMIP6Config *config, guint32 idx);
const GSList * nm_ip6_config_get_nameservers (NMIP6Config *config);
const char * const * nm_ip6_config_get_nameservers (NMIP6Config *config);
const char * const * nm_ip6_config_get_domains (NMIP6Config *config);
const char * const * nm_ip6_config_get_searches (NMIP6Config *config);

View file

@ -25,7 +25,6 @@
#include "nm-types.h"
#include "nm-object-private.h"
gboolean _nm_uint_array_demarshal (GValue *value, GArray **dest);
gboolean _nm_ip6_address_array_demarshal (GValue *value, GSList **dest);
#endif /* __NM_TYPES_PRIVATE_H__ */

View file

@ -28,58 +28,6 @@
#include "nm-dbus-glib-types.h"
#include "nm-setting-ip6-config.h"
static gpointer
_nm_uint_array_copy (GArray *src)
{
GArray *dest;
dest = g_array_sized_new (FALSE, TRUE, sizeof (guint32), src->len);
g_array_append_vals (dest, src->data, src->len);
return dest;
}
static void
_nm_uint_array_free (GArray *array)
{
g_array_free (array, TRUE);
}
GType
nm_uint_array_get_type (void)
{
static GType our_type = 0;
if (our_type == 0)
our_type = g_boxed_type_register_static (g_intern_static_string ("NMUintArray"),
(GBoxedCopyFunc) _nm_uint_array_copy,
(GBoxedFreeFunc) _nm_uint_array_free);
return our_type;
}
gboolean
_nm_uint_array_demarshal (GValue *value, GArray **dest)
{
GArray *array;
if (!G_VALUE_HOLDS (value, DBUS_TYPE_G_UINT_ARRAY))
return FALSE;
if (*dest) {
g_boxed_free (NM_TYPE_UINT_ARRAY, *dest);
*dest = NULL;
}
array = (GArray *) g_value_get_boxed (value);
if (array && (array->len > 0)) {
*dest = g_array_sized_new (FALSE, TRUE, sizeof (guint32), array->len);
g_array_append_vals (*dest, array->data, array->len);
}
return TRUE;
}
/*****************************/
static gpointer
_nm_ip6_address_object_array_copy (GPtrArray *src)
{
@ -116,78 +64,6 @@ nm_ip6_address_object_array_get_type (void)
/*****************************/
static gpointer
_nm_ip6_address_array_copy (GPtrArray *src)
{
GPtrArray *dest;
int i;
dest = g_ptr_array_sized_new (src->len);
for (i = 0; i < src->len; i++) {
struct in6_addr *addr = g_ptr_array_index (src, i);
struct in6_addr *copy;
copy = g_malloc0 (sizeof (struct in6_addr));
memcpy (copy, addr, sizeof (struct in6_addr));
g_ptr_array_add (dest, copy);
}
return dest;
}
static void
_nm_ip6_address_array_free (GPtrArray *array)
{
int i;
for (i = 0; i < array->len; i++)
g_free (g_ptr_array_index (array, i));
g_ptr_array_free (array, TRUE);
}
GType
nm_ip6_address_array_get_type (void)
{
static GType our_type = 0;
if (our_type == 0)
our_type = g_boxed_type_register_static (g_intern_static_string ("NMIP6AddressArray"),
(GBoxedCopyFunc) _nm_ip6_address_array_copy,
(GBoxedFreeFunc) _nm_ip6_address_array_free);
return our_type;
}
gboolean
_nm_ip6_address_array_demarshal (GValue *value, GSList **dest)
{
GPtrArray *array;
if (!G_VALUE_HOLDS (value, DBUS_TYPE_G_ARRAY_OF_ARRAY_OF_UCHAR))
return FALSE;
if (*dest) {
g_slist_free_full (*dest, g_free);
*dest = NULL;
}
array = (GPtrArray *) g_value_get_boxed (value);
if (array && array->len) {
int i;
for (i = 0; i < array->len; i++) {
GByteArray *bytearray = (GByteArray *) g_ptr_array_index (array, i);
struct in6_addr *addr;
addr = g_malloc0 (sizeof (struct in6_addr));
memcpy (addr->s6_addr, bytearray->data, bytearray->len);
*dest = g_slist_append (*dest, addr);
}
}
return TRUE;
}
/*****************************/
static gpointer
_nm_ip6_route_object_array_copy (GPtrArray *src)
{

View file

@ -32,15 +32,9 @@
G_BEGIN_DECLS
#define NM_TYPE_UINT_ARRAY (nm_uint_array_get_type ())
GType nm_uint_array_get_type (void) G_GNUC_CONST;
#define NM_TYPE_IP6_ADDRESS_OBJECT_ARRAY (nm_ip6_address_object_array_get_type ())
GType nm_ip6_address_object_array_get_type (void) G_GNUC_CONST;
#define NM_TYPE_IP6_ADDRESS_ARRAY (nm_ip6_address_array_get_type ())
GType nm_ip6_address_array_get_type (void) G_GNUC_CONST;
#define NM_TYPE_IP6_ROUTE_OBJECT_ARRAY (nm_ip6_route_object_array_get_type ())
GType nm_ip6_route_object_array_get_type (void) G_GNUC_CONST;