From 09d5cd70d7e8105a003ed9583eadb077de014f3b Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 3 Dec 2012 22:06:40 +1030 Subject: [PATCH] tools: use tal/path instead of writing own path handlers. Signed-off-by: Rusty Russell --- tools/Makefile | 1 + tools/ccan_dir.c | 5 ++- tools/ccanlint/Makefile | 1 + tools/ccanlint/ccanlint.c | 6 ++- tools/ccanlint/tests/examples_compile.c | 7 +-- tools/ccanlint/tests/examples_exist.c | 12 +++--- tools/ccanlint/tests/tests_coverage.c | 5 ++- tools/manifest.c | 19 ++++----- tools/namespacize.c | 12 +++--- tools/tools.c | 57 ++++--------------------- tools/tools.h | 3 -- 11 files changed, 47 insertions(+), 81 deletions(-) diff --git a/tools/Makefile b/tools/Makefile index 104af9cf..1ab69c92 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -11,6 +11,7 @@ DEP_OBJS = ccan/err/err.o \ ccan/take/take.o \ ccan/tal/tal.o \ ccan/tal/link/link.o \ + ccan/tal/path/path.o \ ccan/tal/str/str.o \ ccan/time/time.o \ tools/read_config_header.o \ diff --git a/tools/ccan_dir.c b/tools/ccan_dir.c index 2359b8ec..6d95e064 100644 --- a/tools/ccan_dir.c +++ b/tools/ccan_dir.c @@ -1,4 +1,5 @@ #include +#include #include "tools.h" #include #include @@ -26,8 +27,8 @@ const char *find_ccan_dir(const char *base) if (!ccan_dir) { if (base[0] != '/') { - const char *tmpctx = tal_getcwd(NULL); - find_ccan_dir(tal_fmt(tmpctx, "%s/%s", tmpctx, base)); + const char *tmpctx = path_cwd(NULL); + find_ccan_dir(path_join(tmpctx, tmpctx, base)); tal_free(tmpctx); } else { unsigned int prefix = ccan_dir_prefix(base); diff --git a/tools/ccanlint/Makefile b/tools/ccanlint/Makefile index ad6b12fb..f09835a4 100644 --- a/tools/ccanlint/Makefile +++ b/tools/ccanlint/Makefile @@ -24,6 +24,7 @@ CORE_OBJS := \ ccan/take/take.o \ ccan/tal/tal.o \ ccan/tal/link/link.o \ + ccan/tal/path/path.o \ ccan/tal/str/str.o \ ccan/time/time.o \ tools/ccanlint/async.o \ diff --git a/tools/ccanlint/ccanlint.c b/tools/ccanlint/ccanlint.c index 17f7a9c6..83549cc9 100644 --- a/tools/ccanlint/ccanlint.c +++ b/tools/ccanlint/ccanlint.c @@ -32,6 +32,7 @@ #include #include #include +#include #include struct ccanlint_map { @@ -590,7 +591,7 @@ int main(int argc, char *argv[]) unsigned int i; struct manifest *m; const char *prefix = ""; - char *dir = tal_getcwd(NULL), *base_dir = dir, *testlink; + char *dir = path_cwd(NULL), *base_dir = dir, *testlink; struct dgraph_node all; /* Empty graph node to which we attach everything else. */ @@ -675,7 +676,8 @@ int main(int argc, char *argv[]) } if (dir != base_dir) - prefix = tal_strcat(NULL, take(tal_basename(NULL,dir)), + prefix = tal_strcat(NULL, + take(path_basename(NULL,dir)), ": "); m = get_manifest(autofree(), dir); diff --git a/tools/ccanlint/tests/examples_compile.c b/tools/ccanlint/tests/examples_compile.c index 19cbec18..2479d80a 100644 --- a/tools/ccanlint/tests/examples_compile.c +++ b/tools/ccanlint/tests/examples_compile.c @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -461,10 +462,10 @@ static struct ccan_file *mangle_example(struct manifest *m, struct ccan_file *f; name = temp_file(example, ".c", - tal_fmt(m, "%s/mangled-%s", m->dir, example->name)); + take(tal_fmt(NULL, "mangled-%s", example->name))); f = new_ccan_file(example, - tal_dirname(example, name), - tal_basename(example, name)); + path_dirname(example, name), + path_basename(example, name)); tal_steal(f, name); fd = open(f->fullname, O_WRONLY | O_CREAT | O_EXCL, 0600); diff --git a/tools/ccanlint/tests/examples_exist.c b/tools/ccanlint/tests/examples_exist.c index a0adcdbc..02ddb486 100644 --- a/tools/ccanlint/tests/examples_exist.c +++ b/tools/ccanlint/tests/examples_exist.c @@ -1,6 +1,8 @@ #include #include #include +#include +#include #include #include #include @@ -23,16 +25,14 @@ static char *add_example(struct manifest *m, struct ccan_file *source, int fd; struct ccan_file *f; - name = tal_fmt(m, "%s/example-%s-%s.c", - tal_dirname(m, source->fullname), - source->name, - example->function); + name = tal_fmt(m, "example-%s-%s", + source->name, example->function); /* example->function == 'struct foo' */ while (strchr(name, ' ')) *strchr(name, ' ') = '_'; - name = temp_file(m, ".c", name); - f = new_ccan_file(m, tal_dirname(m, name), tal_basename(m, name)); + name = temp_file(m, ".c", take(name)); + f = new_ccan_file(m, path_dirname(m, name), path_basename(m, name)); tal_steal(f, name); list_add_tail(&m->examples, &f->list); diff --git a/tools/ccanlint/tests/tests_coverage.c b/tools/ccanlint/tests/tests_coverage.c index caca30ce..2a7bf635 100644 --- a/tools/ccanlint/tests/tests_coverage.c +++ b/tools/ccanlint/tests/tests_coverage.c @@ -1,6 +1,7 @@ #include #include #include +#include #include #include #include @@ -142,8 +143,8 @@ static void do_run_coverage_tests(struct manifest *m, bool ran_some = false; /* This tells gcov where we put those .gcno files. */ - outdir = tal_dirname(score, - m->info_file->compiled[COMPILE_NORMAL]); + outdir = path_dirname(score, + m->info_file->compiled[COMPILE_NORMAL]); covcmd = tal_fmt(m, "gcov %s -o %s", full_gcov ? "" : "-n", outdir); diff --git a/tools/manifest.c b/tools/manifest.c index f7f86f74..612a8a6d 100644 --- a/tools/manifest.c +++ b/tools/manifest.c @@ -3,6 +3,7 @@ #include "tools.h" #include #include +#include #include #include #include @@ -193,23 +194,22 @@ static void sort_files(struct list_head *list) struct manifest *get_manifest(const void *ctx, const char *dir) { struct manifest *m; - char *olddir, *canon_dir; + char *canon_dir; unsigned int len; struct list_head *list; + struct path_pushd *old; if (!manifests) { manifests = tal(NULL, struct htable_manifest); htable_manifest_init(manifests); } - olddir = tal_getcwd(NULL); - if (!olddir) - err(1, "Getting current directory"); - - if (chdir(dir) != 0) + /* FIXME: Use path_canon, don't chdir! */ + old = path_pushd(ctx, dir); + if (!old) err(1, "Failed to chdir to %s", dir); - canon_dir = tal_getcwd(olddir); + canon_dir = path_cwd(old); if (!canon_dir) err(1, "Getting current directory"); @@ -257,9 +257,8 @@ struct manifest *get_manifest(const void *ctx, const char *dir) htable_manifest_add(manifests, tal_link(manifests, m)); done: - if (chdir(olddir) != 0) - err(1, "Returning to original directory '%s'", olddir); - tal_free(olddir); + if (!path_popd(old)) + err(1, "Returning to original directory"); return m; } diff --git a/tools/namespacize.c b/tools/namespacize.c index 13c1a36a..f1a9374e 100644 --- a/tools/namespacize.c +++ b/tools/namespacize.c @@ -12,6 +12,7 @@ #include "ccan/str/str.h" #include "ccan/take/take.h" #include "ccan/rbuf/rbuf.h" +#include "ccan/tal/path/path.h" #include "ccan/err/err.h" #include "tools.h" @@ -255,7 +256,8 @@ static void analyze_headers(const char *dir, struct replace **repl) char *hdr, *contents; /* Get hold of header, assume that's it. */ - hdr = tal_fmt(dir, "%s/%s.h", dir, tal_basename(dir, dir)); + hdr = tal_fmt(dir, "%s/%s.h", dir, path_basename(dir, dir)); + contents = tal_grab_file(dir, hdr, NULL); if (!contents) err(1, "Reading %s", hdr); @@ -445,7 +447,7 @@ static struct replace *read_replacement_file(const char *depdir) static void adjust_dir(const char *dir) { - char *parent = tal_dirname(autofree(), dir); + char *parent = path_dirname(autofree(), dir); char **deps; verbose("Adjusting %s\n", dir); @@ -473,8 +475,8 @@ static void adjust_dir(const char *dir) static void adjust_dependents(const char *dir) { - char *parent = tal_dirname(NULL, dir); - char *base = tal_basename(parent, dir); + char *parent = path_dirname(NULL, dir); + char *base = path_basename(parent, dir); char **file; verbose("Looking for dependents in %s\n", parent); @@ -483,7 +485,7 @@ static void adjust_dependents(const char *dir) char *info, **deps; bool isdep = false; - if (tal_basename(*file, *file)[0] == '.') + if (path_basename(*file, *file)[0] == '.') continue; info = tal_fmt(*file, "%s/_info", *file); diff --git a/tools/tools.c b/tools/tools.c index 2a776f06..dc42ae47 100644 --- a/tools/tools.c +++ b/tools/tools.c @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -25,42 +26,6 @@ bool tools_verbose = false; /* Ten minutes. */ const unsigned int default_timeout_ms = 10 * 60 * 1000; -char *tal_basename(const void *ctx, const char *dir) -{ - const char *p = strrchr(dir, '/'); - - if (!p) - return tal_strdup(ctx, dir); - return tal_strdup(ctx, p+1); -} - -char *tal_dirname(const void *ctx, const char *dir) -{ - const char *p = strrchr(dir, '/'); - - if (!p) - return tal_strdup(ctx, "."); - return tal_strndup(ctx, dir, p - dir); -} - -char *tal_getcwd(const void *ctx) -{ - unsigned int len; - char *cwd; - - /* *This* is why people hate C. */ - len = 32; - cwd = tal_arr(ctx, char, len); - while (!getcwd(cwd, len)) { - if (errno != ERANGE) { - tal_free(cwd); - return NULL; - } - tal_resize(&cwd, len *= 2); - } - return cwd; -} - static void killme(int sig) { kill(-getpid(), SIGKILL); @@ -229,28 +194,24 @@ void keep_temp_dir(void) char *temp_file(const void *ctx, const char *extension, const char *srcname) { - unsigned baselen; - char *f, *suffix = tal_strdup(ctx, ""); + char *f, *base, *suffix; struct stat st; unsigned int count = 0; - srcname = tal_basename(ctx, srcname); - if (strrchr(srcname, '.')) - baselen = strrchr(srcname, '.') - srcname; - else - baselen = strlen(srcname); + base = path_join(ctx, temp_dir(), take(path_basename(ctx, srcname))); + /* Trim extension. */ + base[path_ext_off(base)] = '\0'; + suffix = tal_strdup(ctx, extension); do { - f = tal_fmt(ctx, "%s/%.*s%s%s", - temp_dir(), baselen, srcname, suffix, extension); - tal_free(suffix); - suffix = tal_fmt(ctx, "-%u", ++count); + f = tal_strcat(ctx, base, suffix); + suffix = tal_fmt(base, "-%u%s", ++count, extension); } while (lstat(f, &st) == 0); if (tools_verbose) printf("Creating file %s\n", f); - tal_free(suffix); + tal_free(base); return f; } diff --git a/tools/tools.h b/tools/tools.h index 6fd9d2e8..40f1bcb0 100644 --- a/tools/tools.h +++ b/tools/tools.h @@ -46,9 +46,6 @@ char **get_libs(const void *ctx, const char *dir, const char *style, /* From tools.c */ /* If set, print all commands run, all output they give and exit status. */ extern bool tools_verbose; -char *tal_basename(const void *ctx, const char *dir); -char *tal_dirname(const void *ctx, const char *dir); -char *tal_getcwd(const void *ctx); bool PRINTF_FMT(4,5) run_command(const void *ctx, unsigned int *time_ms, char **output, -- 2.39.2