diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 935462b022f3b..f44819ed12e26 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -98,6 +98,12 @@ jobs: artifact-tag: offset-bits64 env: RUST_LIBC_UNSTABLE_GNU_FILE_OFFSET_BITS: 64 + - target: i686-unknown-linux-gnu + docker: true + os: ubuntu-24.04 + artifact-tag: time-bits64 + env: + RUST_LIBC_UNSTABLE_GNU_TIME_BITS: 64 - target: x86_64-unknown-linux-gnu docker: true os: ubuntu-24.04 @@ -195,6 +201,10 @@ jobs: env: RUST_LIBC_UNSTABLE_GNU_FILE_OFFSET_BITS: 64 artifact-tag: offset-bits64 + - target: arm-unknown-linux-gnueabihf + env: + RUST_LIBC_UNSTABLE_GNU_TIME_BITS: 64 + artifact-tag: time-bits64 # FIXME(ppc): SIGILL running tests, see # https://github.com/rust-lang/libc/pull/4254#issuecomment-2636288713 # - target: powerpc-unknown-linux-gnu @@ -202,6 +212,10 @@ jobs: # env: # RUST_LIBC_UNSTABLE_GNU_FILE_OFFSET_BITS: 64 # artifact-tag: offset-bits64 + # - target: powerpc-unknown-linux-gnu + # env: + # RUST_LIBC_UNSTABLE_GNU_TIME_BITS: 64 + # artifact-tag: time-bits64 timeout-minutes: 25 env: TARGET: ${{ matrix.target }} diff --git a/build.rs b/build.rs index 5762df5419d76..3c8cb6314e2b6 100644 --- a/build.rs +++ b/build.rs @@ -15,6 +15,8 @@ const ALLOWED_CFGS: &[&str] = &[ "freebsd15", // Corresponds to `_FILE_OFFSET_BITS=64` in glibc "gnu_file_offset_bits64", + // Corresponds to `_TIME_BITS=64` in glibc + "gnu_time_bits64", // FIXME(ctest): this config shouldn't be needed but ctest can't parse `const extern fn` "libc_const_extern_fn", "libc_deny_warnings", @@ -91,23 +93,35 @@ fn main() { set_cfg("linux_time_bits64"); } println!("cargo:rerun-if-env-changed=RUST_LIBC_UNSTABLE_GNU_FILE_OFFSET_BITS"); - match env::var("RUST_LIBC_UNSTABLE_GNU_FILE_OFFSET_BITS") { - Ok(val) if val == "64" => { - if target_env == "gnu" - && target_os == "linux" - && target_ptr_width == "32" - && target_arch != "riscv32" - && target_arch != "x86_64" - { + println!("cargo:rerun-if-env-changed=RUST_LIBC_UNSTABLE_GNU_TIME_BITS"); + if target_env == "gnu" + && target_os == "linux" + && target_ptr_width == "32" + && target_arch != "riscv32" + && target_arch != "x86_64" + { + match env::var("RUST_LIBC_UNSTABLE_GNU_TIME_BITS") { + Ok(val) if val == "64" => { set_cfg("gnu_file_offset_bits64"); + set_cfg("linux_time_bits64"); + set_cfg("gnu_time_bits64"); + } + Ok(val) if val != "32" => { + panic!("RUST_LIBC_UNSTABLE_GNU_TIME_BITS may only be set to '32' or '64'") + } + _ => { + match env::var("RUST_LIBC_UNSTABLE_GNU_FILE_OFFSET_BITS") { + Ok(val) if val == "64" => { + set_cfg("gnu_file_offset_bits64"); + } + Ok(val) if val != "32" => { + panic!("RUST_LIBC_UNSTABLE_GNU_FILE_OFFSET_BITS may only be set to '32' or '64'") + } + _ => {} + } } } - Ok(val) if val != "32" => { - panic!("RUST_LIBC_UNSTABLE_GNU_FILE_OFFSET_BITS may only be set to '32' or '64'") - } - _ => {} } - // On CI: deny all warnings if libc_ci { set_cfg("libc_deny_warnings"); diff --git a/ci/run-docker.sh b/ci/run-docker.sh index 6e18e520ce2d1..9411d39e5f670 100755 --- a/ci/run-docker.sh +++ b/ci/run-docker.sh @@ -44,6 +44,7 @@ run() { --env LIBC_CI \ --env LIBC_CI_ZBUILD_STD \ --env RUST_LIBC_UNSTABLE_GNU_FILE_OFFSET_BITS \ + --env RUST_LIBC_UNSTABLE_GNU_TIME_BITS \ --env CARGO_HOME=/cargo \ --env CARGO_TARGET_DIR=/checkout/target \ --volume "$CARGO_HOME":/cargo \ diff --git a/ci/verify-build.sh b/ci/verify-build.sh index 79299f18a08b2..187f32e8bc45d 100755 --- a/ci/verify-build.sh +++ b/ci/verify-build.sh @@ -77,7 +77,9 @@ test_target() { case "$target" in # Test with the equivalent of __FILE_OFFSET_BITS=64 arm*-gnu*|i*86*-gnu|powerpc-*-gnu*|mips*-gnu|sparc-*-gnu|thumb-*gnu*) - RUST_LIBC_UNSTABLE_GNU_FILE_OFFSET_BITS=64 $cmd;; + RUST_LIBC_UNSTABLE_GNU_FILE_OFFSET_BITS=64 $cmd + RUST_LIBC_UNSTABLE_GNU_TIME_BITS=64 $cmd + ;; esac fi diff --git a/libc-test/build.rs b/libc-test/build.rs index edb1556c2d6d6..deff7554ce601 100644 --- a/libc-test/build.rs +++ b/libc-test/build.rs @@ -3604,22 +3604,37 @@ fn test_vxworks(target: &str) { } fn config_gnu_bits(target: &str, cfg: &mut ctest::TestGenerator) { - match env::var("RUST_LIBC_UNSTABLE_GNU_FILE_OFFSET_BITS") { - Ok(val) if val == "64" => { - if target.contains("gnu") - && target.contains("linux") - && !target.ends_with("x32") - && !target.contains("riscv32") - && env::var("CARGO_CFG_TARGET_POINTER_WIDTH").unwrap() == "32" - { + let pointer_width = env::var("CARGO_CFG_TARGET_POINTER_WIDTH").unwrap_or_default(); + if target.contains("gnu") + && target.contains("linux") + && !target.ends_with("x32") + && !target.contains("riscv32") + && pointer_width == "32" + { + match env::var("RUST_LIBC_UNSTABLE_GNU_TIME_BITS") { + Ok(val) if val == "64" => { cfg.define("_FILE_OFFSET_BITS", Some("64")); + cfg.define("_TIME_BITS", Some("64")); cfg.cfg("gnu_file_offset_bits64", None); + cfg.cfg("linux_time_bits64", None); + cfg.cfg("gnu_time_bits64", None); + } + Ok(val) if val != "32" => { + panic!("RUST_LIBC_UNSTABLE_GNU_TIME_BITS may only be set to '32' or '64'") + } + _ => { + match env::var("RUST_LIBC_UNSTABLE_GNU_FILE_OFFSET_BITS") { + Ok(val) if val == "64" => { + cfg.define("_FILE_OFFSET_BITS", Some("64")); + cfg.cfg("gnu_file_offset_bits64", None); + } + Ok(val) if val != "32" => { + panic!("RUST_LIBC_UNSTABLE_GNU_FILE_OFFSET_BITS may only be set to '32' or '64'") + } + _ => {} + } } } - Ok(val) if val != "32" => { - panic!("RUST_LIBC_UNSTABLE_GNU_FILE_OFFSET_BITS may only be set to '32' or '64'") - } - _ => {} } } diff --git a/src/unix/linux_like/linux/gnu/b32/arm/mod.rs b/src/unix/linux_like/linux/gnu/b32/arm/mod.rs index 2dd4a88674f3e..5fb72e0b7206d 100644 --- a/src/unix/linux_like/linux/gnu/b32/arm/mod.rs +++ b/src/unix/linux_like/linux/gnu/b32/arm/mod.rs @@ -60,23 +60,35 @@ s! { pub struct stat64 { pub st_dev: crate::dev_t, + #[cfg(not(gnu_time_bits64))] __pad1: c_uint, + #[cfg(not(gnu_time_bits64))] __st_ino: c_ulong, + #[cfg(gnu_time_bits64)] + pub st_ino: crate::ino_t, pub st_mode: crate::mode_t, pub st_nlink: crate::nlink_t, pub st_uid: crate::uid_t, pub st_gid: crate::gid_t, pub st_rdev: crate::dev_t, + #[cfg(not(gnu_time_bits64))] __pad2: c_uint, pub st_size: off64_t, pub st_blksize: crate::blksize_t, pub st_blocks: crate::blkcnt64_t, pub st_atime: crate::time_t, pub st_atime_nsec: c_long, + #[cfg(gnu_time_bits64)] + _atime_pad: c_int, pub st_mtime: crate::time_t, pub st_mtime_nsec: c_long, + #[cfg(gnu_time_bits64)] + _mtime_pad: c_int, pub st_ctime: crate::time_t, pub st_ctime_nsec: c_long, + #[cfg(gnu_time_bits64)] + _ctime_pad: c_int, + #[cfg(not(gnu_time_bits64))] pub st_ino: crate::ino64_t, } @@ -115,10 +127,13 @@ s! { pub shm_perm: crate::ipc_perm, pub shm_segsz: size_t, pub shm_atime: crate::time_t, + #[cfg(not(gnu_time_bits64))] __unused1: c_ulong, pub shm_dtime: crate::time_t, + #[cfg(not(gnu_time_bits64))] __unused2: c_ulong, pub shm_ctime: crate::time_t, + #[cfg(not(gnu_time_bits64))] __unused3: c_ulong, pub shm_cpid: crate::pid_t, pub shm_lpid: crate::pid_t, @@ -130,10 +145,13 @@ s! { pub struct msqid_ds { pub msg_perm: crate::ipc_perm, pub msg_stime: crate::time_t, + #[cfg(not(gnu_time_bits64))] __glibc_reserved1: c_ulong, pub msg_rtime: crate::time_t, + #[cfg(not(gnu_time_bits64))] __glibc_reserved2: c_ulong, pub msg_ctime: crate::time_t, + #[cfg(not(gnu_time_bits64))] __glibc_reserved3: c_ulong, pub __msg_cbytes: c_ulong, pub msg_qnum: crate::msgqnum_t, diff --git a/src/unix/linux_like/linux/gnu/b32/mips/mod.rs b/src/unix/linux_like/linux/gnu/b32/mips/mod.rs index 649a8e04bd470..6581d729e9923 100644 --- a/src/unix/linux_like/linux/gnu/b32/mips/mod.rs +++ b/src/unix/linux_like/linux/gnu/b32/mips/mod.rs @@ -5,8 +5,12 @@ pub type wchar_t = i32; s! { pub struct stat { + #[cfg(not(gnu_time_bits64))] pub st_dev: c_ulong, + #[cfg(gnu_time_bits64)] + pub st_dev: crate::dev_t, + #[cfg(not(gnu_time_bits64))] st_pad1: [c_long; 3], pub st_ino: crate::ino_t, @@ -16,11 +20,14 @@ s! { pub st_uid: crate::uid_t, pub st_gid: crate::gid_t, + #[cfg(not(gnu_time_bits64))] pub st_rdev: c_ulong, + #[cfg(gnu_time_bits64)] + pub st_rdev: crate::dev_t, #[cfg(not(gnu_file_offset_bits64))] st_pad2: [c_long; 2], - #[cfg(gnu_file_offset_bits64)] + #[cfg(all(not(gnu_time_bits64), gnu_file_offset_bits64))] st_pad2: [c_long; 3], pub st_size: off_t, @@ -28,40 +35,84 @@ s! { #[cfg(not(gnu_file_offset_bits64))] st_pad3: c_long, + #[cfg(gnu_time_bits64)] + pub st_blksize: crate::blksize_t, + #[cfg(gnu_time_bits64)] + pub st_blocks: crate::blkcnt_t, + pub st_atime: crate::time_t, + #[cfg(gnu_time_bits64)] + _atime_pad: c_int, pub st_atime_nsec: c_long, pub st_mtime: crate::time_t, + #[cfg(gnu_time_bits64)] + _mtime_pad: c_int, pub st_mtime_nsec: c_long, pub st_ctime: crate::time_t, + #[cfg(gnu_time_bits64)] + _ctime_pad: c_int, pub st_ctime_nsec: c_long, + #[cfg(not(gnu_time_bits64))] pub st_blksize: crate::blksize_t, - #[cfg(gnu_file_offset_bits64)] + #[cfg(all(not(gnu_time_bits64), gnu_file_offset_bits64))] st_pad4: c_long, + #[cfg(not(gnu_time_bits64))] pub st_blocks: crate::blkcnt_t, + #[cfg(not(gnu_time_bits64))] st_pad5: [c_long; 14], } pub struct stat64 { + #[cfg(not(gnu_time_bits64))] pub st_dev: c_ulong, + #[cfg(gnu_time_bits64)] + pub st_dev: crate::dev_t, + + #[cfg(not(gnu_time_bits64))] st_pad1: [c_long; 3], + pub st_ino: crate::ino64_t, pub st_mode: crate::mode_t, pub st_nlink: crate::nlink_t, pub st_uid: crate::uid_t, pub st_gid: crate::gid_t, + + #[cfg(not(gnu_time_bits64))] pub st_rdev: c_ulong, + #[cfg(gnu_time_bits64)] + pub st_rdev: crate::dev_t, + + #[cfg(not(gnu_time_bits64))] st_pad2: [c_long; 3], + pub st_size: off64_t, + + #[cfg(gnu_time_bits64)] + pub st_blksize: crate::blksize_t, + #[cfg(gnu_time_bits64)] + pub st_blocks: crate::blkcnt_t, + pub st_atime: crate::time_t, + #[cfg(gnu_time_bits64)] + _atime_pad: c_int, pub st_atime_nsec: c_long, pub st_mtime: crate::time_t, + #[cfg(gnu_time_bits64)] + _mtime_pad: c_int, pub st_mtime_nsec: c_long, pub st_ctime: crate::time_t, + #[cfg(gnu_time_bits64)] + _ctime_pad: c_int, pub st_ctime_nsec: c_long, + + #[cfg(not(gnu_time_bits64))] pub st_blksize: crate::blksize_t, + #[cfg(not(gnu_time_bits64))] st_pad3: c_long, + #[cfg(not(gnu_time_bits64))] pub st_blocks: crate::blkcnt64_t, + #[cfg(not(gnu_time_bits64))] st_pad5: [c_long; 14], } @@ -161,22 +212,22 @@ s! { pub struct msqid_ds { pub msg_perm: crate::ipc_perm, - #[cfg(target_endian = "big")] + #[cfg(all(not(gnu_time_bits64), target_endian = "big"))] __glibc_reserved1: c_ulong, pub msg_stime: crate::time_t, - #[cfg(target_endian = "little")] + #[cfg(all(not(gnu_time_bits64), target_endian = "little"))] __glibc_reserved1: c_ulong, - #[cfg(target_endian = "big")] + #[cfg(all(not(gnu_time_bits64), target_endian = "big"))] __glibc_reserved2: c_ulong, pub msg_rtime: crate::time_t, - #[cfg(target_endian = "little")] + #[cfg(all(not(gnu_time_bits64), target_endian = "little"))] __glibc_reserved2: c_ulong, - #[cfg(target_endian = "big")] + #[cfg(all(not(gnu_time_bits64), target_endian = "big"))] __glibc_reserved3: c_ulong, pub msg_ctime: crate::time_t, #[cfg(target_endian = "little")] __glibc_reserved3: c_ulong, - pub __msg_cbytes: c_ulong, + __msg_cbytes: c_ulong, pub msg_qnum: crate::msgqnum_t, pub msg_qbytes: crate::msglen_t, pub msg_lspid: crate::pid_t, diff --git a/src/unix/linux_like/linux/gnu/b32/mod.rs b/src/unix/linux_like/linux/gnu/b32/mod.rs index e9a958478c543..d34fb23c45db6 100644 --- a/src/unix/linux_like/linux/gnu/b32/mod.rs +++ b/src/unix/linux_like/linux/gnu/b32/mod.rs @@ -29,6 +29,18 @@ cfg_if! { pub type fsfilcnt_t = u64; pub type rlim_t = u64; pub type blksize_t = i64; + } else if #[cfg(gnu_time_bits64)] { + pub type time_t = i64; + pub type suseconds_t = i32; + type __ino_t = c_ulong; + type __ino64_t = u64; + pub type ino_t = __ino64_t; + pub type off_t = i64; + pub type blkcnt_t = i64; + pub type fsblkcnt_t = u64; + pub type fsfilcnt_t = u64; + pub type rlim_t = u64; + pub type blksize_t = i32; } else if #[cfg(gnu_file_offset_bits64)] { pub type time_t = i32; pub type suseconds_t = i32; @@ -67,11 +79,12 @@ cfg_if! { pub struct stat { pub st_dev: crate::dev_t, + #[cfg(not(gnu_time_bits64))] __pad1: c_uint, - #[cfg(not(gnu_file_offset_bits64))] + #[cfg(any(gnu_time_bits64, not(gnu_file_offset_bits64)))] pub st_ino: crate::ino_t, - #[cfg(all(gnu_file_offset_bits64))] + #[cfg(all(not(gnu_time_bits64), gnu_file_offset_bits64))] __st_ino: __ino_t, pub st_mode: crate::mode_t, @@ -81,6 +94,7 @@ cfg_if! { pub st_rdev: crate::dev_t, + #[cfg(not(gnu_time_bits64))] __pad2: c_uint, pub st_size: off_t, @@ -90,16 +104,22 @@ cfg_if! { pub st_atime: crate::time_t, pub st_atime_nsec: c_long, + #[cfg(gnu_time_bits64)] + _atime_pad: c_int, pub st_mtime: crate::time_t, pub st_mtime_nsec: c_long, + #[cfg(gnu_time_bits64)] + _mtime_pad: c_int, pub st_ctime: crate::time_t, pub st_ctime_nsec: c_long, + #[cfg(gnu_time_bits64)] + _ctime_pad: c_int, #[cfg(not(gnu_file_offset_bits64))] __glibc_reserved4: c_long, #[cfg(not(gnu_file_offset_bits64))] __glibc_reserved5: c_long, - #[cfg(gnu_file_offset_bits64)] + #[cfg(all(not(gnu_time_bits64), gnu_file_offset_bits64))] pub st_ino: crate::ino_t, } } @@ -154,28 +174,126 @@ s! { pub struct semid_ds { pub sem_perm: ipc_perm, - #[cfg(target_arch = "powerpc")] + #[cfg(all(not(gnu_time_bits64), target_arch = "powerpc"))] __reserved: crate::__syscall_ulong_t, pub sem_otime: crate::time_t, #[cfg(not(any( + gnu_time_bits64, target_arch = "mips", target_arch = "mips32r6", target_arch = "powerpc" )))] __reserved: crate::__syscall_ulong_t, - #[cfg(target_arch = "powerpc")] + #[cfg(all(not(gnu_time_bits64), target_arch = "powerpc"))] __reserved2: crate::__syscall_ulong_t, pub sem_ctime: crate::time_t, #[cfg(not(any( + gnu_time_bits64, target_arch = "mips", target_arch = "mips32r6", target_arch = "powerpc" )))] __reserved2: crate::__syscall_ulong_t, pub sem_nsems: crate::__syscall_ulong_t, + #[cfg(all( + gnu_time_bits64, + not(any( + target_arch = "mips", + target_arch = "mips32r6", + target_arch = "powerpc", + target_arch = "arm", + target_arch = "x86" + )) + ))] + __reserved2: crate::__syscall_ulong_t, __glibc_reserved3: crate::__syscall_ulong_t, __glibc_reserved4: crate::__syscall_ulong_t, } + + pub struct timex { + pub modes: c_uint, + #[cfg(gnu_time_bits64)] + _pad1: c_int, + #[cfg(gnu_time_bits64)] + pub offset: c_longlong, + #[cfg(not(gnu_time_bits64))] + pub offset: c_long, + #[cfg(gnu_time_bits64)] + pub freq: c_longlong, + #[cfg(not(gnu_time_bits64))] + pub freq: c_long, + #[cfg(gnu_time_bits64)] + pub maxerror: c_longlong, + #[cfg(not(gnu_time_bits64))] + pub maxerror: c_long, + #[cfg(gnu_time_bits64)] + pub esterror: c_longlong, + #[cfg(not(gnu_time_bits64))] + pub esterror: c_long, + pub status: c_int, + #[cfg(gnu_time_bits64)] + _pad2: c_int, + #[cfg(gnu_time_bits64)] + pub constant: c_longlong, + #[cfg(not(gnu_time_bits64))] + pub constant: c_long, + #[cfg(gnu_time_bits64)] + pub precision: c_longlong, + #[cfg(not(gnu_time_bits64))] + pub precision: c_long, + #[cfg(gnu_time_bits64)] + pub tolerance: c_longlong, + #[cfg(not(gnu_time_bits64))] + pub tolerance: c_long, + pub time: crate::timeval, + #[cfg(gnu_time_bits64)] + pub tick: c_longlong, + #[cfg(not(gnu_time_bits64))] + pub tick: c_long, + #[cfg(gnu_time_bits64)] + pub ppsfreq: c_longlong, + #[cfg(not(gnu_time_bits64))] + pub ppsfreq: c_long, + #[cfg(gnu_time_bits64)] + pub jitter: c_longlong, + #[cfg(not(gnu_time_bits64))] + pub jitter: c_long, + pub shift: c_int, + #[cfg(gnu_time_bits64)] + _pad3: c_int, + #[cfg(gnu_time_bits64)] + pub stabil: c_longlong, + #[cfg(not(gnu_time_bits64))] + pub stabil: c_long, + #[cfg(gnu_time_bits64)] + pub jitcnt: c_longlong, + #[cfg(not(gnu_time_bits64))] + pub jitcnt: c_long, + #[cfg(gnu_time_bits64)] + pub calcnt: c_longlong, + #[cfg(not(gnu_time_bits64))] + pub calcnt: c_long, + #[cfg(gnu_time_bits64)] + pub errcnt: c_longlong, + #[cfg(not(gnu_time_bits64))] + pub errcnt: c_long, + #[cfg(gnu_time_bits64)] + pub stbcnt: c_longlong, + #[cfg(not(gnu_time_bits64))] + pub stbcnt: c_long, + pub tai: c_int, + pub __unused1: i32, + pub __unused2: i32, + pub __unused3: i32, + pub __unused4: i32, + pub __unused5: i32, + pub __unused6: i32, + pub __unused7: i32, + pub __unused8: i32, + pub __unused9: i32, + pub __unused10: i32, + pub __unused11: i32, + } } pub const POSIX_FADV_DONTNEED: c_int = 4; diff --git a/src/unix/linux_like/linux/gnu/b32/powerpc.rs b/src/unix/linux_like/linux/gnu/b32/powerpc.rs index 36da977d688a3..d562aac3700a8 100644 --- a/src/unix/linux_like/linux/gnu/b32/powerpc.rs +++ b/src/unix/linux_like/linux/gnu/b32/powerpc.rs @@ -67,17 +67,26 @@ s! { pub st_uid: crate::uid_t, pub st_gid: crate::gid_t, pub st_rdev: crate::dev_t, + #[cfg(not(gnu_time_bits64))] __pad2: c_ushort, pub st_size: off_t, pub st_blksize: crate::blksize_t, pub st_blocks: crate::blkcnt_t, pub st_atime: crate::time_t, + #[cfg(gnu_time_bits64)] + _atime_pad: c_int, pub st_atime_nsec: c_long, pub st_mtime: crate::time_t, + #[cfg(gnu_time_bits64)] + _mtime_pad: c_int, pub st_mtime_nsec: c_long, pub st_ctime: crate::time_t, + #[cfg(gnu_time_bits64)] + _ctime_pad: c_int, pub st_ctime_nsec: c_long, + #[cfg(not(gnu_time_bits64))] __glibc_reserved4: c_ulong, + #[cfg(not(gnu_time_bits64))] __glibc_reserved5: c_ulong, } @@ -89,17 +98,26 @@ s! { pub st_uid: crate::uid_t, pub st_gid: crate::gid_t, pub st_rdev: crate::dev_t, + #[cfg(not(gnu_time_bits64))] __pad2: c_ushort, pub st_size: off64_t, pub st_blksize: crate::blksize_t, pub st_blocks: crate::blkcnt64_t, pub st_atime: crate::time_t, + #[cfg(gnu_time_bits64)] + _atime_pad: c_int, pub st_atime_nsec: c_long, pub st_mtime: crate::time_t, + #[cfg(gnu_time_bits64)] + _mtime_pad: c_int, pub st_mtime_nsec: c_long, pub st_ctime: crate::time_t, + #[cfg(gnu_time_bits64)] + _ctime_pad: c_int, pub st_ctime_nsec: c_long, + #[cfg(not(gnu_time_bits64))] __glibc_reserved4: c_ulong, + #[cfg(not(gnu_time_bits64))] __glibc_reserved5: c_ulong, } @@ -136,13 +154,20 @@ s! { pub struct shmid_ds { pub shm_perm: crate::ipc_perm, + #[cfg(gnu_time_bits64)] + pub shm_segsz: size_t, + #[cfg(not(gnu_time_bits64))] __glibc_reserved1: c_uint, pub shm_atime: crate::time_t, + #[cfg(not(gnu_time_bits64))] __glibc_reserved2: c_uint, pub shm_dtime: crate::time_t, + #[cfg(not(gnu_time_bits64))] __glibc_reserved3: c_uint, pub shm_ctime: crate::time_t, + #[cfg(not(gnu_time_bits64))] __glibc_reserved4: c_uint, + #[cfg(not(gnu_time_bits64))] pub shm_segsz: size_t, pub shm_cpid: crate::pid_t, pub shm_lpid: crate::pid_t, @@ -153,10 +178,13 @@ s! { pub struct msqid_ds { pub msg_perm: crate::ipc_perm, + #[cfg(not(gnu_time_bits64))] __glibc_reserved1: c_uint, pub msg_stime: crate::time_t, + #[cfg(not(gnu_time_bits64))] __glibc_reserved2: c_uint, pub msg_rtime: crate::time_t, + #[cfg(not(gnu_time_bits64))] __glibc_reserved3: c_uint, pub msg_ctime: crate::time_t, pub __msg_cbytes: c_ulong, diff --git a/src/unix/linux_like/linux/gnu/b32/sparc/mod.rs b/src/unix/linux_like/linux/gnu/b32/sparc/mod.rs index 7533ad689bb42..03760e72e5e93 100644 --- a/src/unix/linux_like/linux/gnu/b32/sparc/mod.rs +++ b/src/unix/linux_like/linux/gnu/b32/sparc/mod.rs @@ -154,12 +154,18 @@ s! { pub struct shmid_ds { pub shm_perm: crate::ipc_perm, + #[cfg(gnu_time_bits64)] + pub shm_segsz: size_t, + #[cfg(not(gnu_time_bits64))] __pad1: c_uint, pub shm_atime: crate::time_t, + #[cfg(not(gnu_time_bits64))] __pad2: c_uint, pub shm_dtime: crate::time_t, + #[cfg(not(gnu_time_bits64))] __pad3: c_uint, pub shm_ctime: crate::time_t, + #[cfg(not(gnu_time_bits64))] pub shm_segsz: size_t, pub shm_cpid: crate::pid_t, pub shm_lpid: crate::pid_t, @@ -170,19 +176,22 @@ s! { pub struct msqid_ds { pub msg_perm: crate::ipc_perm, + #[cfg(not(gnu_time_bits64))] __pad1: c_uint, pub msg_stime: crate::time_t, + #[cfg(not(gnu_time_bits64))] __pad2: c_uint, pub msg_rtime: crate::time_t, + #[cfg(not(gnu_time_bits64))] __pad3: c_uint, pub msg_ctime: crate::time_t, - pub __msg_cbytes: c_ushort, + pub __msg_cbytes: c_ulong, pub msg_qnum: crate::msgqnum_t, pub msg_qbytes: crate::msglen_t, pub msg_lspid: crate::pid_t, pub msg_lrpid: crate::pid_t, - __glibc_reserved1: c_ulong, - __glibc_reserved2: c_ulong, + __glibc_reserved4: c_ulong, + __glibc_reserved5: c_ulong, } } diff --git a/src/unix/linux_like/linux/gnu/b32/x86/mod.rs b/src/unix/linux_like/linux/gnu/b32/x86/mod.rs index c0eb9e89bc442..08d2f44eb9e97 100644 --- a/src/unix/linux_like/linux/gnu/b32/x86/mod.rs +++ b/src/unix/linux_like/linux/gnu/b32/x86/mod.rs @@ -134,23 +134,35 @@ s! { pub struct stat64 { pub st_dev: crate::dev_t, + #[cfg(not(gnu_time_bits64))] __pad1: c_uint, + #[cfg(not(gnu_time_bits64))] __st_ino: c_ulong, + #[cfg(gnu_time_bits64)] + pub st_ino: crate::ino_t, pub st_mode: crate::mode_t, pub st_nlink: crate::nlink_t, pub st_uid: crate::uid_t, pub st_gid: crate::gid_t, pub st_rdev: crate::dev_t, + #[cfg(not(gnu_time_bits64))] __pad2: c_uint, pub st_size: off64_t, pub st_blksize: crate::blksize_t, pub st_blocks: crate::blkcnt64_t, pub st_atime: crate::time_t, pub st_atime_nsec: c_long, + #[cfg(gnu_time_bits64)] + _atime_pad: c_int, pub st_mtime: crate::time_t, pub st_mtime_nsec: c_long, + #[cfg(gnu_time_bits64)] + _mtime_pad: c_int, pub st_ctime: crate::time_t, pub st_ctime_nsec: c_long, + #[cfg(gnu_time_bits64)] + _ctime_pad: c_int, + #[cfg(not(gnu_time_bits64))] pub st_ino: crate::ino64_t, } @@ -189,10 +201,13 @@ s! { pub shm_perm: crate::ipc_perm, pub shm_segsz: size_t, pub shm_atime: crate::time_t, + #[cfg(not(gnu_time_bits64))] __unused1: c_ulong, pub shm_dtime: crate::time_t, + #[cfg(not(gnu_time_bits64))] __unused2: c_ulong, pub shm_ctime: crate::time_t, + #[cfg(not(gnu_time_bits64))] __unused3: c_ulong, pub shm_cpid: crate::pid_t, pub shm_lpid: crate::pid_t, @@ -204,10 +219,13 @@ s! { pub struct msqid_ds { pub msg_perm: crate::ipc_perm, pub msg_stime: crate::time_t, + #[cfg(not(gnu_time_bits64))] __glibc_reserved1: c_ulong, pub msg_rtime: crate::time_t, + #[cfg(not(gnu_time_bits64))] __glibc_reserved2: c_ulong, pub msg_ctime: crate::time_t, + #[cfg(not(gnu_time_bits64))] __glibc_reserved3: c_ulong, pub __msg_cbytes: c_ulong, pub msg_qnum: crate::msgqnum_t, diff --git a/src/unix/linux_like/linux/gnu/b64/mod.rs b/src/unix/linux_like/linux/gnu/b64/mod.rs index 5927e6c991725..ba5678b459795 100644 --- a/src/unix/linux_like/linux/gnu/b64/mod.rs +++ b/src/unix/linux_like/linux/gnu/b64/mod.rs @@ -97,6 +97,85 @@ s! { __glibc_reserved3: crate::__syscall_ulong_t, __glibc_reserved4: crate::__syscall_ulong_t, } + + pub struct timex { + pub modes: c_uint, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pub offset: i64, + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pub offset: c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pub freq: i64, + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pub freq: c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pub maxerror: i64, + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pub maxerror: c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pub esterror: i64, + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pub esterror: c_long, + pub status: c_int, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pub constant: i64, + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pub constant: c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pub precision: i64, + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pub precision: c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pub tolerance: i64, + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pub tolerance: c_long, + pub time: crate::timeval, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pub tick: i64, + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pub tick: c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pub ppsfreq: i64, + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pub ppsfreq: c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pub jitter: i64, + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pub jitter: c_long, + pub shift: c_int, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pub stabil: i64, + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pub stabil: c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pub jitcnt: i64, + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pub jitcnt: c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pub calcnt: i64, + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pub calcnt: c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pub errcnt: i64, + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pub errcnt: c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pub stbcnt: i64, + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pub stbcnt: c_long, + pub tai: c_int, + pub __unused1: i32, + pub __unused2: i32, + pub __unused3: i32, + pub __unused4: i32, + pub __unused5: i32, + pub __unused6: i32, + pub __unused7: i32, + pub __unused8: i32, + pub __unused9: i32, + pub __unused10: i32, + pub __unused11: i32, + } } pub const __SIZEOF_PTHREAD_RWLOCKATTR_T: usize = 8; diff --git a/src/unix/linux_like/linux/gnu/mod.rs b/src/unix/linux_like/linux/gnu/mod.rs index 887af5777c907..5ff607f4f2560 100644 --- a/src/unix/linux_like/linux/gnu/mod.rs +++ b/src/unix/linux_like/linux/gnu/mod.rs @@ -152,85 +152,6 @@ s! { pub rt_irtt: c_ushort, } - pub struct timex { - pub modes: c_uint, - #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] - pub offset: i64, - #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] - pub offset: c_long, - #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] - pub freq: i64, - #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] - pub freq: c_long, - #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] - pub maxerror: i64, - #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] - pub maxerror: c_long, - #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] - pub esterror: i64, - #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] - pub esterror: c_long, - pub status: c_int, - #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] - pub constant: i64, - #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] - pub constant: c_long, - #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] - pub precision: i64, - #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] - pub precision: c_long, - #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] - pub tolerance: i64, - #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] - pub tolerance: c_long, - pub time: crate::timeval, - #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] - pub tick: i64, - #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] - pub tick: c_long, - #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] - pub ppsfreq: i64, - #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] - pub ppsfreq: c_long, - #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] - pub jitter: i64, - #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] - pub jitter: c_long, - pub shift: c_int, - #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] - pub stabil: i64, - #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] - pub stabil: c_long, - #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] - pub jitcnt: i64, - #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] - pub jitcnt: c_long, - #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] - pub calcnt: i64, - #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] - pub calcnt: c_long, - #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] - pub errcnt: i64, - #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] - pub errcnt: c_long, - #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] - pub stbcnt: i64, - #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] - pub stbcnt: c_long, - pub tai: c_int, - pub __unused1: i32, - pub __unused2: i32, - pub __unused3: i32, - pub __unused4: i32, - pub __unused5: i32, - pub __unused6: i32, - pub __unused7: i32, - pub __unused8: i32, - pub __unused9: i32, - pub __unused10: i32, - pub __unused11: i32, - } - pub struct ntptimeval { pub time: crate::timeval, pub maxerror: c_long, @@ -1216,12 +1137,14 @@ extern "C" { compar: Option c_int>, arg: *mut c_void, ); + #[cfg_attr(gnu_time_bits64, link_name = "__sendmmsg64")] pub fn sendmmsg( sockfd: c_int, msgvec: *mut crate::mmsghdr, vlen: c_uint, flags: c_int, ) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__recvmmsg64")] pub fn recvmmsg( sockfd: c_int, msgvec: *mut crate::mmsghdr, @@ -1260,15 +1183,20 @@ extern "C" { pub fn endutxent(); pub fn getpt() -> c_int; pub fn mallopt(param: c_int, value: c_int) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__gettimeofday64")] pub fn gettimeofday(tp: *mut crate::timeval, tz: *mut crate::timezone) -> c_int; pub fn getentropy(buf: *mut c_void, buflen: size_t) -> c_int; pub fn getrandom(buf: *mut c_void, buflen: size_t, flags: c_uint) -> ssize_t; pub fn getauxval(type_: c_ulong) -> c_ulong; + #[cfg_attr(gnu_time_bits64, link_name = "___adjtimex64")] pub fn adjtimex(buf: *mut timex) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "___adjtimex64")] pub fn ntp_adjtime(buf: *mut timex) -> c_int; - #[link_name = "ntp_gettimex"] + #[cfg_attr(not(gnu_time_bits64), link_name = "ntp_gettimex")] + #[cfg_attr(gnu_time_bits64, link_name = "__ntp_gettime64")] pub fn ntp_gettime(buf: *mut ntptimeval) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__clock_adjtime64")] pub fn clock_adjtime(clk_id: crate::clockid_t, buf: *mut crate::timex) -> c_int; pub fn fanotify_mark( @@ -1323,12 +1251,14 @@ extern "C" { pub fn ctermid(s: *mut c_char) -> *mut c_char; pub fn backtrace(buf: *mut *mut c_void, sz: c_int) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__glob64_time64")] pub fn glob64( pattern: *const c_char, flags: c_int, errfunc: Option c_int>, pglob: *mut glob64_t, ) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__globfree64_time64")] pub fn globfree64(pglob: *mut glob64_t); pub fn ptrace(request: c_uint, ...) -> c_long; pub fn pthread_attr_getaffinity_np( @@ -1396,6 +1326,7 @@ extern "C" { pub fn eaccess(pathname: *const c_char, mode: c_int) -> c_int; pub fn asctime_r(tm: *const crate::tm, buf: *mut c_char) -> *mut c_char; + #[cfg_attr(gnu_time_bits64, link_name = "__ctime64_r")] pub fn ctime_r(timep: *const time_t, buf: *mut c_char) -> *mut c_char; pub fn dirname(path: *mut c_char) -> *mut c_char; @@ -1460,6 +1391,7 @@ extern "C" { pub fn mq_notify(mqdes: crate::mqd_t, sevp: *const crate::sigevent) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__epoll_pwait2_time64")] pub fn epoll_pwait2( epfd: c_int, events: *mut crate::epoll_event, diff --git a/src/unix/linux_like/linux/mod.rs b/src/unix/linux_like/linux/mod.rs index 56cd1bed5afe6..07367a75528dd 100644 --- a/src/unix/linux_like/linux/mod.rs +++ b/src/unix/linux_like/linux/mod.rs @@ -6265,6 +6265,7 @@ cfg_if! { pub fn aio_error(aiocbp: *const aiocb) -> c_int; #[cfg_attr(gnu_file_offset_bits64, link_name = "aio_return64")] pub fn aio_return(aiocbp: *mut aiocb) -> ssize_t; + #[cfg_attr(gnu_time_bits64, link_name = "__aio_suspend_time64")] pub fn aio_suspend( aiocb_list: *const *const aiocb, nitems: c_int, @@ -6326,6 +6327,7 @@ cfg_if! { riovcnt: c_ulong, flags: c_ulong, ) -> isize; + #[cfg_attr(gnu_time_bits64, link_name = "__futimes64")] pub fn futimes(fd: c_int, times: *const crate::timeval) -> c_int; } } @@ -6355,6 +6357,7 @@ cfg_if! { msg_len: size_t, msg_prio: *mut c_uint, ) -> ssize_t; + #[cfg_attr(gnu_time_bits64, link_name = "__mq_timedreceive_time64")] pub fn mq_timedreceive( mqd: crate::mqd_t, msg_ptr: *mut c_char, @@ -6368,6 +6371,7 @@ cfg_if! { msg_len: size_t, msg_prio: c_uint, ) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__mq_timedsend_time64")] pub fn mq_timedsend( mqd: crate::mqd_t, msg_ptr: *const c_char, @@ -6418,6 +6422,7 @@ extern "C" { pub fn seed48(xseed: *mut c_ushort) -> *mut c_ushort; pub fn lcong48(p: *mut c_ushort); + #[cfg_attr(gnu_time_bits64, link_name = "__lutimes64")] pub fn lutimes(file: *const c_char, times: *const crate::timeval) -> c_int; pub fn setpwent(); @@ -6439,11 +6444,14 @@ extern "C" { pub fn shmget(key: crate::key_t, size: size_t, shmflg: c_int) -> c_int; pub fn shmat(shmid: c_int, shmaddr: *const c_void, shmflg: c_int) -> *mut c_void; pub fn shmdt(shmaddr: *const c_void) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__shmctl64")] pub fn shmctl(shmid: c_int, cmd: c_int, buf: *mut crate::shmid_ds) -> c_int; pub fn ftok(pathname: *const c_char, proj_id: c_int) -> crate::key_t; pub fn semget(key: crate::key_t, nsems: c_int, semflag: c_int) -> c_int; pub fn semop(semid: c_int, sops: *mut crate::sembuf, nsops: size_t) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__semctl64")] pub fn semctl(semid: c_int, semnum: c_int, cmd: c_int, ...) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__msgctl64")] pub fn msgctl(msqid: c_int, cmd: c_int, buf: *mut msqid_ds) -> c_int; pub fn msgget(key: crate::key_t, msgflg: c_int) -> c_int; pub fn msgrcv( @@ -6510,7 +6518,9 @@ extern "C" { pub fn fremovexattr(filedes: c_int, name: *const c_char) -> c_int; pub fn signalfd(fd: c_int, mask: *const crate::sigset_t, flags: c_int) -> c_int; pub fn timerfd_create(clockid: crate::clockid_t, flags: c_int) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__timerfd_gettime64")] pub fn timerfd_gettime(fd: c_int, curr_value: *mut itimerspec) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__timerfd_settime64")] pub fn timerfd_settime( fd: c_int, flags: c_int, @@ -6526,6 +6536,7 @@ extern "C" { sigmask: *const crate::sigset_t, ) -> c_int; pub fn dup3(oldfd: c_int, newfd: c_int, flags: c_int) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__sigtimedwait64")] pub fn sigtimedwait( set: *const sigset_t, info: *mut siginfo_t, @@ -6567,14 +6578,22 @@ extern "C" { ... ) -> *mut c_void; - #[cfg_attr(gnu_file_offset_bits64, link_name = "glob64")] + #[cfg_attr(gnu_time_bits64, link_name = "__glob64_time64")] + #[cfg_attr( + all(not(gnu_time_bits64), gnu_file_offset_bits64), + link_name = "glob64" + )] pub fn glob( pattern: *const c_char, flags: c_int, errfunc: Option c_int>, pglob: *mut crate::glob_t, ) -> c_int; - #[cfg_attr(gnu_file_offset_bits64, link_name = "globfree64")] + #[cfg_attr(gnu_time_bits64, link_name = "__globfree64_time64")] + #[cfg_attr( + all(not(gnu_time_bits64), gnu_file_offset_bits64), + link_name = "globfree64" + )] pub fn globfree(pglob: *mut crate::glob_t); pub fn posix_madvise(addr: *mut c_void, len: size_t, advice: c_int) -> c_int; @@ -6637,6 +6656,7 @@ extern "C" { pub fn umount(target: *const c_char) -> c_int; pub fn sched_get_priority_max(policy: c_int) -> c_int; pub fn tee(fd_in: c_int, fd_out: c_int, len: size_t, flags: c_uint) -> ssize_t; + #[cfg_attr(gnu_time_bits64, link_name = "__settimeofday64")] pub fn settimeofday(tv: *const crate::timeval, tz: *const crate::timezone) -> c_int; pub fn splice( fd_in: c_int, @@ -6650,7 +6670,9 @@ extern "C" { pub fn eventfd_read(fd: c_int, value: *mut eventfd_t) -> c_int; pub fn eventfd_write(fd: c_int, value: eventfd_t) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__sched_rr_get_interval64")] pub fn sched_rr_get_interval(pid: crate::pid_t, tp: *mut crate::timespec) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__sem_timedwait64")] pub fn sem_timedwait(sem: *mut sem_t, abstime: *const crate::timespec) -> c_int; pub fn sem_getvalue(sem: *mut sem_t, sval: *mut c_int) -> c_int; pub fn sched_setparam(pid: crate::pid_t, param: *const crate::sched_param) -> c_int; @@ -6666,8 +6688,10 @@ extern "C" { data: *const c_void, ) -> c_int; pub fn personality(persona: c_ulong) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__prctl_time64")] pub fn prctl(option: c_int, ...) -> c_int; pub fn sched_getparam(pid: crate::pid_t, param: *mut crate::sched_param) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__ppoll64")] pub fn ppoll( fds: *mut crate::pollfd, nfds: nfds_t, @@ -6680,6 +6704,7 @@ extern "C" { ) -> c_int; pub fn pthread_mutexattr_setprotocol(attr: *mut pthread_mutexattr_t, protocol: c_int) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__pthread_mutex_timedlock64")] pub fn pthread_mutex_timedlock( lock: *mut pthread_mutex_t, abstime: *const crate::timespec, @@ -6714,6 +6739,7 @@ extern "C" { ... ) -> c_int; pub fn sched_getscheduler(pid: crate::pid_t) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__clock_nanosleep_time64")] pub fn clock_nanosleep( clk_id: crate::clockid_t, flags: c_int, @@ -6971,7 +6997,9 @@ extern "C" { ) -> c_int; pub fn timer_delete(timerid: crate::timer_t) -> c_int; pub fn timer_getoverrun(timerid: crate::timer_t) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__timer_gettime64")] pub fn timer_gettime(timerid: crate::timer_t, curr_value: *mut crate::itimerspec) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__timer_settime64")] pub fn timer_settime( timerid: crate::timer_t, flags: c_int, @@ -7013,6 +7041,7 @@ extern "C" { pub fn klogctl(syslog_type: c_int, bufp: *mut c_char, len: c_int) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__ioctl_time64")] pub fn ioctl(fd: c_int, request: Ioctl, ...) -> c_int; } diff --git a/src/unix/linux_like/mod.rs b/src/unix/linux_like/mod.rs index cc2ea1af1bfc0..43bd153df2074 100644 --- a/src/unix/linux_like/mod.rs +++ b/src/unix/linux_like/mod.rs @@ -1837,8 +1837,11 @@ extern "C" { pub fn fdatasync(fd: c_int) -> c_int; pub fn mincore(addr: *mut c_void, len: size_t, vec: *mut c_uchar) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__clock_getres64")] pub fn clock_getres(clk_id: crate::clockid_t, tp: *mut crate::timespec) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__clock_gettime64")] pub fn clock_gettime(clk_id: crate::clockid_t, tp: *mut crate::timespec) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__clock_settime64")] pub fn clock_settime(clk_id: crate::clockid_t, tp: *const crate::timespec) -> c_int; pub fn clock_getcpuclockid(pid: crate::pid_t, clk_id: *mut crate::clockid_t) -> c_int; @@ -1865,7 +1868,9 @@ extern "C" { pub fn memrchr(cx: *const c_void, c: c_int, n: size_t) -> *mut c_void; #[cfg_attr(gnu_file_offset_bits64, link_name = "posix_fadvise64")] pub fn posix_fadvise(fd: c_int, offset: off_t, len: off_t, advise: c_int) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__futimens64")] pub fn futimens(fd: c_int, times: *const crate::timespec) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__utimensat64")] pub fn utimensat( dirfd: c_int, path: *const c_char, @@ -1915,6 +1920,7 @@ extern "C" { pub fn sbrk(increment: intptr_t) -> *mut c_void; pub fn setresgid(rgid: crate::gid_t, egid: crate::gid_t, sgid: crate::gid_t) -> c_int; pub fn setresuid(ruid: crate::uid_t, euid: crate::uid_t, suid: crate::uid_t) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__wait4_time64")] pub fn wait4( pid: crate::pid_t, status: *mut c_int, @@ -1939,7 +1945,9 @@ extern "C" { pub fn writev(fd: c_int, iov: *const crate::iovec, iovcnt: c_int) -> ssize_t; pub fn readv(fd: c_int, iov: *const crate::iovec, iovcnt: c_int) -> ssize_t; + #[cfg_attr(gnu_time_bits64, link_name = "__sendmsg64")] pub fn sendmsg(fd: c_int, msg: *const crate::msghdr, flags: c_int) -> ssize_t; + #[cfg_attr(gnu_time_bits64, link_name = "__recvmsg64")] pub fn recvmsg(fd: c_int, msg: *mut crate::msghdr, flags: c_int) -> ssize_t; pub fn uname(buf: *mut crate::utsname) -> c_int; @@ -1981,7 +1989,9 @@ cfg_if! { pub fn fstatvfs64(fd: c_int, buf: *mut statvfs64) -> c_int; pub fn statfs64(path: *const c_char, buf: *mut statfs64) -> c_int; pub fn creat64(path: *const c_char, mode: mode_t) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__fstat64_time64")] pub fn fstat64(fildes: c_int, buf: *mut stat64) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__fstatat64_time64")] pub fn fstatat64( dirfd: c_int, pathname: *const c_char, @@ -1990,6 +2000,7 @@ cfg_if! { ) -> c_int; pub fn ftruncate64(fd: c_int, length: off64_t) -> c_int; pub fn lseek64(fd: c_int, offset: off64_t, whence: c_int) -> off64_t; + #[cfg_attr(gnu_time_bits64, link_name = "__lstat64_time64")] pub fn lstat64(path: *const c_char, buf: *mut stat64) -> c_int; pub fn mmap64( addr: *mut c_void, @@ -2020,6 +2031,7 @@ cfg_if! { entry: *mut crate::dirent64, result: *mut *mut crate::dirent64, ) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__stat64_time64")] pub fn stat64(path: *const c_char, buf: *mut stat64) -> c_int; pub fn truncate64(path: *const c_char, length: off64_t) -> c_int; } diff --git a/src/unix/mod.rs b/src/unix/mod.rs index dc8b0fc01b93a..05ac5a363744a 100644 --- a/src/unix/mod.rs +++ b/src/unix/mod.rs @@ -56,20 +56,35 @@ s! { pub modtime: time_t, } - // FIXME(time): Needs updates at least for glibc _TIME_BITS=64 pub struct timeval { pub tv_sec: time_t, + #[cfg(not(gnu_time_bits64))] pub tv_usec: suseconds_t, + // For 64 bit time on 32 bit linux glibc, suseconds_t is still + // a 32 bit type. Use i64 instead + #[cfg(gnu_time_bits64)] + pub tv_usec: i64, } // linux x32 compatibility // See https://sourceware.org/bugzilla/show_bug.cgi?id=16437 pub struct timespec { pub tv_sec: time_t, - #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + #[cfg(all(gnu_time_bits64, target_endian = "big"))] + __pad: i32, + #[cfg(all( + not(target_env = "gnu"), + target_arch = "x86_64", + target_pointer_width = "32" + ))] pub tv_nsec: i64, - #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + #[cfg(any( + target_env = "gnu", + not(all(target_arch = "x86_64", target_pointer_width = "32")) + ))] pub tv_nsec: c_long, + #[cfg(all(gnu_time_bits64, target_endian = "little"))] + __pad: i32, } pub struct rlimit { @@ -796,6 +811,7 @@ extern "C" { pub fn getsockname(socket: c_int, address: *mut sockaddr, address_len: *mut socklen_t) -> c_int; #[cfg_attr(target_os = "espidf", link_name = "lwip_setsockopt")] + #[cfg_attr(gnu_time_bits64, link_name = "__setsockopt64")] pub fn setsockopt( socket: c_int, level: c_int, @@ -858,7 +874,11 @@ extern "C" { all(target_os = "freebsd", any(freebsd11, freebsd10)), link_name = "fstat@FBSD_1.0" )] - #[cfg_attr(gnu_file_offset_bits64, link_name = "fstat64")] + #[cfg_attr(gnu_time_bits64, link_name = "__fstat64_time64")] + #[cfg_attr( + all(not(gnu_time_bits64), gnu_file_offset_bits64), + link_name = "fstat64" + )] pub fn fstat(fildes: c_int, buf: *mut stat) -> c_int; pub fn mkdir(path: *const c_char, mode: mode_t) -> c_int; @@ -872,7 +892,11 @@ extern "C" { all(target_os = "freebsd", any(freebsd11, freebsd10)), link_name = "stat@FBSD_1.0" )] - #[cfg_attr(gnu_file_offset_bits64, link_name = "stat64")] + #[cfg_attr(gnu_time_bits64, link_name = "__stat64_time64")] + #[cfg_attr( + all(not(gnu_time_bits64), gnu_file_offset_bits64), + link_name = "stat64" + )] pub fn stat(path: *const c_char, buf: *mut stat) -> c_int; pub fn pclose(stream: *mut crate::FILE) -> c_int; @@ -899,7 +923,11 @@ extern "C" { all(target_os = "macos", target_arch = "x86"), link_name = "fcntl$UNIX2003" )] - #[cfg_attr(gnu_file_offset_bits64, link_name = "__fcntl_time64")] + #[cfg_attr(gnu_time_bits64, link_name = "__fcntl_time64")] + #[cfg_attr( + all(not(gnu_time_bits64), gnu_file_offset_bits64), + link_name = "__fcntl_time64" + )] pub fn fcntl(fd: c_int, cmd: c_int, ...) -> c_int; #[cfg_attr( @@ -956,7 +984,11 @@ extern "C" { all(target_os = "freebsd", any(freebsd11, freebsd10)), link_name = "fstatat@FBSD_1.1" )] - #[cfg_attr(gnu_file_offset_bits64, link_name = "fstatat64")] + #[cfg_attr(gnu_time_bits64, link_name = "__fstatat64_time64")] + #[cfg_attr( + all(not(gnu_time_bits64), gnu_file_offset_bits64), + link_name = "fstatat64" + )] pub fn fstatat(dirfd: c_int, pathname: *const c_char, buf: *mut stat, flags: c_int) -> c_int; pub fn linkat( olddirfd: c_int, @@ -1056,6 +1088,7 @@ extern "C" { link_name = "nanosleep$UNIX2003" )] #[cfg_attr(target_os = "netbsd", link_name = "__nanosleep50")] + #[cfg_attr(gnu_time_bits64, link_name = "__nanosleep64")] pub fn nanosleep(rqtp: *const timespec, rmtp: *mut timespec) -> c_int; pub fn tcgetpgrp(fd: c_int) -> pid_t; pub fn tcsetpgrp(fd: c_int, pgrp: crate::pid_t) -> c_int; @@ -1100,6 +1133,7 @@ extern "C" { pub fn umask(mask: mode_t) -> mode_t; #[cfg_attr(target_os = "netbsd", link_name = "__utime50")] + #[cfg_attr(gnu_time_bits64, link_name = "__utime64")] pub fn utime(file: *const c_char, buf: *const utimbuf) -> c_int; #[cfg_attr( @@ -1149,7 +1183,11 @@ extern "C" { all(target_os = "freebsd", any(freebsd11, freebsd10)), link_name = "lstat@FBSD_1.0" )] - #[cfg_attr(gnu_file_offset_bits64, link_name = "lstat64")] + #[cfg_attr(gnu_time_bits64, link_name = "__lstat64_time64")] + #[cfg_attr( + all(not(gnu_time_bits64), gnu_file_offset_bits64), + link_name = "lstat64" + )] pub fn lstat(path: *const c_char, buf: *mut stat) -> c_int; #[cfg_attr( @@ -1180,6 +1218,7 @@ extern "C" { pub fn signal(signum: c_int, handler: sighandler_t) -> sighandler_t; #[cfg_attr(target_os = "netbsd", link_name = "__getrusage50")] + #[cfg_attr(gnu_time_bits64, link_name = "__getrusage64")] pub fn getrusage(resource: c_int, usage: *mut rusage) -> c_int; #[cfg_attr( @@ -1255,6 +1294,7 @@ extern "C" { all(target_os = "macos", target_arch = "x86"), link_name = "pthread_cond_timedwait$UNIX2003" )] + #[cfg_attr(gnu_time_bits64, link_name = "__pthread_cond_timedwait64")] pub fn pthread_cond_timedwait( cond: *mut pthread_cond_t, lock: *mut pthread_mutex_t, @@ -1311,6 +1351,7 @@ extern "C" { link_name = "__xnet_getsockopt" )] #[cfg_attr(target_os = "espidf", link_name = "lwip_getsockopt")] + #[cfg_attr(gnu_time_bits64, link_name = "__getsockopt64")] pub fn getsockopt( sockfd: c_int, level: c_int, @@ -1321,6 +1362,7 @@ extern "C" { pub fn raise(signum: c_int) -> c_int; #[cfg_attr(target_os = "netbsd", link_name = "__utimes50")] + #[cfg_attr(gnu_time_bits64, link_name = "__utimes64")] pub fn utimes(filename: *const c_char, times: *const crate::timeval) -> c_int; pub fn dlopen(filename: *const c_char, flag: c_int) -> *mut c_void; pub fn dlerror() -> *mut c_char; @@ -1372,10 +1414,12 @@ extern "C" { #[cfg_attr(target_os = "netbsd", link_name = "__gmtime_r50")] #[cfg_attr(any(target_env = "musl", target_env = "ohos"), allow(deprecated))] // FIXME(time): for `time_t` + #[cfg_attr(gnu_time_bits64, link_name = "__gmtime64_r")] pub fn gmtime_r(time_p: *const time_t, result: *mut tm) -> *mut tm; #[cfg_attr(target_os = "netbsd", link_name = "__localtime_r50")] #[cfg_attr(any(target_env = "musl", target_env = "ohos"), allow(deprecated))] // FIXME(time): for `time_t` + #[cfg_attr(gnu_time_bits64, link_name = "__localtime64_r")] pub fn localtime_r(time_p: *const time_t, result: *mut tm) -> *mut tm; #[cfg_attr( all(target_os = "macos", target_arch = "x86"), @@ -1384,26 +1428,32 @@ extern "C" { #[cfg_attr(target_os = "netbsd", link_name = "__mktime50")] #[cfg_attr(any(target_env = "musl", target_env = "ohos"), allow(deprecated))] // FIXME: for `time_t` + #[cfg_attr(gnu_time_bits64, link_name = "__mktime64")] pub fn mktime(tm: *mut tm) -> time_t; #[cfg_attr(target_os = "netbsd", link_name = "__time50")] #[cfg_attr(any(target_env = "musl", target_env = "ohos"), allow(deprecated))] // FIXME: for `time_t` + #[cfg_attr(gnu_time_bits64, link_name = "__time64")] pub fn time(time: *mut time_t) -> time_t; #[cfg_attr(target_os = "netbsd", link_name = "__gmtime50")] #[cfg_attr(any(target_env = "musl", target_env = "ohos"), allow(deprecated))] // FIXME(time): for `time_t` + #[cfg_attr(gnu_time_bits64, link_name = "__gmtime64")] pub fn gmtime(time_p: *const time_t) -> *mut tm; #[cfg_attr(target_os = "netbsd", link_name = "__locatime50")] #[cfg_attr(any(target_env = "musl", target_env = "ohos"), allow(deprecated))] // FIXME(time): for `time_t` + #[cfg_attr(gnu_time_bits64, link_name = "__localtime64")] pub fn localtime(time_p: *const time_t) -> *mut tm; #[cfg_attr(target_os = "netbsd", link_name = "__difftime50")] #[cfg_attr(any(target_env = "musl", target_env = "ohos"), allow(deprecated))] // FIXME(time): for `time_t` + #[cfg_attr(gnu_time_bits64, link_name = "__difftime64")] pub fn difftime(time1: time_t, time0: time_t) -> c_double; #[cfg_attr(target_os = "netbsd", link_name = "__timegm50")] #[cfg_attr(any(target_env = "musl", target_env = "ohos"), allow(deprecated))] // FIXME(time): for `time_t` + #[cfg_attr(gnu_time_bits64, link_name = "__timegm64")] pub fn timegm(tm: *mut crate::tm) -> time_t; #[cfg_attr(target_os = "netbsd", link_name = "__mknod50")] @@ -1461,6 +1511,7 @@ extern "C" { link_name = "select$UNIX2003" )] #[cfg_attr(target_os = "netbsd", link_name = "__select50")] + #[cfg_attr(gnu_time_bits64, link_name = "__select64")] pub fn select( nfds: c_int, readfds: *mut fd_set, @@ -1581,6 +1632,7 @@ cfg_if! { target_os = "cygwin" )))] { extern "C" { + #[cfg_attr(gnu_time_bits64, link_name = "__adjtime64")] pub fn adjtime(delta: *const timeval, olddelta: *mut timeval) -> c_int; } } else if #[cfg(target_os = "solaris")] { @@ -1734,6 +1786,7 @@ cfg_if! { link_name = "pselect$UNIX2003" )] #[cfg_attr(target_os = "netbsd", link_name = "__pselect50")] + #[cfg_attr(gnu_time_bits64, link_name = "__pselect64")] pub fn pselect( nfds: c_int, readfds: *mut fd_set,