use errno! macro for all error

This commit is contained in:
WangRunji 2019-04-22 15:54:39 +08:00
parent b99344d7f5
commit 54243c543a
12 changed files with 66 additions and 75 deletions

@ -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> {