summaryrefslogtreecommitdiffstats
path: root/client.c
diff options
context:
space:
mode:
authornicm <nicm>2020-06-10 07:27:10 +0000
committernicm <nicm>2020-06-10 07:27:10 +0000
commit23d79cfda87f822c7440fd572ce5fc440c079ac2 (patch)
tree0176ba308491f01ff5e71092da1e3e7903f01ad6 /client.c
parentfddcad6957056a32d8894f8c9c7cd44a9c56610b (diff)
Instead of a buffer size limit on each pane, set a limit of 300 seconds
of data for each client in control mode.
Diffstat (limited to 'client.c')
-rw-r--r--client.c45
1 files changed, 34 insertions, 11 deletions
diff --git a/client.c b/client.c
index be9dccbf..c97df491 100644
--- a/client.c
+++ b/client.c
@@ -45,11 +45,13 @@ static enum {
CLIENT_EXIT_LOST_SERVER,
CLIENT_EXIT_EXITED,
CLIENT_EXIT_SERVER_EXITED,
+ CLIENT_EXIT_MESSAGE_PROVIDED
} client_exitreason = CLIENT_EXIT_NONE;
static int client_exitflag;
static int client_exitval;
static enum msgtype client_exittype;
static const char *client_exitsession;
+static char *client_exitmessage;
static const char *client_execshell;
static const char *client_execcmd;
static int client_attached;
@@ -207,6 +209,8 @@ client_exit_message(void)
return ("exited");
case CLIENT_EXIT_SERVER_EXITED:
return ("server exited");
+ case CLIENT_EXIT_MESSAGE_PROVIDED:
+ return (client_exitmessage);
}
return ("unknown reason");
}
@@ -791,13 +795,38 @@ client_dispatch(struct imsg *imsg, __unused void *arg)
client_dispatch_wait(imsg);
}
+/* Process an exit message. */
+static void
+client_dispatch_exit_message(char *data, size_t datalen)
+{
+ int retval;
+
+ if (datalen < sizeof retval && datalen != 0)
+ fatalx("bad MSG_EXIT size");
+
+ if (datalen >= sizeof retval) {
+ memcpy(&retval, data, sizeof retval);
+ client_exitval = retval;
+ }
+
+ if (datalen > sizeof retval) {
+ datalen -= sizeof retval;
+ data += sizeof retval;
+
+ client_exitmessage = xmalloc(datalen);
+ memcpy(client_exitmessage, data, datalen);
+ client_exitmessage[datalen - 1] = '\0';
+
+ client_exitreason = CLIENT_EXIT_MESSAGE_PROVIDED;
+ }
+}
+
/* Dispatch imsgs when in wait state (before MSG_READY). */
static void
client_dispatch_wait(struct imsg *imsg)
{
char *data;
ssize_t datalen;
- int retval;
static int pledge_applied;
/*
@@ -820,12 +849,7 @@ client_dispatch_wait(struct imsg *imsg)
switch (imsg->hdr.type) {
case MSG_EXIT:
case MSG_SHUTDOWN:
- if (datalen != sizeof retval && datalen != 0)
- fatalx("bad MSG_EXIT size");
- if (datalen == sizeof retval) {
- memcpy(&retval, data, sizeof retval);
- client_exitval = retval;
- }
+ client_dispatch_exit_message(data, datalen);
client_exitflag = 1;
client_exit();
break;
@@ -916,11 +940,10 @@ client_dispatch_attached(struct imsg *imsg)
proc_send(client_peer, MSG_EXITING, -1, NULL, 0);
break;
case MSG_EXIT:
- if (datalen != 0 && datalen != sizeof (int))
- fatalx("bad MSG_EXIT size");
-
+ client_dispatch_exit_message(data, datalen);
+ if (client_exitreason == CLIENT_EXIT_NONE)
+ client_exitreason = CLIENT_EXIT_EXITED;
proc_send(client_peer, MSG_EXITING, -1, NULL, 0);
- client_exitreason = CLIENT_EXIT_EXITED;
break;
case MSG_EXITED:
if (datalen != 0)