From 0cf714f54e8bce1782d84df9d9db1074465931ac Mon Sep 17 00:00:00 2001 From: WangRunji Date: Wed, 6 Mar 2019 00:23:36 +0800 Subject: [PATCH] add sys_getcwd --- src/libos/include/syscall.h | 2 ++ src/libos/src/syscall/mod.rs | 25 +++++++++++++++++++++++++ src/libos/src/syscall/syscall_entry.c | 6 ++++++ 3 files changed, 33 insertions(+) diff --git a/src/libos/include/syscall.h b/src/libos/include/syscall.h index 756807f7..fc6d0a35 100644 --- a/src/libos/include/syscall.h +++ b/src/libos/include/syscall.h @@ -43,6 +43,8 @@ extern void* occlum_brk(void* addr); extern int occlum_gettimeofday(struct timeval* tv/*, struct timezone* tz*/); +extern int occlum_getcwd(char* buf, size_t size); + extern int occlum_unknown(int num); #ifdef __cplusplus diff --git a/src/libos/src/syscall/mod.rs b/src/libos/src/syscall/mod.rs index 39688217..e4dc7a9f 100644 --- a/src/libos/src/syscall/mod.rs +++ b/src/libos/src/syscall/mod.rs @@ -494,3 +494,28 @@ pub extern "C" fn occlum_gettimeofday(tv: *mut timeval_t) -> c_int { Err(e) => e.errno.as_retval(), } } + +#[no_mangle] +pub extern "C" fn occlum_getcwd(buf: *mut c_void, size: size_t) -> c_int { + + fn do_getcwd(buf: *mut u8, size: usize) -> Result<(), Error> { + let safe_buf = { + check_mut_array(buf, size)?; + unsafe { std::slice::from_raw_parts_mut(buf, size) } + }; + let proc_ref = process::get_current(); + let mut proc = proc_ref.lock().unwrap(); + let cwd = proc.get_exec_path(); + if cwd.len() + 1 > safe_buf.len() { + return Err(Error::new(ERANGE, "buf is not long enough")); + } + safe_buf[..cwd.len()].copy_from_slice(cwd.as_bytes()); + safe_buf[cwd.len()] = 0; + Ok(()) + } + + match do_getcwd(buf as *mut u8, size as usize) { + Ok(()) => 0 as c_int, + Err(e) => e.errno.as_retval(), + } +} diff --git a/src/libos/src/syscall/syscall_entry.c b/src/libos/src/syscall/syscall_entry.c index ba4579f9..9c9f5690 100644 --- a/src/libos/src/syscall/syscall_entry.c +++ b/src/libos/src/syscall/syscall_entry.c @@ -154,6 +154,12 @@ long dispatch_syscall(int num, long arg0, long arg1, long arg2, long arg3, long ret = (long) occlum_gettimeofday(tv/*, tz*/); break; } + case SYS_getcwd: { + DECL_SYSCALL_ARG(char*, buf, arg0); + DECL_SYSCALL_ARG(size_t, buf_size, arg1); + ret = (long) occlum_getcwd(buf, buf_size); + break; + } default: ret = occlum_unknown(num); break;