mirror of
https://github.com/fish-shell/fish-shell.git
synced 2024-12-19 13:33:38 +08:00
7b7d16da48
This was based on a misunderstanding. On musl, 64-bit time_t on 32-bit architectures was introduced in version 1.2.0, by introducing new symbols. The old symbols still exist, to allow programs compiled against older versions to keep running on 1.2.0+, preserving ABI-compatibility. (see musl commit 38143339646a4ccce8afe298c34467767c899f51) Programs compiled against 1.2.0+ will get the new symbols, and will therefore think time_t is 64-bit. Unfortunately, rust's libc crate uses its own definition of these types, and does not check for musl version. Currently, it includes the pre-1.2.0 32-bit type. That means: - If you run on a 32-bit system like i686 - ... and compile against a C-library other than libc - ... and pass it a time_t-containing struct like timespec or stat ... you need to arrange for that library to be built against musl <1.2.0. Or, as https://github.com/ericonr/rust-time64 says: > Therefore, for "old" 32-bit targets (riscv32 is supposed to default to time64), > any Rust code that interacts with C code built on musl after 1.2.0, > using types based on time_t (arguably, the main ones are struct timespec and struct stat) in their interface, > will be completely miscompiled. However, while fish runs on i686 and compiles against pcre2, we do not pass pcre2 a time_t. Our only uses of time_t are confined to interactions with libc, in which case with musl we would simply use the legacy ABI. I have compiled an i686 fish against musl to confirm and can find no issue. This reverts commit55196ee2a0
. This reverts commit4992f88966
. This reverts commit46c8ba2c9f
. This reverts commit3a9b4149da
. This reverts commit5f9e9cbe74
. This reverts commit338579b78c
. This reverts commitd19e5508d7
. This reverts commitb64045dc18
. Closes #10634
62 lines
1.8 KiB
Rust
62 lines
1.8 KiB
Rust
use std::sync::atomic::AtomicPtr;
|
|
|
|
use libc::{c_char, c_int};
|
|
use once_cell::sync::Lazy;
|
|
|
|
pub static _PATH_BSHELL: AtomicPtr<c_char> = AtomicPtr::new(std::ptr::null_mut());
|
|
extern "C" {
|
|
pub fn C_PATH_BSHELL() -> *const c_char;
|
|
}
|
|
|
|
pub static _PC_CASE_SENSITIVE: Lazy<c_int> = Lazy::new(|| unsafe { C_PC_CASE_SENSITIVE() });
|
|
extern "C" {
|
|
fn C_PC_CASE_SENSITIVE() -> c_int;
|
|
}
|
|
|
|
extern "C" {
|
|
pub(crate) fn confstr(
|
|
name: libc::c_int,
|
|
buf: *mut libc::c_char,
|
|
len: libc::size_t,
|
|
) -> libc::size_t;
|
|
pub fn stdout_stream() -> *mut libc::FILE;
|
|
pub fn setlinebuf(stream: *mut libc::FILE);
|
|
}
|
|
|
|
macro_rules! CVAR {
|
|
($cfn:ident, $cvar:ident, $type:ident) => {
|
|
pub fn $cvar() -> $type {
|
|
extern "C" {
|
|
fn $cfn() -> $type;
|
|
}
|
|
unsafe { $cfn() }
|
|
}
|
|
};
|
|
}
|
|
|
|
CVAR!(C_MB_CUR_MAX, MB_CUR_MAX, usize);
|
|
CVAR!(C_ST_LOCAL, ST_LOCAL, u64);
|
|
CVAR!(C_MNT_LOCAL, MNT_LOCAL, u64);
|
|
CVAR!(C_CS_PATH, _CS_PATH, i32);
|
|
|
|
CVAR!(C_RLIMIT_SBSIZE, RLIMIT_SBSIZE, i32);
|
|
CVAR!(C_RLIMIT_CORE, RLIMIT_CORE, i32);
|
|
CVAR!(C_RLIMIT_DATA, RLIMIT_DATA, i32);
|
|
CVAR!(C_RLIMIT_NICE, RLIMIT_NICE, i32);
|
|
CVAR!(C_RLIMIT_FSIZE, RLIMIT_FSIZE, i32);
|
|
CVAR!(C_RLIMIT_SIGPENDING, RLIMIT_SIGPENDING, i32);
|
|
CVAR!(C_RLIMIT_MEMLOCK, RLIMIT_MEMLOCK, i32);
|
|
CVAR!(C_RLIMIT_RSS, RLIMIT_RSS, i32);
|
|
CVAR!(C_RLIMIT_NOFILE, RLIMIT_NOFILE, i32);
|
|
CVAR!(C_RLIMIT_MSGQUEUE, RLIMIT_MSGQUEUE, i32);
|
|
CVAR!(C_RLIMIT_RTPRIO, RLIMIT_RTPRIO, i32);
|
|
CVAR!(C_RLIMIT_STACK, RLIMIT_STACK, i32);
|
|
CVAR!(C_RLIMIT_CPU, RLIMIT_CPU, i32);
|
|
CVAR!(C_RLIMIT_NPROC, RLIMIT_NPROC, i32);
|
|
CVAR!(C_RLIMIT_AS, RLIMIT_AS, i32);
|
|
CVAR!(C_RLIMIT_SWAP, RLIMIT_SWAP, i32);
|
|
CVAR!(C_RLIMIT_RTTIME, RLIMIT_RTTIME, i32);
|
|
CVAR!(C_RLIMIT_KQUEUES, RLIMIT_KQUEUES, i32);
|
|
CVAR!(C_RLIMIT_NPTS, RLIMIT_NPTS, i32);
|
|
CVAR!(C_RLIMIT_NTHR, RLIMIT_NTHR, i32);
|