Thomas Haller
2018-08-01 14:29:23 +02:00
6 changed files with 137 additions and 34 deletions

View File

@@ -55,10 +55,20 @@
<!-- <!--
Nameservers: Nameservers:
The nameservers in use. The nameservers in use. Deprecated: use NameserverData
--> -->
<property name="Nameservers" type="au" access="read"/> <property name="Nameservers" type="au" access="read"/>
<!--
NameserverData:
The nameservers in use. Currently only the value "address"
is recognized (with an IP address string).
Since: 1.14
-->
<property name="NameserverData" type="aa{sv}" access="read"/>
<!-- <!--
Domains: Domains:
@@ -92,10 +102,19 @@
WinsServers: WinsServers:
The Windows Internet Name Service servers associated with the connection. The Windows Internet Name Service servers associated with the connection.
Each address is in network byte order. Each address is in network byte order. Deprecated: use WinsServerData
--> -->
<property name="WinsServers" type="au" access="read"/> <property name="WinsServers" type="au" access="read"/>
<!--
WinsServerData:
The Windows Internet Name Service servers associated with the connection.
Since: 1.14
-->
<property name="WinsServerData" type="as" access="read"/>
<!-- <!--
PropertiesChanged: PropertiesChanged:
@properties: A dictionary mapping property names to variant boxed values @properties: A dictionary mapping property names to variant boxed values

View File

@@ -173,9 +173,11 @@ init_dbus (NMObject *object)
{ "address-data", &priv->addresses, demarshal_ip_address_data }, { "address-data", &priv->addresses, demarshal_ip_address_data },
{ NM_IP_CONFIG_ROUTES, &priv->routes, demarshal_ip_routes }, { NM_IP_CONFIG_ROUTES, &priv->routes, demarshal_ip_routes },
{ "route-data", &priv->routes, demarshal_ip_route_data }, { "route-data", &priv->routes, demarshal_ip_route_data },
/* Still use deprecated "Nameservers" property instead of "NameserverData" */
{ NM_IP_CONFIG_NAMESERVERS, &priv->nameservers, demarshal_ip_array }, { NM_IP_CONFIG_NAMESERVERS, &priv->nameservers, demarshal_ip_array },
{ NM_IP_CONFIG_DOMAINS, &priv->domains, }, { NM_IP_CONFIG_DOMAINS, &priv->domains, },
{ NM_IP_CONFIG_SEARCHES, &priv->searches, }, { NM_IP_CONFIG_SEARCHES, &priv->searches, },
/* Still use deprecated "WinsServers" property instead of "WinsServerData" */
{ NM_IP_CONFIG_WINS_SERVERS, &priv->wins, demarshal_ip_array }, { NM_IP_CONFIG_WINS_SERVERS, &priv->wins, demarshal_ip_array },
{ NULL }, { NULL },
}; };

View File

@@ -933,12 +933,36 @@ static GParamSpec *obj_properties[_PROPERTY_ENUMS_LAST] = { NULL, }
#define NM_GOBJECT_PROPERTIES_DEFINE(obj_type, ...) \ #define NM_GOBJECT_PROPERTIES_DEFINE(obj_type, ...) \
NM_GOBJECT_PROPERTIES_DEFINE_BASE (__VA_ARGS__); \ NM_GOBJECT_PROPERTIES_DEFINE_BASE (__VA_ARGS__); \
static inline void \ static inline void \
_notify (obj_type *obj, _PropertyEnums prop) \ _nm_gobject_notify_together_impl (obj_type *obj, guint n, const _PropertyEnums *props) \
{ \ { \
const gboolean freeze_thaw = (n > 1); \
\
nm_assert (G_IS_OBJECT (obj)); \ nm_assert (G_IS_OBJECT (obj)); \
nm_assert (n > 0); \
\
if (freeze_thaw) \
g_object_freeze_notify ((GObject *) obj); \
while (n-- > 0) { \
const _PropertyEnums prop = *props++; \
\
nm_assert ((gsize) prop < G_N_ELEMENTS (obj_properties)); \ nm_assert ((gsize) prop < G_N_ELEMENTS (obj_properties)); \
g_object_notify_by_pspec ((GObject *) obj, obj_properties[prop]); \ g_object_notify_by_pspec ((GObject *) obj, obj_properties[prop]); \
} } \
if (freeze_thaw) \
g_object_thaw_notify ((GObject *) obj); \
} \
\
static inline void \
_notify (obj_type *obj, _PropertyEnums prop) \
{ \
_nm_gobject_notify_together_impl (obj, 1, &prop); \
} \
/* invokes _notify() for all arguments (of type _PropertyEnums). Note, that if
* there are more than one prop arguments, this will involve a freeze/thaw
* of GObject property notifications. */
#define nm_gobject_notify_together(obj, ...) \
_nm_gobject_notify_together_impl (obj, NM_NARG (__VA_ARGS__), (const _PropertyEnums[]) { __VA_ARGS__ })
/*****************************************************************************/ /*****************************************************************************/

