e1000d: handle EOF
This commit is contained in:
+20
-7
@@ -7,7 +7,7 @@ extern crate syscall;
|
||||
use std::cell::RefCell;
|
||||
use std::env;
|
||||
use std::fs::File;
|
||||
use std::io::{Read, Write, Result};
|
||||
use std::io::{ErrorKind, Read, Write, Result};
|
||||
use std::os::unix::io::{AsRawFd, FromRawFd, RawFd};
|
||||
use std::sync::Arc;
|
||||
|
||||
@@ -17,7 +17,7 @@ use syscall::{Packet, SchemeBlockMut, PHYSMAP_NO_CACHE, PHYSMAP_WRITE};
|
||||
|
||||
pub mod device;
|
||||
|
||||
fn handle_update(socket: &mut File, device: &mut device::Intel8254x, todo: &mut Vec<Packet>) -> Result<()> {
|
||||
fn handle_update(socket: &mut File, device: &mut device::Intel8254x, todo: &mut Vec<Packet>) -> Result<bool> {
|
||||
// Handle any blocked packets
|
||||
let mut i = 0;
|
||||
while i < todo.len() {
|
||||
@@ -33,8 +33,14 @@ fn handle_update(socket: &mut File, device: &mut device::Intel8254x, todo: &mut
|
||||
// Check that the socket is empty
|
||||
loop {
|
||||
let mut packet = Packet::default();
|
||||
if socket.read(&mut packet)? == 0 {
|
||||
break;
|
||||
match socket.read(&mut packet) {
|
||||
Ok(0) => return Ok(true),
|
||||
Ok(_) => (),
|
||||
Err(err) => if err.kind() == ErrorKind::WouldBlock {
|
||||
break;
|
||||
} else {
|
||||
return Err(err);
|
||||
}
|
||||
}
|
||||
|
||||
if let Some(a) = device.handle(&packet) {
|
||||
@@ -45,7 +51,7 @@ fn handle_update(socket: &mut File, device: &mut device::Intel8254x, todo: &mut
|
||||
}
|
||||
}
|
||||
|
||||
Ok(())
|
||||
Ok(false)
|
||||
}
|
||||
|
||||
fn main() {
|
||||
@@ -88,7 +94,9 @@ fn main() {
|
||||
if unsafe { device_irq.borrow().irq() } {
|
||||
irq_file.write(&mut irq)?;
|
||||
|
||||
handle_update(&mut socket_irq.borrow_mut(), &mut device_irq.borrow_mut(), &mut todo_irq.borrow_mut())?;
|
||||
if handle_update(&mut socket_irq.borrow_mut(), &mut device_irq.borrow_mut(), &mut todo_irq.borrow_mut())? {
|
||||
return Ok(Some(0))
|
||||
}
|
||||
|
||||
let next_read = device_irq.borrow().next_read();
|
||||
if next_read > 0 {
|
||||
@@ -101,7 +109,9 @@ fn main() {
|
||||
let device_packet = device.clone();
|
||||
let socket_packet = socket.clone();
|
||||
event_queue.add(socket_fd as RawFd, move |_event| -> Result<Option<usize>> {
|
||||
handle_update(&mut socket_packet.borrow_mut(), &mut device_packet.borrow_mut(), &mut todo.borrow_mut());
|
||||
if handle_update(&mut socket_packet.borrow_mut(), &mut device_packet.borrow_mut(), &mut todo.borrow_mut())? {
|
||||
return Ok(Some(0));
|
||||
}
|
||||
|
||||
let next_read = device_packet.borrow().next_read();
|
||||
if next_read > 0 {
|
||||
@@ -135,6 +145,9 @@ fn main() {
|
||||
|
||||
loop {
|
||||
let event_count = event_queue.run().expect("e1000d: failed to handle events");
|
||||
if event_count == 0 {
|
||||
break;
|
||||
}
|
||||
send_events(event_count);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user