Fix building on targets with unsigned c_char

This commit is contained in:
bjorn3
2025-03-30 16:35:29 +02:00
parent 34c95ea662
commit 8650ac293e
9 changed files with 46 additions and 37 deletions
+6 -4
View File
@@ -1,3 +1,5 @@
use crate::platform::types::c_char;
use super::{apply_grouping, FormatFlags, LocaleMonetaryInfo, DEFAULT_MONETARY};
use alloc::string::{String, ToString};
use core::{ffi::CStr, ptr, result, slice, str};
@@ -11,10 +13,10 @@ use libm::{fabs, floor, pow, round, trunc};
/// - The number of characters written (excluding the null terminator), or -1 if
/// an error occurs (e.g., invalid input, buffer overflow)
pub unsafe extern "C" fn strfmon(
s: *mut i8, // Output buffer
maxsize: usize, // Maximum size of the buffer
format: *const i8, // Format string
mut args: ... // Variadic arguments for monetary values
s: *mut c_char, // Output buffer
maxsize: usize, // Maximum size of the buffer
format: *const c_char, // Format string
mut args: ... // Variadic arguments for monetary values
) -> isize {
// Validate input pointers and buffer size
if s.is_null() || format.is_null() || maxsize == 0 {
+5 -5
View File
@@ -27,7 +27,7 @@ pub static mut HOST_ENTRY: hostent = hostent {
};
pub static mut HOST_NAME: Option<Vec<u8>> = None;
pub static mut HOST_ALIASES: Option<Vec<Vec<u8>>> = None;
static mut _HOST_ALIASES: Option<Vec<*mut i8>> = None;
static mut _HOST_ALIASES: Option<Vec<*mut c_char>> = None;
pub static mut HOST_ADDR: Option<in_addr> = None;
pub static mut HOST_ADDR_LIST: [*mut c_char; 2] = [ptr::null_mut(); 2];
pub static mut _HOST_ADDR_LIST: [u8; 4] = [0u8; 4];
@@ -79,7 +79,7 @@ pub unsafe extern "C" fn gethostent() -> *mut hostent {
let mut iter: SplitWhitespace = r.split_whitespace();
let addr_vec: Vec<u8> = iter.next().unwrap().bytes().chain(Some(b'\0')).collect();
let addr_cstr = addr_vec.as_slice().as_ptr() as *const i8;
let addr_cstr = addr_vec.as_slice().as_ptr() as *const c_char;
let mut addr = mem::MaybeUninit::uninit();
inet_aton(addr_cstr, addr.as_mut_ptr());
let addr = addr.assume_init();
@@ -96,11 +96,11 @@ pub unsafe extern "C" fn gethostent() -> *mut hostent {
.collect();
HOST_ALIASES = Some(_host_aliases);
let mut host_aliases: Vec<*mut i8> = HOST_ALIASES
let mut host_aliases: Vec<*mut c_char> = HOST_ALIASES
.as_mut()
.unwrap()
.iter_mut()
.map(|x| x.as_mut_ptr() as *mut i8)
.map(|x| x.as_mut_ptr() as *mut c_char)
.chain([ptr::null_mut(), ptr::null_mut()])
.collect();
@@ -108,7 +108,7 @@ pub unsafe extern "C" fn gethostent() -> *mut hostent {
HOST_ENTRY = hostent {
h_name: HOST_NAME.as_mut().unwrap().as_mut_ptr() as *mut c_char,
h_aliases: host_aliases.as_mut_slice().as_mut_ptr() as *mut *mut i8,
h_aliases: host_aliases.as_mut_slice().as_mut_ptr(),
h_addrtype: AF_INET,
h_length: 4,
h_addr_list: HOST_ADDR_LIST.as_mut_ptr(),
+14 -14
View File
@@ -249,9 +249,9 @@ pub unsafe extern "C" fn gethostbyaddr(
if (*cp).is_null() {
break;
}
let mut cp_slice: [i8; 4] = [0i8; 4];
let mut cp_slice: [c_char; 4] = [0; 4];
(*cp).copy_to(cp_slice.as_mut_ptr(), 4);
let cp_s_addr = mem::transmute::<[i8; 4], u32>(cp_slice);
let cp_s_addr = mem::transmute::<[c_char; 4], u32>(cp_slice);
if cp_s_addr == addr.s_addr {
sethostent(HOST_STAYOPEN);
return p;
@@ -263,7 +263,7 @@ pub unsafe extern "C" fn gethostbyaddr(
//TODO actually get aliases
let mut _host_aliases: Vec<Vec<u8>> = Vec::new();
_host_aliases.push(vec![b'\0']);
let mut host_aliases: Vec<*mut i8> = Vec::new();
let mut host_aliases: Vec<*mut c_char> = Vec::new();
host_aliases.push(ptr::null_mut());
HOST_ALIASES = Some(_host_aliases);
@@ -274,7 +274,7 @@ pub unsafe extern "C" fn gethostbyaddr(
HOST_NAME = Some(host_name);
HOST_ENTRY = hostent {
h_name: HOST_NAME.as_mut().unwrap().as_mut_ptr() as *mut c_char,
h_aliases: host_aliases.as_mut_slice().as_mut_ptr() as *mut *mut i8,
h_aliases: host_aliases.as_mut_slice().as_mut_ptr(),
h_addrtype: format,
h_length: length as i32,
h_addr_list: HOST_ADDR_LIST.as_mut_ptr(),
@@ -395,14 +395,14 @@ pub unsafe extern "C" fn gethostbyname(name: *const c_char) -> *mut hostent {
//TODO actually get aliases
let mut _host_aliases: Vec<Vec<u8>> = Vec::new();
_host_aliases.push(vec![b'\0']);
let mut host_aliases: Vec<*mut i8> = Vec::new();
let mut host_aliases: Vec<*mut c_char> = Vec::new();
host_aliases.push(ptr::null_mut());
host_aliases.push(ptr::null_mut());
HOST_ALIASES = Some(_host_aliases);
HOST_ENTRY = hostent {
h_name: HOST_NAME.as_mut().unwrap().as_mut_ptr() as *mut c_char,
h_aliases: host_aliases.as_mut_slice().as_mut_ptr() as *mut *mut i8,
h_aliases: host_aliases.as_mut_slice().as_mut_ptr(),
h_addrtype: AF_INET,
h_length: 4,
h_addr_list: HOST_ADDR_LIST.as_mut_ptr(),
@@ -466,7 +466,7 @@ pub unsafe extern "C" fn getnetent() -> *mut netent {
NET_NAME = Some(net_name);
let addr_vec: Vec<u8> = iter.next().unwrap().bytes().chain(Some(b'\0')).collect();
let addr_cstr = addr_vec.as_slice().as_ptr() as *const i8;
let addr_cstr = addr_vec.as_slice().as_ptr() as *const c_char;
let mut addr = mem::MaybeUninit::uninit();
inet_aton(addr_cstr, addr.as_mut_ptr());
let addr = addr.assume_init();
@@ -475,16 +475,16 @@ pub unsafe extern "C" fn getnetent() -> *mut netent {
let mut _net_aliases: Vec<Vec<u8>> = iter
.map(|alias| alias.bytes().chain(Some(b'\0')).collect())
.collect();
let mut net_aliases: Vec<*mut i8> = _net_aliases
let mut net_aliases: Vec<*mut c_char> = _net_aliases
.iter_mut()
.map(|x| x.as_mut_ptr() as *mut i8)
.map(|x| x.as_mut_ptr() as *mut c_char)
.chain(Some(ptr::null_mut()))
.collect();
NET_ALIASES = Some(_net_aliases);
NET_ENTRY = netent {
n_name: NET_NAME.as_mut().unwrap().as_mut_ptr() as *mut c_char,
n_aliases: net_aliases.as_mut_slice().as_mut_ptr() as *mut *mut i8,
n_aliases: net_aliases.as_mut_slice().as_mut_ptr(),
n_addrtype: AF_INET,
n_net: NET_ADDR.unwrap() as c_ulong,
};
@@ -576,7 +576,7 @@ pub unsafe extern "C" fn getprotoent() -> *mut protoent {
let mut num = iter.next().unwrap().as_bytes().to_vec();
num.push(b'\0');
PROTO_NUM = Some(atoi(num.as_mut_slice().as_mut_ptr() as *mut i8));
PROTO_NUM = Some(atoi(num.as_mut_slice().as_mut_ptr() as *mut c_char));
let mut _proto_aliases: Vec<Vec<u8>> = iter
.map(|alias| alias.bytes().chain(Some(b'\0')).collect())
@@ -592,7 +592,7 @@ pub unsafe extern "C" fn getprotoent() -> *mut protoent {
PROTO_ENTRY = protoent {
p_name: PROTO_NAME.as_mut().unwrap().as_mut_slice().as_mut_ptr() as *mut c_char,
p_aliases: proto_aliases.as_mut_slice().as_mut_ptr() as *mut *mut i8,
p_aliases: proto_aliases.as_mut_slice().as_mut_ptr() as *mut *mut c_char,
p_proto: PROTO_NUM.unwrap(),
};
if PROTO_STAYOPEN == 0 {
@@ -698,7 +698,7 @@ pub unsafe extern "C" fn getservent() -> *mut servent {
None => continue,
};
SERV_PORT =
Some(htons(atoi(port.as_mut_slice().as_mut_ptr() as *mut i8) as u16) as u32 as i32);
Some(htons(atoi(port.as_mut_slice().as_mut_ptr() as *mut c_char) as u16) as u32 as i32);
let proto = match split.next() {
Some(proto) => proto.bytes().chain(Some(b'\0')).collect(),
None => continue,
@@ -733,7 +733,7 @@ pub unsafe extern "C" fn getservent() -> *mut servent {
SERV_ENTRY = servent {
s_name: SERV_NAME.as_mut().unwrap().as_mut_slice().as_mut_ptr() as *mut c_char,
s_aliases: serv_aliases.as_mut_slice().as_mut_ptr() as *mut *mut i8,
s_aliases: serv_aliases.as_mut_slice().as_mut_ptr() as *mut *mut c_char,
s_port: SERV_PORT.unwrap(),
s_proto: SERV_PROTO.as_mut().unwrap().as_mut_slice().as_mut_ptr() as *mut c_char,
};
+11 -7
View File
@@ -14,7 +14,7 @@ use alloc::vec::Vec;
pub unsafe fn parse_mode_flags(mode_str: *const c_char) -> i32 {
let mut flags = if !strchr(mode_str, b'+' as i32).is_null() {
O_RDWR
} else if (*mode_str) == b'r' as i8 {
} else if (*mode_str) == b'r' as c_char {
O_RDONLY
} else {
O_WRONLY
@@ -25,12 +25,12 @@ pub unsafe fn parse_mode_flags(mode_str: *const c_char) -> i32 {
if !strchr(mode_str, b'e' as i32).is_null() {
flags |= O_CLOEXEC;
}
if (*mode_str) != b'r' as i8 {
if (*mode_str) != b'r' as c_char {
flags |= O_CREAT;
}
if (*mode_str) == b'w' as i8 {
if (*mode_str) == b'w' as c_char {
flags |= O_TRUNC;
} else if (*mode_str) == b'a' as i8 {
} else if (*mode_str) == b'a' as c_char {
flags |= O_APPEND;
}
@@ -39,21 +39,25 @@ pub unsafe fn parse_mode_flags(mode_str: *const c_char) -> i32 {
/// Open a file with the file descriptor `fd` in the mode `mode`
pub unsafe fn _fdopen(fd: c_int, mode: *const c_char) -> Option<*mut FILE> {
if *mode != b'r' as i8 && *mode != b'w' as i8 && *mode != b'a' as i8 {
if *mode != b'r' as c_char && *mode != b'w' as c_char && *mode != b'a' as c_char {
platform::ERRNO.set(errno::EINVAL);
return None;
}
let mut flags = 0;
if strchr(mode, b'+' as i32).is_null() {
flags |= if *mode == b'r' as i8 { F_NOWR } else { F_NORD };
flags |= if *mode == b'r' as c_char {
F_NOWR
} else {
F_NORD
};
}
if !strchr(mode, b'e' as i32).is_null() {
fcntl(fd, F_SETFD, FD_CLOEXEC as c_ulonglong);
}
if *mode == 'a' as i8 {
if *mode == 'a' as c_char {
let f = fcntl(fd, F_GETFL, 0);
if (f & O_APPEND) == 0 {
fcntl(fd, F_SETFL, (f | O_APPEND) as c_ulonglong);
+6 -3
View File
@@ -292,7 +292,7 @@ pub unsafe extern "C" fn ctermid(s: *mut c_char) -> *mut c_char {
// #[no_mangle]
pub unsafe extern "C" fn cuserid(s: *mut c_char) -> *mut c_char {
let mut buf: Vec<i8> = vec![0; 256];
let mut buf: Vec<c_char> = vec![0; 256];
let mut pwd: pwd::passwd = unsafe { mem::zeroed() };
let mut pwdbuf: *mut pwd::passwd = unsafe { mem::zeroed() };
if s != ptr::null_mut() {
@@ -434,7 +434,7 @@ pub unsafe extern "C" fn fgets(
if left >= 1 {
let unget_read_size = cmp::min(left, stream.unget.len());
for _ in 0..unget_read_size {
*out = stream.unget.pop().unwrap() as i8;
*out = stream.unget.pop().unwrap() as c_char;
out = out.offset(1);
}
left -= unget_read_size;
@@ -505,7 +505,10 @@ pub unsafe extern "C" fn flockfile(file: *mut FILE) {
#[no_mangle]
pub unsafe extern "C" fn fopen(filename: *const c_char, mode: *const c_char) -> *mut FILE {
let initial_mode = *mode;
if initial_mode != b'r' as i8 && initial_mode != b'w' as i8 && initial_mode != b'a' as i8 {
if initial_mode != b'r' as c_char
&& initial_mode != b'w' as c_char
&& initial_mode != b'a' as c_char
{
platform::ERRNO.set(errno::EINVAL);
return ptr::null_mut();
}
+1 -1
View File
@@ -466,7 +466,7 @@ pub unsafe extern "C" fn getsubopt(
i = i + 1;
continue;
}
if (*start.offset(len)) == b'=' as i8 {
if (*start.offset(len)) == b'=' as c_char {
*valuep = start.offset(len + 1);
} else if !start.offset(len).is_null() {
i = i + 1;
+1 -1
View File
@@ -620,7 +620,7 @@ pub unsafe extern "C" fn strpbrk(s1: *const c_char, s2: *const c_char) -> *mut c
#[no_mangle]
pub unsafe extern "C" fn strrchr(s: *const c_char, c: c_int) -> *mut c_char {
let len = strlen(s) as isize;
let c = c as i8;
let c = c as c_char;
let mut i = len - 1;
while i >= 0 {
if *s.offset(i) == c {
+1 -1
View File
@@ -143,7 +143,7 @@ unsafe fn inner_af_inet(
let mut addr = in_addr::default();
assert_eq!(
inet_aton(raw_addr.as_ptr() as *mut i8, &mut addr),
inet_aton(raw_addr.as_ptr() as *mut c_char, &mut addr),
1,
"inet_aton might be broken, failed to parse netstack address"
);
+1 -1
View File
@@ -42,7 +42,7 @@ pub type intptr_t = isize;
pub type uintptr_t = usize;
pub type ssize_t = isize;
pub type c_char = i8;
pub type c_char = core::ffi::c_char;
#[cfg(target_pointer_width = "32")]
pub type c_long = i32;
#[cfg(target_pointer_width = "32")]