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 \
#include <ccan/err/err.h>
+#include <ccan/tal/path/path.h>
#include "tools.h"
#include <assert.h>
#include <string.h>
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);
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 \
#include <ccan/foreach/foreach.h>
#include <ccan/cast/cast.h>
#include <ccan/tlist/tlist.h>
+#include <ccan/tal/path/path.h>
#include <ccan/strmap/strmap.h>
struct ccanlint_map {
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. */
}
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);
#include <ccan/tal/str/str.h>
#include <ccan/take/take.h>
#include <ccan/cast/cast.h>
+#include <ccan/tal/path/path.h>
#include <ccan/str/str.h>
#include <sys/types.h>
#include <sys/stat.h>
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);
#include <tools/ccanlint/ccanlint.h>
#include <tools/tools.h>
#include <ccan/str/str.h>
+#include <ccan/tal/path/path.h>
+#include <ccan/take/take.h>
#include <ccan/cast/cast.h>
#include <sys/types.h>
#include <sys/stat.h>
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);
#include <tools/ccanlint/ccanlint.h>
#include <tools/tools.h>
#include <ccan/str/str.h>
+#include <ccan/tal/path/path.h>
#include <ccan/foreach/foreach.h>
#include <sys/types.h>
#include <sys/stat.h>
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);
#include "tools.h"
#include <ccan/str/str.h>
#include <ccan/tal/link/link.h>
+#include <ccan/tal/path/path.h>
#include <ccan/hash/hash.h>
#include <ccan/htable/htable_type.h>
#include <ccan/noerr/noerr.h>
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");
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;
}
#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"
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);
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);
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);
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);
#include <ccan/read_write_all/read_write_all.h>
#include <ccan/noerr/noerr.h>
#include <ccan/time/time.h>
+#include <ccan/tal/path/path.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/time.h>
/* 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);
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;
}
/* 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,