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>
31 control_write(struct client
*c
, const char *fmt
, ...)
36 evbuffer_add_vprintf(c
->stdout_data
, fmt
, ap
);
39 evbuffer_add(c
->stdout_data
, "\n", 1);
40 server_push_stdout(c
);
43 /* Write a buffer, adding a terminal newline. Empties buffer. */
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. */
54 control_callback(struct client
*c
, int closed
, unused
void *data
)
57 struct cmd_list
*cmdlist
;
61 c
->flags
|= CLIENT_EXIT
;
64 line
= evbuffer_readln(c
->stdin_data
, NULL
, EVBUFFER_EOL_LF
);
67 if (*line
== '\0') { /* empty line exit */
68 c
->flags
|= CLIENT_EXIT
;
72 if (cmd_string_parse(line
, &cmdlist
, NULL
, 0, &cause
) != 0) {
73 c
->cmdq
->time
= time(NULL
);
76 cmdq_guard(c
->cmdq
, "begin", 1);
77 control_write(c
, "parse error: %s", cause
);
78 cmdq_guard(c
->cmdq
, "error", 1);
82 TAILQ_FOREACH(cmd
, &cmdlist
->list
, qentry
)
83 cmd
->flags
|= CMD_CONTROL
;
84 cmdq_run(c
->cmdq
, cmdlist
);
85 cmd_list_free(cmdlist
);