aboutsummaryrefslogtreecommitdiff
path: root/cmd-run-shell.c
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@openbsd.org>2009-11-04 21:04:43 +0000
committerNicholas Marriott <nicm@openbsd.org>2009-11-04 21:04:43 +0000
commit4d6091379b4486b624070492d45ad390e7442382 (patch)
treee22d1b401b804b13a9cafe71d459a55fdbf376dc /cmd-run-shell.c
parentea8c8c5f33e0dcbf563dc54615a6c172aea70518 (diff)
downloadrtmux-4d6091379b4486b624070492d45ad390e7442382.tar.gz
rtmux-4d6091379b4486b624070492d45ad390e7442382.tar.bz2
rtmux-4d6091379b4486b624070492d45ad390e7442382.zip
Switch jobs over to use a bufferevent.
Diffstat (limited to 'cmd-run-shell.c')
-rw-r--r--cmd-run-shell.c42
1 files changed, 22 insertions, 20 deletions
diff --git a/cmd-run-shell.c b/cmd-run-shell.c
index 1a8e28f4..605b5dca 100644
--- a/cmd-run-shell.c
+++ b/cmd-run-shell.c
@@ -77,31 +77,33 @@ cmd_run_shell_callback(struct job *job)
{
struct cmd_run_shell_data *cdata = job->data;
struct cmd_ctx *ctx = &cdata->ctx;
- char *cmd, *msg, *line, *buf;
- size_t off, len, llen;
+ char *cmd, *msg, *line;
+ size_t size;
int retcode;
+ u_int lines;
- buf = BUFFER_OUT(job->out);
- len = BUFFER_USED(job->out);
+ lines = 0;
+ do {
+ if ((line = evbuffer_readline(job->event->input)) != NULL) {
+ ctx->print(ctx, "%s", line);
+ lines++;
+ }
+ } while (line != NULL);
- cmd = cdata->cmd;
+ size = EVBUFFER_LENGTH(job->event->input);
+ if (size != 0) {
+ line = xmalloc(size + 1);
+ memcpy(line, EVBUFFER_DATA(job->event->input), size);
+ line[size] = '\0';
- if (len != 0) {
- line = buf;
- for (off = 0; off < len; off++) {
- if (buf[off] == '\n') {
- llen = buf + off - line;
- if (llen > INT_MAX)
- break;
- ctx->print(ctx, "%.*s", (int) llen, line);
- line = buf + off + 1;
- }
- }
- llen = buf + len - line;
- if (llen > 0 && llen < INT_MAX)
- ctx->print(ctx, "%.*s", (int) llen, line);
+ ctx->print(ctx, "%s", line);
+ lines++;
+
+ xfree(line);
}
+ cmd = cdata->cmd;
+
msg = NULL;
if (WIFEXITED(job->status)) {
if ((retcode = WEXITSTATUS(job->status)) != 0)
@@ -111,7 +113,7 @@ cmd_run_shell_callback(struct job *job)
xasprintf(&msg, "'%s' terminated by signal %d", cmd, retcode);
}
if (msg != NULL) {
- if (len != 0)
+ if (lines != 0)
ctx->print(ctx, "%s", msg);
else
ctx->info(ctx, "%s", msg);