NetworkManager-libreswan/0015-Rewrite-pluto-watch-API-which-watches-the-pluto-proc.patch
Avesh Agarwal 08f137fc11 New upstream release 0.9.8.4
- Fixed 926225
- Fixed dependency to libreswan.
- Created a new sub package NetworkManager-openswan-gnome
- Various other spec file fixes.
- Additional code changes are as follows:
- Fixed an issue where proper network stack is not loaded unless
  _stackmanager is run before starting pluto daemon service.
- Fixed the termination operation of pluto daemon to comply with
  libreswan changes.
- Fixed various debug messages.
- Fixed initiation of pluto daemon by this plugin to reflect the
  changes in libreaswan.
- Fixed defaults values for more parameters to help the VPN
  connection stay more reliable.
- Rewrote pluto watch API which watches the pluto process for its status.
  Fixed memory leak issues as not all child processes were reaped correctly.
  Also g_spwan_close_pid was not being called after children were reaped.
  Also modified debugs and added more to help with debugging in the future.
- Fixed an issue where nm-openswan service is searching for ipsec binary in
  both /sbin and /usr/sbin leading to same operation twice, as /sbin is just
  symlink to /usr/sbin, so removed /sbin from the search paths.
- Fixed some libreswan related macro changes.
- Fixed netmask issue when sending IP information to the nm openswan
  plugin service.
- Fixed the current code as it does not set the default route field
  NM_VPN_PLUGIN_IP4_CONFIG_NEVER_DEFAULT when sending VPN information
  to nm-openswan plugin. This fix sets the field to TRUE.
- Fixed some issues found by coverity scan.
- Fixed an issue where writing configuration on stdin should not end with
  \n as it gives error. It used to work previously, but not with latest
  NetworkManager versions.
- libreswan related fixes, as some macros have been modified after forking
  to libreswan from openswan.
- openswan/libreswan does not provide tun0 interface, so fixed the code
  where it sends tun0 interface.
- Fix prcoessing of nm-openswan-dialog.ui file and added more error notifications.
- Fixed dead code based on coverity scan.
- Fixed gnomekeyring lib dependencies.
- Fixed Networkmanager and related lib dependencies.
- Fixed gtk label max width issue by setting it to 35.
- NM-openswan was missing support for nm-openswan-auth-dialog.desktop.in.in.
  So added a new nm-openswan-auth-dialog.desktop.in.in, and modified related
  Makefile and configure.ac files.
2013-12-10 17:51:36 -05:00

132 lines
4.9 KiB
Diff

