diff options
author | 2013-03-22 15:49:55 +0000 | |
---|---|---|
committer | 2013-03-22 15:49:55 +0000 | |
commit | de9a15de72aa0757cd1a1bfd8aaeafe306453bdc (patch) | |
tree | b3a7edbdb60e25f3fca5f750c86f1ef8165cf3b6 /usr.bin/tmux/server-client.c | |
parent | sync (diff) | |
download | wireguard-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.c | 27 |
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; } |