summaryrefslogtreecommitdiffstats
path: root/server.c
diff options
context:
space:
mode:
authornicm <nicm>2020-05-16 16:07:55 +0000
committernicm <nicm>2020-05-16 16:07:55 +0000
commitdceb6a15d04a2b2e050ab41816d0df3fe224b416 (patch)
treec2810c4472b71fd21301b6391e1a38a4e0774777 /server.c
parent126bacb473f7950a156944caba42fad5f1764287 (diff)
Add a -D flag to ask tmux not to daemonize, useful both for running a
debugger (lldb does not have follow-fork-mode) and for running with a managed supervisor init system. GitHub issue 2190.
Diffstat (limited to 'server.c')
-rw-r--r--server.c44
1 files changed, 27 insertions, 17 deletions
diff --git a/server.c b/server.c
index a4216b87..f07479ae 100644
--- a/server.c
+++ b/server.c
@@ -161,29 +161,35 @@ server_start(struct tmuxproc *client, int flags, struct event_base *base,
struct client *c;
char *cause = NULL;
- if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, pair) != 0)
- fatal("socketpair failed");
- server_client_flags = flags;
-
sigfillset(&set);
sigprocmask(SIG_BLOCK, &set, &oldset);
- switch (fork()) {
- case -1:
- fatal("fork failed");
- case 0:
- break;
- default:
- sigprocmask(SIG_SETMASK, &oldset, NULL);
- close(pair[1]);
- return (pair[0]);
+
+ if (~flags & CLIENT_NOFORK) {
+ if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, pair) != 0)
+ fatal("socketpair failed");
+
+ switch (fork()) {
+ case -1:
+ fatal("fork failed");
+ case 0:
+ break;
+ default:
+ sigprocmask(SIG_SETMASK, &oldset, NULL);
+ close(pair[1]);
+ return (pair[0]);
+ }
+ close(pair[0]);
+ if (daemon(1, 0) != 0)
+ fatal("daemon failed");
}
- close(pair[0]);
- if (daemon(1, 0) != 0)
- fatal("daemon failed");
+
+ server_client_flags = flags;
proc_clear_signals(client, 0);
+
if (event_reinit(base) != 0)
fatalx("event_reinit failed");
server_proc = proc_start("server");
+
proc_set_signals(server_proc, server_signal);
sigprocmask(SIG_SETMASK, &oldset, NULL);
@@ -205,7 +211,10 @@ server_start(struct tmuxproc *client, int flags, struct event_base *base,
server_fd = server_create_socket(flags, &cause);
if (server_fd != -1)
server_update_socket();
- c = server_client_create(pair[1]);
+ if (~flags & CLIENT_NOFORK)
+ c = server_client_create(pair[1]);
+ else
+ options_set_number(global_options, "exit-empty", 0);
if (lockfd >= 0) {
unlink(lockfile);
@@ -396,6 +405,7 @@ server_signal(int sig)
log_debug("%s: %s", __func__, strsignal(sig));
switch (sig) {
+ case SIGINT:
case SIGTERM:
server_exit = 1;
server_send_exit();