#include <pakfire/package.h>
#include <pakfire/packager.h>
#include <pakfire/parser.h>
+#include <pakfire/path.h>
#include <pakfire/private.h>
#include <pakfire/problem.h>
#include <pakfire/repo.h>
#include <pakfire/cgroup.h>
#include <pakfire/logging.h>
#include <pakfire/pakfire.h>
+#include <pakfire/path.h>
#include <pakfire/string.h>
#include <pakfire/util.h>
#include <pakfire/file.h>
#include <pakfire/filelist.h>
#include <pakfire/logging.h>
+#include <pakfire/path.h>
#include <pakfire/progress.h>
#include <pakfire/string.h>
#include <pakfire/util.h>
__pakfire_path_normalize(path, sizeof(path))
int __pakfire_path_normalize(char* p, const size_t length);
+#define pakfire_path_join(path, s1, s2) \
+ __pakfire_path_join(path, sizeof(path), s1, s2)
+int __pakfire_path_join(char* buffer, const size_t length, const char* s1, const char* s2);
+
#endif /* PAKFIRE_PATH_H */
#define pakfire_unhexlify(dst, src) __pakfire_unhexlify(dst, sizeof(dst), src)
int __pakfire_unhexlify(unsigned char* dst, const size_t l, const char* src);
-#define pakfire_path_join(dest, first, second) \
- __pakfire_path_join(dest, sizeof(dest), first, second)
-int __pakfire_path_join(char* dest, const size_t length,
- const char* first, const char* second);
int pakfire_path_is_absolute(const char* path);
const char* pakfire_path_relpath(const char* root, const char* path);
#include <pakfire/logging.h>
#include <pakfire/mount.h>
#include <pakfire/pakfire.h>
+#include <pakfire/path.h>
#include <pakfire/private.h>
#include <pakfire/pwd.h>
#include <pakfire/string.h>
#include <pakfire/arch.h>
#include <pakfire/logging.h>
#include <pakfire/pakfire.h>
+#include <pakfire/path.h>
#include <pakfire/mount.h>
#include <pakfire/string.h>
#include <pakfire/util.h>
#include <pakfire/packagelist.h>
#include <pakfire/pakfire.h>
#include <pakfire/parser.h>
+#include <pakfire/path.h>
#include <pakfire/private.h>
#include <pakfire/pwd.h>
#include <pakfire/repo.h>
return r;
}
+
+int __pakfire_path_join(char* buffer, const size_t length, const char* s1, const char* s2) {
+ struct pakfire_path* path = NULL;
+ int r;
+
+ // Check inputs
+ if (!buffer || !length || !s1 || !s2)
+ return -EINVAL;
+
+ // Parse the path
+ r = pakfire_path_parse(&path, s1);
+ if (r)
+ goto ERROR;
+
+ // Skip any leading slashes
+ while (*s2 == '/')
+ s2++;
+
+ // Add the second part
+ r = pakfire_path_import_segments(path, s2);
+ if (r)
+ goto ERROR;
+
+ // Normalize the path
+ r = pakfire_path_do_normalize(path);
+ if (r)
+ goto ERROR;
+
+ // Write back the path
+ r = pakfire_path_to_string(path, buffer, length);
+ if (r)
+ goto ERROR;
+
+ERROR:
+ if (path)
+ pakfire_path_free(path);
+
+ return r;
+}
#include <pakfire/logging.h>
#include <pakfire/package.h>
#include <pakfire/pakfire.h>
+#include <pakfire/path.h>
#include <pakfire/private.h>
#include <pakfire/progress.h>
#include <pakfire/repo.h>
return s;
}
-int __pakfire_path_join(char* dest, const size_t length,
- const char* first, const char* second) {
- if (!first)
- return __pakfire_string_format(dest, length, "%s", second);
-
- if (!second)
- return __pakfire_string_format(dest, length, "%s", first);
-
- // Remove leading slashes from second argument
- while (*second == '/')
- second++;
-
- return __pakfire_string_format(dest, length, "%s/%s", first, second);
-}
-
int pakfire_path_is_absolute(const char* path) {
if (!path) {
errno = EINVAL;
return EXIT_FAILURE;
}
+static int test_path_join(const struct test* t) {
+ char path[PATH_MAX];
+
+ ASSERT_SUCCESS(pakfire_path_join(path, "/usr/bin", "bash"));
+ ASSERT_STRING_EQUALS(path, "/usr/bin/bash");
+
+ ASSERT_SUCCESS(pakfire_path_join(path, "/usr/bin", "/bash"));
+ ASSERT_STRING_EQUALS(path, "/usr/bin/bash");
+
+ ASSERT_SUCCESS(pakfire_path_join(path, "/usr/bin/sh", "../bash"));
+ ASSERT_STRING_EQUALS(path, "/usr/bin/bash");
+
+ return EXIT_SUCCESS;
+
+FAIL:
+ return EXIT_FAILURE;
+}
+
int main(int argc, const char* argv[]) {
testsuite_add_test(test_path_normalize);
+ testsuite_add_test(test_path_join);
return testsuite_run(argc, argv);
}