diff --git a/vpn-daemons/openvpn/ChangeLog b/vpn-daemons/openvpn/ChangeLog index ffb28b0493..11523883c5 100644 --- a/vpn-daemons/openvpn/ChangeLog +++ b/vpn-daemons/openvpn/ChangeLog @@ -1,3 +1,9 @@ +2008-05-22 Tambet Ingo + + * src/nm-openvpn-service.c (real_disconnect): If sending SIGTERM + succeeds, add a timeout to make sure it gets killed. If it fails, + send SIGKILL immediately. + 2008-05-01 Dan Williams * src/nm-vpnc-service.c diff --git a/vpn-daemons/openvpn/src/nm-openvpn-service.c b/vpn-daemons/openvpn/src/nm-openvpn-service.c index ba41a0c969..4cadb63bd7 100644 --- a/vpn-daemons/openvpn/src/nm-openvpn-service.c +++ b/vpn-daemons/openvpn/src/nm-openvpn-service.c @@ -710,13 +710,28 @@ real_need_secrets (NMVPNPlugin *plugin, } static gboolean -real_disconnect (NMVPNPlugin *plugin, - GError **err) +ensure_killed (gpointer data) +{ + int pid = GPOINTER_TO_INT (data); + + if (kill (pid, 0) == 0) + kill (pid, SIGKILL); + + return FALSE; +} + +static gboolean +real_disconnect (NMVPNPlugin *plugin, + GError **err) { NMOpenvpnPluginPrivate *priv = NM_OPENVPN_PLUGIN_GET_PRIVATE (plugin); if (priv->pid) { - kill (priv->pid, SIGTERM); + if (kill (priv->pid, SIGTERM) == 0) + g_timeout_add (2000, ensure_killed, GINT_TO_POINTER (priv->pid)); + else + kill (priv->pid, SIGKILL); + nm_info ("Terminated openvpn daemon with PID %d.", priv->pid); priv->pid = 0; } diff --git a/vpn-daemons/vpnc/ChangeLog b/vpn-daemons/vpnc/ChangeLog index 7739bcda91..4b01c5d00d 100644 --- a/vpn-daemons/vpnc/ChangeLog +++ b/vpn-daemons/vpnc/ChangeLog @@ -1,3 +1,9 @@ +2008-05-22 Tambet Ingo + + * src/nm-vpnc-service.c (real_disconnect): If sending SIGTERM succeeds, + add a timeout to make sure it gets killed. If it fails, send SIGKILL + immediately. + 2008-05-01 Dan Williams * src/nm-vpnc-service.c diff --git a/vpn-daemons/vpnc/src/nm-vpnc-service.c b/vpn-daemons/vpnc/src/nm-vpnc-service.c index f4bc7b4ce5..56c57897b1 100644 --- a/vpn-daemons/vpnc/src/nm-vpnc-service.c +++ b/vpn-daemons/vpnc/src/nm-vpnc-service.c @@ -351,6 +351,17 @@ real_need_secrets (NMVPNPlugin *plugin, return FALSE; } +static gboolean +ensure_killed (gpointer data) +{ + int pid = GPOINTER_TO_INT (data); + + if (kill (pid, 0) == 0) + kill (pid, SIGKILL); + + return FALSE; +} + static gboolean real_disconnect (NMVPNPlugin *plugin, GError **err) @@ -358,7 +369,11 @@ real_disconnect (NMVPNPlugin *plugin, NMVPNCPluginPrivate *priv = NM_VPNC_PLUGIN_GET_PRIVATE (plugin); if (priv->pid) { - kill (priv->pid, SIGTERM); + if (kill (priv->pid, SIGTERM) == 0) + g_timeout_add (2000, ensure_killed, GINT_TO_POINTER (priv->pid)); + else + kill (priv->pid, SIGKILL); + nm_info ("Terminated vpnc daemon with PID %d.", priv->pid); priv->pid = 0; }