fix return value from libc::ocall
This commit is contained in:
parent
76f9ff380b
commit
141094e95e
@ -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)
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user