Cleaner logging of child output
This commit is contained in:
@@ -34,8 +34,8 @@ static struct list_head exec_head = LIST_HEAD_INIT(exec_head);
|
|||||||
static void exec_spawn_wrapper(struct peer *);
|
static void exec_spawn_wrapper(struct peer *);
|
||||||
|
|
||||||
static void exec_harvest(struct exec *exec) {
|
static void exec_harvest(struct exec *exec) {
|
||||||
int status;
|
if (exec->child > 0) {
|
||||||
if (exec->child) {
|
int status;
|
||||||
assert(waitpid(exec->child, &status, 0) == exec->child);
|
assert(waitpid(exec->child, &status, 0) == exec->child);
|
||||||
exec->child = -1;
|
exec->child = -1;
|
||||||
if (WIFEXITED(status)) {
|
if (WIFEXITED(status)) {
|
||||||
@@ -79,17 +79,25 @@ static void exec_log_handler(struct peer *peer) {
|
|||||||
struct exec *exec = container_of(peer, struct exec, log_peer);
|
struct exec *exec = container_of(peer, struct exec, log_peer);
|
||||||
|
|
||||||
char linebuf[4096];
|
char linebuf[4096];
|
||||||
ssize_t len = read(exec->log_peer.fd, linebuf, 4096);
|
ssize_t ret = read(exec->log_peer.fd, linebuf, 4096);
|
||||||
if (len <= 0) {
|
if (ret <= 0) {
|
||||||
log_write('E', exec->id, "Log input stream closed");
|
log_write('E', exec->id, "Log input stream closed");
|
||||||
assert(!close(exec->log_peer.fd));
|
assert(!close(exec->log_peer.fd));
|
||||||
exec->log_peer.fd = -1;
|
exec->log_peer.fd = -1;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (linebuf[len - 1] == '\n') {
|
size_t len = (size_t) ret;
|
||||||
len--;
|
char *iter = linebuf, *eol;
|
||||||
|
while ((eol = memchr(iter, '\n', len))) {
|
||||||
|
assert(eol >= iter);
|
||||||
|
size_t linelen = (size_t) (eol - iter);
|
||||||
|
log_write('E', exec->id, "(child output) %.*s", linelen, iter);
|
||||||
|
iter += (linelen + 1);
|
||||||
|
len -= (linelen + 1);
|
||||||
|
}
|
||||||
|
if (len) {
|
||||||
|
log_write('E', exec->id, "(child output) %.*s", len, iter);
|
||||||
}
|
}
|
||||||
log_write('E', exec->id, "(child output) %.*s", len, linebuf);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void exec_parent(struct exec *exec, pid_t child, int data_fd, int log_fd) {
|
static void exec_parent(struct exec *exec, pid_t child, int data_fd, int log_fd) {
|
||||||
|
|||||||
Reference in New Issue
Block a user