X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=tools%2Ftools.c;h=16246593b8b7561534df56f7eb7cd533f884c8b0;hp=2983cfca663bc730130899ae96cb16a75e62baa2;hb=0f66da713a750c995bb59452a95f4a71fdd8a58c;hpb=0939b69164c65329fa8f6b2c4ab5e9c7d9162678 diff --git a/tools/tools.c b/tools/tools.c index 2983cfca..16246593 100644 --- a/tools/tools.c +++ b/tools/tools.c @@ -14,10 +14,10 @@ #include #include #include +#include #include "tools.h" static char *tmpdir = NULL; -static unsigned int count; bool tools_verbose = false; /* Ten minutes. */ @@ -204,34 +204,43 @@ char *temp_dir(const void *ctx) err(1, "mkdir %s failed", tmpdir); } talloc_set_destructor(tmpdir, unlink_all); + if (tools_verbose) + printf("Created temporary directory %s\n", tmpdir); } - if (tools_verbose) - printf("Created temporary directory %s\n", tmpdir); return tmpdir; } -char *temp_file(const void *ctx, const char *extension) -{ - char *f = talloc_asprintf(ctx, "%s/%u%s", - temp_dir(ctx), count++, extension); - if (tools_verbose) - printf("Created temporary file %s\n", f); - return f; -} - char *maybe_temp_file(const void *ctx, const char *extension, bool keep, const char *srcname) { size_t baselen; - char *f; + char *f, *suffix = talloc_strdup(ctx, ""); + struct stat st; + unsigned int count = 0; if (!keep) - return temp_file(ctx, extension); + srcname = talloc_basename(ctx, srcname); + else + assert(srcname[0] == '/'); + + if (strrchr(srcname, '.')) + baselen = strrchr(srcname, '.') - srcname; + else + baselen = strlen(srcname); + + do { + f = talloc_asprintf(ctx, "%s/%.*s%s%s", + keep ? "" : temp_dir(ctx), + baselen, srcname, + suffix, extension); + talloc_free(suffix); + suffix = talloc_asprintf(ctx, "-%u", ++count); + } while (lstat(f, &st) == 0); - baselen = strrchr(srcname, '.') - srcname; - f = talloc_asprintf(ctx, "%.*s%s", baselen, srcname, extension); if (tools_verbose) printf("Creating file %s\n", f); + + talloc_free(suffix); return f; }