summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--vpn/vpn-provider.c38
1 files changed, 37 insertions, 1 deletions
diff --git a/vpn/vpn-provider.c b/vpn/vpn-provider.c
index c46c9b41..09b782aa 100644
--- a/vpn/vpn-provider.c
+++ b/vpn/vpn-provider.c
@@ -989,16 +989,52 @@ int __vpn_provider_connect(struct vpn_provider *provider)
return err;
}
+static void connection_removed_signal(struct vpn_provider *provider)
+{
+ DBusMessage *signal;
+ DBusMessageIter iter;
+
+ signal = dbus_message_new_signal(VPN_MANAGER_PATH,
+ VPN_MANAGER_INTERFACE, "ConnectionRemoved");
+ if (signal == NULL)
+ return;
+
+ dbus_message_iter_init_append(signal, &iter);
+ dbus_message_iter_append_basic(&iter, DBUS_TYPE_OBJECT_PATH,
+ &provider->path);
+ dbus_connection_send(connection, signal, NULL);
+ dbus_message_unref(signal);
+}
+
+static char *get_ident(const char *path)
+{
+ char *pos;
+
+ if (*path != '/')
+ return NULL;
+
+ pos = strrchr(path, '/');
+ if (pos == NULL)
+ return NULL;
+
+ return pos + 1;
+}
+
int __vpn_provider_remove(const char *path)
{
struct vpn_provider *provider;
+ char *ident;
DBG("path %s", path);
- provider = vpn_provider_lookup(path);
+ ident = get_ident(path);
+
+ provider = vpn_provider_lookup(ident);
if (provider != NULL) {
DBG("Removing VPN %s", provider->identifier);
+ connection_removed_signal(provider);
+
provider_unregister(provider);
g_hash_table_remove(provider_hash, provider->identifier);
return 0;