summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornicm <nicm>2019-06-07 20:09:17 +0000
committernicm <nicm>2019-06-07 20:09:17 +0000
commite37f34facc05c3ba146d4158cc7af23f6886fecd (patch)
treed5136e2303a92820ab6b5d532d96c8ac1b53b6db
parent8f40796f05f2db0ff8b2c9231054b62b511a7ba0 (diff)
Do not load the config file if the server is exiting because it failed
to start, otherwise commands like lsk which start the server again can end up looping infinitely. Also make the first client exit correctly. Problem reported by Wael M Nasreddine.
-rw-r--r--server-client.c6
-rw-r--r--server.c10
-rw-r--r--tmux.h2
3 files changed, 11 insertions, 7 deletions
diff --git a/server-client.c b/server-client.c
index 52842e38..fa21fa79 100644
--- a/server-client.c
+++ b/server-client.c
@@ -1511,7 +1511,9 @@ server_client_click_timer(__unused int fd, __unused short events, void *data)
static void
server_client_check_exit(struct client *c)
{
- if (!(c->flags & CLIENT_EXIT))
+ if (~c->flags & CLIENT_EXIT)
+ return;
+ if (c->flags & CLIENT_EXITED)
return;
if (EVBUFFER_LENGTH(c->stdin_data) != 0)
@@ -1524,7 +1526,7 @@ server_client_check_exit(struct client *c)
if (c->flags & CLIENT_ATTACHED)
notify_client("client-detached", c);
proc_send(c->peer, MSG_EXIT, -1, &c->retval, sizeof c->retval);
- c->flags &= ~CLIENT_EXIT;
+ c->flags |= CLIENT_EXITED;
}
/* Redraw timer callback. */
diff --git a/server.c b/server.c
index 18818c38..fc3730ad 100644
--- a/server.c
+++ b/server.c
@@ -44,7 +44,7 @@
struct clients clients;
struct tmuxproc *server_proc;
-static int server_fd;
+static int server_fd = -1;
static int server_exit;
static struct event server_ev_accept;
@@ -208,11 +208,10 @@ server_start(struct tmuxproc *client, struct event_base *base, int lockfd,
cmdq_append(c, cmdq_get_error(cause));
free(cause);
c->flags |= CLIENT_EXIT;
- }
+ } else
+ start_cfg();
- start_cfg();
server_add_accept(0);
-
proc_loop(server_proc, server_loop);
job_kill_all();
@@ -364,6 +363,9 @@ server_add_accept(int timeout)
{
struct timeval tv = { timeout, 0 };
+ if (server_fd == -1)
+ return;
+
if (event_initialized(&server_ev_accept))
event_del(&server_ev_accept);
diff --git a/tmux.h b/tmux.h
index f8ceb95d..76bf8303 100644
--- a/tmux.h
+++ b/tmux.h
@@ -1490,7 +1490,7 @@ struct client {
#define CLIENT_REPEAT 0x20
#define CLIENT_SUSPENDED 0x40
#define CLIENT_ATTACHED 0x80
-/* 0x100 unused */
+#define CLIENT_EXITED 0x100
#define CLIENT_DEAD 0x200
#define CLIENT_REDRAWBORDERS 0x400
#define CLIENT_READONLY 0x800