libnm-glib: handle NULL object paths generically
Since D-Bus doesn't allow NULL or zero-length object paths, NM uses "/" as a placeholder here. Make sure the generic marshalling code handles that so we don't have to do it in multiple places and simplify handling of NULL objects somewhat.
This commit is contained in:
@@ -55,7 +55,7 @@ typedef struct {
|
|||||||
NM80211Mode mode;
|
NM80211Mode mode;
|
||||||
guint32 rate;
|
guint32 rate;
|
||||||
NMAccessPoint *active_ap;
|
NMAccessPoint *active_ap;
|
||||||
gboolean null_active_ap;
|
gboolean got_active_ap;
|
||||||
NMDeviceWifiCapabilities wireless_caps;
|
NMDeviceWifiCapabilities wireless_caps;
|
||||||
GPtrArray *aps;
|
GPtrArray *aps;
|
||||||
|
|
||||||
@@ -271,6 +271,7 @@ nm_device_wifi_get_active_access_point (NMDeviceWifi *device)
|
|||||||
NMDeviceState state;
|
NMDeviceState state;
|
||||||
char *path;
|
char *path;
|
||||||
GValue value = { 0, };
|
GValue value = { 0, };
|
||||||
|
GError *error = NULL;
|
||||||
|
|
||||||
g_return_val_if_fail (NM_IS_DEVICE_WIFI (device), NULL);
|
g_return_val_if_fail (NM_IS_DEVICE_WIFI (device), NULL);
|
||||||
|
|
||||||
@@ -291,21 +292,20 @@ nm_device_wifi_get_active_access_point (NMDeviceWifi *device)
|
|||||||
}
|
}
|
||||||
|
|
||||||
priv = NM_DEVICE_WIFI_GET_PRIVATE (device);
|
priv = NM_DEVICE_WIFI_GET_PRIVATE (device);
|
||||||
if (priv->active_ap)
|
if (priv->got_active_ap == TRUE)
|
||||||
return priv->active_ap;
|
return priv->active_ap;
|
||||||
if (priv->null_active_ap)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
path = _nm_object_get_object_path_property (NM_OBJECT (device),
|
path = _nm_object_get_object_path_property (NM_OBJECT (device),
|
||||||
NM_DBUS_INTERFACE_DEVICE_WIRELESS,
|
NM_DBUS_INTERFACE_DEVICE_WIRELESS,
|
||||||
DBUS_PROP_ACTIVE_ACCESS_POINT,
|
DBUS_PROP_ACTIVE_ACCESS_POINT,
|
||||||
NULL);
|
&error);
|
||||||
if (path) {
|
if (error == NULL) {
|
||||||
g_value_init (&value, DBUS_TYPE_G_OBJECT_PATH);
|
g_value_init (&value, DBUS_TYPE_G_OBJECT_PATH);
|
||||||
g_value_take_boxed (&value, path);
|
g_value_take_boxed (&value, path);
|
||||||
demarshal_active_ap (NM_OBJECT (device), NULL, &value, &priv->active_ap);
|
demarshal_active_ap (NM_OBJECT (device), NULL, &value, &priv->active_ap);
|
||||||
g_value_unset (&value);
|
g_value_unset (&value);
|
||||||
}
|
}
|
||||||
|
g_clear_error (&error);
|
||||||
|
|
||||||
return priv->active_ap;
|
return priv->active_ap;
|
||||||
}
|
}
|
||||||
@@ -427,9 +427,8 @@ access_point_removed_proxy (DBusGProxy *proxy, char *path, gpointer user_data)
|
|||||||
if (ap == priv->active_ap) {
|
if (ap == priv->active_ap) {
|
||||||
g_object_unref (priv->active_ap);
|
g_object_unref (priv->active_ap);
|
||||||
priv->active_ap = NULL;
|
priv->active_ap = NULL;
|
||||||
priv->null_active_ap = FALSE;
|
|
||||||
|
|
||||||
_nm_object_queue_notify (NM_OBJECT (self), NM_DEVICE_WIFI_ACTIVE_ACCESS_POINT);
|
_nm_object_queue_notify (NM_OBJECT (self), NM_DEVICE_WIFI_ACTIVE_ACCESS_POINT);
|
||||||
|
|
||||||
priv->rate = 0;
|
priv->rate = 0;
|
||||||
_nm_object_queue_notify (NM_OBJECT (self), NM_DEVICE_WIFI_BITRATE);
|
_nm_object_queue_notify (NM_OBJECT (self), NM_DEVICE_WIFI_BITRATE);
|
||||||
}
|
}
|
||||||
@@ -620,7 +619,6 @@ state_changed_cb (NMDevice *device, GParamSpec *pspec, gpointer user_data)
|
|||||||
if (priv->active_ap) {
|
if (priv->active_ap) {
|
||||||
g_object_unref (priv->active_ap);
|
g_object_unref (priv->active_ap);
|
||||||
priv->active_ap = NULL;
|
priv->active_ap = NULL;
|
||||||
priv->null_active_ap = FALSE;
|
|
||||||
}
|
}
|
||||||
_nm_object_queue_notify (NM_OBJECT (device), NM_DEVICE_WIFI_ACTIVE_ACCESS_POINT);
|
_nm_object_queue_notify (NM_OBJECT (device), NM_DEVICE_WIFI_ACTIVE_ACCESS_POINT);
|
||||||
priv->rate = 0;
|
priv->rate = 0;
|
||||||
@@ -642,13 +640,11 @@ demarshal_active_ap (NMObject *object, GParamSpec *pspec, GValue *value, gpointe
|
|||||||
if (!G_VALUE_HOLDS (value, DBUS_TYPE_G_OBJECT_PATH))
|
if (!G_VALUE_HOLDS (value, DBUS_TYPE_G_OBJECT_PATH))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
priv->null_active_ap = FALSE;
|
priv->got_active_ap = TRUE;
|
||||||
|
|
||||||
|
if (value) {
|
||||||
path = g_value_get_boxed (value);
|
path = g_value_get_boxed (value);
|
||||||
if (path) {
|
if (path) {
|
||||||
if (!strcmp (path, "/"))
|
|
||||||
priv->null_active_ap = TRUE;
|
|
||||||
else {
|
|
||||||
ap = NM_ACCESS_POINT (_nm_object_cache_get (path));
|
ap = NM_ACCESS_POINT (_nm_object_cache_get (path));
|
||||||
if (!ap) {
|
if (!ap) {
|
||||||
connection = nm_object_get_connection (object);
|
connection = nm_object_get_connection (object);
|
||||||
|
@@ -50,7 +50,7 @@ typedef struct {
|
|||||||
|
|
||||||
char *hw_address;
|
char *hw_address;
|
||||||
NMWimaxNsp *active_nsp;
|
NMWimaxNsp *active_nsp;
|
||||||
gboolean null_active_nsp;
|
gboolean got_active_nsp;
|
||||||
GPtrArray *nsps;
|
GPtrArray *nsps;
|
||||||
|
|
||||||
guint center_freq;
|
guint center_freq;
|
||||||
@@ -153,6 +153,7 @@ nm_device_wimax_get_active_nsp (NMDeviceWimax *wimax)
|
|||||||
NMDeviceState state;
|
NMDeviceState state;
|
||||||
char *path;
|
char *path;
|
||||||
GValue value = { 0, };
|
GValue value = { 0, };
|
||||||
|
GError *error = NULL;
|
||||||
|
|
||||||
g_return_val_if_fail (NM_IS_DEVICE_WIMAX (wimax), NULL);
|
g_return_val_if_fail (NM_IS_DEVICE_WIMAX (wimax), NULL);
|
||||||
|
|
||||||
@@ -173,21 +174,20 @@ nm_device_wimax_get_active_nsp (NMDeviceWimax *wimax)
|
|||||||
}
|
}
|
||||||
|
|
||||||
priv = NM_DEVICE_WIMAX_GET_PRIVATE (wimax);
|
priv = NM_DEVICE_WIMAX_GET_PRIVATE (wimax);
|
||||||
if (priv->active_nsp)
|
if (priv->got_active_nsp == TRUE)
|
||||||
return priv->active_nsp;
|
return priv->active_nsp;
|
||||||
if (priv->null_active_nsp)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
path = _nm_object_get_object_path_property (NM_OBJECT (wimax),
|
path = _nm_object_get_object_path_property (NM_OBJECT (wimax),
|
||||||
NM_DBUS_INTERFACE_DEVICE_WIMAX,
|
NM_DBUS_INTERFACE_DEVICE_WIMAX,
|
||||||
DBUS_PROP_ACTIVE_NSP,
|
DBUS_PROP_ACTIVE_NSP,
|
||||||
NULL);
|
&error);
|
||||||
if (path) {
|
if (error == NULL) {
|
||||||
g_value_init (&value, DBUS_TYPE_G_OBJECT_PATH);
|
g_value_init (&value, DBUS_TYPE_G_OBJECT_PATH);
|
||||||
g_value_take_boxed (&value, path);
|
g_value_take_boxed (&value, path);
|
||||||
demarshal_active_nsp (NM_OBJECT (wimax), NULL, &value, &priv->active_nsp);
|
demarshal_active_nsp (NM_OBJECT (wimax), NULL, &value, &priv->active_nsp);
|
||||||
g_value_unset (&value);
|
g_value_unset (&value);
|
||||||
}
|
}
|
||||||
|
g_clear_error (&error);
|
||||||
|
|
||||||
return priv->active_nsp;
|
return priv->active_nsp;
|
||||||
}
|
}
|
||||||
@@ -309,8 +309,6 @@ nsp_removed_proxy (DBusGProxy *proxy, char *path, gpointer user_data)
|
|||||||
if (nsp == priv->active_nsp) {
|
if (nsp == priv->active_nsp) {
|
||||||
g_object_unref (priv->active_nsp);
|
g_object_unref (priv->active_nsp);
|
||||||
priv->active_nsp = NULL;
|
priv->active_nsp = NULL;
|
||||||
priv->null_active_nsp = FALSE;
|
|
||||||
|
|
||||||
_nm_object_queue_notify (NM_OBJECT (self), NM_DEVICE_WIMAX_ACTIVE_NSP);
|
_nm_object_queue_notify (NM_OBJECT (self), NM_DEVICE_WIMAX_ACTIVE_NSP);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -607,7 +605,6 @@ state_changed_cb (NMDevice *device, GParamSpec *pspec, gpointer user_data)
|
|||||||
if (priv->active_nsp) {
|
if (priv->active_nsp) {
|
||||||
g_object_unref (priv->active_nsp);
|
g_object_unref (priv->active_nsp);
|
||||||
priv->active_nsp = NULL;
|
priv->active_nsp = NULL;
|
||||||
priv->null_active_nsp = FALSE;
|
|
||||||
}
|
}
|
||||||
_nm_object_queue_notify (NM_OBJECT (device), NM_DEVICE_WIMAX_ACTIVE_NSP);
|
_nm_object_queue_notify (NM_OBJECT (device), NM_DEVICE_WIMAX_ACTIVE_NSP);
|
||||||
clear_link_status (self);
|
clear_link_status (self);
|
||||||
@@ -634,13 +631,11 @@ demarshal_active_nsp (NMObject *object, GParamSpec *pspec, GValue *value, gpoint
|
|||||||
if (!G_VALUE_HOLDS (value, DBUS_TYPE_G_OBJECT_PATH))
|
if (!G_VALUE_HOLDS (value, DBUS_TYPE_G_OBJECT_PATH))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
priv->null_active_nsp = FALSE;
|
priv->got_active_nsp = TRUE;
|
||||||
|
|
||||||
|
if (value) {
|
||||||
path = g_value_get_boxed (value);
|
path = g_value_get_boxed (value);
|
||||||
if (path) {
|
if (path) {
|
||||||
if (!strcmp (path, "/"))
|
|
||||||
priv->null_active_nsp = TRUE;
|
|
||||||
else {
|
|
||||||
nsp = NM_WIMAX_NSP (_nm_object_cache_get (path));
|
nsp = NM_WIMAX_NSP (_nm_object_cache_get (path));
|
||||||
if (!nsp) {
|
if (!nsp) {
|
||||||
connection = nm_object_get_connection (object);
|
connection = nm_object_get_connection (object);
|
||||||
|
@@ -56,13 +56,13 @@ typedef struct {
|
|||||||
gboolean managed;
|
gboolean managed;
|
||||||
gboolean firmware_missing;
|
gboolean firmware_missing;
|
||||||
NMIP4Config *ip4_config;
|
NMIP4Config *ip4_config;
|
||||||
gboolean null_ip4_config;
|
gboolean got_ip4_config;
|
||||||
NMDHCP4Config *dhcp4_config;
|
NMDHCP4Config *dhcp4_config;
|
||||||
gboolean null_dhcp4_config;
|
gboolean got_dhcp4_config;
|
||||||
NMIP6Config *ip6_config;
|
NMIP6Config *ip6_config;
|
||||||
gboolean null_ip6_config;
|
gboolean got_ip6_config;
|
||||||
NMDHCP6Config *dhcp6_config;
|
NMDHCP6Config *dhcp6_config;
|
||||||
gboolean null_dhcp6_config;
|
gboolean got_dhcp6_config;
|
||||||
NMDeviceState state;
|
NMDeviceState state;
|
||||||
|
|
||||||
GUdevClient *client;
|
GUdevClient *client;
|
||||||
@@ -119,13 +119,11 @@ demarshal_ip4_config (NMObject *object, GParamSpec *pspec, GValue *value, gpoint
|
|||||||
if (!G_VALUE_HOLDS (value, DBUS_TYPE_G_OBJECT_PATH))
|
if (!G_VALUE_HOLDS (value, DBUS_TYPE_G_OBJECT_PATH))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
priv->null_ip4_config = FALSE;
|
priv->got_ip4_config = TRUE;
|
||||||
|
|
||||||
|
if (value) {
|
||||||
path = g_value_get_boxed (value);
|
path = g_value_get_boxed (value);
|
||||||
if (path) {
|
if (path) {
|
||||||
if (!strcmp (path, "/"))
|
|
||||||
priv->null_ip4_config = TRUE;
|
|
||||||
else {
|
|
||||||
config = NM_IP4_CONFIG (_nm_object_cache_get (path));
|
config = NM_IP4_CONFIG (_nm_object_cache_get (path));
|
||||||
if (!config) {
|
if (!config) {
|
||||||
connection = nm_object_get_connection (object);
|
connection = nm_object_get_connection (object);
|
||||||
@@ -157,13 +155,11 @@ demarshal_dhcp4_config (NMObject *object, GParamSpec *pspec, GValue *value, gpoi
|
|||||||
if (!G_VALUE_HOLDS (value, DBUS_TYPE_G_OBJECT_PATH))
|
if (!G_VALUE_HOLDS (value, DBUS_TYPE_G_OBJECT_PATH))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
priv->null_dhcp4_config = FALSE;
|
priv->got_dhcp4_config = TRUE;
|
||||||
|
|
||||||
|
if (value) {
|
||||||
path = g_value_get_boxed (value);
|
path = g_value_get_boxed (value);
|
||||||
if (path) {
|
if (path) {
|
||||||
if (!strcmp (path, "/"))
|
|
||||||
priv->null_dhcp4_config = TRUE;
|
|
||||||
else {
|
|
||||||
config = NM_DHCP4_CONFIG (_nm_object_cache_get (path));
|
config = NM_DHCP4_CONFIG (_nm_object_cache_get (path));
|
||||||
if (!config) {
|
if (!config) {
|
||||||
connection = nm_object_get_connection (object);
|
connection = nm_object_get_connection (object);
|
||||||
@@ -195,13 +191,11 @@ demarshal_ip6_config (NMObject *object, GParamSpec *pspec, GValue *value, gpoint
|
|||||||
if (!G_VALUE_HOLDS (value, DBUS_TYPE_G_OBJECT_PATH))
|
if (!G_VALUE_HOLDS (value, DBUS_TYPE_G_OBJECT_PATH))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
priv->null_ip6_config = FALSE;
|
priv->got_ip6_config = TRUE;
|
||||||
|
|
||||||
|
if (value) {
|
||||||
path = g_value_get_boxed (value);
|
path = g_value_get_boxed (value);
|
||||||
if (path) {
|
if (path) {
|
||||||
if (!strcmp (path, "/"))
|
|
||||||
priv->null_ip6_config = TRUE;
|
|
||||||
else {
|
|
||||||
config = NM_IP6_CONFIG (_nm_object_cache_get (path));
|
config = NM_IP6_CONFIG (_nm_object_cache_get (path));
|
||||||
if (!config) {
|
if (!config) {
|
||||||
connection = nm_object_get_connection (object);
|
connection = nm_object_get_connection (object);
|
||||||
@@ -233,13 +227,11 @@ demarshal_dhcp6_config (NMObject *object, GParamSpec *pspec, GValue *value, gpoi
|
|||||||
if (!G_VALUE_HOLDS (value, DBUS_TYPE_G_OBJECT_PATH))
|
if (!G_VALUE_HOLDS (value, DBUS_TYPE_G_OBJECT_PATH))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
priv->null_dhcp6_config = FALSE;
|
priv->got_dhcp6_config = TRUE;
|
||||||
|
|
||||||
|
if (value) {
|
||||||
path = g_value_get_boxed (value);
|
path = g_value_get_boxed (value);
|
||||||
if (path) {
|
if (path) {
|
||||||
if (!strcmp (path, "/"))
|
|
||||||
priv->null_dhcp6_config = TRUE;
|
|
||||||
else {
|
|
||||||
config = NM_DHCP6_CONFIG (_nm_object_cache_get (path));
|
config = NM_DHCP6_CONFIG (_nm_object_cache_get (path));
|
||||||
if (!config) {
|
if (!config) {
|
||||||
connection = nm_object_get_connection (object);
|
connection = nm_object_get_connection (object);
|
||||||
@@ -998,22 +990,25 @@ nm_device_get_ip4_config (NMDevice *device)
|
|||||||
NMDevicePrivate *priv;
|
NMDevicePrivate *priv;
|
||||||
char *path;
|
char *path;
|
||||||
GValue value = { 0, };
|
GValue value = { 0, };
|
||||||
|
GError *error = NULL;
|
||||||
|
|
||||||
g_return_val_if_fail (NM_IS_DEVICE (device), NULL);
|
g_return_val_if_fail (NM_IS_DEVICE (device), NULL);
|
||||||
|
|
||||||
priv = NM_DEVICE_GET_PRIVATE (device);
|
priv = NM_DEVICE_GET_PRIVATE (device);
|
||||||
if (priv->ip4_config)
|
if (priv->got_ip4_config == TRUE)
|
||||||
return priv->ip4_config;
|
return priv->ip4_config;
|
||||||
if (priv->null_ip4_config)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
path = _nm_object_get_object_path_property (NM_OBJECT (device), NM_DBUS_INTERFACE_DEVICE, "Ip4Config", NULL);
|
path = _nm_object_get_object_path_property (NM_OBJECT (device),
|
||||||
if (path) {
|
NM_DBUS_INTERFACE_DEVICE,
|
||||||
|
"Ip4Config",
|
||||||
|
&error);
|
||||||
|
if (error == NULL) {
|
||||||
g_value_init (&value, DBUS_TYPE_G_OBJECT_PATH);
|
g_value_init (&value, DBUS_TYPE_G_OBJECT_PATH);
|
||||||
g_value_take_boxed (&value, path);
|
g_value_take_boxed (&value, path);
|
||||||
demarshal_ip4_config (NM_OBJECT (device), NULL, &value, &priv->ip4_config);
|
demarshal_ip4_config (NM_OBJECT (device), NULL, &value, &priv->ip4_config);
|
||||||
g_value_unset (&value);
|
g_value_unset (&value);
|
||||||
}
|
}
|
||||||
|
g_clear_error (&error);
|
||||||
|
|
||||||
return priv->ip4_config;
|
return priv->ip4_config;
|
||||||
}
|
}
|
||||||
@@ -1033,22 +1028,25 @@ nm_device_get_dhcp4_config (NMDevice *device)
|
|||||||
NMDevicePrivate *priv;
|
NMDevicePrivate *priv;
|
||||||
char *path;
|
char *path;
|
||||||
GValue value = { 0, };
|
GValue value = { 0, };
|
||||||
|
GError *error = NULL;
|
||||||
|
|
||||||
g_return_val_if_fail (NM_IS_DEVICE (device), NULL);
|
g_return_val_if_fail (NM_IS_DEVICE (device), NULL);
|
||||||
|
|
||||||
priv = NM_DEVICE_GET_PRIVATE (device);
|
priv = NM_DEVICE_GET_PRIVATE (device);
|
||||||
if (priv->dhcp4_config)
|
if (priv->got_dhcp4_config == TRUE)
|
||||||
return priv->dhcp4_config;
|
return priv->dhcp4_config;
|
||||||
if (priv->null_dhcp4_config)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
path = _nm_object_get_object_path_property (NM_OBJECT (device), NM_DBUS_INTERFACE_DEVICE, "Dhcp4Config", NULL);
|
path = _nm_object_get_object_path_property (NM_OBJECT (device),
|
||||||
if (path) {
|
NM_DBUS_INTERFACE_DEVICE,
|
||||||
|
"Dhcp4Config",
|
||||||
|
&error);
|
||||||
|
if (error == NULL) {
|
||||||
g_value_init (&value, DBUS_TYPE_G_OBJECT_PATH);
|
g_value_init (&value, DBUS_TYPE_G_OBJECT_PATH);
|
||||||
g_value_take_boxed (&value, path);
|
g_value_take_boxed (&value, path);
|
||||||
demarshal_dhcp4_config (NM_OBJECT (device), NULL, &value, &priv->dhcp4_config);
|
demarshal_dhcp4_config (NM_OBJECT (device), NULL, &value, &priv->dhcp4_config);
|
||||||
g_value_unset (&value);
|
g_value_unset (&value);
|
||||||
}
|
}
|
||||||
|
g_clear_error (&error);
|
||||||
|
|
||||||
return priv->dhcp4_config;
|
return priv->dhcp4_config;
|
||||||
}
|
}
|
||||||
@@ -1067,22 +1065,25 @@ nm_device_get_ip6_config (NMDevice *device)
|
|||||||
NMDevicePrivate *priv;
|
NMDevicePrivate *priv;
|
||||||
char *path;
|
char *path;
|
||||||
GValue value = { 0, };
|
GValue value = { 0, };
|
||||||
|
GError *error = NULL;
|
||||||
|
|
||||||
g_return_val_if_fail (NM_IS_DEVICE (device), NULL);
|
g_return_val_if_fail (NM_IS_DEVICE (device), NULL);
|
||||||
|
|
||||||
priv = NM_DEVICE_GET_PRIVATE (device);
|
priv = NM_DEVICE_GET_PRIVATE (device);
|
||||||
if (priv->ip6_config)
|
if (priv->got_ip6_config == TRUE)
|
||||||
return priv->ip6_config;
|
return priv->ip6_config;
|
||||||
if (priv->null_ip6_config)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
path = _nm_object_get_object_path_property (NM_OBJECT (device), NM_DBUS_INTERFACE_DEVICE, "Ip6Config", NULL);
|
path = _nm_object_get_object_path_property (NM_OBJECT (device),
|
||||||
if (path) {
|
NM_DBUS_INTERFACE_DEVICE,
|
||||||
|
"Ip6Config",
|
||||||
|
&error);
|
||||||
|
if (error == NULL) {
|
||||||
g_value_init (&value, DBUS_TYPE_G_OBJECT_PATH);
|
g_value_init (&value, DBUS_TYPE_G_OBJECT_PATH);
|
||||||
g_value_take_boxed (&value, path);
|
g_value_take_boxed (&value, path);
|
||||||
demarshal_ip6_config (NM_OBJECT (device), NULL, &value, &priv->ip6_config);
|
demarshal_ip6_config (NM_OBJECT (device), NULL, &value, &priv->ip6_config);
|
||||||
g_value_unset (&value);
|
g_value_unset (&value);
|
||||||
}
|
}
|
||||||
|
g_clear_error (&error);
|
||||||
|
|
||||||
return priv->ip6_config;
|
return priv->ip6_config;
|
||||||
}
|
}
|
||||||
@@ -1102,22 +1103,25 @@ nm_device_get_dhcp6_config (NMDevice *device)
|
|||||||
NMDevicePrivate *priv;
|
NMDevicePrivate *priv;
|
||||||
char *path;
|
char *path;
|
||||||
GValue value = { 0, };
|
GValue value = { 0, };
|
||||||
|
GError *error = NULL;
|
||||||
|
|
||||||
g_return_val_if_fail (NM_IS_DEVICE (device), NULL);
|
g_return_val_if_fail (NM_IS_DEVICE (device), NULL);
|
||||||
|
|
||||||
priv = NM_DEVICE_GET_PRIVATE (device);
|
priv = NM_DEVICE_GET_PRIVATE (device);
|
||||||
if (priv->dhcp6_config)
|
if (priv->got_dhcp6_config == TRUE)
|
||||||
return priv->dhcp6_config;
|
return priv->dhcp6_config;
|
||||||
if (priv->null_dhcp6_config)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
path = _nm_object_get_object_path_property (NM_OBJECT (device), NM_DBUS_INTERFACE_DEVICE, "Dhcp6Config", NULL);
|
path = _nm_object_get_object_path_property (NM_OBJECT (device),
|
||||||
if (path) {
|
NM_DBUS_INTERFACE_DEVICE,
|
||||||
|
"Dhcp6Config",
|
||||||
|
&error);
|
||||||
|
if (error == NULL) {
|
||||||
g_value_init (&value, DBUS_TYPE_G_OBJECT_PATH);
|
g_value_init (&value, DBUS_TYPE_G_OBJECT_PATH);
|
||||||
g_value_take_boxed (&value, path);
|
g_value_take_boxed (&value, path);
|
||||||
demarshal_dhcp6_config (NM_OBJECT (device), NULL, &value, &priv->dhcp6_config);
|
demarshal_dhcp6_config (NM_OBJECT (device), NULL, &value, &priv->dhcp6_config);
|
||||||
g_value_unset (&value);
|
g_value_unset (&value);
|
||||||
}
|
}
|
||||||
|
g_clear_error (&error);
|
||||||
|
|
||||||
return priv->dhcp6_config;
|
return priv->dhcp6_config;
|
||||||
}
|
}
|
||||||
|
@@ -333,6 +333,7 @@ handle_property_changed (gpointer key, gpointer data, gpointer user_data)
|
|||||||
GParamSpec *pspec;
|
GParamSpec *pspec;
|
||||||
gboolean success = FALSE, found = FALSE;
|
gboolean success = FALSE, found = FALSE;
|
||||||
GSList *iter;
|
GSList *iter;
|
||||||
|
GValue *value = data;
|
||||||
|
|
||||||
prop_name = wincaps_to_dash ((char *) key);
|
prop_name = wincaps_to_dash ((char *) key);
|
||||||
pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (G_OBJECT (self)), prop_name);
|
pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (G_OBJECT (self)), prop_name);
|
||||||
@@ -344,12 +345,19 @@ handle_property_changed (gpointer key, gpointer data, gpointer user_data)
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Iterate through the object and it's parents to find the property */
|
/* Iterate through the object and its parents to find the property */
|
||||||
for (iter = priv->pcs; iter; iter = g_slist_next (iter)) {
|
for (iter = priv->pcs; iter; iter = g_slist_next (iter)) {
|
||||||
pci = g_hash_table_lookup ((GHashTable *) iter->data, prop_name);
|
pci = g_hash_table_lookup ((GHashTable *) iter->data, prop_name);
|
||||||
if (pci) {
|
if (pci) {
|
||||||
found = TRUE;
|
found = TRUE;
|
||||||
success = (*(pci->func)) (self, pspec, (GValue *) data, pci->field);
|
|
||||||
|
/* Handle NULL object paths */
|
||||||
|
if (G_VALUE_HOLDS (value, DBUS_TYPE_G_OBJECT_PATH)) {
|
||||||
|
if (g_strcmp0 (g_value_get_boxed (value), "/") == 0)
|
||||||
|
value = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
success = (*(pci->func)) (self, pspec, value, pci->field);
|
||||||
if (success)
|
if (success)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -453,6 +461,11 @@ _nm_object_demarshal_generic (NMObject *object,
|
|||||||
char **param = (char **) field;
|
char **param = (char **) field;
|
||||||
g_free (*param);
|
g_free (*param);
|
||||||
*param = g_strdup (g_value_get_boxed (value));
|
*param = g_strdup (g_value_get_boxed (value));
|
||||||
|
/* Handle "NULL" object paths */
|
||||||
|
if (g_strcmp0 (*param, "/") == 0) {
|
||||||
|
g_free (*param);
|
||||||
|
*param = NULL;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
success = FALSE;
|
success = FALSE;
|
||||||
goto done;
|
goto done;
|
||||||
@@ -558,13 +571,18 @@ _nm_object_get_string_property (NMObject *object,
|
|||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
char *str = NULL;
|
char *str = NULL;
|
||||||
|
const char *tmp;
|
||||||
GValue value = {0,};
|
GValue value = {0,};
|
||||||
|
|
||||||
if (_nm_object_get_property (object, interface, prop_name, &value, error)) {
|
if (_nm_object_get_property (object, interface, prop_name, &value, error)) {
|
||||||
if (G_VALUE_HOLDS_STRING (&value))
|
if (G_VALUE_HOLDS_STRING (&value))
|
||||||
str = g_strdup (g_value_get_string (&value));
|
str = g_strdup (g_value_get_string (&value));
|
||||||
else if (G_VALUE_HOLDS (&value, DBUS_TYPE_G_OBJECT_PATH))
|
else if (G_VALUE_HOLDS (&value, DBUS_TYPE_G_OBJECT_PATH)) {
|
||||||
str = g_strdup (g_value_get_boxed (&value));
|
tmp = g_value_get_boxed (&value);
|
||||||
|
/* Handle "NULL" object paths */
|
||||||
|
if (g_strcmp0 (tmp, "/") != 0)
|
||||||
|
str = g_strdup (tmp);
|
||||||
|
}
|
||||||
g_value_unset (&value);
|
g_value_unset (&value);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -578,10 +596,13 @@ _nm_object_get_object_path_property (NMObject *object,
|
|||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
char *path = NULL;
|
char *path = NULL;
|
||||||
|
const char *tmp;
|
||||||
GValue value = {0,};
|
GValue value = {0,};
|
||||||
|
|
||||||
if (_nm_object_get_property (object, interface, prop_name, &value, error)) {
|
if (_nm_object_get_property (object, interface, prop_name, &value, error)) {
|
||||||
path = g_strdup (g_value_get_boxed (&value));
|
tmp = g_value_get_boxed (&value);
|
||||||
|
if (g_strcmp0 (tmp, "/") != 0)
|
||||||
|
path = g_strdup (tmp);
|
||||||
g_value_unset (&value);
|
g_value_unset (&value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user