diff --git a/libc/bionic/libgen.cpp b/libc/bionic/libgen.cpp index d8df494dc..b98f504b0 100644 --- a/libc/bionic/libgen.cpp +++ b/libc/bionic/libgen.cpp @@ -36,22 +36,7 @@ #include "private/ThreadLocalBuffer.h" -GLOBAL_INIT_THREAD_LOCAL_BUFFER(basename); -GLOBAL_INIT_THREAD_LOCAL_BUFFER(dirname); - -char* basename(const char* path) { - LOCAL_INIT_THREAD_LOCAL_BUFFER(char*, basename, MAXPATHLEN); - int rc = basename_r(path, basename_tls_buffer, basename_tls_buffer_size); - return (rc < 0) ? NULL : basename_tls_buffer; -} - -char* dirname(const char* path) { - LOCAL_INIT_THREAD_LOCAL_BUFFER(char*, dirname, MAXPATHLEN); - int rc = dirname_r(path, dirname_tls_buffer, dirname_tls_buffer_size); - return (rc < 0) ? NULL : dirname_tls_buffer; -} - -int basename_r(const char* path, char* buffer, size_t buffer_size) { +__LIBC64_HIDDEN__ int basename_r(const char* path, char* buffer, size_t buffer_size) { const char* startp = NULL; const char* endp = NULL; int len; @@ -103,7 +88,7 @@ int basename_r(const char* path, char* buffer, size_t buffer_size) { return result; } -int dirname_r(const char* path, char* buffer, size_t buffer_size) { +__LIBC64_HIDDEN__ int dirname_r(const char* path, char* buffer, size_t buffer_size) { const char* endp = NULL; int len; int result; @@ -161,3 +146,18 @@ int dirname_r(const char* path, char* buffer, size_t buffer_size) { } return result; } + +GLOBAL_INIT_THREAD_LOCAL_BUFFER(basename); +GLOBAL_INIT_THREAD_LOCAL_BUFFER(dirname); + +char* basename(const char* path) { + LOCAL_INIT_THREAD_LOCAL_BUFFER(char*, basename, MAXPATHLEN); + int rc = basename_r(path, basename_tls_buffer, basename_tls_buffer_size); + return (rc < 0) ? NULL : basename_tls_buffer; +} + +char* dirname(const char* path) { + LOCAL_INIT_THREAD_LOCAL_BUFFER(char*, dirname, MAXPATHLEN); + int rc = dirname_r(path, dirname_tls_buffer, dirname_tls_buffer_size); + return (rc < 0) ? NULL : dirname_tls_buffer; +} diff --git a/libc/include/libgen.h b/libc/include/libgen.h index c5fc76a79..9dcec75cc 100644 --- a/libc/include/libgen.h +++ b/libc/include/libgen.h @@ -33,24 +33,15 @@ __BEGIN_DECLS -/* our version of dirname/basename don't modify the input path */ -extern char* dirname (const char* path); -extern char* basename(const char* path); +/* On Android these don't modify their input, and use thread-local storage for their results. */ +extern char* basename(const char*); +extern char* dirname(const char*); -/* special thread-safe Bionic versions - * - * if 'buffer' is NULL, 'bufflen' is ignored and the length of the result is returned - * otherwise, place result in 'buffer' - * - * at most bufflen-1 characters written, plus a terminating zero - * - * return length of result, or -1 in case of error, with errno set to: - * - * ERANGE: buffer is too short - * ENAMETOOLONG: the result is too long for a valid path - */ -extern int dirname_r(const char* path, char* buffer, size_t bufflen); -extern int basename_r(const char* path, char* buffer, size_t bufflen); +#if !defined(__LP64__) +/* These non-standard functions are not needed on Android; basename and dirname use thread-local storage. */ +extern int dirname_r(const char*, char*, size_t); +extern int basename_r(const char*, char*, size_t); +#endif __END_DECLS diff --git a/tests/libgen_test.cpp b/tests/libgen_test.cpp index cae646f25..3958f81ed 100644 --- a/tests/libgen_test.cpp +++ b/tests/libgen_test.cpp @@ -64,7 +64,7 @@ TEST(libgen, dirname) { TestDirname("/", "/"); } -#if defined(__BIONIC__) +#if defined(__BIONIC__) && !defined(__LP64__) static void TestBasename(const char* in, const char* expected_out, int expected_rc, char* buf, size_t buf_size, int expected_errno) { errno = 0; @@ -89,7 +89,7 @@ static void TestDirname(const char* in, const char* expected_out, int expected_r #endif // __BIONIC__ TEST(libgen, basename_r) { -#if defined(__BIONIC__) +#if defined(__BIONIC__) && !defined(__LP64__) char buf[256]; TestBasename("", ".", 1, NULL, 0, 0); TestBasename("", ".", -1, buf, 0, ERANGE); @@ -108,7 +108,7 @@ TEST(libgen, basename_r) { } TEST(libgen, dirname_r) { -#if defined(__BIONIC__) +#if defined(__BIONIC__) && !defined(__LP64__) char buf[256]; TestDirname("", ".", 1, NULL, 0, 0); TestDirname("", ".", -1, buf, 0, ERANGE);