Add access and faccessat
This commit is contained in:
		
							parent
							
								
									b003f4ce43
								
							
						
					
					
						commit
						d7e266d0e3
					
				
							
								
								
									
										52
									
								
								src/libos/src/fs/access.rs
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										52
									
								
								src/libos/src/fs/access.rs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,52 @@ | |||||||
|  | use super::*; | ||||||
|  | 
 | ||||||
|  | //int faccessat(int dirfd, const char *pathname, int mode, int flags);
 | ||||||
|  | //int access(const char *pathname, int mode);
 | ||||||
|  | 
 | ||||||
|  | bitflags! { | ||||||
|  |     pub struct AccessModes : u32 { | ||||||
|  |         const X_OK = 1; | ||||||
|  |         const W_OK = 2; | ||||||
|  |         const R_OK = 4; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | impl AccessModes { | ||||||
|  |     pub fn from_u32(bits: u32) -> Result<AccessModes, Error> { | ||||||
|  |         AccessModes::from_bits(bits).ok_or_else(|| Error::new(Errno::EINVAL, "invalid mode")) | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | bitflags! { | ||||||
|  |     pub struct AccessFlags : u32 { | ||||||
|  |         const AT_SYMLINK_NOFOLLOW = 0x100; | ||||||
|  |         const AT_EACCESS          = 0x200; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | impl AccessFlags { | ||||||
|  |     pub fn from_u32(bits: u32) -> Result<AccessFlags, Error> { | ||||||
|  |         AccessFlags::from_bits(bits).ok_or_else(|| Error::new(Errno::EINVAL, "invalid flags")) | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | pub const AT_FDCWD : i32 = -100; | ||||||
|  | 
 | ||||||
|  | pub fn do_faccessat(dirfd: Option<FileDesc>, path: &str, mode: AccessModes, flags: AccessFlags) -> Result<(), Error> { | ||||||
|  |     match dirfd { | ||||||
|  |         // TODO: handle dirfd
 | ||||||
|  |         Some(dirfd) => errno!(ENOSYS, "cannot accept dirfd"), | ||||||
|  |         None => do_access(path, mode), | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | pub fn do_access(path: &str, mode: AccessModes) -> Result<(), Error> { | ||||||
|  |     let current_ref = process::get_current(); | ||||||
|  |     let mut current = current_ref.lock().unwrap(); | ||||||
|  |     let inode = current.lookup_inode(path)?; | ||||||
|  |     //let metadata = inode.get_metadata();
 | ||||||
|  |     // TODO: check metadata.mode with mode
 | ||||||
|  |     Ok(()) | ||||||
|  | } | ||||||
| @ -11,12 +11,14 @@ pub use self::file_table::{FileDesc, FileTable}; | |||||||
| pub use self::inode_file::{INodeExt, INodeFile, ROOT_INODE}; | pub use self::inode_file::{INodeExt, INodeFile, ROOT_INODE}; | ||||||
| use self::inode_file::OpenOptions; | use self::inode_file::OpenOptions; | ||||||
| pub use self::pipe::Pipe; | pub use self::pipe::Pipe; | ||||||
|  | pub use self::access::{AccessModes, AccessFlags, AT_FDCWD, do_access, do_faccessat}; | ||||||
| 
 | 
 | ||||||
| mod file; | mod file; | ||||||
| mod file_table; | mod file_table; | ||||||
| mod inode_file; | mod inode_file; | ||||||
| mod pipe; | mod pipe; | ||||||
| mod sgx_impl; | mod sgx_impl; | ||||||
|  | mod access; | ||||||
| 
 | 
 | ||||||
| // TODO: use the type defined in Rust libc.
 | // TODO: use the type defined in Rust libc.
 | ||||||
| //
 | //
 | ||||||
|  | |||||||
| @ -1,6 +1,5 @@ | |||||||
| use {fs, process, std, vm}; | use {fs, process, std, vm}; | ||||||
| use fs::{FileDesc, off_t}; | use fs::{File, FileDesc, off_t, AccessModes, AccessFlags, AT_FDCWD}; | ||||||
| use fs::File; |  | ||||||
| use prelude::*; | use prelude::*; | ||||||
| use process::{ChildProcessFilter, FileAction, pid_t, CloneFlags, FutexFlags, FutexOp}; | use process::{ChildProcessFilter, FileAction, pid_t, CloneFlags, FutexFlags, FutexOp}; | ||||||
| use std::ffi::{CStr, CString}; | use std::ffi::{CStr, CString}; | ||||||
| @ -57,6 +56,8 @@ pub extern "C" fn dispatch_syscall( | |||||||
|         SYS_STAT => do_stat(arg0 as *const i8, arg1 as *mut fs::Stat), |         SYS_STAT => do_stat(arg0 as *const i8, arg1 as *mut fs::Stat), | ||||||
|         SYS_FSTAT => do_fstat(arg0 as FileDesc, arg1 as *mut fs::Stat), |         SYS_FSTAT => do_fstat(arg0 as FileDesc, arg1 as *mut fs::Stat), | ||||||
|         SYS_LSTAT => do_lstat(arg0 as *const i8, arg1 as *mut fs::Stat), |         SYS_LSTAT => do_lstat(arg0 as *const i8, arg1 as *mut fs::Stat), | ||||||
|  |         SYS_ACCESS => do_access(arg0 as *const i8, arg1 as u32), | ||||||
|  |         SYS_FACCESSAT => do_faccessat(arg0 as i32, arg1 as *const i8, arg2 as u32, arg3 as u32), | ||||||
|         SYS_LSEEK => do_lseek(arg0 as FileDesc, arg1 as off_t, arg2 as i32), |         SYS_LSEEK => do_lseek(arg0 as FileDesc, arg1 as off_t, arg2 as i32), | ||||||
|         SYS_FSYNC => do_fsync(arg0 as FileDesc), |         SYS_FSYNC => do_fsync(arg0 as FileDesc), | ||||||
|         SYS_FDATASYNC => do_fdatasync(arg0 as FileDesc), |         SYS_FDATASYNC => do_fdatasync(arg0 as FileDesc), | ||||||
| @ -730,3 +731,23 @@ fn do_prlimit(pid: pid_t, resource: u32, new_limit: *const rlimit_t, old_limit: | |||||||
|     }; |     }; | ||||||
|     misc::do_prlimit(pid, resource, new_limit, old_limit).map(|_| 0) |     misc::do_prlimit(pid, resource, new_limit, old_limit).map(|_| 0) | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | fn do_access(path: *const i8, mode: u32) -> Result<isize, Error> { | ||||||
|  |     let path = clone_cstring_safely(path)?.to_string_lossy().into_owned(); | ||||||
|  |     let mode = AccessModes::from_u32(mode)?; | ||||||
|  |     fs::do_access(&path, mode).map(|_| 0) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | fn do_faccessat(dirfd: i32, path: *const i8, mode: u32, flags: u32) -> Result<isize, Error> { | ||||||
|  |     let dirfd = if dirfd >= 0 { | ||||||
|  |         Some(dirfd as FileDesc) | ||||||
|  |     } else if dirfd == AT_FDCWD { | ||||||
|  |         None | ||||||
|  |     } else { | ||||||
|  |         return errno!(EINVAL, "invalid dirfd"); | ||||||
|  |     }; | ||||||
|  |     let path = clone_cstring_safely(path)?.to_string_lossy().into_owned(); | ||||||
|  |     let mode = AccessModes::from_u32(mode)?; | ||||||
|  |     let flags = AccessFlags::from_u32(flags)?; | ||||||
|  |     fs::do_faccessat(dirfd, &path, mode, flags).map(|_| 0) | ||||||
|  | } | ||||||
|  | |||||||
| @ -21,6 +21,11 @@ int main(int argc, const char* argv[]) { | |||||||
|         return fd; |         return fd; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     if (access(FILE_NAME, F_OK) < 0) { | ||||||
|  |         printf("cannot access the new file\n"); | ||||||
|  |         return -1; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     ret = ftruncate(fd, TRUNC_LEN); |     ret = ftruncate(fd, TRUNC_LEN); | ||||||
|     if (ret < 0) { |     if (ret < 0) { | ||||||
|         printf("failed to ftruncate the file\n"); |         printf("failed to ftruncate the file\n"); | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user