From 1033a017c16ac7f239c2436fbd9cad433672a011 Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Sun, 21 Jun 2015 21:52:51 -0400 Subject: bftw: Don't add extra slashes. This fixes "bfs /" among other things. --- bftw.c | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) (limited to 'bftw.c') diff --git a/bftw.c b/bftw.c index 0d55a65..47ab8b5 100644 --- a/bftw.c +++ b/bftw.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -225,7 +226,13 @@ static DIR *dircache_entry_open(dircache *cache, dircache_entry *entry, dynstr * dircache_entry *parent = entry; do { - pathsize += strlen(parent->name) + 1; // name + '/' + size_t namelen = strlen(parent->name); + pathsize += namelen; + + if (namelen > 0 && parent->name[namelen - 1] != '/') { + ++pathsize; + } + parent = parent->parent; } while (parent); @@ -241,11 +248,20 @@ static DIR *dircache_entry_open(dircache *cache, dircache_entry *entry, dynstr * const char *relpath = path->str; parent = entry; - while (1) { + while (true) { size_t namelen = strlen(parent->name); - segment -= namelen + 1; + bool needs_slash = namelen > 0 && parent->name[namelen - 1] != '/'; + + segment -= namelen; + if (needs_slash) { + segment -= 1; + } + memcpy(segment, parent->name, namelen); - segment[namelen] = '/'; + + if (needs_slash) { + segment[namelen] = '/'; + } parent = parent->parent; if (!parent) { -- cgit v1.2.3