X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=tools%2Ftools.c;h=4874fc62645fdff6aa372ecc6637227e6377865e;hb=cbc7cbf1dae1ad8c1f7f3314b9a22f75fafb48c0;hp=f0a9ad46f1e8e48307cedc1b9f4ef608a8a9aac4;hpb=eca104468958afaa893b76d9b3545cd554563538;p=ccan diff --git a/tools/tools.c b/tools/tools.c index f0a9ad46..4874fc62 100644 --- a/tools/tools.c +++ b/tools/tools.c @@ -39,7 +39,8 @@ char *run_with_timeout(const void *ctx, const char *cmd, int p[2]; struct rbuf in; int status, ms; - struct timespec start; + struct timeabs start; + char *ret; *ok = false; if (pipe(p) != 0) @@ -71,7 +72,7 @@ char *run_with_timeout(const void *ctx, const char *cmd, signal(SIGALRM, killme); itim.it_interval.tv_sec = itim.it_interval.tv_usec = 0; - itim.it_value = timespec_to_timeval(time_from_msec(*timeout_ms)); + itim.it_value = timespec_to_timeval(time_from_msec(*timeout_ms).ts); setitimer(ITIMER_REAL, &itim, NULL); status = system(cmd); @@ -82,29 +83,28 @@ char *run_with_timeout(const void *ctx, const char *cmd, } close(p[1]); - rbuf_init(&in, p[0], tal_arr(ctx, char, 4096), 4096); - if (!rbuf_read_str(&in, 0, do_tal_realloc) && errno) - in.buf = tal_free(in.buf); + rbuf_init(&in, p[0], tal_arr(ctx, char, 4096), 4096, tal_rbuf_enlarge); + ret = rbuf_read_str(&in, 0); /* This shouldn't fail... */ if (waitpid(pid, &status, 0) != pid) err(1, "Failed to wait for child"); - ms = time_to_msec(time_sub(time_now(), start)); + ms = time_to_msec(time_between(time_now(), start)); if (ms > *timeout_ms) *timeout_ms = 0; else *timeout_ms -= ms; close(p[0]); if (tools_verbose) { - printf("%s", in.buf); + printf("%s", ret); printf("Finished: %u ms, %s %u\n", ms, WIFEXITED(status) ? "exit status" : "killed by signal", WIFEXITED(status) ? WEXITSTATUS(status) : WTERMSIG(status)); } *ok = (WIFEXITED(status) && WEXITSTATUS(status) == 0); - return in.buf; + return ret; } /* Tals *output off ctx; return false if command fails. */ @@ -267,7 +267,7 @@ free: return ret; } -void *do_tal_realloc(void *p, size_t size) +void *tal_rbuf_enlarge(struct membuf *mb, void *p, size_t size) { tal_resize((char **)&p, size); return p;