You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

105 lines
2.5 KiB
Rust

use std::io::Write;
use std::net::TcpStream;
use std::process::{Command, exit};
pub fn usage() {
eprintln!("usage: rgp [-v] [-H] [gopher URI]");
exit(0);
}
pub fn banner(to_error: bool) {
if to_error {
eprintln!("rgp 0.3.3 Copyright (c) 2020 Lukáš Hozda");
} else {
println!("rgp 0.3.3 Copyright (c) 2020 Lukáš Hozda");
}
}
pub fn dial(
host: &str,
port: u16,
selector: &str,
) -> Option<TcpStream> {
let mut stream = match TcpStream::connect((host, port)) {
Ok(s) => s,
Err(e) => {
eprintln!("failed to dial server: {}", e);
return None;
}
};
if let Err(e) = writeln!(stream, "{}", selector) {
eprintln!("failed to send request to server: {}", e);
return None;
};
Some(stream)
}
pub fn make_key(c1: char, c2: char, c3: char) -> Option<usize> {
if c1 == '\0' || c2 == '\0' {
return None;
}
if c3 == '\0' {
Some(
(c1 as u8 - b'a') as usize * ('z' as usize - 'a' as usize + 1)
+ (c2 as u8 - b'a') as usize,
)
} else {
Some(
((c1 as u8 - b'a') as usize + 1)
* ('z' as usize - 'a' as usize + 1)
* ('z' as usize - 'a' as usize + 1)
+ ((c2 as u8 - b'a') as usize) * ('z' as usize - 'a' as usize + 1)
+ ((c3 as u8 - b'a') as usize),
)
}
}
pub fn make_key_str(
key: usize,
c1: &mut char,
c2: &mut char,
c3: &mut char,
) {
if key
< ('z' as usize - 'a' as usize + 1 as usize)
* ('z' as usize - 'a' as usize + 1 as usize)
{
*c1 = ('a' as usize + key / ('z' as usize - 'a' as usize + 1 as usize)) as u8
as char;
*c2 = ('a' as usize + key % ('z' as usize - 'a' as usize + 1 as usize)) as u8
as char;
*c3 = 0 as usize as u8 as char
} else {
*c1 = ('a' as usize
+ key
/ (('z' as usize - 'a' as usize + 1 as usize)
* ('z' as usize - 'a' as usize + 1 as usize))
- 1 as usize) as u8 as char;
*c2 = ('a' as usize
+ key / ('z' as usize - 'a' as usize + 1 as usize)
% ('z' as usize - 'a' as usize + 1 as usize)) as u8 as char;
*c3 = ('a' as usize + key % ('z' as usize - 'a' as usize + 1 as usize)) as u8
as char
};
}
pub fn is_valid_directory_entry(kind: char) -> bool {
matches!(kind, 'i' | '3' | '.' | '0' | '1' | '5' | '7' | '8' | '9' | 'g' | 'I' | 'p' | 'h' | '2' | 'd'| 's')
}
pub fn view_telnet(host: &str, port: u16) {
println!("executing: telnet {} {}", host, port);
// TODO check stdio
match Command::new("telnet").arg(host).arg(port.to_string()).spawn() {
Ok(mut c) =>
if let Err(e) = c.wait() {
eprintln!("failed to wait for telnet: {}", e);
},
Err(e) => eprintln!("failed to start telnet: {}", e),
}
println!("(done)");
}