summaryrefslogtreecommitdiff
path: root/gnome-base/gdm/files/gdm-3.7.90-fix-daemonize-regression.patch
blob: 810bd6e836468938cc2f858b2aeb8fdfdae49ed3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
From bda248c1e184f92aedf9f8d932ebd20746910d52 Mon Sep 17 00:00:00 2001
From: Sobhan Mohammadpour <sobhanmohammadpour1@yahoo.fr>
Date: Mon, 4 Mar 2013 21:23:45 +0330
Subject: [PATCH] gdm-3.7.90 fix daemonize regression

---
 configure.ac       |  4 ++++
 daemon/Makefile.am |  1 +
 daemon/main.c      | 45 +++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 50 insertions(+)

diff --git a/configure.ac b/configure.ac
index 0918060..d4ea271 100644
--- a/configure.ac
+++ b/configure.ac
@@ -99,6 +99,10 @@ PKG_CHECK_MODULES(DAEMON,
 AC_SUBST(DAEMON_CFLAGS)
 AC_SUBST(DAEMON_LIBS)
 
+PKG_CHECK_MODULES(LIBDAEMON, libdaemon)
+AC_SUBST(LIBDAEMON_CFLAGS)
+AC_SUBST(LIBDAEMON_LIBS)
+
 GLIB_GSETTINGS
 
 PKG_CHECK_MODULES(NSS,
diff --git a/daemon/Makefile.am b/daemon/Makefile.am
index ead9096..b810089 100644
--- a/daemon/Makefile.am
+++ b/daemon/Makefile.am
@@ -385,6 +385,7 @@ gdm_LDADD = \
 	$(top_builddir)/common/libgdmcommon.la	\
 	$(XLIB_LIBS)				\
 	$(DAEMON_LIBS)				\
+	$(LIBDAEMON_LIBS)			\
 	$(XDMCP_LIBS)                           \
 	$(LIBWRAP_LIBS)                         \
 	$(SYSTEMD_LIBS)				\
diff --git a/daemon/main.c b/daemon/main.c
index 8176fe3..0151862 100644
--- a/daemon/main.c
+++ b/daemon/main.c
@@ -34,6 +34,8 @@
 #include <locale.h>
 #include <signal.h>
 
+#include <libdaemon/dfork.h>
+
 #include <glib.h>
 #include <glib/gi18n.h>
 #include <glib/gstdio.h>
@@ -329,8 +331,10 @@ main (int    argc,
         static gboolean     do_timed_exit    = FALSE;
         static gboolean     print_version    = FALSE;
         static gboolean     fatal_warnings   = FALSE;
+        static gboolean     no_daemon        = FALSE;
         static GOptionEntry entries []   = {
                 { "fatal-warnings", 0, 0, G_OPTION_ARG_NONE, &fatal_warnings, N_("Make all warnings fatal"), NULL },
+                { "nodaemon", 0, 0, G_OPTION_ARG_NONE, &no_daemon, N_("Do not fork into the background"), NULL },
                 { "timed-exit", 0, 0, G_OPTION_ARG_NONE, &do_timed_exit, N_("Exit after a time (for debugging)"), NULL },
                 { "version", 0, 0, G_OPTION_ARG_NONE, &print_version, N_("Print GDM version"), NULL },
 
@@ -343,6 +347,15 @@ main (int    argc,
 
         ret = 1;
 
+        /* preprocess the arguments to support the xdm style
+         * -nodaemon option
+         */
+        int i;
+        for ( i = 0; i < argc; i++) {
+                if (strcmp (argv[i], "-nodaemon") == 0)
+                        argv[i] = "--nodaemon";
+        }
+
         context = g_option_context_new (_("GNOME Display Manager"));
         g_option_context_add_main_entries (context, entries, NULL);
         g_option_context_set_ignore_unknown_options (context, TRUE);
@@ -369,6 +382,33 @@ main (int    argc,
                 g_log_set_always_fatal (fatal_mask);
         }
 
+        if (!no_daemon) {
+                pid_t pid;
+                if (daemon_retval_init () < 0) {
+                        g_warning ("Failed to create pipe");
+                        exit (-1);
+                }
+                if ((pid = daemon_fork ()) < 0) {
+                        /* Fork failed */
+                        daemon_retval_done ();
+                        exit (1);
+                } else if (pid) {
+                        /* Parent process: wait 20s for daemon_retval_send() in the daemon process */
+                        if ((ret = daemon_retval_wait (20)) < 0) {
+                            g_warning ("Timed out waiting for daemon process: %s", strerror(errno));
+                            exit (255);
+                        } else if (ret > 0) {
+                            g_warning ("Daemon process returned error code %d", ret);
+                            exit (ret);
+                        }
+                        exit (0);
+                }
+                /* Daemon process */
+                daemon_close_all (-1);
+                /* Start a new process group so that killing the daemon will kill the processes that it spawned */
+                setsid ();
+        }
+
         gdm_log_init ();
 
         settings = gdm_settings_new ();
@@ -418,6 +458,9 @@ main (int    argc,
                 g_timeout_add_seconds (30, (GSourceFunc) timed_exit_cb, main_loop);
         }
 
+        if (!no_daemon)
+                daemon_retval_send (0);
+
         g_main_loop_run (main_loop);
 
         g_debug ("GDM finished, cleaning up...");
@@ -433,6 +476,8 @@ main (int    argc,
         ret = 0;
 
  out:
+        if (!no_daemon)
+                daemon_retval_send (ret);
         if (error) {
                 g_printerr ("%s\n", error->message);
                 g_clear_error (&error);
-- 
1.8.1.2