|
@@ -14,9 +14,7 @@ use fs::File;
|
|
|
use header::dirent::dirent;
|
|
|
use header::errno::{EINVAL, EIO, EPERM};
|
|
|
use header::fcntl;
|
|
|
-use header::poll::{self, nfds_t, pollfd};
|
|
|
use header::sys_mman::MAP_ANON;
|
|
|
-use header::sys_select::fd_set;
|
|
|
use header::sys_stat::stat;
|
|
|
use header::sys_statvfs::statvfs;
|
|
|
use header::sys_time::{timeval, timezone};
|
|
@@ -691,130 +689,6 @@ impl Pal for Sys {
|
|
|
res as c_int
|
|
|
}
|
|
|
|
|
|
- fn poll(fds: *mut pollfd, nfds: nfds_t, timeout: c_int) -> c_int {
|
|
|
- let fds = unsafe { slice::from_raw_parts_mut(fds, nfds as usize) };
|
|
|
-
|
|
|
- let event_path = c_str!("event:");
|
|
|
- let mut event_file = match File::open(event_path, fcntl::O_RDWR | fcntl::O_CLOEXEC) {
|
|
|
- Ok(file) => file,
|
|
|
- Err(_) => return -1,
|
|
|
- };
|
|
|
-
|
|
|
- for fd in fds.iter_mut() {
|
|
|
- let mut flags = 0;
|
|
|
-
|
|
|
- if fd.events & poll::POLLIN > 0 {
|
|
|
- flags |= syscall::EVENT_READ;
|
|
|
- }
|
|
|
-
|
|
|
- if fd.events & poll::POLLOUT > 0 {
|
|
|
- flags |= syscall::EVENT_WRITE;
|
|
|
- }
|
|
|
-
|
|
|
- fd.revents = 0;
|
|
|
-
|
|
|
- if fd.fd >= 0 && flags > 0 {
|
|
|
- if event_file
|
|
|
- .write(&syscall::Event {
|
|
|
- id: fd.fd as usize,
|
|
|
- flags: flags,
|
|
|
- data: 0,
|
|
|
- })
|
|
|
- .is_err()
|
|
|
- {
|
|
|
- return -1;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- const TIMEOUT_TOKEN: usize = 1;
|
|
|
-
|
|
|
- let timeout_file = if timeout < 0 {
|
|
|
- None
|
|
|
- } else {
|
|
|
- let timeout_path = unsafe {
|
|
|
- CString::from_vec_unchecked(
|
|
|
- format!("time:{}", syscall::CLOCK_MONOTONIC).into_bytes(),
|
|
|
- )
|
|
|
- };
|
|
|
- let mut timeout_file = match File::open(&timeout_path, fcntl::O_RDWR | fcntl::O_CLOEXEC)
|
|
|
- {
|
|
|
- Ok(file) => file,
|
|
|
- Err(_) => return -1,
|
|
|
- };
|
|
|
-
|
|
|
- if event_file
|
|
|
- .write(&syscall::Event {
|
|
|
- id: *timeout_file as usize,
|
|
|
- flags: syscall::EVENT_READ,
|
|
|
- data: TIMEOUT_TOKEN,
|
|
|
- })
|
|
|
- .is_err()
|
|
|
- {
|
|
|
- return -1;
|
|
|
- }
|
|
|
-
|
|
|
- let mut time = syscall::TimeSpec::default();
|
|
|
- if timeout_file.read(&mut time).is_err() {
|
|
|
- return -1;
|
|
|
- }
|
|
|
-
|
|
|
- time.tv_nsec += timeout * 1000000;
|
|
|
- while time.tv_nsec >= 1000000000 {
|
|
|
- time.tv_sec += 1;
|
|
|
- time.tv_nsec -= 1000000000;
|
|
|
- }
|
|
|
-
|
|
|
- if timeout_file.write(&time).is_err() {
|
|
|
- return -1;
|
|
|
- }
|
|
|
-
|
|
|
- Some(timeout_file)
|
|
|
- };
|
|
|
-
|
|
|
- let mut events = [syscall::Event::default(); 32];
|
|
|
- let read = {
|
|
|
- let mut events = unsafe {
|
|
|
- slice::from_raw_parts_mut(
|
|
|
- &mut events as *mut _ as *mut u8,
|
|
|
- mem::size_of::<syscall::Event>() * events.len(),
|
|
|
- )
|
|
|
- };
|
|
|
- match event_file.read(&mut events) {
|
|
|
- Ok(i) => i / mem::size_of::<syscall::Event>(),
|
|
|
- Err(_) => return -1,
|
|
|
- }
|
|
|
- };
|
|
|
-
|
|
|
- for event in &events[..read] {
|
|
|
- if event.data == TIMEOUT_TOKEN {
|
|
|
- continue;
|
|
|
- }
|
|
|
-
|
|
|
- for fd in fds.iter_mut() {
|
|
|
- if event.id == fd.fd as usize {
|
|
|
- if event.flags & syscall::EVENT_READ > 0 {
|
|
|
- fd.revents |= poll::POLLIN;
|
|
|
- }
|
|
|
-
|
|
|
- if event.flags & syscall::EVENT_WRITE > 0 {
|
|
|
- fd.revents |= poll::POLLOUT;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- let mut total = 0;
|
|
|
-
|
|
|
- for fd in fds.iter_mut() {
|
|
|
- if fd.revents > 0 {
|
|
|
- total += 1;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- total
|
|
|
- }
|
|
|
-
|
|
|
fn pte_clone() -> pid_t {
|
|
|
e(unsafe {
|
|
|
syscall::clone(
|
|
@@ -872,143 +746,6 @@ impl Pal for Sys {
|
|
|
e(syscall::sched_yield()) as c_int
|
|
|
}
|
|
|
|
|
|
- fn select(
|
|
|
- nfds: c_int,
|
|
|
- readfds: *mut fd_set,
|
|
|
- writefds: *mut fd_set,
|
|
|
- exceptfds: *mut fd_set,
|
|
|
- timeout: *mut timeval,
|
|
|
- ) -> c_int {
|
|
|
- let mut readfds = unsafe { readfds.as_mut() }.map(|s| BitSet::from_ref(&mut s.fds_bits));
|
|
|
- let mut writefds = unsafe { writefds.as_mut() }.map(|s| BitSet::from_ref(&mut s.fds_bits));
|
|
|
- let mut exceptfds =
|
|
|
- unsafe { exceptfds.as_mut() }.map(|s| BitSet::from_ref(&mut s.fds_bits));
|
|
|
-
|
|
|
- let event_path = c_str!("event:");
|
|
|
- let mut event_file = match File::open(event_path, fcntl::O_RDWR | fcntl::O_CLOEXEC) {
|
|
|
- Ok(file) => file,
|
|
|
- Err(_) => return -1,
|
|
|
- };
|
|
|
-
|
|
|
- for fd in 0..nfds as usize {
|
|
|
- macro_rules! register {
|
|
|
- ($fd:expr, $flags:expr) => {
|
|
|
- if event_file
|
|
|
- .write(&syscall::Event {
|
|
|
- id: $fd,
|
|
|
- flags: $flags,
|
|
|
- data: 0,
|
|
|
- })
|
|
|
- .is_err()
|
|
|
- {
|
|
|
- return -1;
|
|
|
- }
|
|
|
- };
|
|
|
- }
|
|
|
- if readfds.as_mut().map(|s| s.contains(fd)).unwrap_or(false) {
|
|
|
- register!(fd, syscall::EVENT_READ);
|
|
|
- }
|
|
|
- if writefds.as_mut().map(|s| s.contains(fd)).unwrap_or(false) {
|
|
|
- register!(fd, syscall::EVENT_WRITE);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- const TIMEOUT_TOKEN: usize = 1;
|
|
|
-
|
|
|
- let timeout_file = if timeout.is_null() {
|
|
|
- None
|
|
|
- } else {
|
|
|
- let timeout = unsafe { &*timeout };
|
|
|
-
|
|
|
- let timeout_path = unsafe {
|
|
|
- CString::from_vec_unchecked(
|
|
|
- format!("time:{}", syscall::CLOCK_MONOTONIC).into_bytes(),
|
|
|
- )
|
|
|
- };
|
|
|
- let mut timeout_file = match File::open(&timeout_path, fcntl::O_RDWR | fcntl::O_CLOEXEC)
|
|
|
- {
|
|
|
- Ok(file) => file,
|
|
|
- Err(_) => return -1,
|
|
|
- };
|
|
|
-
|
|
|
- if event_file
|
|
|
- .write(&syscall::Event {
|
|
|
- id: *timeout_file as usize,
|
|
|
- flags: syscall::EVENT_READ,
|
|
|
- data: TIMEOUT_TOKEN,
|
|
|
- })
|
|
|
- .is_err()
|
|
|
- {
|
|
|
- return -1;
|
|
|
- }
|
|
|
-
|
|
|
- let mut time = syscall::TimeSpec::default();
|
|
|
- if timeout_file.read(&mut time).is_err() {
|
|
|
- return -1;
|
|
|
- }
|
|
|
-
|
|
|
- time.tv_sec += timeout.tv_sec;
|
|
|
- time.tv_nsec += timeout.tv_usec * 1000;
|
|
|
- while time.tv_nsec >= 1000000000 {
|
|
|
- time.tv_sec += 1;
|
|
|
- time.tv_nsec -= 1000000000;
|
|
|
- }
|
|
|
-
|
|
|
- if timeout_file.write(&time).is_err() {
|
|
|
- return -1;
|
|
|
- }
|
|
|
-
|
|
|
- Some(timeout_file)
|
|
|
- };
|
|
|
-
|
|
|
- let mut events = [syscall::Event::default(); 32];
|
|
|
- let read = {
|
|
|
- let mut events = unsafe {
|
|
|
- slice::from_raw_parts_mut(
|
|
|
- &mut events as *mut _ as *mut u8,
|
|
|
- mem::size_of::<syscall::Event>() * events.len(),
|
|
|
- )
|
|
|
- };
|
|
|
- match event_file.read(&mut events) {
|
|
|
- Ok(i) => i / mem::size_of::<syscall::Event>(),
|
|
|
- Err(_) => return -1,
|
|
|
- }
|
|
|
- };
|
|
|
-
|
|
|
- let mut total = 0;
|
|
|
-
|
|
|
- if let Some(ref mut set) = readfds {
|
|
|
- set.clear();
|
|
|
- }
|
|
|
- if let Some(ref mut set) = writefds {
|
|
|
- set.clear();
|
|
|
- }
|
|
|
- if let Some(ref mut set) = exceptfds {
|
|
|
- set.clear();
|
|
|
- }
|
|
|
-
|
|
|
- for event in &events[..read] {
|
|
|
- if event.data == TIMEOUT_TOKEN {
|
|
|
- continue;
|
|
|
- }
|
|
|
-
|
|
|
- if event.flags & syscall::EVENT_READ == syscall::EVENT_READ {
|
|
|
- if let Some(ref mut set) = readfds {
|
|
|
- set.insert(event.id);
|
|
|
- }
|
|
|
- total += 1;
|
|
|
- }
|
|
|
- if event.flags & syscall::EVENT_WRITE == syscall::EVENT_WRITE {
|
|
|
- if let Some(ref mut set) = writefds {
|
|
|
- set.insert(event.id);
|
|
|
- }
|
|
|
- total += 1;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- total
|
|
|
- }
|
|
|
-
|
|
|
fn setpgid(pid: pid_t, pgid: pid_t) -> c_int {
|
|
|
e(syscall::setpgid(pid as usize, pgid as usize)) as c_int
|
|
|
}
|