aboutsummaryrefslogtreecommitdiff
path: root/cmd-run-shell.c
diff options
context:
space:
mode:
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);