summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/connection.c9
-rw-r--r--src/connman.h2
-rw-r--r--src/profile.c29
3 files changed, 33 insertions, 7 deletions
diff --git a/src/connection.c b/src/connection.c
index 6939e441..7c81c0d2 100644
--- a/src/connection.c
+++ b/src/connection.c
@@ -656,15 +656,20 @@ static void update_order(void)
}
}
-void __connman_connection_update_gateway(void)
+gboolean __connman_connection_update_gateway(void)
{
struct gateway_data *active_gateway, *default_gateway;
+ gboolean updated = FALSE;
update_order();
active_gateway = find_active_gateway();
default_gateway = find_default_gateway();
- if (active_gateway && active_gateway != default_gateway)
+ if (active_gateway && active_gateway != default_gateway) {
del_route(active_gateway->element, active_gateway->gateway);
+ updated = TRUE;
+ }
+
+ return updated;
}
diff --git a/src/connman.h b/src/connman.h
index 4b461f12..bfc7fdf9 100644
--- a/src/connman.h
+++ b/src/connman.h
@@ -188,7 +188,7 @@ void __connman_ipv4_cleanup(void);
int __connman_connection_init(void);
void __connman_connection_cleanup(void);
-void __connman_connection_update_gateway(void);
+gboolean __connman_connection_update_gateway(void);
int __connman_udev_init(void);
void __connman_udev_cleanup(void);
diff --git a/src/profile.c b/src/profile.c
index 683e46a8..0f7c793f 100644
--- a/src/profile.c
+++ b/src/profile.c
@@ -65,18 +65,20 @@ static void append_services(DBusMessageIter *entry)
dbus_message_iter_close_container(entry, &value);
}
-void __connman_profile_changed(void)
+static guint changed_timeout = 0;
+
+static gboolean services_changed(gpointer user_data)
{
const char *path = __connman_profile_active_path();
DBusMessage *signal;
DBusMessageIter entry;
- __connman_connection_update_gateway();
+ changed_timeout = 0;
signal = dbus_message_new_signal(path,
CONNMAN_PROFILE_INTERFACE, "PropertyChanged");
if (signal == NULL)
- return;
+ return FALSE;
dbus_message_iter_init_append(signal, &entry);
append_services(&entry);
@@ -85,11 +87,30 @@ void __connman_profile_changed(void)
signal = dbus_message_new_signal(CONNMAN_MANAGER_PATH,
CONNMAN_MANAGER_INTERFACE, "PropertyChanged");
if (signal == NULL)
- return;
+ return FALSE;
dbus_message_iter_init_append(signal, &entry);
append_services(&entry);
g_dbus_send_message(connection, signal);
+
+ return FALSE;
+}
+
+void __connman_profile_changed(void)
+{
+ DBG("");
+
+ if (changed_timeout > 0) {
+ g_source_remove(changed_timeout);
+ changed_timeout = 0;
+ }
+
+ if (__connman_connection_update_gateway() == TRUE) {
+ services_changed(NULL);
+ return;
+ }
+
+ changed_timeout = g_timeout_add_seconds(2, services_changed, NULL);
}
int __connman_profile_add_device(struct connman_device *device)