diff options
-rw-r--r-- | vpn/vpn-provider.c | 38 |
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; |