From 24e2b36b20f2b6d42f715618e13c2919ad0fc51c Mon Sep 17 00:00:00 2001
From: Avesh Agarwal <avagarwa@redhat.com>
Date: Tue, 10 Dec 2013 15:04:09 -0500
Subject: [PATCH 15/20] Rewrite pluto watch API which watches the pluto process
for its status. Fixed memory leak issues as not all child processes were
reaped correctly. Also g_spwan_close_pid was not being called after children
were reaped. Also modified debugs and added more to help with debugging in
the future.
---
src/nm-openswan-service.c | 52 +++++++++++++++++++++++++++--------------------
1 file changed, 30 insertions(+), 22 deletions(-)
diff --git a/src/nm-openswan-service.c b/src/nm-openswan-service.c
index 7f1a9c9..b73ab1f 100644
--- a/src/nm-openswan-service.c
+++ b/src/nm-openswan-service.c
@@ -207,30 +207,33 @@ nm_openswan_secrets_validate (NMSettingVPN *s_vpn, GError **error)
}
static void
-openswan_watch_cb_auto (GPid pid, gint status, gpointer user_data)
+pluto_watch_cb (GPid pid, gint status, gpointer user_data)
{
NMOPENSWANPlugin *plugin = NM_OPENSWAN_PLUGIN (user_data);
NMOPENSWANPluginPrivate *priv = NM_OPENSWAN_PLUGIN_GET_PRIVATE (plugin);
guint error = 0;
+ if(debug)
+ g_printf("pluto_watch: current child pid = %d, pluto pid=%d\n", pid, priv->pid);
+
if (WIFEXITED (status)) {
error = WEXITSTATUS (status);
if (error != 0)
- g_warning ("openswan: ipsec auto exited with error code %d", error);
+ g_printf ("pluto_watch: pluto exited with error code %d\n", error);
}
else if (WIFSTOPPED (status))
- g_warning ("openswan: ipsec auto stopped unexpectedly with signal %d", WSTOPSIG (status));
+ g_printf ("pluto_watch: pluto stopped unexpectedly with signal %d\n", WSTOPSIG (status));
else if (WIFSIGNALED (status))
- g_warning ("openswan: ipsec auto died with signal %d", WTERMSIG (status));
+ g_printf ("pluto_watch: pluto died with signal %d\n", WTERMSIG (status));
else
- g_warning ("openswan: ipsec auto died from an unknown cause");
+ g_printf ("pluto_watch: pluto died from an unknown cause\n");
/* Reap child if needed. */
- //waitpid (priv->pid_auto, NULL, WNOHANG);
- //priv->pid_auto = 0;
+ waitpid (pid, NULL, WNOHANG);
+
+ if(debug)
+ g_printf ("pluto_watch: reaped child pid =%d\n", pid);
- waitpid (priv->pid, NULL, WNOHANG);
- priv->pid = 0;
/* Must be after data->state is set since signals use data->state */
switch (error) {
@@ -246,18 +249,29 @@ openswan_watch_cb_auto (GPid pid, gint status, gpointer user_data)
break;
}
- nm_vpn_plugin_set_state (NM_VPN_PLUGIN (plugin), NM_VPN_SERVICE_STATE_STOPPED);
+ if(pid == priv->pid || error) {
+ priv->pid = 0;
+
+ if(debug)
+ g_printf ("pluto_watch: nm pluto service is stopping\n");
+
+ nm_vpn_plugin_set_state (NM_VPN_PLUGIN (plugin), NM_VPN_SERVICE_STATE_STOPPED);
+ }
+
+ if(debug)
+ g_printf ("pluto_watch: nm pluto service will continue after reaping a child\n");
+
+ /*closing pid*/
+ g_spawn_close_pid(pid);
}
static gint
-//nm_openswan_start_openswan_binary (NMSettingVPN *s_vpn, NMOPENSWANPlugin *plugin, GError **error)
nm_openswan_start_openswan_binary (NMOPENSWANPlugin *plugin, GError **error)
{
GPid pid, pid_auto;
const char **openswan_binary = NULL;
GPtrArray *openswan_argv;
- GSource *openswan_watch;
gint stdin_fd;
/* Find openswan ipsec */
@@ -293,11 +307,8 @@ nm_openswan_start_openswan_binary (NMOPENSWANPlugin *plugin, GError **error)
g_message ("openswan: ipsec started with pid %d", pid);
- NM_OPENSWAN_PLUGIN_GET_PRIVATE (plugin)->pid = pid;
- openswan_watch = g_child_watch_source_new (pid);
- g_source_set_callback (openswan_watch, (GSourceFunc) openswan_watch_cb_auto, plugin, NULL);
- g_source_attach (openswan_watch, NULL);
- g_source_unref (openswan_watch);
+ NM_OPENSWAN_PLUGIN_GET_PRIVATE (plugin)->pid = pid;
+ g_child_watch_add(pid, (GChildWatchFunc) pluto_watch_cb, plugin);
sleep(2);
@@ -322,11 +333,7 @@ nm_openswan_start_openswan_binary (NMOPENSWANPlugin *plugin, GError **error)
g_message ("openswan: ipsec auto started with pid %d", pid_auto);
- /*NM_OPENSWAN_PLUGIN_GET_PRIVATE (plugin)->pid_auto = pid_auto;
- openswan_watch = g_child_watch_source_new (pid_auto);
- g_source_set_callback (openswan_watch, (GSourceFunc) openswan_watch_cb_auto, plugin, NULL);
- g_source_attach (openswan_watch, NULL);
- g_source_unref (openswan_watch);*/
+ g_child_watch_add(pid_auto, (GChildWatchFunc) pluto_watch_cb, plugin);
return stdin_fd;
}
@@ -376,6 +383,7 @@ nm_openswan_start_openswan_connection (NMOPENSWANPlugin *plugin, GError **error)
g_ptr_array_free (openswan_argv, TRUE);
sleep(3);
+ g_child_watch_add(pid, (GChildWatchFunc) pluto_watch_cb, plugin);
g_message ("openswan: ipsec auto connection started with pid %d", pid);
--
1.8.3.1