add sys_getcwd
This commit is contained in:
parent
a3c49c2a3e
commit
0cf714f54e
@ -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
|
||||
|
@ -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(),
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user