From: Michael Tremer Date: Fri, 6 Oct 2023 13:50:44 +0000 (+0000) Subject: path: Implement joining two paths X-Git-Tag: 0.9.30~1535 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=729827f70cb0a191d35e944fe0d53db0037d9a31;p=pakfire.git path: Implement joining two paths Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/build.c b/src/libpakfire/build.c index a69c60aa8..30df7ac9e 100644 --- a/src/libpakfire/build.c +++ b/src/libpakfire/build.c @@ -40,6 +40,7 @@ #include #include #include +#include #include #include #include diff --git a/src/libpakfire/cgroup.c b/src/libpakfire/cgroup.c index a63a7c211..8b76cbc67 100644 --- a/src/libpakfire/cgroup.c +++ b/src/libpakfire/cgroup.c @@ -31,6 +31,7 @@ #include #include #include +#include #include #include diff --git a/src/libpakfire/compress.c b/src/libpakfire/compress.c index f850f7294..4e8a0928d 100644 --- a/src/libpakfire/compress.c +++ b/src/libpakfire/compress.c @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include diff --git a/src/libpakfire/include/pakfire/path.h b/src/libpakfire/include/pakfire/path.h index 4390becbe..e9b533c75 100644 --- a/src/libpakfire/include/pakfire/path.h +++ b/src/libpakfire/include/pakfire/path.h @@ -27,4 +27,8 @@ __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 */ diff --git a/src/libpakfire/include/pakfire/util.h b/src/libpakfire/include/pakfire/util.h index 95b2383c8..7af64b5f6 100644 --- a/src/libpakfire/include/pakfire/util.h +++ b/src/libpakfire/include/pakfire/util.h @@ -63,10 +63,6 @@ char* __pakfire_hexlify(const unsigned char* digest, const size_t length); #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); diff --git a/src/libpakfire/jail.c b/src/libpakfire/jail.c index 7b861d929..4a7af06e8 100644 --- a/src/libpakfire/jail.c +++ b/src/libpakfire/jail.c @@ -56,6 +56,7 @@ #include #include #include +#include #include #include #include diff --git a/src/libpakfire/mount.c b/src/libpakfire/mount.c index 403d42144..ec9537a60 100644 --- a/src/libpakfire/mount.c +++ b/src/libpakfire/mount.c @@ -32,6 +32,7 @@ #include #include #include +#include #include #include #include diff --git a/src/libpakfire/pakfire.c b/src/libpakfire/pakfire.c index cd2614f86..099ee9279 100644 --- a/src/libpakfire/pakfire.c +++ b/src/libpakfire/pakfire.c @@ -55,6 +55,7 @@ #include #include #include +#include #include #include #include diff --git a/src/libpakfire/path.c b/src/libpakfire/path.c index 2fa08cf28..16ac09b56 100644 --- a/src/libpakfire/path.c +++ b/src/libpakfire/path.c @@ -244,3 +244,42 @@ ERROR: 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; +} diff --git a/src/libpakfire/repo.c b/src/libpakfire/repo.c index bc8833e6e..05465fadc 100644 --- a/src/libpakfire/repo.c +++ b/src/libpakfire/repo.c @@ -42,6 +42,7 @@ #include #include #include +#include #include #include #include diff --git a/src/libpakfire/util.c b/src/libpakfire/util.c index c7b84dd8b..c06bf59ee 100644 --- a/src/libpakfire/util.c +++ b/src/libpakfire/util.c @@ -79,21 +79,6 @@ char* pakfire_unquote_in_place(char* s) { 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; diff --git a/tests/libpakfire/path.c b/tests/libpakfire/path.c index 4c9218d63..b7ba771c7 100644 --- a/tests/libpakfire/path.c +++ b/tests/libpakfire/path.c @@ -58,8 +58,27 @@ FAIL: 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); }