e1000d: handle EOF

This commit is contained in:
Jeremy Soller
2019-07-18 21:10:02 -06:00
parent 217e51f830
commit 974fe7488f
+20 -7
View File
@@ -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);
}
}