aboutsummaryrefslogtreecommitdiffstats
path: root/pseudo_util.c
diff options
context:
space:
mode:
authorSeebs <seebs@seebs.net>2018-03-30 12:18:13 -0500
committerSeebs <seebs@seebs.net>2018-03-30 12:18:13 -0500
commitcd842c2df2fc94fe0866c3fe5ab7d34e447ca5fc (patch)
tree84e3cbf7ac148dbe41f064c582a7f03ba61e8b92 /pseudo_util.c
parent778abd3686fb7c419e9016fdd9e93819405d52aa (diff)
downloadpseudo-cd842c2df2fc94fe0866c3fe5ab7d34e447ca5fc.tar.gz
pseudo-cd842c2df2fc94fe0866c3fe5ab7d34e447ca5fc.tar.bz2
pseudo-cd842c2df2fc94fe0866c3fe5ab7d34e447ca5fc.zip
don't add quite so many slashes
pseudo_append_elements was unconditionally adding a slash after each element. this means that if it gets called more than once, as when processing symlinks, you end up with trailing slashes. change it to add infix slashes. This code probably wants a rethink. Signed-off-by: Seebs <seebs@seebs.net>
Diffstat (limited to 'pseudo_util.c')
-rw-r--r--pseudo_util.c38
1 files changed, 28 insertions, 10 deletions
diff --git a/pseudo_util.c b/pseudo_util.c
index addf503..06ad8fc 100644
--- a/pseudo_util.c
+++ b/pseudo_util.c
@@ -630,6 +630,8 @@ pseudo_append_element(char *newpath, char *root, size_t allocated, char **pcurre
return -1;
}
current = *pcurrent;
+ pseudo_debug(PDBGF_PATH | PDBGF_VERBOSE, "pae: %s, + %.*s\n",
+ newpath, (int) elen, element);
/* the special cases here to skip empty paths, or ./.., should not
* apply to plain files, which should just get bogus
* paths.
@@ -724,6 +726,7 @@ pseudo_append_elements(char *newpath, char *root, size_t allocated, char **curre
int retval = 1;
PSEUDO_STATBUF buf;
buf.st_mode = 0;
+ int add_slash = 0;
const char * start = element;
if (!newpath || !root ||
!current || !*current ||
@@ -731,6 +734,8 @@ pseudo_append_elements(char *newpath, char *root, size_t allocated, char **curre
pseudo_diag("pseudo_append_elements: invalid arguments.");
return -1;
}
+ pseudo_debug(PDBGF_PATH | PDBGF_VERBOSE, "paes: element list <%.*s>\n",
+ (int) elen, element);
/* coming into append_elements, we should always have a trailing slash on
* the path. append_element won't provide one, though.
*/
@@ -744,15 +749,29 @@ pseudo_append_elements(char *newpath, char *root, size_t allocated, char **curre
leave_this = leave_last;
}
this_elen = next - element;
- /* for an empty path, or a "/.", we skip the append, but not for regular
- * files; regular files get it appended so they can fail properly
+ /* for a directory, we skip the append for empty path or ".";
+ * regular files get it appended so they can fail properly
* later for being invalid paths.
*/
+ pseudo_debug(PDBGF_FILE | PDBGF_VERBOSE, "element to add: '%.*s'\n",
+ (int) this_elen, element);
+ /* we initially had a trailing slash. we don't
+ * want append_element to append slashes, so every time through
+ * this loop after the first, we want to add a slash.
+ */
+ if (add_slash) {
+ *(*current)++ = '/';
+ *(*current) = '\0';
+ } else {
+ add_slash = 1;
+ }
if (is_reg || (this_elen > 1) || ((this_elen == 1) && (*element != '.'))) {
if (pseudo_append_element(newpath, root, allocated, current, element, this_elen, &buf, leave_this) == -1) {
retval = -1;
break;
}
+ pseudo_debug(PDBGF_FILE | PDBGF_VERBOSE, "paes: append_element gave us '%s', current '%s'\n",
+ newpath, *current);
/* if a path element was appended, we want to know whether the resulting
* thing is an existing regular file; regular files can't be further
* explored, which actually means we *do* append path things to them
@@ -761,11 +780,6 @@ pseudo_append_elements(char *newpath, char *root, size_t allocated, char **curre
if (!pseudo_real_lstat || (pseudo_real_lstat(newpath, &buf) == -1)) {
buf.st_mode = 0;
}
- /* having grabbed a stat for the path, we append a slash so we can append to it again
- * if needed.
- */
- *(*current)++ = '/';
- *(*current) = '\0';
}
/* and now move past the separator */
element += this_elen + 1;
@@ -833,11 +847,15 @@ pseudo_fix_path(const char *base, const char *path, size_t rootlen, size_t basel
* path points to the next element of path
* newpathlen is the total allocated length of newpath
* (current - newpath) is the used length of newpath
+ *
+ * ... the above is now slightly wrong, we start append_elements
+ * and append_element with a trailing slash on the path, but
+ * end them without.
*/
if (pseudo_append_elements(newpath, effective_root, newpathlen, &current, path, pathlen, leave_last) != -1) {
- --current;
- if (*current == '/' && current > effective_root && !trailing_slash) {
- *current = '\0';
+ if (current > effective_root && trailing_slash) {
+ *current++ = '/';
+ *current++ = '\0';
}
pseudo_debug(PDBGF_PATH, "%s + %s => <%s>\n",
base ? base : "<nil>",