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
|
#
# Patch managed by http://www.holgerschurig.de/patcher.html
#
--- qt-2.3.9-snapshot-20041211/src/kernel/qapplication_qws.cpp~daemonize
+++ qt-2.3.9-snapshot-20041211/src/kernel/qapplication_qws.cpp
@@ -104,6 +104,7 @@
#endif
#include <sys/time.h>
+#include <syslog.h>
#if defined(_OS_AIX_) && defined(_CC_GNU_)
#include <sys/select.h>
@@ -163,6 +164,7 @@
//these used to be environment variables, they are initialized from
//environment variables in
+bool qws_daemon = TRUE;
bool qws_savefonts = FALSE;
bool qws_screen_is_interlaced=FALSE; //### should be detected
bool qws_shared_memory = FALSE;
@@ -1686,6 +1688,10 @@
mwGeometry = argv[i];
} else if ( arg == "-shared" ) {
qws_shared_memory = TRUE;
+ } else if ( arg == "-daemon" ) {
+ qws_daemon = TRUE;
+ } else if ( arg == "-nodaemon" ) {
+ qws_daemon = FALSE;
} else if ( arg == "-noshared" ) {
qws_shared_memory = FALSE;
} else if ( arg == "-savefonts" ) {
@@ -1742,6 +1748,78 @@
qt_appType = type;
qws_single_process = TRUE;
+ /* Daemonize the server process -- (C) Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de>
+ * Added a new command line option which only is relevant if the application is created as a GuiServer.
+ * The option is -daemon respectively -nodaemon. If in daemon mode (which is the default now), the
+ * server will detach from the controlling terminal and continue as a daemon. This is done via the standard
+ * UNIX double fork magic.
+ */
+ if ( qws_daemon )
+ {
+ qWarning( "qt_init() - starting in daemon mode..." );
+
+ int pid1 = fork();
+ if ( pid1 == -1 )
+ {
+ qWarning( "qt_init() - can't perform initial fork: %s", strerror( errno ) );
+ exit( -1 );
+ }
+ if ( pid1 ) _exit( 0 ); // ok, first fork performed
+
+ chdir( "/" );
+ setsid();
+ umask(0);
+ close(0);
+ close(1);
+ close(2);
+
+ int fdnull = ::open( "/dev/null", O_RDWR );
+ if ( fdnull == -1 )
+ {
+ syslog( 3, "qt_init() - can't open /dev/null to redirect std{in|out|err}: %s", strerror( errno ) );
+ exit( -1 );
+ }
+ dup2( fdnull, 0 ); // stdin
+ dup2( fdnull, 1 ); // stdout
+ dup2( fdnull, 2 ); // stderr
+
+ int pid2 = fork();
+ if ( pid2 == -1 )
+ {
+ syslog( 3, "qt_init() - can't perform initial fork: %s", strerror( errno ) );
+ exit( -1 );
+ }
+ if ( pid2 )
+ {
+ syslog( 4, "qt_init() [%d] - successfully entered daemon mode", pid2 );
+ _exit( 0 ); // ok, second fork performed
+ }
+ }
+
+ /*
+ * , ,
+ * /( )`
+ * \ \___ / | B E W A R E !
+ * /- _ `-/ ' We are a DAEMON now!
+ * (/\/ \ \ /\
+ * / / | ` \
+ * O O ) / |
+ * `-^--'`< '
+ * (_.) _ ) /
+ * `.___/` /
+ * `-----' /
+ * <----. __ / __ \
+ * <----|====O)))==) \) /====
+ * <----' `--' `.__,' \
+ * | |
+ * \ /
+ * ______( (_ / \______
+ * (FL) ,' ,-----' | \
+ * `--{__________) \/
+ *
+ */
+
+
/* Allocate a dedicated virtual terminal -- (C) Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de>
* Added a new command line option which only is relevant if the application is created as a GuiServer.
* The option is -terminal <num>, where <num> specifies the virtual terminal to be occupied by the server.
|