fix and add test for readv, writev, lseek

This commit is contained in:
WangRunji 2019-03-20 18:47:43 +08:00 committed by Tate Tian
parent 4a9b7aa1b0
commit d5e8d43e7b
4 changed files with 86 additions and 6 deletions

@ -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;
}