Send readable event from fevent

This fixes one problem with openssl on relibc, since relibc correctly respects readable/writable status unlike the newlib implementation which always says it's readable.
This commit is contained in:
jD91mZM2
2018-08-29 17:47:25 +02:00
parent 9deb8dcb0d
commit a7eb42fbeb
+17 -5
View File
@@ -18,7 +18,8 @@ use syscall::data::{Packet, Stat};
//TODO: Use a CSPRNG, allow write of entropy
struct RandScheme {
prng: ChaChaRng
socket: File,
prng: ChaChaRng
}
impl SchemeMut for RandScheme {
@@ -66,6 +67,17 @@ impl SchemeMut for RandScheme {
Ok(0)
}
fn fevent(&mut self, id: usize, _flags: usize) -> Result<usize> {
self.socket.write(&syscall::Packet {
a: syscall::SYS_FEVENT,
b: id,
c: syscall::EVENT_READ,
d: 1,
..Default::default()
})?;
Ok(0)
}
fn fcntl(&mut self, _id: usize, _cmd: usize, _arg: usize) -> Result<usize> {
Ok(0)
}
@@ -80,7 +92,7 @@ fn main(){
// Daemonize
if unsafe { syscall::clone(0).unwrap() } == 0 {
let mut socket = File::create(":rand").expect("rand: failed to create rand scheme");
let socket = File::create(":rand").expect("rand: failed to create rand scheme");
let mut rng = ChaChaRng::new_unseeded();
@@ -99,15 +111,15 @@ fn main(){
println!("rand: unseeded");
}
let mut scheme = RandScheme{prng: rng};
let mut scheme = RandScheme{socket, prng: rng};
syscall::setrens(0, 0).expect("randd: failed to enter null namespace");
loop {
let mut packet = Packet::default();
socket.read(&mut packet).expect("rand: failed to read events from rand scheme");
scheme.socket.read(&mut packet).expect("rand: failed to read events from rand scheme");
scheme.handle(&mut packet);
socket.write(&packet).expect("rand: failed to write responses to rand scheme");
scheme.socket.write(&packet).expect("rand: failed to write responses to rand scheme");
}
}
}