This commit is contained in:
2025-12-30 10:48:18 +11:00
commit 40335a8926
4 changed files with 209 additions and 0 deletions
+1
View File
@@ -0,0 +1 @@
/target
Generated
+102
View File
@@ -0,0 +1,102 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 4
[[package]]
name = "bitvec"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c"
dependencies = [
"funty",
"radium",
"tap",
"wyz",
]
[[package]]
name = "errno"
version = "0.3.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
dependencies = [
"libc",
"windows-sys",
]
[[package]]
name = "funty"
version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c"
[[package]]
name = "libc"
version = "0.2.178"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "37c93d8daa9d8a012fd8ab92f088405fb202ea0b6ab73ee2482ae66af4f42091"
[[package]]
name = "radium"
version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09"
[[package]]
name = "signal-hook"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2a37d01603c37b5466f808de79f845c7116049b0579adb70a6b7d47c1fa3a952"
dependencies = [
"libc",
"signal-hook-registry",
]
[[package]]
name = "signal-hook-registry"
version = "1.4.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b"
dependencies = [
"errno",
"libc",
]
[[package]]
name = "signalstream"
version = "0.1.0"
dependencies = [
"bitvec",
"libc",
"signal-hook",
]
[[package]]
name = "tap"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369"
[[package]]
name = "windows-link"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
[[package]]
name = "windows-sys"
version = "0.61.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc"
dependencies = [
"windows-link",
]
[[package]]
name = "wyz"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed"
dependencies = [
"tap",
]
+9
View File
@@ -0,0 +1,9 @@
[package]
name = "signalstream"
version = "0.1.0"
edition = "2024"
[dependencies]
bitvec = "1.0.1"
libc = "0.2.178"
signal-hook = "0.4.1"
+97
View File
@@ -0,0 +1,97 @@
use bitvec::prelude::*;
use std::io::{self, Read, Write};
use std::os::unix::process;
use signal_hook::consts::*;
use signal_hook::iterator::Signals;
pub struct SignalStream {
signals: Signals,
pid: u32,
}
impl SignalStream {
pub fn new(pid: u32) -> Self {
Self {
signals: Signals::new([SIGUSR1, SIGUSR2]).unwrap(),
pid: pid,
}
}
}
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,
_ => {
panic!("Program recieved an unexpected signal, despite it not being registered")
}
});
if n >= buf.len() * 8 {
dbg!("broken");
break;
}
}
dbg!(bitlist.to_string());
// 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}"));
for bit in bit_representation.chars() {
let signal = match bit
.to_digit(2)
.expect("Non-binary digit in binary representation")
{
0 => SIGUSR1,
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)
}
fn flush(&mut self) -> io::Result<()> {
Ok(())
}
}
#[cfg(test)]
mod tests {
use super::*;
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);
}
}