]> average.org Git - ironfinger.git/commitdiff
Initial code main
authorEugene Crosser <crosser@average.org>
Fri, 31 Oct 2025 22:53:29 +0000 (23:53 +0100)
committerEugene Crosser <crosser@average.org>
Fri, 31 Oct 2025 22:53:29 +0000 (23:53 +0100)
.gitignore [new file with mode: 0644]
Cargo.toml [new file with mode: 0644]
README.md [new file with mode: 0644]
ironfinger.rs [new file with mode: 0644]

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..b397ff1
--- /dev/null
@@ -0,0 +1,2 @@
+Cargo.lock
+target/*
diff --git a/Cargo.toml b/Cargo.toml
new file mode 100644 (file)
index 0000000..093e77c
--- /dev/null
@@ -0,0 +1,11 @@
+[package]
+name = "ironfinger"
+default-run = "ironfinger"
+edition = "2021"
+
+[[bin]]
+name = "ironfinger"
+path = "ironfinger.rs"
+
+[dependencies]
+getopts = "0.2"
diff --git a/README.md b/README.md
new file mode 100644 (file)
index 0000000..2433124
--- /dev/null
+++ b/README.md
@@ -0,0 +1,16 @@
+Dependencies:
+    librust-getopts-dev
+
+Configure cargo this way:
+
+```
+$ cat ~/.cargo/config.toml
+[net]
+offline = true
+
+[source]
+[source.debian-packages]
+directory = "/usr/share/cargo/registry"
+[source.crates-io]
+replace-with = "debian-packages"
+```
diff --git a/ironfinger.rs b/ironfinger.rs
new file mode 100644 (file)
index 0000000..b22372b
--- /dev/null
@@ -0,0 +1,69 @@
+use std::env;
+use std::io::{Read, Write};
+use std::net::{Ipv6Addr, Shutdown, TcpListener, TcpStream};
+use std::time::Duration;
+
+extern crate getopts;
+use getopts::Options;
+
+fn handle_client(mut stream: TcpStream) {
+    println!("Connection from {:?}", stream.peer_addr().unwrap());
+    stream
+        .set_read_timeout(Some(Duration::from_secs(5)))
+        .expect("set_read_timeout failed");
+    let mut buffer = [0; 128];
+    match stream.read(&mut buffer) {
+        Ok(l) => {
+            let request = String::from_utf8_lossy(&buffer[..l]);
+            let name = request.trim_end();
+            println!("Got {l:?} bytes request: \"{}\"", name);
+            stream
+                .write("Got this request\r\n".as_bytes())
+                .expect("Write failed");
+            stream.write(request.as_bytes()).expect("Write data failed");
+        }
+        Err(e) => {
+            println!("Read error: {e:?}");
+        }
+    }
+    stream.shutdown(Shutdown::Both).expect("Shutdown failed");
+    println!("Finished processing client");
+}
+
+fn main() -> std::io::Result<()> {
+    let args: Vec<String> = env::args().collect();
+    let progname = args[0].clone();
+    let mut opts = Options::new();
+    opts.optopt("p", "port", "set port to listen", "79");
+    opts.optflag("h", "help", "print this help menu");
+    let mo = match opts.parse(&args[1..]) {
+        Ok(m) => m,
+        Err(e) => {
+            panic!("{}", e.to_string())
+        }
+    };
+    if mo.opt_present("h") {
+        println!("{}: there is no help!", progname);
+        return Ok(());
+    }
+    let p = match mo.opt_get_default::<u16>("p", 79) {
+        Ok(p) => p,
+        Err(e) => {
+            panic!("Bad option for port {:?}", e)
+        }
+    };
+    println!("Binding to port {:?}", p);
+    let listener = TcpListener::bind((Ipv6Addr::UNSPECIFIED, p))
+        .expect("Could not bind to finger port");
+    for stream in listener.incoming() {
+        match stream {
+            Ok(stream) => {
+                handle_client(stream);
+            }
+            Err(e) => {
+                println!("Unaccepted {e:?}");
+            }
+        }
+    }
+    Ok(())
+}