summaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs97
1 files changed, 52 insertions, 45 deletions
diff --git a/src/main.rs b/src/main.rs
index 7f64e33..5639158 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,6 +1,9 @@
mod mime;
mod server;
use std::env;
+use std::fs::File;
+use std::io::{BufRead, BufReader};
+use std::path::Path;
fn help() {
let version = match option_env!("CARGO_PKG_VERSION") {
@@ -9,69 +12,73 @@ fn help() {
};
println!("usage: sheldond {}", version);
- println!(" -h, --help\t\tdisplay this message");
- println!(" -l, --listen\t\tadd a listening address (you can define multiple)");
- println!(" -d, --default-host\tdefault hostname to listen for");
- println!(" -g, --gem-root\tpath to the gemini root, aka the folder to serve files from");
- println!(" --user\tuser to drop to after opening TLS socket");
- println!(" --group\tgroup to drop to after opening TLS socket");
+ println!(" -c, --config\t\tpath to the configuration file");
}
-fn parse_args() -> Option<server::ServerConfig> {
- let mut has_addr = false;
- let mut has_host = false;
- let mut has_root = false;
- let mut has_user = false;
- let mut has_group = false;
-
- let mut config = server::ServerConfig::new();
+fn parse_args() -> Option<String> {
let mut args = env::args();
loop {
match args.next() {
Some(arg) => {
- if arg == "-h" || arg == "--help" {
- return None;
- }
- if arg == "-l" || arg == "--listen" {
- let addr = args.next().unwrap();
- config.add_addr(addr);
- has_addr = true;
- }
- if arg == "-d" || arg == "--default-host" {
- let host = args.next().unwrap();
- config.set_default_host(host);
- has_host = true;
- }
- if arg == "-g" || arg == "--gem-root" {
- let gem_root = args.next().unwrap();
- config.set_gem_root(gem_root);
- has_root = true;
- }
- if arg == "--user" {
- let user = args.next().unwrap();
- config.set_user(user);
- has_user = true;
- }
- if arg == "--group" {
- let group = args.next().unwrap();
- config.set_group(group);
- has_group = true;
+ if arg == "-c" || arg == "--config" {
+ let config_fname = args.next().unwrap();
+ return Some(config_fname);
}
}
None => break,
}
}
- if !has_addr || !has_host || !has_root || !has_user || !has_group {
- return None;
+ None
+}
+
+fn parse_config(fname: String) -> server::ServerConfig {
+ let path = Path::new(&fname);
+ let mut config = server::ServerConfig::new();
+
+ let file = match File::open(path) {
+ Ok(file) => BufReader::new(file),
+ Err(e) => {
+ panic!(e);
+ }
+ };
+
+ for rline in file.lines() {
+ let line = rline.unwrap();
+ if line == "" || line.starts_with("#") {
+ continue;
+ }
+
+ let mut parts = line.split_whitespace();
+
+ let key = parts.next().unwrap();
+
+ if parts.next().unwrap() != "=" {
+ panic!("malformatted line in config: {}", line);
+ }
+
+ let val = parts.next().unwrap().to_string();
+
+ match key {
+ "default_host" => config.set_default_host(val),
+ "gem_root" => config.set_gem_root(val),
+ "listen" => config.add_addr(val),
+ "user" => config.set_user(val),
+ "group" => config.set_group(val),
+ "cert_key" => config.set_cert_key(val),
+ "cert_chain" => config.set_cert_chain(val),
+ _ => {
+ panic!("unknown key in config: {}", key);
+ }
+ }
}
- Some(config)
+ return config;
}
fn main() {
let config = match parse_args() {
- Some(config) => config,
+ Some(config_fname) => parse_config(config_fname),
None => {
help();
return;