diff options
Diffstat (limited to 'metacity-dont-do-bad-stuff-on-sigterm.patch')
-rw-r--r-- | metacity-dont-do-bad-stuff-on-sigterm.patch | 64 |
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", |