use anyhow::Context as _;
use socket_config::{
SocketAddr,
SocketAppOptions,
SocketUserOptions,
};
use socket2::Socket;
use std::io::Write;
#[derive(clap::Parser)]
struct CommandLine {
#[command(flatten)]
options: SocketUserOptions,
socket: SocketAddr,
}
fn main() -> anyhow::Result<()> {
let command_line = <CommandLine as clap::Parser>::parse();
let mut socket_app_options = SocketAppOptions::new(socket2::Type::STREAM);
socket_app_options.default_port = Some(27910);
let socket: Socket = socket_config::open(
&command_line.socket,
&socket_app_options,
&command_line.options,
).context("couldn't open socket")?;
let (mut connection, _): (Socket, _) = loop {
let result = socket.accept();
if matches!(&result, Err(e) if e.kind() == std::io::ErrorKind::Interrupted) {
continue;
}
break result
}.context("couldn't accept a connection")?;
drop(socket);
let chars: Vec<u8> = (b' '..b'~').into_iter().collect();
loop {
match connection.write_all(&chars) {
Ok(()) => {
}
Err(error) if error.kind() == std::io::ErrorKind::WriteZero => {
break;
}
Err(error) => {
return Err(
anyhow::format_err!(error)
.context("couldn't send characters to client")
);
}
}
}
Ok(())
}