summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Weinberger <richard@nod.at>2021-12-05 00:10:13 +0100
committerRichard Weinberger <richard@nod.at>2021-12-16 21:15:31 +0100
commit1cf3421c425cbee41055cdefba2d858542f2d402 (patch)
treee8639add1231edb7b094f6736615327aae1e26b1
parent4131aef752ec397403772a86e947f4991d1c16ed (diff)
downloadgeschichte-1cf3421c425cbee41055cdefba2d858542f2d402.tar.gz
vlc: Support DNS lookup and multiple IPs and connect timeout
Signed-off-by: Richard Weinberger <richard@nod.at>
-rw-r--r--src/vlc.rs46
1 files changed, 39 insertions, 7 deletions
diff --git a/src/vlc.rs b/src/vlc.rs
index 630d641..0bf58b6 100644
--- a/src/vlc.rs
+++ b/src/vlc.rs
@@ -7,18 +7,20 @@ use std::io;
use std::io::Read;
use std::io::Write;
use std::net::SocketAddr;
+use std::net::TcpStream;
+use std::net::ToSocketAddrs;
use std::os::unix::io::AsRawFd;
use std::path::PathBuf;
+use std::time::Duration;
use mio::event::Event;
-use mio::net::TcpStream;
use mio::{Events, Interest, Poll, Token};
use crate::config::PlayerConfig;
use crate::playerbackend::PlayerBackend;
pub struct BackendVlc {
- conn: TcpStream,
+ conn: mio::net::TcpStream,
mio_poll: Poll,
volume: u32,
volume_step: u32,
@@ -44,15 +46,45 @@ impl BackendVlc {
}
fn init(dst: &str) -> io::Result<BackendVlc> {
- let addr: SocketAddr = dst.parse().unwrap();
- let mut conn = TcpStream::connect(addr)?;
- let mut poll = Poll::new()?;
+ let addrs: Vec<SocketAddr> = dst
+ .to_socket_addrs()
+ .expect("Unable to resolve VLC hostname(s)")
+ .collect();
+
+ let mut conn: Option<TcpStream> = None;
+ for addr in &addrs {
+ let ct = TcpStream::connect_timeout(&addr, Duration::new(5, 0));
+ match ct {
+ Err(e) => {
+ eprintln!(
+ "Unable to connect to VLC at {}: {}. Trying next address",
+ addr, e
+ );
+ }
+ Ok(c) => {
+ c.set_nonblocking(true)?;
+ conn = Some(c);
+ eprintln!("Connected to VLC at {}", addr);
+ break;
+ }
+ }
+ }
+
+ if conn.is_none() {
+ return Err(io::Error::new(
+ io::ErrorKind::Other,
+ "No connection to VLC was possible",
+ ));
+ }
+
+ let mut mio_conn = mio::net::TcpStream::from_std(conn.unwrap());
+ let poll = Poll::new()?;
poll.registry()
- .register(&mut conn, Token(0), Interest::READABLE)?;
+ .register(&mut mio_conn, Token(0), Interest::READABLE)?;
let mut vlc = BackendVlc {
- conn: conn,
+ conn: mio_conn,
mio_poll: poll,
volume: 256,
volume_step: 5,