diff options
author | Nicholas Marriott <nicm@openbsd.org> | 2009-11-04 21:04:43 +0000 |
---|---|---|
committer | Nicholas Marriott <nicm@openbsd.org> | 2009-11-04 21:04:43 +0000 |
commit | 4d6091379b4486b624070492d45ad390e7442382 (patch) | |
tree | e22d1b401b804b13a9cafe71d459a55fdbf376dc /cmd-run-shell.c | |
parent | ea8c8c5f33e0dcbf563dc54615a6c172aea70518 (diff) | |
download | rtmux-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.c | 42 |
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); |