diff --git a/src/header/stdio/mod.rs b/src/header/stdio/mod.rs index 52bee2737ec5f926028e8ce4303e599cebe7285e..e4d3eb1b9e356e286dab9ea91dd42a5067cf7a49 100644 --- a/src/header/stdio/mod.rs +++ b/src/header/stdio/mod.rs @@ -616,7 +616,7 @@ pub unsafe fn fseek_locked(stream: &mut FILE, mut off: off_t, whence: c_int) -> /// Seek to a position `pos` in the file from the beginning of the file #[no_mangle] pub unsafe extern "C" fn fsetpos(stream: *mut FILE, pos: *const fpos_t) -> c_int { - fseek(stream, *pos, SEEK_SET) + fseeko(stream, *pos, SEEK_SET) } /// Get the current position of the cursor in the file diff --git a/src/header/time/mod.rs b/src/header/time/mod.rs index dce14c03eb28a8d578d39c4b133e319b94d5c6a9..a2071e586e234d3feb43fc9d1ea800fd4fd6d052 100644 --- a/src/header/time/mod.rs +++ b/src/header/time/mod.rs @@ -163,14 +163,12 @@ pub extern "C" fn clock() -> clock_t { } let ts = unsafe { ts.assume_init() }; - if ts.tv_sec > time_t::max_value() / CLOCKS_PER_SEC - || ts.tv_nsec / (1_000_000_000 / CLOCKS_PER_SEC) - > time_t::max_value() - CLOCKS_PER_SEC * ts.tv_sec - { - return -1; + let clocks = ts.tv_sec * CLOCKS_PER_SEC as i64 + + (ts.tv_nsec / (1_000_000_000 / CLOCKS_PER_SEC)) as i64; + match clock_t::try_from(clocks) { + Ok(ok) => ok, + Err(_err) => -1, } - - ts.tv_sec * CLOCKS_PER_SEC + ts.tv_nsec / (1_000_000_000 / CLOCKS_PER_SEC) } // #[no_mangle] diff --git a/src/header/unistd/mod.rs b/src/header/unistd/mod.rs index 49169fa69ce16062b7c18e82e80332ed233926dc..ede590227d034a62b1f09c80f90bafb3531eea4a 100644 --- a/src/header/unistd/mod.rs +++ b/src/header/unistd/mod.rs @@ -603,7 +603,7 @@ pub extern "C" fn setuid(uid: uid_t) -> c_int { #[no_mangle] pub extern "C" fn sleep(seconds: c_uint) -> c_uint { let rqtp = timespec { - tv_sec: seconds as c_long, + tv_sec: seconds as time_t, tv_nsec: 0, }; let rmtp = ptr::null_mut(); @@ -731,7 +731,7 @@ pub unsafe extern "C" fn unlink(path: *const c_char) -> c_int { #[no_mangle] pub extern "C" fn usleep(useconds: useconds_t) -> c_int { let rqtp = timespec { - tv_sec: (useconds / 1_000_000) as c_long, + tv_sec: (useconds / 1_000_000) as time_t, tv_nsec: ((useconds % 1_000_000) * 1000) as c_long, }; let rmtp = ptr::null_mut(); diff --git a/src/platform/pte.rs b/src/platform/pte.rs index ee70a6e68f63142c4891459a4c230bb17138ace6..049f6868bfcdd6e19fc65399bf114d6958ea998c 100644 --- a/src/platform/pte.rs +++ b/src/platform/pte.rs @@ -14,7 +14,7 @@ use crate::{ tcb::{Master, Tcb}, }, platform::{ - types::{c_int, c_uint, c_long, c_void, pid_t, size_t}, + types::{c_int, c_uint, c_long, c_void, pid_t, size_t, time_t}, Pal, Sys, }, sync::{Mutex, Semaphore}, @@ -253,8 +253,8 @@ pub unsafe extern "C" fn pte_osThreadSleep(msecs: c_uint) { Sys::sched_yield(); } else { let tm = timespec { - tv_sec: msecs as c_long / 1000, - tv_nsec: (msecs % 1000) as c_long * 1000000, + tv_sec: msecs as time_t / 1000, + tv_nsec: ((msecs as c_long) % 1000) * 1000000, }; Sys::nanosleep(&tm, ptr::null_mut()); } @@ -353,9 +353,9 @@ pub unsafe extern "C" fn pte_osSemaphorePend( clock_gettime(CLOCK_MONOTONIC, &mut time); // Add timeout to time - let timeout = *pTimeout as c_long; + let timeout = *pTimeout as time_t; time.tv_sec += timeout / 1000; - time.tv_nsec += (timeout % 1000) * 1_000_000; + time.tv_nsec += ((timeout % 1000) * 1_000_000) as c_long; while time.tv_nsec >= 1_000_000_000 { time.tv_sec += 1; time.tv_nsec -= 1_000_000_000; diff --git a/src/platform/redox/mod.rs b/src/platform/redox/mod.rs index 405b10772b52fb67c0b02e615d55c786788bf857..58d07df9013ce4decaf9538539a80b3984528a15 100644 --- a/src/platform/redox/mod.rs +++ b/src/platform/redox/mod.rs @@ -190,7 +190,7 @@ impl Pal for Sys { -1 => -1, _ => { unsafe { - (*tp).tv_sec = redox_tp.tv_sec as c_long; + (*tp).tv_sec = redox_tp.tv_sec as time_t; (*tp).tv_nsec = redox_tp.tv_nsec as c_long; }; 0 @@ -702,7 +702,7 @@ impl Pal for Sys { _ => { unsafe { if !rmtp.is_null() { - (*rmtp).tv_sec = redox_rmtp.tv_sec as c_long; + (*rmtp).tv_sec = redox_rmtp.tv_sec as time_t; (*rmtp).tv_nsec = redox_rmtp.tv_nsec as c_long; } } diff --git a/src/platform/redox/signal.rs b/src/platform/redox/signal.rs index cfe0dc93190f610fffcea5f6149befb5e88d6603..801d947d95df38f3c9a4da41791de2c4d136af5b 100644 --- a/src/platform/redox/signal.rs +++ b/src/platform/redox/signal.rs @@ -39,9 +39,9 @@ impl PalSignal for Sys { } unsafe { - (*out).it_interval.tv_sec = spec.it_interval.tv_sec as c_long; + (*out).it_interval.tv_sec = spec.it_interval.tv_sec as time_t; (*out).it_interval.tv_usec = spec.it_interval.tv_nsec / 1000; - (*out).it_value.tv_sec = spec.it_value.tv_sec as c_long; + (*out).it_value.tv_sec = spec.it_value.tv_sec as time_t; (*out).it_value.tv_usec = spec.it_value.tv_nsec / 1000; } @@ -81,9 +81,9 @@ impl PalSignal for Sys { if count != !0 { unsafe { if !old.is_null() { - (*old).it_interval.tv_sec = spec.it_interval.tv_sec as c_long; + (*old).it_interval.tv_sec = spec.it_interval.tv_sec as time_t; (*old).it_interval.tv_usec = spec.it_interval.tv_nsec / 1000; - (*old).it_value.tv_sec = spec.it_value.tv_sec as c_long; + (*old).it_value.tv_sec = spec.it_value.tv_sec as time_t; (*old).it_value.tv_usec = spec.it_value.tv_nsec / 1000; }