From 03a97a38bbd6a71bb6ffc6e97516e2458c3415f2 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sun, 23 Aug 2020 22:45:59 +0100 Subject: [PATCH] fix error and default and socket and things --- src/bin/otter.rs | 26 +++++++++++++++++++++++++- src/global.rs | 6 +++--- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/bin/otter.rs b/src/bin/otter.rs index 8d13348b..f8a2c3e3 100644 --- a/src/bin/otter.rs +++ b/src/bin/otter.rs @@ -57,6 +57,7 @@ const EXIT_DISASTER : i32 = 16; #[derive(Debug,Default)] struct MainOpts { scope: Option, + socket_path: Option, verbose: i32, } @@ -71,6 +72,13 @@ inventory::collect!(Subcommand); struct ArgumentParseError(String); display_as_debug!(ArgumentParseError); +impl From for ArgumentParseError { + fn from(ae: anyhow::Error) -> ArgumentParseError { + eprintln!("error during argument parsing/startup: {:?}\n", &ae); + exit(EXIT_USAGE); + } +} + fn parse_args( args: Vec, apmaker: &F, @@ -118,6 +126,7 @@ fn main() { #[derive(Default,Debug)] struct MainArgs { opts: MainOpts, + config_filename: Option, subcommand: String, subargs: Vec, }; @@ -145,6 +154,12 @@ fn main() { scope.add_option(&["--scope-unix"], StoreConst(None), "use unix user $USER scope (default)"); + ap.refer(&mut ma.opts.socket_path) + .add_option(&["--socket"], StoreOption, + "specify server socket path"); + ap.refer(&mut ma.config_filename) + .add_option(&["-C","--config"], StoreOption, + "specify server config file (used for finding socket)"); let mut verbose = ap.refer(&mut ma.opts.verbose); verbose.add_option(&["-q","--quiet"], StoreConst(-1), "set verbosity to error messages only"); @@ -158,6 +173,13 @@ fn main() { ))?; *scope = Some(ManagementScope::Unix { user }); } + if ma.config_filename.is_some() || ma.opts.socket_path.is_none() { + ServerConfig::read(ma.config_filename.as_ref().map(String::as_str)) + .context("read config file")?; + } + ma.opts.socket_path.get_or_insert_with( + || config().command_socket.clone() + ); Ok(()) }), Some(&|w|{ writeln!(w, "\nSubcommands:")?; @@ -281,7 +303,9 @@ impl ConnForGame { #[throws(E)] fn connect(ma: &MainOpts) -> Conn { - let unix = UnixStream::connect(DEFAULT_COMMAND_SOCKET).context("connect to server")?; // xxx + let socket_path = ma.socket_path.as_ref().unwrap(); + let unix = UnixStream::connect(&socket_path) + .with_context(||socket_path.clone()).context("connect to server")?; let chan = MgmtChannel::new(unix)?; let mut chan = Conn { chan }; chan.cmd(&MgmtCommand::SetScope(ma.scope.clone().unwrap()))?; diff --git a/src/global.rs b/src/global.rs index 446ea786..c6262052 100644 --- a/src/global.rs +++ b/src/global.rs @@ -924,8 +924,7 @@ pub fn client_expire_old_clients() { const DEFAULT_CONFIG_FILENAME : &str = "server.toml"; const DEFAULT_SAVE_DIRECTORY : &str = "save"; -pub const DEFAULT_COMMAND_SOCKET : &str = "command.socket"; // in save dir -// ^ xxx should not be pub +const DEFAULT_COMMAND_SOCKET : &str = "command.socket"; // in save dir #[derive(Deserialize,Debug,Clone)] pub struct ServerConfigSpec { @@ -969,7 +968,8 @@ impl ServerConfig { let config_filename = config_filename .unwrap_or_else(|| DEFAULT_CONFIG_FILENAME); let mut buf = String::new(); - File::open(config_filename)?.read_to_string(&mut buf)?; + File::open(&config_filename).with_context(||config_filename.to_string())? + .read_to_string(&mut buf)?; let config : ServerConfigSpec = toml::de::from_str(&buf)?; let config = config.try_into()?; set_config(config); -- 2.30.2