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) |         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 { |         if !self.is_writable { | ||||||
|             return Err(Error::new(Errno::EINVAL, "File not writable")); |             return Err(Error::new(Errno::EINVAL, "File not writable")); | ||||||
|         } |         } | ||||||
| @ -245,7 +245,7 @@ impl SgxFileInner { | |||||||
|         Ok(total_bytes) |         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 { |         if !self.is_readable { | ||||||
|             return Err(Error::new(Errno::EINVAL, "File not 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> { |     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> { |     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> { |     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> { | pub fn do_write(fd: FileDesc, buf: &[u8]) -> Result<usize, Error> { | ||||||
|  |     info!("write: fd: {}", fd); | ||||||
|     let current_ref = process::get_current(); |     let current_ref = process::get_current(); | ||||||
|     let current_process = current_ref.lock().unwrap(); |     let current_process = current_ref.lock().unwrap(); | ||||||
|     let file_ref = current_process.get_files().get(fd)?; |     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> { | pub fn do_read(fd: FileDesc, buf: &mut [u8]) -> Result<usize, Error> { | ||||||
|  |     info!("read: fd: {}", fd); | ||||||
|     let current_ref = process::get_current(); |     let current_ref = process::get_current(); | ||||||
|     let current_process = current_ref.lock().unwrap(); |     let current_process = current_ref.lock().unwrap(); | ||||||
|     let file_ref = current_process.get_files().get(fd)?; |     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> { | pub fn do_writev(fd: FileDesc, bufs: &[&[u8]]) -> Result<usize, Error> { | ||||||
|  |     info!("writev: fd: {}", fd); | ||||||
|     let current_ref = process::get_current(); |     let current_ref = process::get_current(); | ||||||
|     let current_process = current_ref.lock().unwrap(); |     let current_process = current_ref.lock().unwrap(); | ||||||
|     let file_ref = current_process.get_files().get(fd)?; |     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> { | 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_ref = process::get_current(); | ||||||
|     let current_process = current_ref.lock().unwrap(); |     let current_process = current_ref.lock().unwrap(); | ||||||
|     let file_ref = current_process.get_files().get(fd)?; |     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> { | 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_ref = process::get_current(); | ||||||
|     let current_process = current_ref.lock().unwrap(); |     let current_process = current_ref.lock().unwrap(); | ||||||
|     let file_ref = current_process.get_files().get(fd)?; |     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> { | 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_ref = process::get_current(); | ||||||
|     let current_process = current_ref.lock().unwrap(); |     let current_process = current_ref.lock().unwrap(); | ||||||
|     let file_ref = current_process.get_files().get(fd)?; |     let file_ref = current_process.get_files().get(fd)?; | ||||||
|  | |||||||
| @ -1,5 +1,5 @@ | |||||||
| #include <sys/types.h> | #include <sys/types.h> | ||||||
| #include <sys/stat.h> | #include <sys/uio.h> | ||||||
| #include <fcntl.h> | #include <fcntl.h> | ||||||
| #include <unistd.h> | #include <unistd.h> | ||||||
| #include <string.h> | #include <string.h> | ||||||
| @ -8,6 +8,7 @@ | |||||||
| int main(int argc, const char* argv[]) { | int main(int argc, const char* argv[]) { | ||||||
|     const char* file_name = "tmp.txt"; |     const char* file_name = "tmp.txt"; | ||||||
|     int fd, flags, mode, len; |     int fd, flags, mode, len; | ||||||
|  |     off_t offset; | ||||||
|     const char* write_msg = "Hello World\n"; |     const char* write_msg = "Hello World\n"; | ||||||
|     char read_buf[128] = {0}; |     char read_buf[128] = {0}; | ||||||
| 
 | 
 | ||||||
| @ -39,6 +40,45 @@ int main(int argc, const char* argv[]) { | |||||||
|         return -1; |         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; |     return 0; | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user