summaryrefslogtreecommitdiffstats
path: root/usr.bin/tmux/server-client.c
diff options
context:
space:
mode:
authornicm <nicm@openbsd.org>2013-03-22 15:49:55 +0000
committernicm <nicm@openbsd.org>2013-03-22 15:49:55 +0000
commitde9a15de72aa0757cd1a1bfd8aaeafe306453bdc (patch)
treeb3a7edbdb60e25f3fca5f750c86f1ef8165cf3b6 /usr.bin/tmux/server-client.c
parentsync (diff)
downloadwireguard-openbsd-de9a15de72aa0757cd1a1bfd8aaeafe306453bdc.tar.xz
wireguard-openbsd-de9a15de72aa0757cd1a1bfd8aaeafe306453bdc.zip
Add functions to allocate and free command contexts rather than doing it
all on the stack.
Diffstat (limited to 'usr.bin/tmux/server-client.c')
-rw-r--r--usr.bin/tmux/server-client.c27
1 files changed, 15 insertions, 12 deletions
diff --git a/usr.bin/tmux/server-client.c b/usr.bin/tmux/server-client.c
index 11bdb1dff27..f3ea551db6d 100644
--- a/usr.bin/tmux/server-client.c
+++ b/usr.bin/tmux/server-client.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: server-client.c,v 1.87 2013/03/22 10:31:22 nicm Exp $ */
+/* $OpenBSD: server-client.c,v 1.88 2013/03/22 15:49:55 nicm Exp $ */
/*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -865,24 +865,24 @@ server_client_msg_info(struct cmd_ctx *ctx, const char *fmt, ...)
void
server_client_msg_command(struct client *c, struct msg_command_data *data)
{
- struct cmd_ctx ctx;
+ struct cmd_ctx *ctx;
struct cmd_list *cmdlist = NULL;
int argc;
char **argv, *cause;
- ctx.error = server_client_msg_error;
- ctx.print = server_client_msg_print;
- ctx.info = server_client_msg_info;
+ ctx = cmd_get_ctx();
+ ctx->msgdata = data;
+ ctx->curclient = NULL;
+ ctx->cmdclient = c;
- ctx.msgdata = data;
- ctx.curclient = NULL;
-
- ctx.cmdclient = c;
+ ctx->error = server_client_msg_error;
+ ctx->print = server_client_msg_print;
+ ctx->info = server_client_msg_info;
argc = data->argc;
data->argv[(sizeof data->argv) - 1] = '\0';
if (cmd_unpack_argv(data->argv, sizeof data->argv, argc, &argv) != 0) {
- server_client_msg_error(&ctx, "command too long");
+ server_client_msg_error(ctx, "command too long");
goto error;
}
@@ -893,13 +893,13 @@ server_client_msg_command(struct client *c, struct msg_command_data *data)
}
if ((cmdlist = cmd_list_parse(argc, argv, &cause)) == NULL) {
- server_client_msg_error(&ctx, "%s", cause);
+ server_client_msg_error(ctx, "%s", cause);
cmd_free_argv(argc, argv);
goto error;
}
cmd_free_argv(argc, argv);
- switch (cmd_list_exec(cmdlist, &ctx))
+ switch (cmd_list_exec(cmdlist, ctx))
{
case CMD_RETURN_ERROR:
case CMD_RETURN_NORMAL:
@@ -910,11 +910,14 @@ server_client_msg_command(struct client *c, struct msg_command_data *data)
break;
}
cmd_list_free(cmdlist);
+ cmd_free_ctx(ctx);
return;
error:
if (cmdlist != NULL)
cmd_list_free(cmdlist);
+ cmd_free_ctx(ctx);
+
c->flags |= CLIENT_EXIT;
}