| 83 | } |
| 84 | |
| 85 | pub fn open_file(name: &str, flags: OpenFlags) -> Option<Arc<OSInode>> { |
| 86 | let (readable, writable) = flags.read_write(); |
| 87 | if flags.contains(OpenFlags::CREATE) { |
| 88 | if let Some(inode) = ROOT_INODE.find(name) { |
| 89 | // clear size |
| 90 | inode.clear(); |
| 91 | Some(Arc::new(OSInode::new(readable, writable, inode))) |
| 92 | } else { |
| 93 | // create file |
| 94 | ROOT_INODE |
| 95 | .create(name) |
| 96 | .map(|inode| Arc::new(OSInode::new(readable, writable, inode))) |
| 97 | } |
| 98 | } else { |
| 99 | ROOT_INODE.find(name).map(|inode| { |
| 100 | if flags.contains(OpenFlags::TRUNC) { |
| 101 | inode.clear(); |
| 102 | } |
| 103 | Arc::new(OSInode::new(readable, writable, inode)) |
| 104 | }) |
| 105 | } |
| 106 | } |
| 107 | |
| 108 | impl File for OSInode { |
| 109 | fn readable(&self) -> bool { |