Avoid crashing when Avahi is not available

When librespot is built with Avahi turned on, it will crash if Avahi is
later not available at runtime.

This change avoids it crashing hard when Avahi is not available;
librespot will merely warn of the issue.

This affects some distribution packages too, where the maintainer might
prefer leaving Avahi support enabled, but many setups don't (or can't)
run Avahi.

Co-authored-by: Nick Steel <nick@nsteel.co.uk>
This commit is contained in:
Hugo Osvaldo Barrera 2022-05-03 22:20:14 +02:00
parent 7efc62b9ca
commit c4af90f5fe
3 changed files with 11 additions and 10 deletions

View file

@ -35,6 +35,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- [playback] Adhere to ReplayGain spec when calculating gain normalisation factor. - [playback] Adhere to ReplayGain spec when calculating gain normalisation factor.
- [playback] `alsa`: Use `--volume-range` overrides for softvol controls - [playback] `alsa`: Use `--volume-range` overrides for softvol controls
- [connect] Don't panic when activating shuffle without previous interaction. - [connect] Don't panic when activating shuffle without previous interaction.
- [main] Fix crash when built with Avahi support but Avahi is locally unavailable.
### Removed ### Removed
- [playback] `alsamixer`: previously deprecated option `mixer-card` has been removed. - [playback] `alsamixer`: previously deprecated option `mixer-card` has been removed.

View file

@ -111,8 +111,7 @@ impl Builder {
None, None,
port, port,
&["VERSION=1.0", "CPath=/"], &["VERSION=1.0", "CPath=/"],
) ).map_err(|e| Error::DnsSdError(io::Error::new(io::ErrorKind::Unsupported, e)))?;
.unwrap();
} else { } else {
let responder = libmdns::Responder::spawn(&tokio::runtime::Handle::current())?; let responder = libmdns::Responder::spawn(&tokio::runtime::Handle::current())?;

View file

@ -1581,19 +1581,15 @@ async fn main() {
if setup.enable_discovery { if setup.enable_discovery {
let device_id = setup.session_config.device_id.clone(); let device_id = setup.session_config.device_id.clone();
match librespot::discovery::Discovery::builder(device_id)
discovery = match librespot::discovery::Discovery::builder(device_id)
.name(setup.connect_config.name.clone()) .name(setup.connect_config.name.clone())
.device_type(setup.connect_config.device_type) .device_type(setup.connect_config.device_type)
.port(setup.zeroconf_port) .port(setup.zeroconf_port)
.launch() .launch()
{ {
Ok(d) => Some(d), Ok(d) => discovery = Some(d),
Err(e) => { Err(err) => warn!("Could not initialise discovery: {}.", err),
error!("Discovery Error: {}", e); };
exit(1);
}
}
} }
if let Some(credentials) = setup.credentials { if let Some(credentials) = setup.credentials {
@ -1606,6 +1602,11 @@ async fn main() {
) )
.fuse(), .fuse(),
); );
} else if discovery.is_none() {
error!(
"Discovery is unavailable and no credentials provided. Authentication is not possible."
);
exit(1);
} }
loop { loop {