use errno! macro for all error
This commit is contained in:
		
							parent
							
								
									b99344d7f5
								
							
						
					
					
						commit
						54243c543a
					
				| @ -37,7 +37,7 @@ impl SgxFile { | |||||||
|         is_append: bool, |         is_append: bool, | ||||||
|     ) -> Result<SgxFile, Error> { |     ) -> Result<SgxFile, Error> { | ||||||
|         if !is_readable && !is_writable { |         if !is_readable && !is_writable { | ||||||
|             return Err(Error::new(Errno::EINVAL, "Invalid permissions")); |             return errno!(EINVAL, "Invalid permissions"); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         Ok(SgxFile { |         Ok(SgxFile { | ||||||
| @ -132,7 +132,7 @@ struct SgxFileInner { | |||||||
| impl SgxFileInner { | impl SgxFileInner { | ||||||
|     pub fn write(&mut self, buf: &[u8]) -> Result<usize, Error> { |     pub fn write(&mut self, buf: &[u8]) -> Result<usize, Error> { | ||||||
|         if !self.is_writable { |         if !self.is_writable { | ||||||
|             return Err(Error::new(Errno::EINVAL, "File not writable")); |             return errno!(EINVAL, "File not writable"); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         let mut file_guard = self.file.lock().unwrap(); |         let mut file_guard = self.file.lock().unwrap(); | ||||||
| @ -160,7 +160,7 @@ impl SgxFileInner { | |||||||
| 
 | 
 | ||||||
|     pub fn read(&mut self, buf: &mut [u8]) -> Result<usize, Error> { |     pub fn read(&mut self, buf: &mut [u8]) -> Result<usize, Error> { | ||||||
|         if !self.is_readable { |         if !self.is_readable { | ||||||
|             return Err(Error::new(Errno::EINVAL, "File not readable")); |             return errno!(EINVAL, "File not readable"); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         let mut file_guard = self.file.lock().unwrap(); |         let mut file_guard = self.file.lock().unwrap(); | ||||||
| @ -193,7 +193,7 @@ impl SgxFileInner { | |||||||
|                     let backward_offset = (-relative_offset) as usize; |                     let backward_offset = (-relative_offset) as usize; | ||||||
|                     if self.pos < backward_offset { |                     if self.pos < backward_offset { | ||||||
|                         // underflow
 |                         // underflow
 | ||||||
|                         return Err(Error::new(Errno::EINVAL, "Invalid seek position")); |                         return errno!(EINVAL, "Invalid seek position"); | ||||||
|                     } |                     } | ||||||
|                     SeekFrom::Start((self.pos - backward_offset) as u64) |                     SeekFrom::Start((self.pos - backward_offset) as u64) | ||||||
|                 } |                 } | ||||||
| @ -209,7 +209,7 @@ impl SgxFileInner { | |||||||
| 
 | 
 | ||||||
|     pub fn writev(&mut self, bufs: &[&[u8]]) -> Result<usize, Error> { |     pub fn writev(&mut self, bufs: &[&[u8]]) -> Result<usize, Error> { | ||||||
|         if !self.is_writable { |         if !self.is_writable { | ||||||
|             return Err(Error::new(Errno::EINVAL, "File not writable")); |             return errno!(EINVAL, "File not writable"); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         let mut file_guard = self.file.lock().unwrap(); |         let mut file_guard = self.file.lock().unwrap(); | ||||||
| @ -235,7 +235,7 @@ impl SgxFileInner { | |||||||
|                 Err(e) => { |                 Err(e) => { | ||||||
|                     match total_bytes { |                     match total_bytes { | ||||||
|                         // a complete failure
 |                         // a complete failure
 | ||||||
|                         0 => return Err(Error::new(Errno::EINVAL, "Failed to write")), |                         0 => return errno!(EINVAL, "Failed to write"), | ||||||
|                         // a partially failure
 |                         // a partially failure
 | ||||||
|                         _ => break, |                         _ => break, | ||||||
|                     } |                     } | ||||||
| @ -249,7 +249,7 @@ impl SgxFileInner { | |||||||
| 
 | 
 | ||||||
|     fn readv(&mut self, bufs: &mut [&mut [u8]]) -> Result<usize, Error> { |     fn readv(&mut self, bufs: &mut [&mut [u8]]) -> Result<usize, Error> { | ||||||
|         if !self.is_readable { |         if !self.is_readable { | ||||||
|             return Err(Error::new(Errno::EINVAL, "File not readable")); |             return errno!(EINVAL, "File not readable"); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         let mut file_guard = self.file.lock().unwrap(); |         let mut file_guard = self.file.lock().unwrap(); | ||||||
| @ -271,7 +271,7 @@ impl SgxFileInner { | |||||||
|                 Err(e) => { |                 Err(e) => { | ||||||
|                     match total_bytes { |                     match total_bytes { | ||||||
|                         // a complete failure
 |                         // a complete failure
 | ||||||
|                         0 => return Err(Error::new(Errno::EINVAL, "Failed to write")), |                         0 => return errno!(EINVAL, "Failed to write"), | ||||||
|                         // a partially failure
 |                         // a partially failure
 | ||||||
|                         _ => break, |                         _ => break, | ||||||
|                     } |                     } | ||||||
| @ -307,7 +307,7 @@ impl StdoutFile { | |||||||
| 
 | 
 | ||||||
| impl File for StdoutFile { | impl File for StdoutFile { | ||||||
|     fn read(&self, buf: &mut [u8]) -> Result<usize, Error> { |     fn read(&self, buf: &mut [u8]) -> Result<usize, Error> { | ||||||
|         Err(Error::new(Errno::EBADF, "Stdout does not support read")) |         errno!(EBADF, "Stdout does not support read") | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fn write(&self, buf: &[u8]) -> Result<usize, Error> { |     fn write(&self, buf: &[u8]) -> Result<usize, Error> { | ||||||
| @ -329,7 +329,7 @@ impl File for StdoutFile { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fn readv(&self, bufs: &mut [&mut [u8]]) -> Result<usize, Error> { |     fn readv(&self, bufs: &mut [&mut [u8]]) -> Result<usize, Error> { | ||||||
|         Err(Error::new(Errno::EBADF, "Stdout does not support read")) |         errno!(EBADF, "Stdout does not support read") | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fn writev(&self, bufs: &[&[u8]]) -> Result<usize, Error> { |     fn writev(&self, bufs: &[&[u8]]) -> Result<usize, Error> { | ||||||
| @ -346,7 +346,7 @@ impl File for StdoutFile { | |||||||
|                 Err(e) => { |                 Err(e) => { | ||||||
|                     match total_bytes { |                     match total_bytes { | ||||||
|                         // a complete failure
 |                         // a complete failure
 | ||||||
|                         0 => return Err(Error::new(Errno::EINVAL, "Failed to write")), |                         0 => return errno!(EINVAL, "Failed to write"), | ||||||
|                         // a partially failure
 |                         // a partially failure
 | ||||||
|                         _ => break, |                         _ => break, | ||||||
|                     } |                     } | ||||||
| @ -357,7 +357,7 @@ impl File for StdoutFile { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fn seek(&self, seek_pos: SeekFrom) -> Result<off_t, Error> { |     fn seek(&self, seek_pos: SeekFrom) -> Result<off_t, Error> { | ||||||
|         Err(Error::new(Errno::ESPIPE, "Stdout does not support seek")) |         errno!(ESPIPE, "Stdout does not support seek") | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fn metadata(&self) -> Result<Metadata, Error> { |     fn metadata(&self) -> Result<Metadata, Error> { | ||||||
| @ -414,7 +414,7 @@ impl File for StdinFile { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fn write(&self, buf: &[u8]) -> Result<usize, Error> { |     fn write(&self, buf: &[u8]) -> Result<usize, Error> { | ||||||
|         Err(Error::new(Errno::EBADF, "Stdin does not support write")) |         errno!(EBADF, "Stdin does not support write") | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fn read_at(&self, offset: usize, buf: &mut [u8]) -> Result<usize, Error> { |     fn read_at(&self, offset: usize, buf: &mut [u8]) -> Result<usize, Error> { | ||||||
| @ -439,7 +439,7 @@ impl File for StdinFile { | |||||||
|                 Err(e) => { |                 Err(e) => { | ||||||
|                     match total_bytes { |                     match total_bytes { | ||||||
|                         // a complete failure
 |                         // a complete failure
 | ||||||
|                         0 => return Err(Error::new(Errno::EINVAL, "Failed to write")), |                         0 => return errno!(EINVAL, "Failed to write"), | ||||||
|                         // a partially failure
 |                         // a partially failure
 | ||||||
|                         _ => break, |                         _ => break, | ||||||
|                     } |                     } | ||||||
| @ -450,11 +450,11 @@ impl File for StdinFile { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fn writev(&self, bufs: &[&[u8]]) -> Result<usize, Error> { |     fn writev(&self, bufs: &[&[u8]]) -> Result<usize, Error> { | ||||||
|         Err(Error::new(Errno::EBADF, "Stdin does not support write")) |         errno!(EBADF, "Stdin does not support write") | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fn seek(&self, pos: SeekFrom) -> Result<off_t, Error> { |     fn seek(&self, pos: SeekFrom) -> Result<off_t, Error> { | ||||||
|         Err(Error::new(Errno::ESPIPE, "Stdin does not support seek")) |         errno!(ESPIPE, "Stdin does not support seek") | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fn metadata(&self) -> Result<Metadata, Error> { |     fn metadata(&self) -> Result<Metadata, Error> { | ||||||
|  | |||||||
| @ -32,7 +32,7 @@ pub struct OpenOptions { | |||||||
| impl File for INodeFile { | impl File for INodeFile { | ||||||
|     fn read(&self, buf: &mut [u8]) -> Result<usize, Error> { |     fn read(&self, buf: &mut [u8]) -> Result<usize, Error> { | ||||||
|         if !self.options.read { |         if !self.options.read { | ||||||
|             return Err(Error::new(Errno::EBADF, "File not readable")); |             return errno!(EBADF, "File not readable"); | ||||||
|         } |         } | ||||||
|         let mut offset = self.offset.lock().unwrap(); |         let mut offset = self.offset.lock().unwrap(); | ||||||
|         let len = self.inode.read_at(*offset, buf)?; |         let len = self.inode.read_at(*offset, buf)?; | ||||||
| @ -42,7 +42,7 @@ impl File for INodeFile { | |||||||
| 
 | 
 | ||||||
|     fn write(&self, buf: &[u8]) -> Result<usize, Error> { |     fn write(&self, buf: &[u8]) -> Result<usize, Error> { | ||||||
|         if !self.options.write { |         if !self.options.write { | ||||||
|             return Err(Error::new(Errno::EBADF, "File not writable")); |             return errno!(EBADF, "File not writable"); | ||||||
|         } |         } | ||||||
|         let mut offset = self.offset.lock().unwrap(); |         let mut offset = self.offset.lock().unwrap(); | ||||||
|         if self.options.append { |         if self.options.append { | ||||||
| @ -56,7 +56,7 @@ impl File for INodeFile { | |||||||
| 
 | 
 | ||||||
|     fn read_at(&self, offset: usize, buf: &mut [u8]) -> Result<usize, Error> { |     fn read_at(&self, offset: usize, buf: &mut [u8]) -> Result<usize, Error> { | ||||||
|         if !self.options.read { |         if !self.options.read { | ||||||
|             return Err(Error::new(Errno::EBADF, "File not readable")); |             return errno!(EBADF, "File not readable"); | ||||||
|         } |         } | ||||||
|         let len = self.inode.read_at(offset, buf)?; |         let len = self.inode.read_at(offset, buf)?; | ||||||
|         Ok(len) |         Ok(len) | ||||||
| @ -64,7 +64,7 @@ impl File for INodeFile { | |||||||
| 
 | 
 | ||||||
|     fn write_at(&self, offset: usize, buf: &[u8]) -> Result<usize, Error> { |     fn write_at(&self, offset: usize, buf: &[u8]) -> Result<usize, Error> { | ||||||
|         if !self.options.write { |         if !self.options.write { | ||||||
|             return Err(Error::new(Errno::EBADF, "File not writable")); |             return errno!(EBADF, "File not writable"); | ||||||
|         } |         } | ||||||
|         let len = self.inode.write_at(offset, buf)?; |         let len = self.inode.write_at(offset, buf)?; | ||||||
|         Ok(len) |         Ok(len) | ||||||
| @ -72,7 +72,7 @@ impl File for INodeFile { | |||||||
| 
 | 
 | ||||||
|     fn readv(&self, bufs: &mut [&mut [u8]]) -> Result<usize, Error> { |     fn readv(&self, bufs: &mut [&mut [u8]]) -> Result<usize, Error> { | ||||||
|         if !self.options.read { |         if !self.options.read { | ||||||
|             return Err(Error::new(Errno::EBADF, "File not readable")); |             return errno!(EBADF, "File not readable"); | ||||||
|         } |         } | ||||||
|         let mut offset = self.offset.lock().unwrap(); |         let mut offset = self.offset.lock().unwrap(); | ||||||
|         let mut total_len = 0; |         let mut total_len = 0; | ||||||
| @ -91,7 +91,7 @@ impl File for INodeFile { | |||||||
| 
 | 
 | ||||||
|     fn writev(&self, bufs: &[&[u8]]) -> Result<usize, Error> { |     fn writev(&self, bufs: &[&[u8]]) -> Result<usize, Error> { | ||||||
|         if !self.options.write { |         if !self.options.write { | ||||||
|             return Err(Error::new(Errno::EBADF, "File not writable")); |             return errno!(EBADF, "File not writable"); | ||||||
|         } |         } | ||||||
|         let mut offset = self.offset.lock().unwrap(); |         let mut offset = self.offset.lock().unwrap(); | ||||||
|         if self.options.append { |         if self.options.append { | ||||||
| @ -129,7 +129,7 @@ impl File for INodeFile { | |||||||
| 
 | 
 | ||||||
|     fn set_len(&self, len: u64) -> Result<(), Error> { |     fn set_len(&self, len: u64) -> Result<(), Error> { | ||||||
|         if !self.options.write { |         if !self.options.write { | ||||||
|             return Err(Error::new(EBADF, "File not writable. Can't set len.")); |             return errno!(EBADF, "File not writable. Can't set len."); | ||||||
|         } |         } | ||||||
|         self.inode.resize(len as usize)?; |         self.inode.resize(len as usize)?; | ||||||
|         Ok(()) |         Ok(()) | ||||||
| @ -147,7 +147,7 @@ impl File for INodeFile { | |||||||
| 
 | 
 | ||||||
|     fn read_entry(&self) -> Result<String, Error> { |     fn read_entry(&self) -> Result<String, Error> { | ||||||
|         if !self.options.read { |         if !self.options.read { | ||||||
|             return Err(Error::new(EBADF, "File not readable. Can't read entry.")); |             return errno!(EBADF, "File not readable. Can't read entry."); | ||||||
|         } |         } | ||||||
|         let mut offset = self.offset.lock().unwrap(); |         let mut offset = self.offset.lock().unwrap(); | ||||||
|         let name = self.inode.get_entry(*offset)?; |         let name = self.inode.get_entry(*offset)?; | ||||||
|  | |||||||
| @ -52,7 +52,7 @@ pub fn do_select( | |||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     if ret < 0 { |     if ret < 0 { | ||||||
|         return Err(Error::new(Errno::from_retval(ret as i32), "")); |         return errno!(Errno::from_retval(ret as i32), ""); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     // convert fd back and write fdset
 |     // convert fd back and write fdset
 | ||||||
| @ -97,7 +97,7 @@ pub fn do_poll( | |||||||
|     // recover fd ?
 |     // recover fd ?
 | ||||||
| 
 | 
 | ||||||
|     if ret < 0 { |     if ret < 0 { | ||||||
|         Err(Error::new(Errno::from_retval(ret as i32), "")) |         errno!(Errno::from_retval(ret as i32), "") | ||||||
|     } else { |     } else { | ||||||
|         Ok(ret as usize) |         Ok(ret as usize) | ||||||
|     } |     } | ||||||
| @ -202,7 +202,7 @@ impl EpollFileInner { | |||||||
|     pub fn new() -> Result<Self, Error> { |     pub fn new() -> Result<Self, Error> { | ||||||
|         let ret = unsafe { libc::ocall::epoll_create1(0) }; |         let ret = unsafe { libc::ocall::epoll_create1(0) }; | ||||||
|         if ret < 0 { |         if ret < 0 { | ||||||
|             return Err(Error::new(Errno::from_retval(ret as i32), "")); |             return errno!(Errno::from_retval(ret as i32), ""); | ||||||
|         } |         } | ||||||
|         Ok(EpollFileInner { |         Ok(EpollFileInner { | ||||||
|             epoll_fd: ret, |             epoll_fd: ret, | ||||||
| @ -220,7 +220,7 @@ impl EpollFileInner { | |||||||
|             ) |             ) | ||||||
|         }; |         }; | ||||||
|         if ret < 0 { |         if ret < 0 { | ||||||
|             return Err(Error::new(Errno::from_retval(ret as i32), "")); |             return errno!(Errno::from_retval(ret as i32), ""); | ||||||
|         } |         } | ||||||
|         Ok(()) |         Ok(()) | ||||||
|     } |     } | ||||||
| @ -241,7 +241,7 @@ impl EpollFileInner { | |||||||
|             ) |             ) | ||||||
|         }; |         }; | ||||||
|         if ret < 0 { |         if ret < 0 { | ||||||
|             return Err(Error::new(Errno::from_retval(ret as i32), "")); |             return errno!(Errno::from_retval(ret as i32), ""); | ||||||
|         } |         } | ||||||
|         Ok(ret as usize) |         Ok(ret as usize) | ||||||
|     } |     } | ||||||
| @ -281,7 +281,7 @@ impl File for EpollFile { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fn seek(&self, pos: SeekFrom) -> Result<off_t, Error> { |     fn seek(&self, pos: SeekFrom) -> Result<off_t, Error> { | ||||||
|         Err(Error::new(Errno::ESPIPE, "Epoll does not support seek")) |         errno!(ESPIPE, "Epoll does not support seek") | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fn metadata(&self) -> Result<Metadata, Error> { |     fn metadata(&self) -> Result<Metadata, Error> { | ||||||
|  | |||||||
| @ -173,7 +173,7 @@ pub fn do_getdents64(fd: FileDesc, buf: &mut [u8]) -> Result<usize, Error> { | |||||||
|     let file_ref = current_process.get_files().lock().unwrap().get(fd)?; |     let file_ref = current_process.get_files().lock().unwrap().get(fd)?; | ||||||
|     let info = file_ref.metadata()?; |     let info = file_ref.metadata()?; | ||||||
|     if info.type_ != FileType::Dir { |     if info.type_ != FileType::Dir { | ||||||
|         return Err(Error::new(ENOTDIR, "")); |         return errno!(ENOTDIR, ""); | ||||||
|     } |     } | ||||||
|     let mut writer = unsafe { DirentBufWriter::new(buf) }; |     let mut writer = unsafe { DirentBufWriter::new(buf) }; | ||||||
|     loop { |     loop { | ||||||
| @ -267,7 +267,7 @@ pub fn do_chdir(path: &str) -> Result<(), Error> { | |||||||
|     let inode = current_process.lookup_inode(path)?; |     let inode = current_process.lookup_inode(path)?; | ||||||
|     let info = inode.metadata()?; |     let info = inode.metadata()?; | ||||||
|     if info.type_ != FileType::Dir { |     if info.type_ != FileType::Dir { | ||||||
|         return Err(Error::new(ENOTDIR, "")); |         return errno!(ENOTDIR, ""); | ||||||
|     } |     } | ||||||
|     current_process.change_cwd(path); |     current_process.change_cwd(path); | ||||||
|     Ok(()) |     Ok(()) | ||||||
| @ -295,7 +295,7 @@ pub fn do_mkdir(path: &str, mode: usize) -> Result<(), Error> { | |||||||
|     let (dir_path, file_name) = split_path(&path); |     let (dir_path, file_name) = split_path(&path); | ||||||
|     let inode = current_process.lookup_inode(dir_path)?; |     let inode = current_process.lookup_inode(dir_path)?; | ||||||
|     if inode.find(file_name).is_ok() { |     if inode.find(file_name).is_ok() { | ||||||
|         return Err(Error::new(EEXIST, "")); |         return errno!(EEXIST, ""); | ||||||
|     } |     } | ||||||
|     inode.create(file_name, FileType::Dir, mode as u32)?; |     inode.create(file_name, FileType::Dir, mode as u32)?; | ||||||
|     Ok(()) |     Ok(()) | ||||||
| @ -310,7 +310,7 @@ pub fn do_rmdir(path: &str) -> Result<(), Error> { | |||||||
|     let dir_inode = current_process.lookup_inode(dir_path)?; |     let dir_inode = current_process.lookup_inode(dir_path)?; | ||||||
|     let file_inode = dir_inode.find(file_name)?; |     let file_inode = dir_inode.find(file_name)?; | ||||||
|     if file_inode.metadata()?.type_ != FileType::Dir { |     if file_inode.metadata()?.type_ != FileType::Dir { | ||||||
|         return Err(Error::new(ENOTDIR, "rmdir on not directory")); |         return errno!(ENOTDIR, "rmdir on not directory"); | ||||||
|     } |     } | ||||||
|     dir_inode.unlink(file_name)?; |     dir_inode.unlink(file_name)?; | ||||||
|     Ok(()) |     Ok(()) | ||||||
| @ -337,7 +337,7 @@ pub fn do_unlink(path: &str) -> Result<(), Error> { | |||||||
|     let dir_inode = current_process.lookup_inode(dir_path)?; |     let dir_inode = current_process.lookup_inode(dir_path)?; | ||||||
|     let file_inode = dir_inode.find(file_name)?; |     let file_inode = dir_inode.find(file_name)?; | ||||||
|     if file_inode.metadata()?.type_ == FileType::Dir { |     if file_inode.metadata()?.type_ == FileType::Dir { | ||||||
|         return Err(Error::new(EISDIR, "unlink on directory")); |         return errno!(EISDIR, "unlink on directory"); | ||||||
|     } |     } | ||||||
|     dir_inode.unlink(file_name)?; |     dir_inode.unlink(file_name)?; | ||||||
|     Ok(()) |     Ok(()) | ||||||
| @ -381,7 +381,7 @@ pub fn do_sendfile( | |||||||
|         while bytes_written < read_len { |         while bytes_written < read_len { | ||||||
|             let write_len = out_file.write(&buffer[bytes_written..])?; |             let write_len = out_file.write(&buffer[bytes_written..])?; | ||||||
|             if write_len == 0 { |             if write_len == 0 { | ||||||
|                 return Err(Error::new(EBADF, "sendfile write return 0")); |                 return errno!(EBADF, "sendfile write return 0"); | ||||||
|             } |             } | ||||||
|             bytes_written += write_len; |             bytes_written += write_len; | ||||||
|         } |         } | ||||||
| @ -406,7 +406,7 @@ impl Process { | |||||||
|             match dir_inode.find(file_name) { |             match dir_inode.find(file_name) { | ||||||
|                 Ok(file_inode) => { |                 Ok(file_inode) => { | ||||||
|                     if flags.contains(OpenFlags::EXCLUSIVE) { |                     if flags.contains(OpenFlags::EXCLUSIVE) { | ||||||
|                         return Err(Error::new(EEXIST, "file exists")); |                         return errno!(EEXIST, "file exists"); | ||||||
|                     } |                     } | ||||||
|                     file_inode |                     file_inode | ||||||
|                 } |                 } | ||||||
|  | |||||||
| @ -37,10 +37,7 @@ impl File for PipeReader { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fn write(&self, buf: &[u8]) -> Result<usize, Error> { |     fn write(&self, buf: &[u8]) -> Result<usize, Error> { | ||||||
|         Err(Error::new( |         errno!(EBADF, "PipeReader does not support write") | ||||||
|             Errno::EBADF, |  | ||||||
|             "PipeReader does not support write", |  | ||||||
|         )) |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fn read_at(&self, offset: usize, buf: &mut [u8]) -> Result<usize, Error> { |     fn read_at(&self, offset: usize, buf: &mut [u8]) -> Result<usize, Error> { | ||||||
| @ -76,14 +73,11 @@ impl File for PipeReader { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fn writev(&self, bufs: &[&[u8]]) -> Result<usize, Error> { |     fn writev(&self, bufs: &[&[u8]]) -> Result<usize, Error> { | ||||||
|         Err(Error::new( |         errno!(EBADF, "PipeReader does not support write") | ||||||
|             Errno::EBADF, |  | ||||||
|             "PipeReader does not support write", |  | ||||||
|         )) |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fn seek(&self, pos: SeekFrom) -> Result<off_t, Error> { |     fn seek(&self, pos: SeekFrom) -> Result<off_t, Error> { | ||||||
|         Err(Error::new(Errno::ESPIPE, "Pipe does not support seek")) |         errno!(ESPIPE, "Pipe does not support seek") | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fn metadata(&self) -> Result<Metadata, Error> { |     fn metadata(&self) -> Result<Metadata, Error> { | ||||||
| @ -117,7 +111,7 @@ pub struct PipeWriter { | |||||||
| 
 | 
 | ||||||
| impl File for PipeWriter { | impl File for PipeWriter { | ||||||
|     fn read(&self, buf: &mut [u8]) -> Result<usize, Error> { |     fn read(&self, buf: &mut [u8]) -> Result<usize, Error> { | ||||||
|         Err(Error::new(Errno::EBADF, "PipeWriter does not support read")) |         errno!(EBADF, "PipeWriter does not support read") | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fn write(&self, buf: &[u8]) -> Result<usize, Error> { |     fn write(&self, buf: &[u8]) -> Result<usize, Error> { | ||||||
| @ -133,7 +127,7 @@ impl File for PipeWriter { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fn readv(&self, bufs: &mut [&mut [u8]]) -> Result<usize, Error> { |     fn readv(&self, bufs: &mut [&mut [u8]]) -> Result<usize, Error> { | ||||||
|         Err(Error::new(Errno::EBADF, "PipeWriter does not support read")) |         errno!(EBADF, "PipeWriter does not support read") | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fn writev(&self, bufs: &[&[u8]]) -> Result<usize, Error> { |     fn writev(&self, bufs: &[&[u8]]) -> Result<usize, Error> { | ||||||
| @ -161,7 +155,7 @@ impl File for PipeWriter { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fn seek(&self, seek_pos: SeekFrom) -> Result<off_t, Error> { |     fn seek(&self, seek_pos: SeekFrom) -> Result<off_t, Error> { | ||||||
|         Err(Error::new(Errno::ESPIPE, "Pipe does not support seek")) |         errno!(ESPIPE, "Pipe does not support seek") | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fn metadata(&self) -> Result<Metadata, Error> { |     fn metadata(&self) -> Result<Metadata, Error> { | ||||||
|  | |||||||
| @ -11,7 +11,7 @@ impl SocketFile { | |||||||
|     pub fn new(domain: c_int, socket_type: c_int, protocol: c_int) -> Result<Self, Error> { |     pub fn new(domain: c_int, socket_type: c_int, protocol: c_int) -> Result<Self, Error> { | ||||||
|         let ret = unsafe { libc::ocall::socket(domain, socket_type, protocol) }; |         let ret = unsafe { libc::ocall::socket(domain, socket_type, protocol) }; | ||||||
|         if ret < 0 { |         if ret < 0 { | ||||||
|             Err(Error::new(Errno::from_retval(ret as i32), "")) |             errno!(Errno::from_retval(ret as i32), "") | ||||||
|         } else { |         } else { | ||||||
|             Ok(SocketFile { fd: ret }) |             Ok(SocketFile { fd: ret }) | ||||||
|         } |         } | ||||||
| @ -25,7 +25,7 @@ impl SocketFile { | |||||||
|     ) -> Result<Self, Error> { |     ) -> Result<Self, Error> { | ||||||
|         let ret = unsafe { libc::ocall::accept4(self.fd, addr, addr_len, flags) }; |         let ret = unsafe { libc::ocall::accept4(self.fd, addr, addr_len, flags) }; | ||||||
|         if ret < 0 { |         if ret < 0 { | ||||||
|             Err(Error::new(Errno::from_retval(ret as i32), "")) |             errno!(Errno::from_retval(ret as i32), "") | ||||||
|         } else { |         } else { | ||||||
|             Ok(SocketFile { fd: ret }) |             Ok(SocketFile { fd: ret }) | ||||||
|         } |         } | ||||||
| @ -49,7 +49,7 @@ impl File for SocketFile { | |||||||
|     fn read(&self, buf: &mut [u8]) -> Result<usize, Error> { |     fn read(&self, buf: &mut [u8]) -> Result<usize, Error> { | ||||||
|         let ret = unsafe { libc::ocall::read(self.fd, buf.as_mut_ptr() as *mut c_void, buf.len()) }; |         let ret = unsafe { libc::ocall::read(self.fd, buf.as_mut_ptr() as *mut c_void, buf.len()) }; | ||||||
|         if ret < 0 { |         if ret < 0 { | ||||||
|             Err(Error::new(Errno::from_retval(ret as i32), "")) |             errno!(Errno::from_retval(ret as i32), "") | ||||||
|         } else { |         } else { | ||||||
|             Ok(ret as usize) |             Ok(ret as usize) | ||||||
|         } |         } | ||||||
| @ -58,7 +58,7 @@ impl File for SocketFile { | |||||||
|     fn write(&self, buf: &[u8]) -> Result<usize, Error> { |     fn write(&self, buf: &[u8]) -> Result<usize, Error> { | ||||||
|         let ret = unsafe { libc::ocall::write(self.fd, buf.as_ptr() as *const c_void, buf.len()) }; |         let ret = unsafe { libc::ocall::write(self.fd, buf.as_ptr() as *const c_void, buf.len()) }; | ||||||
|         if ret < 0 { |         if ret < 0 { | ||||||
|             Err(Error::new(Errno::from_retval(ret as i32), "")) |             errno!(Errno::from_retval(ret as i32), "") | ||||||
|         } else { |         } else { | ||||||
|             Ok(ret as usize) |             Ok(ret as usize) | ||||||
|         } |         } | ||||||
| @ -101,7 +101,7 @@ impl File for SocketFile { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fn seek(&self, pos: SeekFrom) -> Result<off_t, Error> { |     fn seek(&self, pos: SeekFrom) -> Result<off_t, Error> { | ||||||
|         Err(Error::new(Errno::ESPIPE, "Socket does not support seek")) |         errno!(ESPIPE, "Socket does not support seek") | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fn metadata(&self) -> Result<Metadata, Error> { |     fn metadata(&self) -> Result<Metadata, Error> { | ||||||
|  | |||||||
| @ -35,7 +35,7 @@ macro_rules! debug_trace { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| macro_rules! errno { | macro_rules! errno { | ||||||
|     ($errno: ident, $msg: expr) => {{ |     ($errno: expr, $msg: expr) => {{ | ||||||
|         println!( |         println!( | ||||||
|             "ERROR: {} ({}, line {} in file {})", |             "ERROR: {} ({}, line {} in file {})", | ||||||
|             $errno, |             $errno, | ||||||
|  | |||||||
| @ -139,7 +139,7 @@ impl StackBuf { | |||||||
|             let old_pos = self.stack_pos.get(); |             let old_pos = self.stack_pos.get(); | ||||||
|             let new_pos = align_down(old_pos - size, align); |             let new_pos = align_down(old_pos - size, align); | ||||||
|             if new_pos < self.stack_bottom { |             if new_pos < self.stack_bottom { | ||||||
|                 return Err(Error::new(Errno::ENOMEM, "No enough space in buffer")); |                 return errno!(ENOMEM, "No enough space in buffer"); | ||||||
|             } |             } | ||||||
|             new_pos |             new_pos | ||||||
|         }; |         }; | ||||||
| @ -274,7 +274,7 @@ impl AuxTable { | |||||||
| 
 | 
 | ||||||
|     pub fn set_val(&mut self, key: AuxKey, val: u64) -> Result<(), Error> { |     pub fn set_val(&mut self, key: AuxKey, val: u64) -> Result<(), Error> { | ||||||
|         if key == AuxKey::AT_NULL || key == AuxKey::AT_IGNORE { |         if key == AuxKey::AT_NULL || key == AuxKey::AT_IGNORE { | ||||||
|             return Err(Error::new(Errno::EINVAL, "Illegal key")); |             return errno!(EINVAL, "Illegal key"); | ||||||
|         } |         } | ||||||
|         self.values[key as usize] = Some(val); |         self.values[key as usize] = Some(val); | ||||||
|         Ok(()) |         Ok(()) | ||||||
|  | |||||||
| @ -65,7 +65,7 @@ pub fn do_spawn<P: AsRef<Path>>( | |||||||
|         let program_entry = { |         let program_entry = { | ||||||
|             let program_entry = base_addr + elf_helper::get_start_address(&elf_file)?; |             let program_entry = base_addr + elf_helper::get_start_address(&elf_file)?; | ||||||
|             if !vm.get_code_vma().contains_obj(program_entry, 16) { |             if !vm.get_code_vma().contains_obj(program_entry, 16) { | ||||||
|                 return Err(Error::new(Errno::EINVAL, "Invalid program entry")); |                 return errno!(EINVAL, "Invalid program entry"); | ||||||
|             } |             } | ||||||
|             program_entry |             program_entry | ||||||
|         }; |         }; | ||||||
|  | |||||||
| @ -436,7 +436,7 @@ fn do_write(fd: FileDesc, buf: *const u8, size: usize) -> Result<isize, Error> { | |||||||
| fn do_writev(fd: FileDesc, iov: *const iovec_t, count: i32) -> Result<isize, Error> { | fn do_writev(fd: FileDesc, iov: *const iovec_t, count: i32) -> Result<isize, Error> { | ||||||
|     let count = { |     let count = { | ||||||
|         if count < 0 { |         if count < 0 { | ||||||
|             return Err(Error::new(Errno::EINVAL, "Invalid count of iovec")); |             return errno!(EINVAL, "Invalid count of iovec"); | ||||||
|         } |         } | ||||||
|         count as usize |         count as usize | ||||||
|     }; |     }; | ||||||
| @ -461,7 +461,7 @@ fn do_writev(fd: FileDesc, iov: *const iovec_t, count: i32) -> Result<isize, Err | |||||||
| fn do_readv(fd: FileDesc, iov: *mut iovec_t, count: i32) -> Result<isize, Error> { | fn do_readv(fd: FileDesc, iov: *mut iovec_t, count: i32) -> Result<isize, Error> { | ||||||
|     let count = { |     let count = { | ||||||
|         if count < 0 { |         if count < 0 { | ||||||
|             return Err(Error::new(Errno::EINVAL, "Invalid count of iovec")); |             return errno!(EINVAL, "Invalid count of iovec"); | ||||||
|         } |         } | ||||||
|         count as usize |         count as usize | ||||||
|     }; |     }; | ||||||
| @ -538,7 +538,7 @@ fn do_lseek(fd: FileDesc, offset: off_t, whence: i32) -> Result<isize, Error> { | |||||||
|         0 => { |         0 => { | ||||||
|             // SEEK_SET
 |             // SEEK_SET
 | ||||||
|             if offset < 0 { |             if offset < 0 { | ||||||
|                 return Err(Error::new(Errno::EINVAL, "Invalid offset")); |                 return errno!(EINVAL, "Invalid offset"); | ||||||
|             } |             } | ||||||
|             SeekFrom::Start(offset as u64) |             SeekFrom::Start(offset as u64) | ||||||
|         } |         } | ||||||
| @ -551,7 +551,7 @@ fn do_lseek(fd: FileDesc, offset: off_t, whence: i32) -> Result<isize, Error> { | |||||||
|             SeekFrom::End(offset) |             SeekFrom::End(offset) | ||||||
|         } |         } | ||||||
|         _ => { |         _ => { | ||||||
|             return Err(Error::new(Errno::EINVAL, "Invalid whence")); |             return errno!(EINVAL, "Invalid whence"); | ||||||
|         } |         } | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
| @ -767,7 +767,7 @@ fn do_unknown( | |||||||
|         "unknown or unsupported syscall (# = {}): {:#x}, {:#x}, {:#x}, {:#x}, {:#x}, {:#x}", |         "unknown or unsupported syscall (# = {}): {:#x}, {:#x}, {:#x}, {:#x}, {:#x}, {:#x}", | ||||||
|         num, arg0, arg1, arg2, arg3, arg4, arg5 |         num, arg0, arg1, arg2, arg3, arg4, arg5 | ||||||
|     ); |     ); | ||||||
|     Err(Error::new(ENOSYS, "Unknown syscall")) |     errno!(ENOSYS, "Unknown syscall") | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn do_getcwd(buf: *mut u8, size: usize) -> Result<isize, Error> { | fn do_getcwd(buf: *mut u8, size: usize) -> Result<isize, Error> { | ||||||
| @ -779,7 +779,7 @@ fn do_getcwd(buf: *mut u8, size: usize) -> Result<isize, Error> { | |||||||
|     let mut proc = proc_ref.lock().unwrap(); |     let mut proc = proc_ref.lock().unwrap(); | ||||||
|     let cwd = proc.get_cwd(); |     let cwd = proc.get_cwd(); | ||||||
|     if cwd.len() + 1 > safe_buf.len() { |     if cwd.len() + 1 > safe_buf.len() { | ||||||
|         return Err(Error::new(ERANGE, "buf is not long enough")); |         return errno!(ERANGE, "buf is not long enough"); | ||||||
|     } |     } | ||||||
|     safe_buf[..cwd.len()].copy_from_slice(cwd.as_bytes()); |     safe_buf[..cwd.len()].copy_from_slice(cwd.as_bytes()); | ||||||
|     safe_buf[cwd.len()] = 0; |     safe_buf[cwd.len()] = 0; | ||||||
| @ -1064,10 +1064,7 @@ fn do_select( | |||||||
| ) -> Result<isize, Error> { | ) -> Result<isize, Error> { | ||||||
|     // check arguments
 |     // check arguments
 | ||||||
|     if nfds < 0 || nfds >= libc::FD_SETSIZE as c_int { |     if nfds < 0 || nfds >= libc::FD_SETSIZE as c_int { | ||||||
|         return Err(Error::new( |         return errno!(EINVAL, "nfds is negative or exceeds the resource limit"); | ||||||
|             EINVAL, |  | ||||||
|             "nfds is negative or exceeds the resource limit", |  | ||||||
|         )); |  | ||||||
|     } |     } | ||||||
|     let nfds = nfds as usize; |     let nfds = nfds as usize; | ||||||
| 
 | 
 | ||||||
| @ -1114,7 +1111,7 @@ fn do_poll(fds: *mut libc::pollfd, nfds: libc::nfds_t, timeout: c_int) -> Result | |||||||
| 
 | 
 | ||||||
| fn do_epoll_create(size: c_int) -> Result<isize, Error> { | fn do_epoll_create(size: c_int) -> Result<isize, Error> { | ||||||
|     if size <= 0 { |     if size <= 0 { | ||||||
|         return Err(Error::new(EINVAL, "size is not positive")); |         return errno!(EINVAL, "size is not positive"); | ||||||
|     } |     } | ||||||
|     do_epoll_create1(0) |     do_epoll_create1(0) | ||||||
| } | } | ||||||
| @ -1145,7 +1142,7 @@ fn do_epoll_wait( | |||||||
| ) -> Result<isize, Error> { | ) -> Result<isize, Error> { | ||||||
|     let maxevents = { |     let maxevents = { | ||||||
|         if maxevents <= 0 { |         if maxevents <= 0 { | ||||||
|             return Err(Error::new(EINVAL, "maxevents <= 0")); |             return errno!(EINVAL, "maxevents <= 0"); | ||||||
|         } |         } | ||||||
|         maxevents as usize |         maxevents as usize | ||||||
|     }; |     }; | ||||||
|  | |||||||
| @ -74,7 +74,7 @@ pub struct VMAllocOptions { | |||||||
| impl VMAllocOptions { | impl VMAllocOptions { | ||||||
|     pub fn new(size: usize) -> Result<VMAllocOptions, Error> { |     pub fn new(size: usize) -> Result<VMAllocOptions, Error> { | ||||||
|         if size % PAGE_SIZE != 0 { |         if size % PAGE_SIZE != 0 { | ||||||
|             return Err(Error::new(Errno::EINVAL, "Size is not page-aligned")); |             return errno!(EINVAL, "Size is not page-aligned"); | ||||||
|         } |         } | ||||||
|         Ok(VMAllocOptions { |         Ok(VMAllocOptions { | ||||||
|             size, |             size, | ||||||
| @ -84,7 +84,7 @@ impl VMAllocOptions { | |||||||
| 
 | 
 | ||||||
|     pub fn addr(&mut self, addr: VMAddrOption) -> Result<&mut Self, Error> { |     pub fn addr(&mut self, addr: VMAddrOption) -> Result<&mut Self, Error> { | ||||||
|         if addr.is_addr_given() && addr.get_addr() % PAGE_SIZE != 0 { |         if addr.is_addr_given() && addr.get_addr() % PAGE_SIZE != 0 { | ||||||
|             return Err(Error::new(Errno::EINVAL, "Invalid address")); |             return errno!(EINVAL, "Invalid address"); | ||||||
|         } |         } | ||||||
|         self.addr = addr; |         self.addr = addr; | ||||||
|         Ok(self) |         Ok(self) | ||||||
| @ -175,7 +175,7 @@ pub struct VMResizeOptions { | |||||||
| impl VMResizeOptions { | impl VMResizeOptions { | ||||||
|     pub fn new(new_size: usize) -> Result<VMResizeOptions, Error> { |     pub fn new(new_size: usize) -> Result<VMResizeOptions, Error> { | ||||||
|         if new_size % PAGE_SIZE != 0 { |         if new_size % PAGE_SIZE != 0 { | ||||||
|             return Err(Error::new(Errno::EINVAL, "Size is not page-aligned")); |             return errno!(EINVAL, "Size is not page-aligned"); | ||||||
|         } |         } | ||||||
|         Ok(VMResizeOptions { |         Ok(VMResizeOptions { | ||||||
|             new_size, |             new_size, | ||||||
|  | |||||||
| @ -169,7 +169,7 @@ impl ProcessVM { | |||||||
|                     VMAddrOption::Beyond(mmap_start_addr) |                     VMAddrOption::Beyond(mmap_start_addr) | ||||||
|                 } else { |                 } else { | ||||||
|                     if addr < mmap_start_addr { |                     if addr < mmap_start_addr { | ||||||
|                         return Err(Error::new(Errno::EINVAL, "Beyond valid memory range")); |                         return errno!(EINVAL, "Beyond valid memory range"); | ||||||
|                     } |                     } | ||||||
|                     // TODO: Fixed or Hint? Should hanle mmap flags
 |                     // TODO: Fixed or Hint? Should hanle mmap flags
 | ||||||
|                     VMAddrOption::Hint(addr) |                     VMAddrOption::Hint(addr) | ||||||
| @ -212,7 +212,7 @@ impl ProcessVM { | |||||||
|         options: &VMResizeOptions, |         options: &VMResizeOptions, | ||||||
|     ) -> Result<usize, Error> { |     ) -> Result<usize, Error> { | ||||||
|         // TODO: Implement this!
 |         // TODO: Implement this!
 | ||||||
|         Err(Error::new(Errno::EINVAL, "Not implemented")) |         errno!(EINVAL, "Not implemented") | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     pub fn brk(&mut self, new_brk: usize) -> Result<usize, Error> { |     pub fn brk(&mut self, new_brk: usize) -> Result<usize, Error> { | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user