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