From e0529e15e0c7f9251af5465ef03f208d279affc1 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 3 Dec 2012 22:06:40 +1030 Subject: [PATCH 1/1] tools: manifest.c should use path_canon. Signed-off-by: Rusty Russell --- tools/ccanlint/tests/examples_compile.c | 4 +-- tools/ccanlint/tests/examples_exist.c | 3 +- tools/manifest.c | 48 ++++++++++++------------- tools/manifest.h | 5 +-- 4 files changed, 29 insertions(+), 31 deletions(-) diff --git a/tools/ccanlint/tests/examples_compile.c b/tools/ccanlint/tests/examples_compile.c index 2479d80a..b10940ae 100644 --- a/tools/ccanlint/tests/examples_compile.c +++ b/tools/ccanlint/tests/examples_compile.c @@ -464,8 +464,8 @@ static struct ccan_file *mangle_example(struct manifest *m, name = temp_file(example, ".c", take(tal_fmt(NULL, "mangled-%s", example->name))); f = new_ccan_file(example, - path_dirname(example, name), - path_basename(example, name)); + take(path_dirname(example, name)), + take(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 02ddb486..e308be20 100644 --- a/tools/ccanlint/tests/examples_exist.c +++ b/tools/ccanlint/tests/examples_exist.c @@ -32,7 +32,8 @@ static char *add_example(struct manifest *m, struct ccan_file *source, *strchr(name, ' ') = '_'; name = temp_file(m, ".c", take(name)); - f = new_ccan_file(m, path_dirname(m, name), path_basename(m, name)); + f = new_ccan_file(m, take(path_dirname(m, name)), + take(path_basename(m, name))); tal_steal(f, name); list_add_tail(&m->examples, &f->list); diff --git a/tools/manifest.c b/tools/manifest.c index 927a2185..762550ea 100644 --- a/tools/manifest.c +++ b/tools/manifest.c @@ -60,7 +60,8 @@ char **get_ccan_file_lines(struct ccan_file *f) return f->lines; } -struct ccan_file *new_ccan_file(const void *ctx, const char *dir, char *name) +struct ccan_file *new_ccan_file(const void *ctx, const char *dir, + const char *name) { struct ccan_file *f; unsigned int i; @@ -73,25 +74,28 @@ struct ccan_file *new_ccan_file(const void *ctx, const char *dir, char *name) f->doc_sections = NULL; for (i = 0; i < ARRAY_SIZE(f->compiled); i++) f->compiled[i] = NULL; - f->name = tal_steal(f, name); + f->name = tal_strdup(f, name); f->fullname = path_join(f, dir, f->name); f->contents = NULL; f->simplified = NULL; return f; } -static void add_files(struct manifest *m, const char *dir) +static void add_files(struct manifest *m, const char *base, const char *subdir) { DIR *d; struct dirent *ent; char **subs = tal_arr(m, char *, 0); + const char *thisdir; - if (dir[0]) - d = opendir(dir); + if (!subdir) + thisdir = base; else - d = opendir("."); + thisdir = path_join(subs, base, subdir); + + d = opendir(thisdir); if (!d) - err(1, "Opening directory %s", dir[0] ? dir : "."); + err(1, "Opening directory %s", thisdir); while ((ent = readdir(d)) != NULL) { struct stat st; @@ -103,9 +107,10 @@ static void add_files(struct manifest *m, const char *dir) continue; f = new_ccan_file(m, m->dir, - tal_fmt(m, "%s%s", dir, ent->d_name)); - if (lstat(f->name, &st) != 0) - err(1, "lstat %s", f->name); + subdir ? path_join(m, subdir, ent->d_name) + : ent->d_name); + if (lstat(f->fullname, &st) != 0) + err(1, "lstat %s", f->fullname); if (S_ISDIR(st.st_mode)) { size_t len = tal_count(subs); @@ -153,7 +158,7 @@ static void add_files(struct manifest *m, const char *dir) closedir(d); /* Before we recurse, sanity check this is a ccan module. */ - if (!dir[0]) { + if (!subdir) { size_t i; if (!m->info_file @@ -162,7 +167,7 @@ static void add_files(struct manifest *m, const char *dir) errx(1, "No _info, C or H files found here!"); for (i = 0; i < tal_count(subs); i++) - add_files(m, subs[i]); + add_files(m, base, subs[i]); } tal_free(subs); } @@ -195,25 +200,20 @@ struct manifest *get_manifest(const void *ctx, const char *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); } - /* FIXME: Use path_canon, don't chdir! */ - old = path_pushd(ctx, dir); - if (!old) - err(1, "Failed to chdir to %s", dir); - - canon_dir = path_cwd(old); + canon_dir = path_canon(ctx, dir); if (!canon_dir) - err(1, "Getting current directory"); + err(1, "Getting canonical version of directory %s", dir); m = htable_manifest_get(manifests, canon_dir); if (m) - goto done; + return m; + m = tal_linkable(tal(NULL, struct manifest)); m->info_file = NULL; m->compiled[COMPILE_NORMAL] = m->compiled[COMPILE_NOFEAT] = NULL; @@ -245,7 +245,7 @@ struct manifest *get_manifest(const void *ctx, const char *dir) assert(strstarts(m->dir, find_ccan_dir(m->dir))); m->modname = m->dir + strlen(find_ccan_dir(m->dir)) + strlen("ccan/"); - add_files(m, ""); + add_files(m, canon_dir, NULL); /* Nicer to run tests in a predictable order. */ foreach_ptr(list, &m->api_tests, &m->run_tests, &m->compile_ok_tests, @@ -254,9 +254,5 @@ struct manifest *get_manifest(const void *ctx, const char *dir) htable_manifest_add(manifests, tal_link(manifests, m)); -done: - if (!path_popd(old)) - err(1, "Returning to original directory"); - return m; } diff --git a/tools/manifest.h b/tools/manifest.h index 86e1f205..d2de6437 100644 --- a/tools/manifest.h +++ b/tools/manifest.h @@ -82,8 +82,9 @@ struct ccan_file { char *simplified; }; -/* A new ccan_file, with the given name (tal_steal onto returned value). */ -struct ccan_file *new_ccan_file(const void *ctx, const char *dir, char *name); +/* A new ccan_file, with the given dir and name (either can be take()). */ +struct ccan_file *new_ccan_file(const void *ctx, + const char *dir, const char *name); /* Use this rather than accessing f->contents directly: loads on demand. */ const char *get_ccan_file_contents(struct ccan_file *f); -- 2.39.2