Fix building on targets with unsigned c_char
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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
@@ -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,
|
||||
};
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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"
|
||||
);
|
||||
|
||||
@@ -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")]
|
||||
|
||||
Reference in New Issue
Block a user