[libos] Add status_flags support for stdio
This commit is contained in:
		
							parent
							
								
									cd5d9e6d57
								
							
						
					
					
						commit
						626ea3dc7c
					
				| @ -83,12 +83,7 @@ impl File for EventFile { | ||||
|     } | ||||
| 
 | ||||
|     fn set_status_flags(&self, new_status_flags: StatusFlags) -> Result<()> { | ||||
|         let valid_flags_mask = StatusFlags::O_APPEND | ||||
|             | StatusFlags::O_ASYNC | ||||
|             | StatusFlags::O_DIRECT | ||||
|             | StatusFlags::O_NOATIME | ||||
|             | StatusFlags::O_NONBLOCK; | ||||
|         let raw_status_flags = (new_status_flags & valid_flags_mask).bits(); | ||||
|         let raw_status_flags = (new_status_flags & STATUS_FLAGS_MASK).bits(); | ||||
|         try_libc!(libc::ocall::fcntl_arg1( | ||||
|             self.host_fd(), | ||||
|             libc::F_SETFL, | ||||
|  | ||||
| @ -111,6 +111,15 @@ bitflags! { | ||||
|         const O_PATH = 1 << 21; | ||||
|     } | ||||
| } | ||||
| // On Linux, F_SETFL can change only the O_APPEND,
 | ||||
| // O_ASYNC, O_DIRECT, O_NOATIME, and O_NONBLOCK flags
 | ||||
| pub const STATUS_FLAGS_MASK: StatusFlags = StatusFlags::from_bits_truncate( | ||||
|     StatusFlags::O_APPEND.bits() | ||||
|         | StatusFlags::O_ASYNC.bits() | ||||
|         | StatusFlags::O_DIRECT.bits() | ||||
|         | StatusFlags::O_NOATIME.bits() | ||||
|         | StatusFlags::O_NONBLOCK.bits(), | ||||
| ); | ||||
| 
 | ||||
| impl StatusFlags { | ||||
|     pub fn always_append(&self) -> bool { | ||||
|  | ||||
| @ -8,7 +8,7 @@ pub use self::close::do_close; | ||||
| pub use self::dup::{do_dup, do_dup2, do_dup3}; | ||||
| pub use self::fallocate::{do_fallocate, FallocateFlags}; | ||||
| pub use self::fcntl::{do_fcntl, FcntlCmd}; | ||||
| pub use self::file_flags::{AccessMode, CreationFlags, StatusFlags}; | ||||
| pub use self::file_flags::{AccessMode, CreationFlags, StatusFlags, STATUS_FLAGS_MASK}; | ||||
| pub use self::flock::do_flock; | ||||
| pub use self::fspath::{get_abs_path_by_fd, FsPath, AT_FDCWD}; | ||||
| pub use self::fsync::{do_fdatasync, do_fsync}; | ||||
|  | ||||
| @ -176,14 +176,8 @@ impl File for INodeFile { | ||||
| 
 | ||||
|     fn set_status_flags(&self, new_status_flags: StatusFlags) -> Result<()> { | ||||
|         let mut status_flags = self.status_flags.write().unwrap(); | ||||
|         // Currently, F_SETFL can change only the O_APPEND,
 | ||||
|         // O_ASYNC, O_NOATIME, and O_NONBLOCK flags
 | ||||
|         let valid_flags_mask = StatusFlags::O_APPEND | ||||
|             | StatusFlags::O_ASYNC | ||||
|             | StatusFlags::O_NOATIME | ||||
|             | StatusFlags::O_NONBLOCK; | ||||
|         status_flags.remove(valid_flags_mask); | ||||
|         status_flags.insert(new_status_flags & valid_flags_mask); | ||||
|         status_flags.remove(STATUS_FLAGS_MASK); | ||||
|         status_flags.insert(new_status_flags & STATUS_FLAGS_MASK); | ||||
|         Ok(()) | ||||
|     } | ||||
| 
 | ||||
|  | ||||
| @ -21,6 +21,7 @@ pub use self::file::{File, FileRef}; | ||||
| pub use self::file_ops::{ | ||||
|     occlum_ocall_ioctl, utimbuf_t, AccessMode, BuiltinIoctlNum, CreationFlags, FallocateFlags, | ||||
|     FileMode, IfConf, IoctlCmd, Stat, StatusFlags, StructuredIoctlArgType, StructuredIoctlNum, | ||||
|     STATUS_FLAGS_MASK, | ||||
| }; | ||||
| pub use self::file_table::{FileDesc, FileTable, FileTableEvent, FileTableNotifier}; | ||||
| pub use self::fs_ops::Statfs; | ||||
|  | ||||
| @ -213,6 +213,24 @@ impl File for StdoutFile { | ||||
|         Ok(ret) | ||||
|     } | ||||
| 
 | ||||
|     fn status_flags(&self) -> Result<StatusFlags> { | ||||
|         let ret = try_libc!(libc::ocall::fcntl_arg0( | ||||
|             self.host_fd() as i32, | ||||
|             libc::F_GETFL | ||||
|         )); | ||||
|         Ok(StatusFlags::from_bits_truncate(ret as u32)) | ||||
|     } | ||||
| 
 | ||||
|     fn set_status_flags(&self, new_status_flags: StatusFlags) -> Result<()> { | ||||
|         let raw_status_flags = (new_status_flags & STATUS_FLAGS_MASK).bits(); | ||||
|         try_libc!(libc::ocall::fcntl_arg1( | ||||
|             self.host_fd() as i32, | ||||
|             libc::F_SETFL, | ||||
|             raw_status_flags as c_int | ||||
|         )); | ||||
|         Ok(()) | ||||
|     } | ||||
| 
 | ||||
|     fn as_any(&self) -> &dyn Any { | ||||
|         self | ||||
|     } | ||||
| @ -375,6 +393,24 @@ impl File for StdinFile { | ||||
|         Ok(ret) | ||||
|     } | ||||
| 
 | ||||
|     fn status_flags(&self) -> Result<StatusFlags> { | ||||
|         let ret = try_libc!(libc::ocall::fcntl_arg0( | ||||
|             self.host_fd() as i32, | ||||
|             libc::F_GETFL | ||||
|         )); | ||||
|         Ok(StatusFlags::from_bits_truncate(ret as u32)) | ||||
|     } | ||||
| 
 | ||||
|     fn set_status_flags(&self, new_status_flags: StatusFlags) -> Result<()> { | ||||
|         let raw_status_flags = (new_status_flags & STATUS_FLAGS_MASK).bits(); | ||||
|         try_libc!(libc::ocall::fcntl_arg1( | ||||
|             self.host_fd() as i32, | ||||
|             libc::F_SETFL, | ||||
|             raw_status_flags as c_int | ||||
|         )); | ||||
|         Ok(()) | ||||
|     } | ||||
| 
 | ||||
|     fn as_any(&self) -> &dyn Any { | ||||
|         self | ||||
|     } | ||||
|  | ||||
| @ -130,12 +130,7 @@ impl File for TimerFile { | ||||
|     } | ||||
| 
 | ||||
|     fn set_status_flags(&self, new_status_flags: StatusFlags) -> Result<()> { | ||||
|         let valid_flags_mask = StatusFlags::O_APPEND | ||||
|             | StatusFlags::O_ASYNC | ||||
|             | StatusFlags::O_DIRECT | ||||
|             | StatusFlags::O_NOATIME | ||||
|             | StatusFlags::O_NONBLOCK; | ||||
|         let raw_status_flags = (new_status_flags & valid_flags_mask).bits(); | ||||
|         let raw_status_flags = (new_status_flags & STATUS_FLAGS_MASK).bits(); | ||||
|         try_libc!(libc::ocall::fcntl_arg1( | ||||
|             self.host_fd(), | ||||
|             libc::F_SETFL, | ||||
|  | ||||
| @ -6,7 +6,7 @@ use atomic::{Atomic, Ordering}; | ||||
| use super::*; | ||||
| use crate::fs::{ | ||||
|     occlum_ocall_ioctl, AccessMode, AtomicIoEvents, CreationFlags, File, FileRef, HostFd, IoEvents, | ||||
|     IoctlCmd, StatusFlags, | ||||
|     IoctlCmd, StatusFlags, STATUS_FLAGS_MASK, | ||||
| }; | ||||
| 
 | ||||
| //TODO: refactor write syscall to allow zero length with non-zero buffer
 | ||||
| @ -63,12 +63,7 @@ impl File for HostSocket { | ||||
|     } | ||||
| 
 | ||||
|     fn set_status_flags(&self, new_status_flags: StatusFlags) -> Result<()> { | ||||
|         let valid_flags_mask = StatusFlags::O_APPEND | ||||
|             | StatusFlags::O_ASYNC | ||||
|             | StatusFlags::O_DIRECT | ||||
|             | StatusFlags::O_NOATIME | ||||
|             | StatusFlags::O_NONBLOCK; | ||||
|         let raw_status_flags = (new_status_flags & valid_flags_mask).bits(); | ||||
|         let raw_status_flags = (new_status_flags & STATUS_FLAGS_MASK).bits(); | ||||
|         try_libc!(libc::ocall::fcntl_arg1( | ||||
|             self.raw_host_fd() as i32, | ||||
|             libc::F_SETFL, | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user