summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2014-11-13 14:50:50 +0100
committerThomas Haller <thaller@redhat.com>2014-11-13 15:05:26 +0100
commit144de5930734bc728247b0a90092361af17ec412 (patch)
tree2d4a57eb6fa607fe797d2ba870693b19f5184cd2
parentf5b83d8af34094cf7b5d706a1394d735c10e6606 (diff)
downloadNetworkManager-144de5930734bc728247b0a90092361af17ec412.tar.gz
fixup! firewall: always complete callbacks asynchronously
-rw-r--r--src/nm-firewall-manager.c21
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;