2018-03-29 17:40:56 -04:00
|
|
|
use std::{
|
|
|
|
time,
|
|
|
|
path::PathBuf,
|
|
|
|
env,
|
2018-04-03 06:03:08 -04:00
|
|
|
os::unix::net::UnixStream,
|
2018-03-29 17:40:56 -04:00
|
|
|
};
|
2018-03-22 17:54:49 -04:00
|
|
|
|
|
|
|
use super::base::Connection;
|
2018-03-29 17:40:56 -04:00
|
|
|
use error::Result;
|
|
|
|
|
2018-03-22 17:54:49 -04:00
|
|
|
|
|
|
|
pub struct UnixConnection {
|
|
|
|
socket: UnixStream,
|
|
|
|
}
|
|
|
|
|
2018-04-03 06:03:08 -04:00
|
|
|
impl Connection for UnixConnection {
|
|
|
|
type Socket = UnixStream;
|
|
|
|
|
|
|
|
fn connect() -> Result<Self> {
|
|
|
|
let connection_name = Self::socket_path(0);
|
|
|
|
let socket = UnixStream::connect(connection_name)?;
|
|
|
|
socket.set_write_timeout(Some(time::Duration::from_secs(30)))?;
|
|
|
|
socket.set_read_timeout(Some(time::Duration::from_secs(30)))?;
|
|
|
|
Ok(Self { socket })
|
|
|
|
}
|
|
|
|
|
2018-03-22 17:54:49 -04:00
|
|
|
fn ipc_path() -> PathBuf {
|
|
|
|
let tmp = env::var("XDG_RUNTIME_DIR")
|
|
|
|
.or_else(|_| env::var("TMPDIR"))
|
|
|
|
.or_else(|_| {
|
|
|
|
match env::temp_dir().to_str() {
|
|
|
|
None => Err("Failed to convert temp_dir"),
|
|
|
|
Some(tmp) => Ok(tmp.to_string())
|
|
|
|
}
|
|
|
|
})
|
|
|
|
.unwrap_or("/tmp".to_string());
|
|
|
|
PathBuf::from(tmp)
|
|
|
|
}
|
|
|
|
|
2018-04-03 06:03:08 -04:00
|
|
|
fn socket(&mut self) -> &mut Self::Socket {
|
|
|
|
&mut self.socket
|
2018-03-22 17:54:49 -04:00
|
|
|
}
|
|
|
|
}
|