summaryrefslogtreecommitdiff
path: root/src/shared/path-util.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2015-05-13 17:42:10 +0200
committerLennart Poettering <lennart@poettering.net>2015-05-13 17:42:10 +0200
commit1d13f648d0fade38194db74b4f82ca68c8a26856 (patch)
treeb85c22b0007e0c8c6e612b8c9f5606bcd84f0451 /src/shared/path-util.c
parent8b44a3d22c1fdfc5ce5fcb77e38a90ec02ba8019 (diff)
util: add generic calls for prefixing a root directory to a path
So far a number of utilities implemented their own calls for this, unify them in prefix_root() and prefix_roota(). The former uses heap memory, the latter allocates from the stack via alloca(). Port over most users of a --root= logic.
Diffstat (limited to 'src/shared/path-util.c')
-rw-r--r--src/shared/path-util.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/src/shared/path-util.c b/src/shared/path-util.c
index 635ce33b23..7090989fcb 100644
--- a/src/shared/path-util.c
+++ b/src/shared/path-util.c
@@ -793,3 +793,37 @@ int fsck_exists(const char *fstype) {
return 0;
}
+
+char *prefix_root(const char *root, const char *path) {
+ char *n, *p;
+ size_t l;
+
+ /* If root is passed, prefixes path with it. Otherwise returns
+ * it as is. */
+
+ assert(path);
+
+ /* First, drop duplicate prefixing slashes from the path */
+ while (path[0] == '/' && path[1] == '/')
+ path++;
+
+ if (isempty(root) || path_equal(root, "/"))
+ return strdup(path);
+
+ l = strlen(root) + 1 + strlen(path) + 1;
+
+ n = new(char, l);
+ if (!n)
+ return NULL;
+
+ p = stpcpy(n, root);
+
+ while (p > n && p[-1] == '/')
+ p--;
+
+ if (path[0] != '/')
+ *(p++) = '/';
+
+ strcpy(p, path);
+ return n;
+}