Fix leak in format_get_command.
[tmux-openbsd.git] / control.c
blob8e24fd0ef437825caac2a0a0b7f6395f14158d66
1 /* $OpenBSD$ */
3 /*
4 * Copyright (c) 2012 Nicholas Marriott <nicm@users.sourceforge.net>
5 * Copyright (c) 2012 George Nachman <tmux@georgester.com>
7 * Permission to use, copy, modify, and distribute this software for any
8 * purpose with or without fee is hereby granted, provided that the above
9 * copyright notice and this permission notice appear in all copies.
11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15 * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
16 * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
17 * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
20 #include <sys/types.h>
22 #include <event.h>
23 #include <stdlib.h>
24 #include <string.h>
25 #include <time.h>
27 #include "tmux.h"
29 /* Write a line. */
30 void printflike2
31 control_write(struct client *c, const char *fmt, ...)
33 va_list ap;
35 va_start(ap, fmt);
36 evbuffer_add_vprintf(c->stdout_data, fmt, ap);
37 va_end(ap);
39 evbuffer_add(c->stdout_data, "\n", 1);
40 server_push_stdout(c);
43 /* Write a buffer, adding a terminal newline. Empties buffer. */
44 void
45 control_write_buffer(struct client *c, struct evbuffer *buffer)
47 evbuffer_add_buffer(c->stdout_data, buffer);
48 evbuffer_add(c->stdout_data, "\n", 1);
49 server_push_stdout(c);
52 /* Control input callback. Read lines and fire commands. */
53 void
54 control_callback(struct client *c, int closed, unused void *data)
56 char *line, *cause;
57 struct cmd_list *cmdlist;
58 struct cmd *cmd;
60 if (closed)
61 c->flags |= CLIENT_EXIT;
63 for (;;) {
64 line = evbuffer_readln(c->stdin_data, NULL, EVBUFFER_EOL_LF);
65 if (line == NULL)
66 break;
67 if (*line == '\0') { /* empty line exit */
68 c->flags |= CLIENT_EXIT;
69 break;
72 if (cmd_string_parse(line, &cmdlist, NULL, 0, &cause) != 0) {
73 c->cmdq->time = time(NULL);
74 c->cmdq->number++;
76 cmdq_guard(c->cmdq, "begin", 1);
77 control_write(c, "parse error: %s", cause);
78 cmdq_guard(c->cmdq, "error", 1);
80 free(cause);
81 } else {
82 TAILQ_FOREACH(cmd, &cmdlist->list, qentry)
83 cmd->flags |= CMD_CONTROL;
84 cmdq_run(c->cmdq, cmdlist);
85 cmd_list_free(cmdlist);
88 free(line);