1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
pub struct Args {
pub ip: String,
pub port: u16,
pub unsafe_mode: bool,
pub init: bool,
}
pub fn parse_args() -> Args {
let args: Vec<String> = std::env::args().collect();
let mut ip = "127.0.0.1".to_string();
let mut port = 11525;
let mut unsafe_mode = false;
let mut init = false;
let mut i = 1;
while i < args.len() {
match args[i].as_str() {
"-p" => {
if i + 1 < args.len() {
port = args[i + 1].parse::<u16>().unwrap_or_else(|_| {
eprintln!("Invalid port number: {}", args[i + 1]);
std::process::exit(1);
});
i += 2;
} else {
eprintln!("-p requires a port number");
std::process::exit(1);
}
}
"-i" => {
if i + 1 < args.len() {
ip = args[i + 1].clone();
if ip != "127.0.0.1" && ip != "0.0.0.0" {
eprintln!(
"Invalid IP address: {}. Must be 127.0.0.1 or 0.0.0.0",
ip
);
std::process::exit(1);
}
i += 2;
} else {
eprintln!("-i requires an IP address");
std::process::exit(1);
}
}
"--unsafe" => {
unsafe_mode = true;
i += 1;
}
"--init" => {
init = true;
i += 1;
}
"-h" | "--help" => {
print_usage();
std::process::exit(0);
}
other => {
eprintln!("Unknown argument: {other}");
print_usage();
std::process::exit(1);
}
}
}
Args {
ip,
port,
unsafe_mode,
init,
}
}
fn print_usage() {
println!(
"Usage: server [OPTIONS]\n\
\n\
Options:\n\
\x20 -i <ip> Bind address (127.0.0.1 or 0.0.0.0)\n\
\x20 -p <port> Bind port (default 11525)\n\
\x20 --init Generate identity.p12, key.pem and cert.pem, then exit\n\
\x20 --unsafe Run in unsafe mode (warning only)\n\
\x20 -h, --help Show this help\n\
\n\
First run:\n\
\x20 cargo run --bin server -- --init\n\
\x20 cargo run --bin server"
);
}
|