X-Git-Url: https://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=tools%2Ftools.c;h=09cc3d3a17b362b324b99d5ef20fc922d885ff36;hp=b93448278648034f8835668db5476cc6abe038c5;hb=024fbb5f9682d3187b65849948c372c3879ed9bd;hpb=afcb4f4dd0d88c699d816883d62c8cff5f37ca0d diff --git a/tools/tools.c b/tools/tools.c index b9344827..09cc3d3a 100644 --- a/tools/tools.c +++ b/tools/tools.c @@ -17,7 +17,7 @@ #include #include "tools.h" -static char *tmpdir = NULL; +static const char *tmpdir = NULL; bool tools_verbose = false; /* Ten minutes. */ @@ -81,6 +81,8 @@ char *run_with_timeout(const void *ctx, const char *cmd, if (tools_verbose) printf("Running: %s\n", cmd); + /* Always flush buffers before fork! */ + fflush(stdout); gettimeofday(&start, NULL); pid = fork(); if (pid == -1) { @@ -131,7 +133,7 @@ char *run_with_timeout(const void *ctx, const char *cmd, *timeout_ms = 0; else *timeout_ms -= ms; - + close(p[0]); if (tools_verbose) { printf("%s", ret); printf("Finished: %u ms, %s %u\n", ms, @@ -143,38 +145,38 @@ char *run_with_timeout(const void *ctx, const char *cmd, return ret; } -/* Returns output if command fails. */ -char *run_command(const void *ctx, unsigned int *time_ms, const char *fmt, ...) +/* Tallocs *output off ctx; return false if command fails. */ +bool run_command(const void *ctx, unsigned int *time_ms, char **output, + const char *fmt, ...) { va_list ap; - char *cmd, *contents; + char *cmd; bool ok; unsigned int default_time = default_timeout_ms; if (!time_ms) time_ms = &default_time; - else if (*time_ms == 0) - return talloc_strdup(ctx, "\n== TIMED OUT ==\n"); + else if (*time_ms == 0) { + *output = talloc_strdup(ctx, "\n== TIMED OUT ==\n"); + return false; + } va_start(ap, fmt); cmd = talloc_vasprintf(ctx, fmt, ap); va_end(ap); - contents = run_with_timeout(ctx, cmd, &ok, time_ms); - if (ok) { - talloc_free(contents); - return NULL; - } - - if (!contents) + *output = run_with_timeout(ctx, cmd, &ok, time_ms); + if (ok) + return true; + if (!*output) err(1, "Problem running child"); if (*time_ms == 0) - contents = talloc_asprintf_append(contents, - "\n== TIMED OUT ==\n"); - return contents; + *output = talloc_asprintf_append(*output, + "\n== TIMED OUT ==\n"); + return false; } -static int unlink_all(char *dir) +static int unlink_all(const char *dir) { char cmd[strlen(dir) + sizeof("rm -rf ")]; sprintf(cmd, "rm -rf %s", dir); @@ -185,7 +187,7 @@ static int unlink_all(char *dir) return 0; } -char *temp_dir(const void *ctx) +const char *temp_dir(const void *ctx) { /* For first call, create dir. */ while (!tmpdir) { @@ -210,6 +212,12 @@ char *temp_dir(const void *ctx) return tmpdir; } +int unlink_file_destructor(char *filename) +{ + unlink(filename); + return 0; +} + char *maybe_temp_file(const void *ctx, const char *extension, bool keep, const char *srcname) { @@ -218,11 +226,7 @@ char *maybe_temp_file(const void *ctx, const char *extension, bool keep, struct stat st; unsigned int count = 0; - if (!keep) - srcname = talloc_basename(ctx, srcname); - else - assert(srcname[0] == '/'); - + srcname = talloc_basename(ctx, srcname); if (strrchr(srcname, '.')) baselen = strrchr(srcname, '.') - srcname; else @@ -230,7 +234,7 @@ char *maybe_temp_file(const void *ctx, const char *extension, bool keep, do { f = talloc_asprintf(ctx, "%s/%.*s%s%s", - keep ? "" : temp_dir(ctx), + temp_dir(ctx), baselen, srcname, suffix, extension); talloc_free(suffix); @@ -238,7 +242,10 @@ char *maybe_temp_file(const void *ctx, const char *extension, bool keep, } while (lstat(f, &st) == 0); if (tools_verbose) - printf("Creating file %s\n", f); + printf("Creating %sfile %s\n", keep ? "" : "temporary ", f); + + if (!keep) + talloc_set_destructor(f, unlink_file_destructor); talloc_free(suffix); return f;