add sys_getcwd

This commit is contained in:
WangRunji 2019-03-06 00:23:36 +08:00 committed by Tate Tian
parent a3c49c2a3e
commit 0cf714f54e
3 changed files with 33 additions and 0 deletions

@ -43,6 +43,8 @@ extern void* occlum_brk(void* addr);
extern int occlum_gettimeofday(struct timeval* tv/*, struct timezone* tz*/); 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); extern int occlum_unknown(int num);
#ifdef __cplusplus #ifdef __cplusplus

@ -494,3 +494,28 @@ pub extern "C" fn occlum_gettimeofday(tv: *mut timeval_t) -> c_int {
Err(e) => e.errno.as_retval(), 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(),
}
}

@ -154,6 +154,12 @@ long dispatch_syscall(int num, long arg0, long arg1, long arg2, long arg3, long
ret = (long) occlum_gettimeofday(tv/*, tz*/); ret = (long) occlum_gettimeofday(tv/*, tz*/);
break; 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: default:
ret = occlum_unknown(num); ret = occlum_unknown(num);
break; break;