The pathjoin() function creates a path from a list of strings.

Signed-off-by: Goffredo Baroncelli <kreij...@inwind.it>
---
 utils.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 utils.h |  1 +
 2 files changed, 64 insertions(+)

diff --git a/utils.c b/utils.c
index f499023..5f4d0ef 100644
--- a/utils.c
+++ b/utils.c
@@ -38,6 +38,7 @@
 #include <linux/kdev_t.h>
 #include <limits.h>
 #include <blkid/blkid.h>
+#include <stdarg.h>
 #include "kerncompat.h"
 #include "radix-tree.h"
 #include "ctree.h"
@@ -2108,3 +2109,65 @@ int lookup_ino_rootid(int fd, u64 *rootid)
 
        return 0;
 }
+
+/*
+ * Joints a list of string. The list has to be NULL terminated
+ */
+char *pathjoin( char *s, ...)
+{
+       va_list         ap;
+       int             size;
+       char            *dst;
+
+       if (!s || !strlen(s))
+               return NULL;
+
+       size = strlen(s)+1;
+       va_start(ap, s);
+
+       do {
+               char *p;
+
+               p = va_arg(ap, char *);
+               if (!p)
+                       break;
+
+               size += strlen(p)+1;
+       } while(1);
+
+       va_end(ap);
+       size++;
+
+       dst = malloc(size);
+       if (!dst)
+               return NULL;
+
+       strcpy(dst, s);
+       va_start(ap, s);
+
+       do {
+               char *p;
+               int l, l2;
+               p = va_arg(ap, char *);
+               if (!p)
+                       break;
+               if (*p == '/')
+                       p++;
+
+               l2 = strlen(p);
+               if (!l2)
+                       continue;
+               if (p[l2-1] == '/')
+                       p[l2-1] = 0;
+
+               l = strlen(dst);
+               if (dst[l-1] != '/')
+                       strcat(dst, "/");
+               strcat(dst, p);
+
+       } while(1);
+       va_end(ap);
+
+       return dst;
+
+}
\ No newline at end of file
diff --git a/utils.h b/utils.h
index 6f4b10c..d6c52a6 100644
--- a/utils.h
+++ b/utils.h
@@ -94,5 +94,6 @@ int ask_user(char *question);
 int lookup_ino_rootid(int fd, u64 *rootid);
 int btrfs_scan_lblkid(int update_kernel);
 int get_btrfs_mount(const char *dev, char *mp, size_t mp_size);
+char *pathjoin(char *, ...);
 
 #endif
-- 
1.8.4.3

--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to