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_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;
|
||||||
|
Loading…
Reference in New Issue
Block a user