From: Kevin Locke Date: Thu, 29 Sep 2016 00:44:44 +0000 (-0600) Subject: configurator: Print test source without cat X-Git-Url: https://git.ozlabs.org/?p=ccan;a=commitdiff_plain;h=fcdcba92fe85ced9594cabb9c1f960dc98e33077 configurator: Print test source without cat Windows does not provide cat. Instead, copy the test source to stdout using the file stream to which it was written. Changes since v1: - Create fwrite_noeintr to avoid EINTR in fwrite without writing any data. - Handle short reads from fread. This can happen with non-conformant libc or if EINTR occurs after reading some data. - Handle short writes from fwrite. This can happen with non-conformant libc or if EINTR occurs after writing some data. Changes since v2: - Revert fwrite_noeintr and short read/write changes. Signed-off-by: Kevin Locke Signed-off-by: David Gibson --- diff --git a/tools/configurator/configurator.c b/tools/configurator/configurator.c index a7cbfa53..73fdc952 100644 --- a/tools/configurator/configurator.c +++ b/tools/configurator/configurator.c @@ -407,6 +407,22 @@ static void c12r_errx(int eval, const char *fmt, ...) exit(eval); } +static size_t fcopy(FILE *fsrc, FILE *fdst) +{ + char buffer[BUFSIZ]; + size_t rsize, wsize; + size_t copied = 0; + + while ((rsize = fread(buffer, 1, BUFSIZ, fsrc)) > 0) { + wsize = fwrite(buffer, 1, rsize, fdst); + copied += wsize; + if (wsize != rsize) + break; + } + + return copied; +} + static char *grab_stream(FILE *file) { size_t max, ret, size = 0; @@ -530,7 +546,7 @@ static bool run_test(const char *cmd, struct test *test) } } - outf = fopen(INPUT_FILE, "w"); + outf = fopen(INPUT_FILE, verbose > 1 ? "w+" : "w"); if (!outf) c12r_err(1, "creating %s", INPUT_FILE); @@ -561,11 +577,13 @@ static bool run_test(const char *cmd, struct test *test) abort(); } - fclose(outf); - if (verbose > 1) - if (system("cat " INPUT_FILE) == -1) - ; + if (verbose > 1) { + fseek(outf, 0, SEEK_SET); + fcopy(outf, stdout); + } + + fclose(outf); newcmd = strdup(cmd);