mirror of
https://github.com/stickynotememo/signalstream.git
synced 2026-07-30 06:46:03 +10:00
add write()
This commit is contained in:
+11
-22
@@ -1,6 +1,5 @@
|
||||
use bitvec::prelude::*;
|
||||
use std::io::{self, Read, Write};
|
||||
use std::os::unix::process;
|
||||
|
||||
use signal_hook::consts::*;
|
||||
use signal_hook::iterator::Signals;
|
||||
@@ -21,48 +20,41 @@ impl Read for SignalStream {
|
||||
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
|
||||
let mut n = 0;
|
||||
|
||||
dbg!(std::process::id());
|
||||
|
||||
let pending = self.signals.forever();
|
||||
let mut bitlist = bitvec![];
|
||||
for signal in pending {
|
||||
dbg!(&signal);
|
||||
n += 1;
|
||||
bitlist.push(match signal {
|
||||
SIGUSR1 => false,
|
||||
SIGUSR2 => true,
|
||||
_ => {
|
||||
// This should be impossible, as only the SIGUSR1 and SIGUSR2 signals are
|
||||
// registered to begin with.
|
||||
panic!("Program recieved an unexpected signal, despite it not being registered")
|
||||
}
|
||||
});
|
||||
|
||||
if n >= buf.len() * 8 {
|
||||
dbg!("broken");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
dbg!(bitlist.to_string());
|
||||
|
||||
// Converts a bitvec to a vec of bytes, with 1/8th the length.
|
||||
// Adapted from https://stackoverflow.com/a/72572904
|
||||
for (i, bit) in bitlist.iter().enumerate() {
|
||||
let byte = i / 8;
|
||||
let shift = 7 - i % 8;
|
||||
buf[byte] |= ((*bit) as u8) << shift
|
||||
}
|
||||
|
||||
// std::process::exit(1);
|
||||
// if bytelist.len() % buf.len() != 0 {
|
||||
// return Err(io::Error::new(io::ErrorKind::UnexpectedEof, "Could not read enough bits."));
|
||||
// };
|
||||
|
||||
Ok(n)
|
||||
}
|
||||
}
|
||||
|
||||
impl Write for SignalStream {
|
||||
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
|
||||
dbg!(std::process::id());
|
||||
for num in buf {
|
||||
let bit_representation = String::from(format!("{num:b}"));
|
||||
let bit_representation = String::from(format!("{num:08b}"));
|
||||
for bit in bit_representation.chars() {
|
||||
let signal = match bit
|
||||
.to_digit(2)
|
||||
@@ -72,10 +64,10 @@ impl Write for SignalStream {
|
||||
1 => SIGUSR2,
|
||||
_ => panic!("Non-binary digit in binary representation"),
|
||||
};
|
||||
|
||||
unsafe {
|
||||
libc::kill(self.pid as i32, signal);
|
||||
};
|
||||
std::thread::sleep(std::time::Duration::from_millis(100));
|
||||
}
|
||||
}
|
||||
Ok(0)
|
||||
@@ -92,11 +84,8 @@ mod tests {
|
||||
use std::{process::Command, thread::sleep, time::Duration};
|
||||
|
||||
#[test]
|
||||
fn read_test() {
|
||||
let mut sigstream = SignalStream::new(std::process::id());
|
||||
// sigstream.write(&[4]).unwrap();
|
||||
let mut buf = [0; 3];
|
||||
dbg!(sigstream.read(&mut buf).unwrap());
|
||||
dbg!(buf);
|
||||
}
|
||||
fn read_test() {}
|
||||
|
||||
#[test]
|
||||
fn write_test() {}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user