diff options
author | Richard Weinberger <richard@nod.at> | 2021-12-05 00:10:13 +0100 |
---|---|---|
committer | Richard Weinberger <richard@nod.at> | 2021-12-16 21:15:31 +0100 |
commit | 1cf3421c425cbee41055cdefba2d858542f2d402 (patch) | |
tree | e8639add1231edb7b094f6736615327aae1e26b1 | |
parent | 4131aef752ec397403772a86e947f4991d1c16ed (diff) | |
download | geschichte-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.rs | 46 |
1 files changed, 39 insertions, 7 deletions
@@ -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, |