diff options
author | Thomas Haller <thaller@redhat.com> | 2014-11-13 14:50:50 +0100 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2014-11-13 15:05:26 +0100 |
commit | 144de5930734bc728247b0a90092361af17ec412 (patch) | |
tree | 2d4a57eb6fa607fe797d2ba870693b19f5184cd2 | |
parent | f5b83d8af34094cf7b5d706a1394d735c10e6606 (diff) | |
download | NetworkManager-144de5930734bc728247b0a90092361af17ec412.tar.gz |
fixup! firewall: always complete callbacks asynchronously
-rw-r--r-- | src/nm-firewall-manager.c | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/src/nm-firewall-manager.c b/src/nm-firewall-manager.c index afef42e989..05ce533300 100644 --- a/src/nm-firewall-manager.c +++ b/src/nm-firewall-manager.c @@ -59,9 +59,15 @@ static guint signals[LAST_SIGNAL] = { 0 }; /********************************************************************/ -#define PENDING_CALL_DUMMY ((NMFirewallPendingCall) ((void *) nm_firewall_manager_init) ) +#define PENDING_CALL_DUMMY ((NMFirewallPendingCall) GUINT_TO_POINTER(1)) #define PENDING_CALL_FROM_INFO(info) ((NMFirewallPendingCall) info) +typedef enum { + IDLY_SCHEDULED_TYPE_NONE = 0, + IDLY_SCHEDULED_TYPE_PENDING = 1, + IDLY_SCHEDULED_TYPE_CANCELLED = 2, +} IdlyScheduledType; + typedef struct { NMFirewallManager *self; char *iface; @@ -70,8 +76,7 @@ typedef struct { guint id; gboolean completed; - gboolean cancelled; - gboolean is_idly_scheduled; + IdlyScheduledType idly_scheduled; DBusGProxyCall *dbus_call; } CBInfo; @@ -128,7 +133,7 @@ add_or_change_idle_cb (gpointer user_data) { CBInfo *info = user_data; - if (info->cancelled) { + if (info->idly_scheduled == IDLY_SCHEDULED_TYPE_CANCELLED) { /* operation was cancelled. _cb_info_free will invoke callback. */ } else { nm_log_dbg (LOGD_FIREWALL, "(%s) firewall zone call pretends success [%u]", @@ -187,7 +192,7 @@ nm_firewall_manager_add_or_change_zone (NMFirewallManager *self, if (priv->running == FALSE) { if (callback) { info = _cb_info_create (self, iface, callback, user_data); - info->is_idly_scheduled= TRUE; + info->idly_scheduled = IDLY_SCHEDULED_TYPE_PENDING; g_idle_add (add_or_change_idle_cb, info); nm_log_dbg (LOGD_FIREWALL, "(%s) firewall zone %s -> %s%s%s [%u] (not running, simulate success)", iface, add ? "add" : "change", zone?"\"":"", zone ? zone : "default", zone?"\"":"", info->id); @@ -290,8 +295,8 @@ void nm_firewall_manager_cancel_call (NMFirewallManager *self, NMFirewallPending priv->pending_calls = g_slist_remove_link (priv->pending_calls, pending); info = (CBInfo *) call; - if (info->is_idly_scheduled) - info->cancelled = TRUE; + if (info->idly_scheduled != IDLY_SCHEDULED_TYPE_NONE) + info->idly_scheduled = IDLY_SCHEDULED_TYPE_CANCELLED; else { dbus_g_proxy_cancel_call (NM_FIREWALL_MANAGER_GET_PRIVATE (self)->proxy, info->dbus_call); @@ -394,6 +399,8 @@ dispose (GObject *object) { NMFirewallManagerPrivate *priv = NM_FIREWALL_MANAGER_GET_PRIVATE (object); + g_assert (priv->pending_calls == NULL); + if (priv->dbus_mgr) { g_signal_handler_disconnect (priv->dbus_mgr, priv->name_owner_id); priv->name_owner_id = 0; |