fix return value from libc::ocall

This commit is contained in:
WangRunji 2019-04-22 21:55:57 +08:00
parent 76f9ff380b
commit 141094e95e
3 changed files with 72 additions and 41 deletions

@ -1,9 +1,9 @@
use super::*;
use crate::syscall::AsSocket;
use std::vec::Vec;
use std::any::Any;
use std::collections::btree_map::BTreeMap;
use std::fmt;
use std::any::Any;
use std::vec::Vec;
/// Forward to host `poll`
/// (sgx_libc doesn't have `select`)
@ -23,7 +23,11 @@ pub fn do_select(
let file_table_ref = proc.get_files().lock().unwrap();
for fd in 0..nfds {
let (r, w, e) = (readfds.is_set(fd), writefds.is_set(fd), exceptfds.is_set(fd));
let (r, w, e) = (
readfds.is_set(fd),
writefds.is_set(fd),
exceptfds.is_set(fd),
);
if !(r || w || e) {
continue;
}
@ -31,9 +35,15 @@ pub fn do_select(
host_to_libos_fd[host_fd as usize] = fd;
let mut events = 0;
if r { events |= libc::POLLIN; }
if w { events |= libc::POLLOUT; }
if e { events |= libc::POLLERR; }
if r {
events |= libc::POLLIN;
}
if w {
events |= libc::POLLOUT;
}
if e {
events |= libc::POLLERR;
}
polls.push(libc::pollfd {
fd: host_fd as c_int,
@ -47,12 +57,10 @@ pub fn do_select(
Some(tv) => (tv.tv_sec * 1000 + tv.tv_usec / 1000) as i32,
};
let ret = unsafe {
libc::ocall::poll(polls.as_mut_ptr(), polls.len() as u64, timeout)
};
let ret = unsafe { libc::ocall::poll(polls.as_mut_ptr(), polls.len() as u64, timeout) };
if ret < 0 {
return errno!(Errno::from_retval(ret as i32), "");
return errno!(Errno::from_retval(unsafe { libc::errno() }), "");
}
// convert fd back and write fdset
@ -76,10 +84,7 @@ pub fn do_select(
Ok(ret as usize)
}
pub fn do_poll(
polls: &mut [libc::pollfd],
timeout: c_int,
) -> Result<usize, Error> {
pub fn do_poll(polls: &mut [libc::pollfd], timeout: c_int) -> Result<usize, Error> {
info!("poll: [..], timeout: {}", timeout);
let current_ref = process::get_current();
@ -91,13 +96,11 @@ pub fn do_poll(
let socket = file_ref.as_socket()?;
poll.fd = socket.fd();
}
let ret = unsafe {
libc::ocall::poll(polls.as_mut_ptr(), polls.len() as u64, timeout)
};
let ret = unsafe { libc::ocall::poll(polls.as_mut_ptr(), polls.len() as u64, timeout) };
// recover fd ?
if ret < 0 {
errno!(Errno::from_retval(ret as i32), "")
errno!(Errno::from_retval(unsafe { libc::errno() }), "")
} else {
Ok(ret as usize)
}
@ -112,7 +115,10 @@ pub fn do_epoll_create1(flags: c_int) -> Result<FileDesc, Error> {
let mut proc = current_ref.lock().unwrap();
let fd = {
let close_on_spawn = flags & libc::EPOLL_CLOEXEC != 0;
proc.get_files().lock().unwrap().put(file_ref, close_on_spawn)
proc.get_files()
.lock()
.unwrap()
.put(file_ref, close_on_spawn)
};
Ok(fd)
}
@ -142,7 +148,12 @@ pub fn do_epoll_wait(
events: &mut [libc::epoll_event],
timeout: c_int,
) -> Result<usize, Error> {
info!("epoll_wait: epfd: {}, len: {:?}, timeout: {}", epfd, events.len(), timeout);
info!(
"epoll_wait: epfd: {}, len: {:?}, timeout: {}",
epfd,
events.len(),
timeout
);
let current_ref = process::get_current();
let mut proc = current_ref.lock().unwrap();
@ -187,7 +198,7 @@ pub struct EpollFile {
impl EpollFile {
pub fn new() -> Result<Self, Error> {
Ok(Self {
inner: SgxMutex::new(EpollFileInner::new()?)
inner: SgxMutex::new(EpollFileInner::new()?),
})
}
}
@ -202,25 +213,21 @@ impl EpollFileInner {
pub fn new() -> Result<Self, Error> {
let ret = unsafe { libc::ocall::epoll_create1(0) };
if ret < 0 {
return errno!(Errno::from_retval(ret as i32), "");
return errno!(Errno::from_retval(unsafe { libc::errno() }), "");
}
Ok(EpollFileInner {
epoll_fd: ret,
})
Ok(EpollFileInner { epoll_fd: ret })
}
pub fn ctl(&mut self, op: c_int, host_fd: FileDesc, event: *const libc::epoll_event) -> Result<(), Error> {
let ret = unsafe {
libc::ocall::epoll_ctl(
self.epoll_fd,
op,
host_fd as c_int,
event as *mut _,
)
};
pub fn ctl(
&mut self,
op: c_int,
host_fd: FileDesc,
event: *const libc::epoll_event,
) -> Result<(), Error> {
let ret =
unsafe { libc::ocall::epoll_ctl(self.epoll_fd, op, host_fd as c_int, event as *mut _) };
if ret < 0 {
return errno!(Errno::from_retval(ret as i32), "");
return errno!(Errno::from_retval(unsafe { libc::errno() }), "");
}
Ok(())
}
@ -241,7 +248,7 @@ impl EpollFileInner {
)
};
if ret < 0 {
return errno!(Errno::from_retval(ret as i32), "");
return errno!(Errno::from_retval(unsafe { libc::errno() }), "");
}
Ok(ret as usize)
}

@ -11,7 +11,7 @@ impl SocketFile {
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) };
if ret < 0 {
errno!(Errno::from_retval(ret as i32), "")
errno!(Errno::from_retval(unsafe { libc::errno() }), "")
} else {
Ok(SocketFile { fd: ret })
}
@ -25,7 +25,7 @@ impl SocketFile {
) -> Result<Self, Error> {
let ret = unsafe { libc::ocall::accept4(self.fd, addr, addr_len, flags) };
if ret < 0 {
errno!(Errno::from_retval(ret as i32), "")
errno!(Errno::from_retval(unsafe { libc::errno() }), "")
} else {
Ok(SocketFile { fd: ret })
}
@ -49,7 +49,7 @@ impl File for SocketFile {
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()) };
if ret < 0 {
errno!(Errno::from_retval(ret as i32), "")
errno!(Errno::from_retval(unsafe { libc::errno() }), "")
} else {
Ok(ret as usize)
}
@ -58,7 +58,7 @@ impl File for SocketFile {
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()) };
if ret < 0 {
errno!(Errno::from_retval(ret as i32), "")
errno!(Errno::from_retval(unsafe { libc::errno() }), "")
} else {
Ok(ret as usize)
}

@ -942,6 +942,9 @@ fn do_connect(
let socket = file_ref.as_socket()?;
let ret = unsafe { libc::ocall::connect(socket.fd(), addr, addr_len) };
if ret < 0 {
return errno!(Errno::from_retval(unsafe { libc::errno() }), "");
}
Ok(ret as isize)
}
@ -975,6 +978,9 @@ fn do_shutdown(fd: c_int, how: c_int) -> Result<isize, Error> {
let socket = file_ref.as_socket()?;
let ret = unsafe { libc::ocall::shutdown(socket.fd(), how) };
if ret < 0 {
return errno!(Errno::from_retval(unsafe { libc::errno() }), "");
}
Ok(ret as isize)
}
@ -990,6 +996,9 @@ fn do_bind(
let socket = file_ref.as_socket()?;
let ret = unsafe { libc::ocall::bind(socket.fd(), addr, addr_len) };
if ret < 0 {
return errno!(Errno::from_retval(unsafe { libc::errno() }), "");
}
Ok(ret as isize)
}
@ -1001,6 +1010,9 @@ fn do_listen(fd: c_int, backlog: c_int) -> Result<isize, Error> {
let socket = file_ref.as_socket()?;
let ret = unsafe { libc::ocall::listen(socket.fd(), backlog) };
if ret < 0 {
return errno!(Errno::from_retval(unsafe { libc::errno() }), "");
}
Ok(ret as isize)
}
@ -1021,6 +1033,9 @@ fn do_setsockopt(
let socket = file_ref.as_socket()?;
let ret = unsafe { libc::ocall::setsockopt(socket.fd(), level, optname, optval, optlen) };
if ret < 0 {
return errno!(Errno::from_retval(unsafe { libc::errno() }), "");
}
Ok(ret as isize)
}
@ -1041,6 +1056,9 @@ fn do_getsockopt(
let socket = file_ref.as_socket()?;
let ret = unsafe { libc::ocall::getsockopt(socket.fd(), level, optname, optval, optlen) };
if ret < 0 {
return errno!(Errno::from_retval(unsafe { libc::errno() }), "");
}
Ok(ret as isize)
}
@ -1062,6 +1080,9 @@ fn do_sendto(
let socket = file_ref.as_socket()?;
let ret = unsafe { libc::ocall::sendto(socket.fd(), base, len, flags, addr, addr_len) };
if ret < 0 {
return errno!(Errno::from_retval(unsafe { libc::errno() }), "");
}
Ok(ret as isize)
}
@ -1083,6 +1104,9 @@ fn do_recvfrom(
let socket = file_ref.as_socket()?;
let ret = unsafe { libc::ocall::recvfrom(socket.fd(), base, len, flags, addr, addr_len) };
if ret < 0 {
return errno!(Errno::from_retval(unsafe { libc::errno() }), "");
}
Ok(ret as isize)
}