From a23fedf2fbd11bfea817b7a8c374089bef2e9585 Mon Sep 17 00:00:00 2001 From: Danny McClanahan <1305167+cosmicexplorer@users.noreply.github.com> Date: Thu, 3 Jul 2025 00:07:27 -0400 Subject: [PATCH 1/4] add musl and glibc wrappers for getdents{,64} --- src/unix/linux_like/linux/gnu/mod.rs | 7 +++++++ src/unix/linux_like/linux/musl/lfs64.rs | 5 +++++ src/unix/linux_like/linux/musl/mod.rs | 15 +++++++++++++++ 3 files changed, 27 insertions(+) diff --git a/src/unix/linux_like/linux/gnu/mod.rs b/src/unix/linux_like/linux/gnu/mod.rs index 06c6fe6714d35..371a61283730d 100644 --- a/src/unix/linux_like/linux/gnu/mod.rs +++ b/src/unix/linux_like/linux/gnu/mod.rs @@ -1344,6 +1344,13 @@ extern "C" { pub fn mempcpy(dest: *mut c_void, src: *const c_void, n: size_t) -> *mut c_void; } +extern "C" { + // There is no glibc wrapper for the getdents system call, and getdents64() is only available + // from 2.30 onwards. + /// `buffer` points to a buffer of [`crate::dirent64`] structs. + pub fn getdents64(fd: c_int, buffer: *mut c_void, nbytes: usize) -> isize; +} + cfg_if! { if #[cfg(any( target_arch = "x86", diff --git a/src/unix/linux_like/linux/musl/lfs64.rs b/src/unix/linux_like/linux/musl/lfs64.rs index e6506fd3d385d..a55259288d420 100644 --- a/src/unix/linux_like/linux/musl/lfs64.rs +++ b/src/unix/linux_like/linux/musl/lfs64.rs @@ -198,6 +198,11 @@ pub unsafe extern "C" fn readdir64_r( crate::readdir_r(dirp, entry as *mut _, result as *mut _) } +#[inline] +pub unsafe extern "C" fn getdents64(fd: c_int, buf: *mut crate::dirent64, len: usize) -> c_int { + crate::getdents(fd, buf as *mut _, len) +} + #[inline] pub unsafe extern "C" fn sendfile64( out_fd: c_int, diff --git a/src/unix/linux_like/linux/musl/mod.rs b/src/unix/linux_like/linux/musl/mod.rs index a62926576bfc6..3b305010853c5 100644 --- a/src/unix/linux_like/linux/musl/mod.rs +++ b/src/unix/linux_like/linux/musl/mod.rs @@ -37,6 +37,15 @@ cfg_if! { } } +#[repr(C)] +pub struct posix_dent { + pub d_ino: ino_t, + pub d_off: off_t, + pub d_reclen: c_ushort, + pub d_type: c_uchar, + pub d_name: *mut c_char, +} + impl siginfo_t { pub unsafe fn si_addr(&self) -> *mut c_void { #[repr(C)] @@ -974,6 +983,12 @@ extern "C" { pub fn utmpxname(file: *const c_char) -> c_int; } +extern "C" { + pub fn posix_getdents(fd: c_int, buf: *mut c_void, len: usize, flags: c_int) -> isize; + + pub fn getdents(fd: c_int, buf: *mut crate::dirent, len: usize) -> c_int; +} + // Alias to 64 to mimic glibc's LFS64 support mod lfs64; pub use self::lfs64::*; From 5d4300a4727e8da32f8cd12efc86d0cefa00865c Mon Sep 17 00:00:00 2001 From: Danny McClanahan <1305167+cosmicexplorer@users.noreply.github.com> Date: Thu, 3 Jul 2025 00:50:11 -0400 Subject: [PATCH 2/4] add debug impl to posix_dent --- src/unix/linux_like/linux/musl/mod.rs | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/unix/linux_like/linux/musl/mod.rs b/src/unix/linux_like/linux/musl/mod.rs index 3b305010853c5..bed1b1d808f6a 100644 --- a/src/unix/linux_like/linux/musl/mod.rs +++ b/src/unix/linux_like/linux/musl/mod.rs @@ -37,13 +37,15 @@ cfg_if! { } } -#[repr(C)] -pub struct posix_dent { - pub d_ino: ino_t, - pub d_off: off_t, - pub d_reclen: c_ushort, - pub d_type: c_uchar, - pub d_name: *mut c_char, +s_no_extra_traits! { + #[repr(C)] + pub struct posix_dent { + pub d_ino: ino_t, + pub d_off: off_t, + pub d_reclen: c_ushort, + pub d_type: c_uchar, + pub d_name: *mut c_char, + } } impl siginfo_t { From f16f1da165cf520a952a0c8d22473db437b927ba Mon Sep 17 00:00:00 2001 From: Danny McClanahan <1305167+cosmicexplorer@users.noreply.github.com> Date: Thu, 3 Jul 2025 00:58:00 -0400 Subject: [PATCH 3/4] update semver tests --- libc-test/semver/linux-gnu.txt | 1 + libc-test/semver/linux-musl.txt | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/libc-test/semver/linux-gnu.txt b/libc-test/semver/linux-gnu.txt index c88da4fe9bf6e..798be32457142 100644 --- a/libc-test/semver/linux-gnu.txt +++ b/libc-test/semver/linux-gnu.txt @@ -604,6 +604,7 @@ fgetpwent_r fgetspent_r futimes getauxval +getdents64 getentropy getgrent_r getloadavg diff --git a/libc-test/semver/linux-musl.txt b/libc-test/semver/linux-musl.txt index 8497fe9cf529a..22148f616205a 100644 --- a/libc-test/semver/linux-musl.txt +++ b/libc-test/semver/linux-musl.txt @@ -66,6 +66,8 @@ euidaccess explicit_bzero futimes getauxval +getdents +getdents64 getloadavg getutxent getutxid @@ -73,6 +75,8 @@ getutxline lio_listio ntptimeval open_wmemstream +posix_dent +posix_getdents posix_spawn_file_actions_addchdir_np posix_spawn_file_actions_addfchdir_np preadv2 From 5559783828203177d9091ef756c47a2f2b73df13 Mon Sep 17 00:00:00 2001 From: Danny McClanahan <1305167+cosmicexplorer@users.noreply.github.com> Date: Thu, 3 Jul 2025 06:39:25 -0400 Subject: [PATCH 4/4] remove posix_getdents() from musl the musl bundled with rust appears to be from january 2024 --- libc-test/semver/linux-musl.txt | 2 -- src/unix/linux_like/linux/musl/mod.rs | 13 ------------- 2 files changed, 15 deletions(-) diff --git a/libc-test/semver/linux-musl.txt b/libc-test/semver/linux-musl.txt index 22148f616205a..db2a678f30464 100644 --- a/libc-test/semver/linux-musl.txt +++ b/libc-test/semver/linux-musl.txt @@ -75,8 +75,6 @@ getutxline lio_listio ntptimeval open_wmemstream -posix_dent -posix_getdents posix_spawn_file_actions_addchdir_np posix_spawn_file_actions_addfchdir_np preadv2 diff --git a/src/unix/linux_like/linux/musl/mod.rs b/src/unix/linux_like/linux/musl/mod.rs index bed1b1d808f6a..1db8918f59446 100644 --- a/src/unix/linux_like/linux/musl/mod.rs +++ b/src/unix/linux_like/linux/musl/mod.rs @@ -37,17 +37,6 @@ cfg_if! { } } -s_no_extra_traits! { - #[repr(C)] - pub struct posix_dent { - pub d_ino: ino_t, - pub d_off: off_t, - pub d_reclen: c_ushort, - pub d_type: c_uchar, - pub d_name: *mut c_char, - } -} - impl siginfo_t { pub unsafe fn si_addr(&self) -> *mut c_void { #[repr(C)] @@ -986,8 +975,6 @@ extern "C" { } extern "C" { - pub fn posix_getdents(fd: c_int, buf: *mut c_void, len: usize, flags: c_int) -> isize; - pub fn getdents(fd: c_int, buf: *mut crate::dirent, len: usize) -> c_int; }