while (num_running < lbalance_target(lb)) {
int p[2];
- c = tlist_top(&pending, struct command, list);
+
+ c = tlist_top(&pending, list);
if (!c)
break;
+ fflush(stdout);
if (pipe(p) != 0)
err(1, "Pipe failed");
c->pid = fork();
signal(SIGALRM, killme);
itim.it_interval.tv_sec = itim.it_interval.tv_usec = 0;
- itim.it_value = time_from_msec(c->time_ms);
+ itim.it_value = timespec_to_timeval(time_from_msec(c->time_ms));
setitimer(ITIMER_REAL, &itim, NULL);
c->status = system(c->command);
tlist_for_each_safe(&running, c, next, list) {
if (FD_ISSET(c->output_fd, &in)) {
int old_len, len;
+ /* This length includes nul terminator! */
old_len = talloc_array_length(c->output);
c->output = talloc_realloc(c, c->output, char,
old_len + 1024);
- len = read(c->output_fd, c->output + old_len, 1024);
+ len = read(c->output_fd, c->output + old_len - 1, 1024);
if (len < 0)
err(1, "Reading from async command");
c->output = talloc_realloc(c, c->output, char,
old_len + len);
+ c->output[old_len + len - 1] = '\0';
if (len == 0) {
struct rusage ru;
wait4(c->pid, &c->status, 0, &ru);
struct command *c;
const void *ctx;
- while ((c = tlist_top(&done, struct command, list)) == NULL) {
+ while ((c = tlist_top(&done, list)) == NULL) {
if (tlist_empty(&pending) && tlist_empty(&running))
return NULL;
reap_output();