View File

@@ -278,10 +278,12 @@ NM_GOBJECT_PROPERTIES_DEFINE (NMIP4Config,
PROP_ROUTE_DATA, PROP_ROUTE_DATA,
PROP_ROUTES, PROP_ROUTES,
PROP_GATEWAY, PROP_GATEWAY,
PROP_NAMESERVER_DATA,
PROP_NAMESERVERS, PROP_NAMESERVERS,
PROP_DOMAINS, PROP_DOMAINS,
PROP_SEARCHES, PROP_SEARCHES,
PROP_DNS_OPTIONS, PROP_DNS_OPTIONS,
PROP_WINS_SERVER_DATA,
PROP_WINS_SERVERS, PROP_WINS_SERVERS,
PROP_DNS_PRIORITY, PROP_DNS_PRIORITY,
); );
@@ -509,8 +511,8 @@ _notify_addresses (NMIP4Config *self)
nm_clear_g_variant (&priv->address_data_variant); nm_clear_g_variant (&priv->address_data_variant);
nm_clear_g_variant (&priv->addresses_variant); nm_clear_g_variant (&priv->addresses_variant);
_notify (self, PROP_ADDRESS_DATA); nm_gobject_notify_together (self, PROP_ADDRESS_DATA,
_notify (self, PROP_ADDRESSES); PROP_ADDRESSES);
} }
static void static void
@@ -521,8 +523,8 @@ _notify_routes (NMIP4Config *self)
nm_assert (priv->best_default_route == _nm_ip4_config_best_default_route_find (self)); nm_assert (priv->best_default_route == _nm_ip4_config_best_default_route_find (self));
nm_clear_g_variant (&priv->route_data_variant); nm_clear_g_variant (&priv->route_data_variant);
nm_clear_g_variant (&priv->routes_variant); nm_clear_g_variant (&priv->routes_variant);
_notify (self, PROP_ROUTE_DATA); nm_gobject_notify_together (self, PROP_ROUTE_DATA,
_notify (self, PROP_ROUTES); PROP_ROUTES);
} }
/*****************************************************************************/ /*****************************************************************************/
@@ -2276,7 +2278,8 @@ nm_ip4_config_reset_nameservers (NMIP4Config *self)
if (priv->nameservers->len != 0) { if (priv->nameservers->len != 0) {
g_array_set_size (priv->nameservers, 0); g_array_set_size (priv->nameservers, 0);
_notify (self, PROP_NAMESERVERS); nm_gobject_notify_together (self, PROP_NAMESERVER_DATA,
PROP_NAMESERVERS);
} }
} }
@@ -2293,7 +2296,8 @@ nm_ip4_config_add_nameserver (NMIP4Config *self, guint32 new)
return; return;
g_array_append_val (priv->nameservers, new); g_array_append_val (priv->nameservers, new);
_notify (self, PROP_NAMESERVERS); nm_gobject_notify_together (self, PROP_NAMESERVER_DATA,
PROP_NAMESERVERS);
} }
void void
@@ -2304,7 +2308,8 @@ nm_ip4_config_del_nameserver (NMIP4Config *self, guint i)
g_return_if_fail (i < priv->nameservers->len); g_return_if_fail (i < priv->nameservers->len);
g_array_remove_index (priv->nameservers, i); g_array_remove_index (priv->nameservers, i);
_notify (self, PROP_NAMESERVERS); nm_gobject_notify_together (self, PROP_NAMESERVER_DATA,
PROP_NAMESERVERS);
} }
guint guint
@@ -2622,7 +2627,8 @@ nm_ip4_config_reset_wins (NMIP4Config *self)
if (priv->wins->len != 0) { if (priv->wins->len != 0) {
g_array_set_size (priv->wins, 0); g_array_set_size (priv->wins, 0);
_notify (self, PROP_WINS_SERVERS); nm_gobject_notify_together (self, PROP_WINS_SERVER_DATA,
PROP_WINS_SERVERS);
} }
} }
@@ -2639,7 +2645,8 @@ nm_ip4_config_add_wins (NMIP4Config *self, guint32 wins)
return; return;
g_array_append_val (priv->wins, wins); g_array_append_val (priv->wins, wins);
_notify (self, PROP_WINS_SERVERS); nm_gobject_notify_together (self, PROP_WINS_SERVER_DATA,
PROP_WINS_SERVERS);
} }
void void
@@ -2650,7 +2657,8 @@ nm_ip4_config_del_wins (NMIP4Config *self, guint i)
g_return_if_fail (i < priv->wins->len); g_return_if_fail (i < priv->wins->len);
g_array_remove_index (priv->wins, i); g_array_remove_index (priv->wins, i);
_notify (self, PROP_WINS_SERVERS); nm_gobject_notify_together (self, PROP_WINS_SERVER_DATA,
PROP_WINS_SERVERS);
} }
guint guint
@@ -2913,6 +2921,7 @@ get_property (GObject *object, guint prop_id,
NMDedupMultiIter ipconf_iter; NMDedupMultiIter ipconf_iter;
const NMPlatformIP4Route *route; const NMPlatformIP4Route *route;
GVariantBuilder builder_data, builder_legacy; GVariantBuilder builder_data, builder_legacy;
guint i;
switch (prop_id) { switch (prop_id) {
case PROP_IFINDEX: case PROP_IFINDEX:
@@ -2931,7 +2940,7 @@ get_property (GObject *object, guint prop_id,
head_entry = nm_ip4_config_lookup_addresses (self); head_entry = nm_ip4_config_lookup_addresses (self);
if (head_entry) { if (head_entry) {
gs_free const NMPObject **addresses = NULL; gs_free const NMPObject **addresses = NULL;
guint naddr, i; guint naddr;
addresses = (const NMPObject **) nm_dedup_multi_objs_to_array_head (head_entry, NULL, NULL, &naddr); addresses = (const NMPObject **) nm_dedup_multi_objs_to_array_head (head_entry, NULL, NULL, &naddr);
nm_assert (addresses && naddr); nm_assert (addresses && naddr);
@@ -3067,6 +3076,26 @@ out_routes_cached:
} else } else
g_value_set_string (value, NULL); g_value_set_string (value, NULL);
break; break;
case PROP_NAMESERVER_DATA:
g_variant_builder_init (&builder_data, G_VARIANT_TYPE ("aa{sv}"));
for (i = 0; i < priv->nameservers->len; i++) {
GVariantBuilder nested_builder;
char addr_str[NM_UTILS_INET_ADDRSTRLEN];
nm_utils_inet4_ntop (g_array_index (priv->nameservers, in_addr_t, i),
addr_str);
g_variant_builder_init (&nested_builder, G_VARIANT_TYPE ("a{sv}"));
g_variant_builder_add (&nested_builder, "{sv}",
"address",
g_variant_new_string (addr_str));
g_variant_builder_add (&builder_data, "a{sv}", &nested_builder);
}
g_value_take_variant (value,
g_variant_builder_end (&builder_data));
break;
case PROP_NAMESERVERS: case PROP_NAMESERVERS:
g_value_take_variant (value, g_value_take_variant (value,
g_variant_new_fixed_array (G_VARIANT_TYPE_UINT32, g_variant_new_fixed_array (G_VARIANT_TYPE_UINT32,
@@ -3086,6 +3115,19 @@ out_routes_cached:
case PROP_DNS_PRIORITY: case PROP_DNS_PRIORITY:
g_value_set_int (value, priv->dns_priority); g_value_set_int (value, priv->dns_priority);
break; break;
case PROP_WINS_SERVER_DATA:
g_variant_builder_init (&builder_data, G_VARIANT_TYPE ("as"));
for (i = 0; i < priv->wins->len; i++) {
char addr_str[NM_UTILS_INET_ADDRSTRLEN];
g_variant_builder_add (&builder_data,
"s",
nm_utils_inet4_ntop (g_array_index (priv->wins, in_addr_t, i),
addr_str));
}
g_value_take_variant (value,
g_variant_builder_end (&builder_data));
break;
case PROP_WINS_SERVERS: case PROP_WINS_SERVERS:
g_value_take_variant (value, g_value_take_variant (value,
g_variant_new_fixed_array (G_VARIANT_TYPE_UINT32, g_variant_new_fixed_array (G_VARIANT_TYPE_UINT32,
@@ -3198,11 +3240,13 @@ static const NMDBusInterfaceInfoExtended interface_info_ip4_config = {
NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE_L ("Gateway", "s", NM_IP4_CONFIG_GATEWAY), NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE_L ("Gateway", "s", NM_IP4_CONFIG_GATEWAY),
NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE_L ("Routes", "aau", NM_IP4_CONFIG_ROUTES), NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE_L ("Routes", "aau", NM_IP4_CONFIG_ROUTES),
NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE_L ("RouteData", "aa{sv}", NM_IP4_CONFIG_ROUTE_DATA), NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE_L ("RouteData", "aa{sv}", NM_IP4_CONFIG_ROUTE_DATA),
NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE ("NameserverData", "aa{sv}", NM_IP4_CONFIG_NAMESERVER_DATA),
NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE_L ("Nameservers", "au", NM_IP4_CONFIG_NAMESERVERS), NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE_L ("Nameservers", "au", NM_IP4_CONFIG_NAMESERVERS),
NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE_L ("Domains", "as", NM_IP4_CONFIG_DOMAINS), NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE_L ("Domains", "as", NM_IP4_CONFIG_DOMAINS),
NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE_L ("Searches", "as", NM_IP4_CONFIG_SEARCHES), NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE_L ("Searches", "as", NM_IP4_CONFIG_SEARCHES),
NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE_L ("DnsOptions", "as", NM_IP4_CONFIG_DNS_OPTIONS), NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE_L ("DnsOptions", "as", NM_IP4_CONFIG_DNS_OPTIONS),
NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE_L ("DnsPriority", "i", NM_IP4_CONFIG_DNS_PRIORITY), NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE_L ("DnsPriority", "i", NM_IP4_CONFIG_DNS_PRIORITY),
NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE ("WinsServerData", "as", NM_IP4_CONFIG_WINS_SERVER_DATA),
NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE_L ("WinsServers", "au", NM_IP4_CONFIG_WINS_SERVERS), NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE_L ("WinsServers", "au", NM_IP4_CONFIG_WINS_SERVERS),
), ),
), ),
@@ -3262,6 +3306,12 @@ nm_ip4_config_class_init (NMIP4ConfigClass *config_class)
NULL, NULL,
G_PARAM_READABLE | G_PARAM_READABLE |
G_PARAM_STATIC_STRINGS); G_PARAM_STATIC_STRINGS);
obj_properties[PROP_NAMESERVER_DATA] =
g_param_spec_variant (NM_IP4_CONFIG_NAMESERVER_DATA, "", "",
G_VARIANT_TYPE ("aa{sv}"),
NULL,
G_PARAM_READABLE |
G_PARAM_STATIC_STRINGS);
obj_properties[PROP_NAMESERVERS] = obj_properties[PROP_NAMESERVERS] =
g_param_spec_variant (NM_IP4_CONFIG_NAMESERVERS, "", "", g_param_spec_variant (NM_IP4_CONFIG_NAMESERVERS, "", "",
G_VARIANT_TYPE ("au"), G_VARIANT_TYPE ("au"),
@@ -3288,6 +3338,12 @@ nm_ip4_config_class_init (NMIP4ConfigClass *config_class)
G_MININT32, G_MAXINT32, 0, G_MININT32, G_MAXINT32, 0,
G_PARAM_READABLE | G_PARAM_READABLE |
G_PARAM_STATIC_STRINGS); G_PARAM_STATIC_STRINGS);
obj_properties[PROP_WINS_SERVER_DATA] =
g_param_spec_variant (NM_IP4_CONFIG_WINS_SERVER_DATA, "", "",
G_VARIANT_TYPE ("as"),
NULL,
G_PARAM_READABLE |
G_PARAM_STATIC_STRINGS);
obj_properties[PROP_WINS_SERVERS] = obj_properties[PROP_WINS_SERVERS] =
g_param_spec_variant (NM_IP4_CONFIG_WINS_SERVERS, "", "", g_param_spec_variant (NM_IP4_CONFIG_WINS_SERVERS, "", "",
G_VARIANT_TYPE ("au"), G_VARIANT_TYPE ("au"),

View File

@@ -138,16 +138,18 @@ typedef struct _NMIP4ConfigClass NMIP4ConfigClass;
#define NM_IP4_CONFIG_ADDRESS_DATA "address-data" #define NM_IP4_CONFIG_ADDRESS_DATA "address-data"
#define NM_IP4_CONFIG_ROUTE_DATA "route-data" #define NM_IP4_CONFIG_ROUTE_DATA "route-data"
#define NM_IP4_CONFIG_GATEWAY "gateway" #define NM_IP4_CONFIG_GATEWAY "gateway"
#define NM_IP4_CONFIG_NAMESERVERS "nameservers" #define NM_IP4_CONFIG_NAMESERVER_DATA "nameserver-data"
#define NM_IP4_CONFIG_DOMAINS "domains" #define NM_IP4_CONFIG_DOMAINS "domains"
#define NM_IP4_CONFIG_SEARCHES "searches" #define NM_IP4_CONFIG_SEARCHES "searches"
#define NM_IP4_CONFIG_DNS_OPTIONS "dns-options" #define NM_IP4_CONFIG_DNS_OPTIONS "dns-options"
#define NM_IP4_CONFIG_DNS_PRIORITY "dns-priority" #define NM_IP4_CONFIG_DNS_PRIORITY "dns-priority"
#define NM_IP4_CONFIG_WINS_SERVERS "wins-servers" #define NM_IP4_CONFIG_WINS_SERVER_DATA "wins-server-data"
/* deprecated */ /* deprecated */
#define NM_IP4_CONFIG_ADDRESSES "addresses" #define NM_IP4_CONFIG_ADDRESSES "addresses"
#define NM_IP4_CONFIG_ROUTES "routes" #define NM_IP4_CONFIG_ROUTES "routes"
#define NM_IP4_CONFIG_NAMESERVERS "nameservers"
#define NM_IP4_CONFIG_WINS_SERVERS "wins-servers"
GType nm_ip4_config_get_type (void); GType nm_ip4_config_get_type (void);

View File

@@ -208,8 +208,8 @@ _notify_addresses (NMIP6Config *self)
nm_clear_g_variant (&priv->address_data_variant); nm_clear_g_variant (&priv->address_data_variant);
nm_clear_g_variant (&priv->addresses_variant); nm_clear_g_variant (&priv->addresses_variant);
_notify (self, PROP_ADDRESS_DATA); nm_gobject_notify_together (self, PROP_ADDRESS_DATA,
_notify (self, PROP_ADDRESSES); PROP_ADDRESSES);
} }
static void static void
@@ -220,8 +220,8 @@ _notify_routes (NMIP6Config *self)
nm_assert (priv->best_default_route == _nm_ip6_config_best_default_route_find (self)); nm_assert (priv->best_default_route == _nm_ip6_config_best_default_route_find (self));
nm_clear_g_variant (&priv->route_data_variant); nm_clear_g_variant (&priv->route_data_variant);
nm_clear_g_variant (&priv->routes_variant); nm_clear_g_variant (&priv->routes_variant);
_notify (self, PROP_ROUTE_DATA); nm_gobject_notify_together (self, PROP_ROUTE_DATA,
_notify (self, PROP_ROUTES); PROP_ROUTES);
} }
/*****************************************************************************/ /*****************************************************************************/