diff --git a/libc-test/semver/linux-gnu.txt b/libc-test/semver/linux-gnu.txt index c88da4fe9bf6..798be3245714 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 8497fe9cf529..db2a678f3046 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 diff --git a/src/unix/linux_like/linux/gnu/mod.rs b/src/unix/linux_like/linux/gnu/mod.rs index 06c6fe6714d3..371a61283730 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 e6506fd3d385..a55259288d42 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 a62926576bfc..1db8918f5944 100644 --- a/src/unix/linux_like/linux/musl/mod.rs +++ b/src/unix/linux_like/linux/musl/mod.rs @@ -974,6 +974,10 @@ extern "C" { pub fn utmpxname(file: *const c_char) -> c_int; } +extern "C" { + 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::*;