From: Michael Tremer Date: Tue, 17 Oct 2023 09:05:17 +0000 (+0000) Subject: path: Move pakfire_basename into the path library X-Git-Tag: 0.9.30~1473 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6749768670db813944a441498eb0bfd1200314fa;p=pakfire.git path: Move pakfire_basename into the path library Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/downloader.c b/src/libpakfire/downloader.c index 2fb6de8f9..be14917db 100644 --- a/src/libpakfire/downloader.c +++ b/src/libpakfire/downloader.c @@ -35,6 +35,7 @@ #include #include #include +#include #include #include #include @@ -427,7 +428,7 @@ const char* pakfire_downloader_transfer_get_title(struct pakfire_transfer* trans // Default to the filename if no title is set if (!*transfer->title) { - r = pakfire_basename(path, transfer->url); + r = pakfire_path_basename(path, transfer->url); if (r) return NULL; diff --git a/src/libpakfire/include/pakfire/path.h b/src/libpakfire/include/pakfire/path.h index 3de754313..b619bf073 100644 --- a/src/libpakfire/include/pakfire/path.h +++ b/src/libpakfire/include/pakfire/path.h @@ -35,6 +35,10 @@ int __pakfire_path_append(char* buffer, const size_t length, const char* s1, con __pakfire_path_merge(path, sizeof(path), s1, s2) int __pakfire_path_merge(char* buffer, const size_t length, const char* s1, const char* s2); +#define pakfire_path_basename(path, s) \ + __pakfire_path_basename(path, sizeof(path), s) +int __pakfire_path_basename(char* buffer, const size_t length, const char* s); + #define pakfire_path_dirname(path, s) \ __pakfire_path_dirname(path, sizeof(path), s) int __pakfire_path_dirname(char* buffer, const size_t length, const char* s); diff --git a/src/libpakfire/include/pakfire/util.h b/src/libpakfire/include/pakfire/util.h index f247367ff..a7a2a849e 100644 --- a/src/libpakfire/include/pakfire/util.h +++ b/src/libpakfire/include/pakfire/util.h @@ -47,10 +47,6 @@ int pakfire_path_strip_extension(char* path); __pakfire_path_replace_extension(path, sizeof(path), extension) int __pakfire_path_replace_extension(char* path, const size_t length, const char* extension); -#define pakfire_basename(basename, path) \ - __pakfire_basename(basename, sizeof(basename), path) -int __pakfire_basename(char* basename, const size_t length, const char* path); - char* pakfire_remove_trailing_newline(char* str); int pakfire_read_file_into_buffer(FILE* f, char** buffer, size_t* len); diff --git a/src/libpakfire/linter.c b/src/libpakfire/linter.c index 2c0df5ac3..9cbcc7f96 100644 --- a/src/libpakfire/linter.c +++ b/src/libpakfire/linter.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include @@ -41,7 +42,7 @@ static int pakfire_lint_makefile_name(struct pakfire* pakfire, } // Determine the basename of the file - r = pakfire_basename(basename, path); + r = pakfire_path_basename(basename, path); if (r) return r; diff --git a/src/libpakfire/package.c b/src/libpakfire/package.c index 9bf75b796..0c12e253e 100644 --- a/src/libpakfire/package.c +++ b/src/libpakfire/package.c @@ -924,7 +924,7 @@ PAKFIRE_EXPORT int pakfire_package_set_string( case PAKFIRE_PKG_PATH: if (value) { - r = pakfire_basename(basename, value); + r = pakfire_path_basename(basename, value); if (r) return r; @@ -1936,7 +1936,7 @@ int pakfire_package_append_file(struct pakfire_package* pkg, const char* path) { Repodata* repodata = pakfire_repo_get_repodata(repo); // Get filename part - r = pakfire_basename(basename, path); + r = pakfire_path_basename(basename, path); if (r) return r; diff --git a/src/libpakfire/path.c b/src/libpakfire/path.c index e48d3ade1..ee2fdee6e 100644 --- a/src/libpakfire/path.c +++ b/src/libpakfire/path.c @@ -347,6 +347,41 @@ ERROR: return r; } +int __pakfire_path_basename(char* buffer, const size_t length, const char* s) { + struct pakfire_path* path = NULL; + int r; + + // Check inputs + if (!buffer || !length) + return -EINVAL; + + // Parse the path + r = pakfire_path_parse(&path, s); + if (r) + goto ERROR; + + // Drop everything but the last segment + while (path->num_segments > 1) { + r = pakfire_path_remove_segment(path, 0); + if (r) + goto ERROR; + } + + // The result is never absolute + path->is_absolute = 0; + + // 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; +} + int __pakfire_path_dirname(char* buffer, const size_t length, const char* s) { struct pakfire_path* path = NULL; int r; diff --git a/src/libpakfire/util.c b/src/libpakfire/util.c index 9197f992c..b67de4ae4 100644 --- a/src/libpakfire/util.c +++ b/src/libpakfire/util.c @@ -297,23 +297,6 @@ ERROR: return r; } -int __pakfire_basename(char* __basename, const size_t length, const char* path) { - char buffer[PATH_MAX]; - int r; - - // Copy the path into the buffer - r = pakfire_string_set(buffer, path); - if (r) - return r; - - // Run basename() - char* p = basename(buffer); - if (!p) - return -errno; - - return __pakfire_string_set(__basename, length, p); -} - char* pakfire_remove_trailing_newline(char* str) { ssize_t pos = strlen(str) - 1; diff --git a/tests/libpakfire/path.c b/tests/libpakfire/path.c index 7603b0e92..6014fd0cc 100644 --- a/tests/libpakfire/path.c +++ b/tests/libpakfire/path.c @@ -94,6 +94,18 @@ FAIL: return EXIT_FAILURE; } +static int test_path_basename(const struct test* t) { + char path[PATH_MAX]; + + ASSERT_SUCCESS(pakfire_path_basename(path, "/usr/bin/bash")); + ASSERT_STRING_EQUALS(path, "bash"); + + return EXIT_SUCCESS; + +FAIL: + return EXIT_FAILURE; +} + static int test_path_dirname(const struct test* t) { char path[PATH_MAX]; @@ -110,6 +122,7 @@ int main(int argc, const char* argv[]) { testsuite_add_test(test_path_normalize); testsuite_add_test(test_path_append); testsuite_add_test(test_path_merge); + testsuite_add_test(test_path_basename); testsuite_add_test(test_path_dirname); return testsuite_run(argc, argv); diff --git a/tests/libpakfire/util.c b/tests/libpakfire/util.c index 45c950c0d..63fd49640 100644 --- a/tests/libpakfire/util.c +++ b/tests/libpakfire/util.c @@ -22,19 +22,6 @@ #include "../testsuite.h" -static int test_basename(const struct test* t) { - char basename[PATH_MAX]; - const char* dir = "/a/b/c"; - - ASSERT_SUCCESS(pakfire_basename(basename, dir)); - ASSERT_STRING_EQUALS(basename, "c"); - - return EXIT_SUCCESS; - -FAIL: - return EXIT_FAILURE; -} - static int test_mkdir(const struct test* t) { char path[PATH_MAX]; @@ -136,7 +123,6 @@ FAIL: } int main(int argc, const char* argv[]) { - testsuite_add_test(test_basename); testsuite_add_test(test_mkdir); testsuite_add_test(test_path_match); testsuite_add_test(test_base64);