summaryrefslogtreecommitdiffstats
path: root/metacity-dont-do-bad-stuff-on-sigterm.patch
diff options
context:
space:
mode:
Diffstat (limited to 'metacity-dont-do-bad-stuff-on-sigterm.patch')
-rw-r--r--metacity-dont-do-bad-stuff-on-sigterm.patch64
1 files changed, 64 insertions, 0 deletions
diff --git a/metacity-dont-do-bad-stuff-on-sigterm.patch b/metacity-dont-do-bad-stuff-on-sigterm.patch
new file mode 100644
index 0000000..7402e6c
--- /dev/null
+++ b/metacity-dont-do-bad-stuff-on-sigterm.patch
@@ -0,0 +1,64 @@
+diff -up metacity-2.28.0/src/core/main.c.sigterm metacity-2.28.0/src/core/main.c
+--- metacity-2.28.0/src/core/main.c.sigterm 2009-11-05 14:53:40.599237201 -0500
++++ metacity-2.28.0/src/core/main.c 2009-11-05 17:28:18.601486344 -0500
+@@ -67,6 +67,7 @@
+ #include <fcntl.h>
+ #include <locale.h>
+ #include <time.h>
++#include <unistd.h>
+
+ /**
+ * The exit code we'll return to our parent process when we eventually die.
+@@ -368,12 +369,25 @@ meta_finalize (void)
+ meta_session_shutdown ();
+ }
+
++static int sigterm_pipe_fds[2] = { -1, -1 };
++
+ static void
+ sigterm_handler (int signum)
+ {
+- meta_finalize ();
++ if (sigterm_pipe_fds[1] >= 0)
++ {
++ ssize_t bytes_written;
++ bytes_written = write (sigterm_pipe_fds[1], "", 1);
++ close (sigterm_pipe_fds[1]);
++ sigterm_pipe_fds[1] = -1;
++ }
++}
+
+- exit (meta_exit_code);
++static gboolean
++on_sigterm (void)
++{
++ meta_quit (META_EXIT_SUCCESS);
++ return FALSE;
+ }
+
+ static guint sigchld_signal_id = 0;
+@@ -421,6 +434,7 @@ main (int argc, char **argv)
+ "Pango", "GLib-GObject", "GThread"
+ };
+ guint i;
++ GIOChannel *channel;
+
+ if (!g_thread_supported ())
+ g_thread_init (NULL);
+@@ -443,6 +457,16 @@ main (int argc, char **argv)
+ g_strerror (errno));
+ #endif
+
++ if (pipe (sigterm_pipe_fds) != 0)
++ g_printerr ("Failed to create SIGTERM pipe: %s\n",
++ g_strerror (errno));
++
++ channel = g_io_channel_unix_new (sigterm_pipe_fds[0]);
++ g_io_channel_set_flags (channel, G_IO_FLAG_NONBLOCK, NULL);
++ g_io_add_watch (channel, G_IO_IN, (GIOFunc) on_sigterm, NULL);
++ g_io_channel_set_close_on_unref (channel, TRUE);
++ g_io_channel_unref (channel);
++
+ act.sa_handler = &sigterm_handler;
+ if (sigaction (SIGTERM, &act, NULL) < 0)
+ g_printerr ("Failed to register SIGTERM handler: %s\n",