From d01e7aac89fefff31e668ac2d668c84c345b9e67 Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Sun, 10 May 2020 16:52:46 +0100 Subject: 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. --- server.c | 44 +++++++++++++++++++++++++++----------------- 1 file changed, 27 insertions(+), 17 deletions(-) (limited to 'server.c') diff --git a/server.c b/server.c index 2f262f3c..c451989c 100644 --- a/server.c +++ b/server.c @@ -160,29 +160,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); @@ -204,7 +210,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); @@ -395,6 +404,7 @@ server_signal(int sig) log_debug("%s: %s", __func__, strsignal(sig)); switch (sig) { + case SIGINT: case SIGTERM: server_exit = 1; server_send_exit(); -- cgit