Add time syscall and default localtime support
This commit is contained in:
parent
ef7b663c4d
commit
64a980f529
@ -285,7 +285,7 @@ macro_rules! process_syscall_table_with_callback {
|
||||
(Lremovexattr = 198) => handle_unsupported(),
|
||||
(Fremovexattr = 199) => handle_unsupported(),
|
||||
(Tkill = 200) => do_tkill(tid: pid_t, sig: c_int),
|
||||
(Time = 201) => handle_unsupported(),
|
||||
(Time = 201) => do_time(tloc_u: *mut time_t),
|
||||
(Futex = 202) => do_futex(futex_addr: *const i32, futex_op: u32, futex_val: i32, timeout: u64, futex_new_addr: *const i32, bitset: u32),
|
||||
(SchedSetaffinity = 203) => do_sched_setaffinity(pid: pid_t, cpusize: size_t, buf: *const c_uchar),
|
||||
(SchedGetaffinity = 204) => do_sched_getaffinity(pid: pid_t, cpusize: size_t, buf: *mut c_uchar),
|
||||
@ -833,6 +833,17 @@ fn do_clock_gettime(clockid: clockid_t, ts_u: *mut timespec_t) -> Result<isize>
|
||||
Ok(0)
|
||||
}
|
||||
|
||||
fn do_time(tloc_u: *mut time_t) -> Result<isize> {
|
||||
let ts = time::do_clock_gettime(time::ClockID::CLOCK_REALTIME)?;
|
||||
if !tloc_u.is_null() {
|
||||
check_mut_ptr(tloc_u)?;
|
||||
unsafe {
|
||||
*tloc_u = ts.sec();
|
||||
}
|
||||
}
|
||||
Ok(ts.sec() as isize)
|
||||
}
|
||||
|
||||
fn do_clock_getres(clockid: clockid_t, res_u: *mut timespec_t) -> Result<isize> {
|
||||
if res_u.is_null() {
|
||||
return Ok(0);
|
||||
|
@ -50,6 +50,24 @@ int test_clock_getres() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// Test cases for localtime
|
||||
// ============================================================================
|
||||
|
||||
int test_get_localtime() {
|
||||
time_t t = time(NULL);
|
||||
if (t == (time_t) -1) {
|
||||
THROW_ERROR("failed to get time");
|
||||
}
|
||||
struct tm *local_time = localtime(&t);
|
||||
if (local_time == NULL) {
|
||||
THROW_ERROR("failed to convert a time value to a local time");
|
||||
}
|
||||
printf("Offset to GMT is %lds.\n", local_time->tm_gmtoff);
|
||||
printf("The time zone is '%s'.\n", local_time->tm_zone);
|
||||
return 0;
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// Test suite
|
||||
// ============================================================================
|
||||
@ -58,6 +76,7 @@ static test_case_t test_cases[] = {
|
||||
TEST_CASE(test_gettimeofday),
|
||||
TEST_CASE(test_clock_gettime),
|
||||
TEST_CASE(test_clock_getres),
|
||||
TEST_CASE(test_get_localtime),
|
||||
};
|
||||
|
||||
int main() {
|
||||
|
11
tools/occlum
11
tools/occlum
@ -157,15 +157,19 @@ cmd_init() {
|
||||
mkdir -p image/tmp
|
||||
mkdir -p image/dev
|
||||
mkdir -p image/proc
|
||||
mkdir -p image/etc
|
||||
local occlum_glibc_lib=/opt/occlum/glibc/lib
|
||||
local occlum_glibc_etc=/opt/occlum/glibc/etc
|
||||
local cpu_lib=/sys/devices/system/cpu
|
||||
if [ -d "$occlum_glibc_lib" ]; then
|
||||
mkdir -p "image/$occlum_glibc_lib"
|
||||
mkdir -p "image/$cpu_lib"
|
||||
mkdir -p "image/$occlum_glibc_etc"
|
||||
fi
|
||||
# add default /etc/hosts
|
||||
mkdir -p image/etc
|
||||
echo "127.0.0.1 localhost" > image/etc/hosts
|
||||
# add default timezone file
|
||||
cp /etc/localtime image/etc/
|
||||
|
||||
# add musl
|
||||
local occlum_musl_lib=/usr/local/occlum/x86_64-linux-musl/lib
|
||||
@ -195,6 +199,8 @@ cmd_init() {
|
||||
"/usr/lib64/libstdc++.so.6" \
|
||||
"/usr/lib64/libgcc_s.so.1"
|
||||
fi
|
||||
cp -t "image/$occlum_glibc_etc" \
|
||||
/etc/localtime
|
||||
cp -t "image/$cpu_lib" \
|
||||
"$cpu_lib/online"
|
||||
fi
|
||||
@ -207,6 +213,9 @@ cmd_init() {
|
||||
mkdir -p initfs/etc
|
||||
# add default /etc/hosts
|
||||
echo "127.0.0.1 localhost" > initfs/etc/hosts
|
||||
# add default timezone file
|
||||
cp /etc/localtime initfs/etc/
|
||||
|
||||
# add musl
|
||||
local occlum_musl_lib=/usr/local/occlum/x86_64-linux-musl/lib
|
||||
cp -t initfs/lib \
|
||||
|
Loading…
Reference in New Issue
Block a user