fix and add test for readv, writev, lseek
This commit is contained in:
		
							parent
							
								
									4a9b7aa1b0
								
							
						
					
					
						commit
						d5e8d43e7b
					
				| @ -205,7 +205,7 @@ impl SgxFileInner { | ||||
|         Ok(self.pos as off_t) | ||||
|     } | ||||
| 
 | ||||
|     pub fn writev<'a, 'b>(&mut self, bufs: &'a [&'b [u8]]) -> Result<usize, Error> { | ||||
|     pub fn writev(&mut self, bufs: &[&[u8]]) -> Result<usize, Error> { | ||||
|         if !self.is_writable { | ||||
|             return Err(Error::new(Errno::EINVAL, "File not writable")); | ||||
|         } | ||||
| @ -245,7 +245,7 @@ impl SgxFileInner { | ||||
|         Ok(total_bytes) | ||||
|     } | ||||
| 
 | ||||
|     fn readv<'a, 'b>(&mut self, bufs: &'a mut [&'b mut [u8]]) -> Result<usize, Error> { | ||||
|     fn readv(&mut self, bufs: &mut [&mut [u8]]) -> Result<usize, Error> { | ||||
|         if !self.is_readable { | ||||
|             return Err(Error::new(Errno::EINVAL, "File not readable")); | ||||
|         } | ||||
|  | ||||
| @ -71,11 +71,45 @@ impl File for INodeFile { | ||||
| 
 | ||||
| 
 | ||||
|     fn readv(&self, bufs: &mut [&mut [u8]]) -> Result<usize, Error> { | ||||
|         Err(Error::new(Errno::ENOSYS, "Not implemented")) | ||||
|         if !self.options.read { | ||||
|             return Err(Error::new(Errno::EBADF, "File not readable")); | ||||
|         } | ||||
|         let mut offset = self.offset.lock().unwrap(); | ||||
|         let mut total_len = 0; | ||||
|         for buf in bufs { | ||||
|             match self.inode.read_at(*offset, buf) { | ||||
|                 Ok(len) => { | ||||
|                     total_len += len; | ||||
|                     *offset += len; | ||||
|                 }, | ||||
|                 Err(_) if total_len != 0 => break, | ||||
|                 Err(e) => return Err(e.into()), | ||||
|             } | ||||
|         } | ||||
|         Ok(total_len) | ||||
|     } | ||||
| 
 | ||||
|     fn writev(&self, bufs: &[&[u8]]) -> Result<usize, Error> { | ||||
|         Err(Error::new(Errno::ENOSYS, "Not implemented")) | ||||
|         if !self.options.write { | ||||
|             return Err(Error::new(Errno::EBADF, "File not writable")); | ||||
|         } | ||||
|         let mut offset = self.offset.lock().unwrap(); | ||||
|         if self.options.append { | ||||
|             let info = self.inode.metadata()?; | ||||
|             *offset = info.size; | ||||
|         } | ||||
|         let mut total_len = 0; | ||||
|         for buf in bufs { | ||||
|             match self.inode.write_at(*offset, buf) { | ||||
|                 Ok(len) => { | ||||
|                     total_len += len; | ||||
|                     *offset += len; | ||||
|                 }, | ||||
|                 Err(_) if total_len != 0 => break, | ||||
|                 Err(e) => return Err(e.into()), | ||||
|             } | ||||
|         } | ||||
|         Ok(total_len) | ||||
|     } | ||||
| 
 | ||||
|     fn seek(&self, pos: SeekFrom) -> Result<off_t, Error> { | ||||
|  | ||||
| @ -62,6 +62,7 @@ pub fn do_open(path: &str, flags: u32, mode: u32) -> Result<FileDesc, Error> { | ||||
| } | ||||
| 
 | ||||
| pub fn do_write(fd: FileDesc, buf: &[u8]) -> Result<usize, Error> { | ||||
|     info!("write: fd: {}", fd); | ||||
|     let current_ref = process::get_current(); | ||||
|     let current_process = current_ref.lock().unwrap(); | ||||
|     let file_ref = current_process.get_files().get(fd)?; | ||||
| @ -69,6 +70,7 @@ pub fn do_write(fd: FileDesc, buf: &[u8]) -> Result<usize, Error> { | ||||
| } | ||||
| 
 | ||||
| pub fn do_read(fd: FileDesc, buf: &mut [u8]) -> Result<usize, Error> { | ||||
|     info!("read: fd: {}", fd); | ||||
|     let current_ref = process::get_current(); | ||||
|     let current_process = current_ref.lock().unwrap(); | ||||
|     let file_ref = current_process.get_files().get(fd)?; | ||||
| @ -76,6 +78,7 @@ pub fn do_read(fd: FileDesc, buf: &mut [u8]) -> Result<usize, Error> { | ||||
| } | ||||
| 
 | ||||
| pub fn do_writev(fd: FileDesc, bufs: &[&[u8]]) -> Result<usize, Error> { | ||||
|     info!("writev: fd: {}", fd); | ||||
|     let current_ref = process::get_current(); | ||||
|     let current_process = current_ref.lock().unwrap(); | ||||
|     let file_ref = current_process.get_files().get(fd)?; | ||||
| @ -83,6 +86,7 @@ pub fn do_writev(fd: FileDesc, bufs: &[&[u8]]) -> Result<usize, Error> { | ||||
| } | ||||
| 
 | ||||
| pub fn do_readv(fd: FileDesc, bufs: &mut [&mut [u8]]) -> Result<usize, Error> { | ||||
|     info!("readv: fd: {}", fd); | ||||
|     let current_ref = process::get_current(); | ||||
|     let current_process = current_ref.lock().unwrap(); | ||||
|     let file_ref = current_process.get_files().get(fd)?; | ||||
| @ -90,6 +94,7 @@ pub fn do_readv(fd: FileDesc, bufs: &mut [&mut [u8]]) -> Result<usize, Error> { | ||||
| } | ||||
| 
 | ||||
| pub fn do_pwrite(fd: FileDesc, buf: &[u8], offset: usize) -> Result<usize, Error> { | ||||
|     info!("pwrite: fd: {}, offset: {}", fd, offset); | ||||
|     let current_ref = process::get_current(); | ||||
|     let current_process = current_ref.lock().unwrap(); | ||||
|     let file_ref = current_process.get_files().get(fd)?; | ||||
| @ -97,6 +102,7 @@ pub fn do_pwrite(fd: FileDesc, buf: &[u8], offset: usize) -> Result<usize, Error | ||||
| } | ||||
| 
 | ||||
| pub fn do_pread(fd: FileDesc, buf: &mut [u8], offset: usize) -> Result<usize, Error> { | ||||
|     info!("pread: fd: {}, offset: {}", fd, offset); | ||||
|     let current_ref = process::get_current(); | ||||
|     let current_process = current_ref.lock().unwrap(); | ||||
|     let file_ref = current_process.get_files().get(fd)?; | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| #include <sys/types.h> | ||||
| #include <sys/stat.h> | ||||
| #include <sys/uio.h> | ||||
| #include <fcntl.h> | ||||
| #include <unistd.h> | ||||
| #include <string.h> | ||||
| @ -8,6 +8,7 @@ | ||||
| int main(int argc, const char* argv[]) { | ||||
|     const char* file_name = "tmp.txt"; | ||||
|     int fd, flags, mode, len; | ||||
|     off_t offset; | ||||
|     const char* write_msg = "Hello World\n"; | ||||
|     char read_buf[128] = {0}; | ||||
| 
 | ||||
| @ -39,6 +40,45 @@ int main(int argc, const char* argv[]) { | ||||
|         return -1; | ||||
|     } | ||||
| 
 | ||||
|     printf("File write and read succesfully\n"); | ||||
| 
 | ||||
|     flags = O_RDWR; | ||||
|     if ((fd = open(file_name, flags)) < 0) { | ||||
|         printf("ERROR: failed to open a file for read and write\n"); | ||||
|         return -1; | ||||
|     } | ||||
| 
 | ||||
|     const char* iov_msg[2] = {"hello ", "world!"}; | ||||
|     struct iovec iov[2]; | ||||
|     for(int i=0; i<2; ++i) { | ||||
|         iov[i].iov_base = (void*)iov_msg[i]; | ||||
|         iov[i].iov_len = strlen(iov_msg[i]); | ||||
|     } | ||||
|     if ((len = writev(fd, iov, 2)) != 12) { | ||||
|         printf("ERROR: failed to write vectors to the file\n"); | ||||
|         return -1; | ||||
|     } | ||||
| 
 | ||||
|     if ((offset = lseek(fd, 0, SEEK_SET)) != 0) { | ||||
|         printf("ERROR: failed to lseek the file\n"); | ||||
|         return -1; | ||||
|     } | ||||
| 
 | ||||
|     iov[0].iov_base = read_buf; | ||||
|     iov[0].iov_len = 3; | ||||
|     iov[1].iov_base = read_buf + 5; | ||||
|     iov[1].iov_len = 20; | ||||
|     if ((len = readv(fd, iov, 2)) != 12) { | ||||
|         printf("ERROR: failed to read vectors from the file\n"); | ||||
|         return -1; | ||||
|     } | ||||
| 
 | ||||
|     if (memcmp(read_buf, "hel", 3) != 0 | ||||
|         || memcmp(read_buf + 5, "lo world!", 9) != 0) { | ||||
|         printf("ERROR: the message read from the file is not as it was written\n"); | ||||
|         return -1; | ||||
|     } | ||||
|     close(fd); | ||||
| 
 | ||||
|     printf("File write and read successfully\n"); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user