policy: clean up device signal handling
This commit is contained in:
@@ -51,7 +51,7 @@ struct NMPolicy {
|
|||||||
GSList *pending_activation_checks;
|
GSList *pending_activation_checks;
|
||||||
GSList *manager_ids;
|
GSList *manager_ids;
|
||||||
GSList *settings_ids;
|
GSList *settings_ids;
|
||||||
GSList *dev_signal_ids;
|
GSList *dev_ids;
|
||||||
|
|
||||||
NMVPNManager *vpn_manager;
|
NMVPNManager *vpn_manager;
|
||||||
gulong vpn_activated_id;
|
gulong vpn_activated_id;
|
||||||
@@ -948,53 +948,32 @@ wireless_networks_changed (NMDeviceWifi *device, NMAccessPoint *ap, gpointer use
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
gulong id;
|
gulong id;
|
||||||
NMDevice *device;
|
NMDevice *device;
|
||||||
} DeviceSignalID;
|
} DeviceSignalId;
|
||||||
|
|
||||||
static GSList *
|
static void
|
||||||
add_device_signal_id (GSList *list, gulong id, NMDevice *device)
|
_connect_device_signal (NMPolicy *policy, NMDevice *device, const char *name, gpointer callback)
|
||||||
{
|
{
|
||||||
DeviceSignalID *data;
|
DeviceSignalId *data;
|
||||||
|
|
||||||
data = g_malloc0 (sizeof (DeviceSignalID));
|
data = g_slice_new0 (DeviceSignalId);
|
||||||
if (!data)
|
g_assert (data);
|
||||||
return list;
|
data->id = g_signal_connect (device, name, callback, policy);
|
||||||
|
|
||||||
data->id = id;
|
|
||||||
data->device = device;
|
data->device = device;
|
||||||
return g_slist_append (list, data);
|
policy->dev_ids = g_slist_prepend (policy->dev_ids, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
device_added (NMManager *manager, NMDevice *device, gpointer user_data)
|
device_added (NMManager *manager, NMDevice *device, gpointer user_data)
|
||||||
{
|
{
|
||||||
NMPolicy *policy = (NMPolicy *) user_data;
|
NMPolicy *policy = (NMPolicy *) user_data;
|
||||||
gulong id;
|
|
||||||
|
|
||||||
id = g_signal_connect (device, "state-changed",
|
_connect_device_signal (policy, device, "state-changed", device_state_changed);
|
||||||
G_CALLBACK (device_state_changed),
|
_connect_device_signal (policy, device, "notify::" NM_DEVICE_INTERFACE_IP4_CONFIG, device_ip_config_changed);
|
||||||
policy);
|
_connect_device_signal (policy, device, "notify::" NM_DEVICE_INTERFACE_IP6_CONFIG, device_ip_config_changed);
|
||||||
policy->dev_signal_ids = add_device_signal_id (policy->dev_signal_ids, id, device);
|
|
||||||
|
|
||||||
id = g_signal_connect (device, "notify::" NM_DEVICE_INTERFACE_IP4_CONFIG,
|
|
||||||
G_CALLBACK (device_ip_config_changed),
|
|
||||||
policy);
|
|
||||||
policy->dev_signal_ids = add_device_signal_id (policy->dev_signal_ids, id, device);
|
|
||||||
|
|
||||||
id = g_signal_connect (device, "notify::" NM_DEVICE_INTERFACE_IP6_CONFIG,
|
|
||||||
G_CALLBACK (device_ip_config_changed),
|
|
||||||
policy);
|
|
||||||
policy->dev_signal_ids = add_device_signal_id (policy->dev_signal_ids, id, device);
|
|
||||||
|
|
||||||
if (NM_IS_DEVICE_WIFI (device)) {
|
if (NM_IS_DEVICE_WIFI (device)) {
|
||||||
id = g_signal_connect (device, "access-point-added",
|
_connect_device_signal (policy, device, "access-point-added", wireless_networks_changed);
|
||||||
G_CALLBACK (wireless_networks_changed),
|
_connect_device_signal (policy, device, "access-point-removed", wireless_networks_changed);
|
||||||
policy);
|
|
||||||
policy->dev_signal_ids = add_device_signal_id (policy->dev_signal_ids, id, device);
|
|
||||||
|
|
||||||
id = g_signal_connect (device, "access-point-removed",
|
|
||||||
G_CALLBACK (wireless_networks_changed),
|
|
||||||
policy);
|
|
||||||
policy->dev_signal_ids = add_device_signal_id (policy->dev_signal_ids, id, device);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1020,15 +999,15 @@ device_removed (NMManager *manager, NMDevice *device, gpointer user_data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Clear any signal handlers for this device */
|
/* Clear any signal handlers for this device */
|
||||||
iter = policy->dev_signal_ids;
|
iter = policy->dev_ids;
|
||||||
while (iter) {
|
while (iter) {
|
||||||
DeviceSignalID *data = (DeviceSignalID *) iter->data;
|
DeviceSignalId *data = iter->data;
|
||||||
GSList *next = g_slist_next (iter);
|
GSList *next = g_slist_next (iter);
|
||||||
|
|
||||||
if (data->device == device) {
|
if (data->device == device) {
|
||||||
g_signal_handler_disconnect (data->device, data->id);
|
g_signal_handler_disconnect (data->device, data->id);
|
||||||
g_free (data);
|
g_slice_free (DeviceSignalId, data);
|
||||||
policy->dev_signal_ids = g_slist_delete_link (policy->dev_signal_ids, iter);
|
policy->dev_ids = g_slist_delete_link (policy->dev_ids, iter);
|
||||||
}
|
}
|
||||||
iter = next;
|
iter = next;
|
||||||
}
|
}
|
||||||
@@ -1220,13 +1199,13 @@ nm_policy_destroy (NMPolicy *policy)
|
|||||||
g_signal_handler_disconnect (policy->settings, GPOINTER_TO_UINT (iter->data));
|
g_signal_handler_disconnect (policy->settings, GPOINTER_TO_UINT (iter->data));
|
||||||
g_slist_free (policy->settings_ids);
|
g_slist_free (policy->settings_ids);
|
||||||
|
|
||||||
for (iter = policy->dev_signal_ids; iter; iter = g_slist_next (iter)) {
|
for (iter = policy->dev_ids; iter; iter = g_slist_next (iter)) {
|
||||||
DeviceSignalID *data = (DeviceSignalID *) iter->data;
|
DeviceSignalId *data = iter->data;
|
||||||
|
|
||||||
g_signal_handler_disconnect (data->device, data->id);
|
g_signal_handler_disconnect (data->device, data->id);
|
||||||
g_free (data);
|
g_slice_free (DeviceSignalId, data);
|
||||||
}
|
}
|
||||||
g_slist_free (policy->dev_signal_ids);
|
g_slist_free (policy->dev_ids);
|
||||||
|
|
||||||
/* Rewrite /etc/hosts on exit to ensure we don't leave stale IP addresses
|
/* Rewrite /etc/hosts on exit to ensure we don't leave stale IP addresses
|
||||||
* lying around. FIXME: this will take out a valid IP address of an
|
* lying around. FIXME: this will take out a valid IP address of an
|
||||||
|
Reference in New Issue
Block a user