policy: clean up device signal handling

This commit is contained in:
Dan Williams
2010-10-27 16:57:31 -05:00
parent 6329fadb48
commit 18f819d71d

View File

@@ -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