summaryrefslogtreecommitdiffstats
path: root/server.c
diff options
context:
space:
mode:
authorNicholas Marriott <nicholas.marriott@gmail.com>2020-05-10 16:52:46 +0100
committerNicholas Marriott <nicholas.marriott@gmail.com>2020-05-10 16:52:46 +0100
commitd01e7aac89fefff31e668ac2d668c84c345b9e67 (patch)
tree5d773b1d95cb96f9c3b70e1d34c355f283a0a136 /server.c
parent5fa377d9273ee609784acc538a5defa09feb3095 (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 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();