summaryrefslogtreecommitdiffstats
path: root/client.c
diff options
context:
space:
mode:
authorThomas Adam <thomas@xteddy.org>2020-06-18 12:01:22 +0100
committerThomas Adam <thomas@xteddy.org>2020-06-18 12:01:22 +0100
commit6c437d45ac90b2f62d6176c1ac14a717023cfaae (patch)
treec00437b2b08d98889960afc869b250de5a698dc5 /client.c
parenteb448daa1a07fa25a9928791cdc8411da271a9bc (diff)
parent068b92b0512bb29e29d1c2aa76c0b29f788e45f6 (diff)
Merge branch 'obsd-master'
Diffstat (limited to 'client.c')
-rw-r--r--client.c38
1 files changed, 33 insertions, 5 deletions
diff --git a/client.c b/client.c
index 24938235..b652754b 100644
--- a/client.c
+++ b/client.c
@@ -35,7 +35,7 @@
static struct tmuxproc *client_proc;
static struct tmuxpeer *client_peer;
-static int client_flags;
+static uint64_t client_flags;
static enum {
CLIENT_EXIT_NONE,
CLIENT_EXIT_DETACHED,
@@ -247,7 +247,9 @@ client_main(struct event_base *base, int argc, char **argv, int flags, int feat)
pid_t ppid;
enum msgtype msg;
struct termios tio, saved_tio;
- size_t size;
+ size_t size, linesize = 0;
+ ssize_t linelen;
+ char *line = NULL;
/* Ignore SIGCHLD now or daemon() in the server will leave a zombie. */
signal(SIGCHLD, SIG_IGN);
@@ -276,13 +278,14 @@ client_main(struct event_base *base, int argc, char **argv, int flags, int feat)
free(pr->error);
}
- /* Save the flags. */
- client_flags = flags;
-
/* Create client process structure (starts logging). */
client_proc = proc_start("client");
proc_set_signals(client_proc, client_signal);
+ /* Save the flags. */
+ client_flags = flags;
+ log_debug("flags are %#llx", client_flags);
+
/* Initialize the client socket and start the server. */
fd = client_connect(base, socket_path, client_flags);
if (fd == -1) {
@@ -408,8 +411,19 @@ client_main(struct event_base *base, int argc, char **argv, int flags, int feat)
printf("%%exit %s\n", client_exit_message());
else
printf("%%exit\n");
+ fflush(stdout);
+ if (client_flags & CLIENT_CONTROL_WAITEXIT) {
+ setvbuf(stdin, NULL, _IOLBF, 0);
+ for (;;) {
+ linelen = getline(&line, &linesize, stdin);
+ if (linelen <= 1)
+ break;
+ }
+ free(line);
+ }
if (client_flags & CLIENT_CONTROLCONTROL) {
printf("\033\\");
+ fflush(stdout);
tcsetattr(STDOUT_FILENO, TCSAFLUSH, &saved_tio);
}
} else if (client_exitreason != CLIENT_EXIT_NONE)
@@ -872,6 +886,13 @@ client_dispatch_wait(struct imsg *imsg)
client_exitval = 1;
proc_exit(client_proc);
break;
+ case MSG_FLAGS:
+ if (datalen != sizeof client_flags)
+ fatalx("bad MSG_FLAGS string");
+
+ memcpy(&client_flags, data, sizeof client_flags);
+ log_debug("new flags are %#llx", client_flags);
+ break;
case MSG_SHELL:
if (datalen == 0 || data[datalen - 1] != '\0')
fatalx("bad MSG_SHELL string");
@@ -918,6 +939,13 @@ client_dispatch_attached(struct imsg *imsg)
datalen = imsg->hdr.len - IMSG_HEADER_SIZE;
switch (imsg->hdr.type) {
+ case MSG_FLAGS:
+ if (datalen != sizeof client_flags)
+ fatalx("bad MSG_FLAGS string");
+
+ memcpy(&client_flags, data, sizeof client_flags);
+ log_debug("new flags are %#llx", client_flags);
+ break;
case MSG_DETACH:
case MSG_DETACHKILL:
if (datalen == 0 || data[datalen - 1] != '\0')