[mdns] Remove ipv4/ipv6 argument to mdns_browse

Make sure mdns_browse() always works the same, and follows user config.
This commit is contained in:
ejurgensen 2021-02-26 22:16:04 +01:00
parent 7871d71a9c
commit dd0f0ece78
7 changed files with 23 additions and 33 deletions

View File

@ -8,6 +8,8 @@ enum mdns_options
{
// Test connection to device and only call back if successful
MDNS_CONNECTION_TEST = (1 << 1),
// Only browse for ipv4 services
MDNS_IPV4ONLY = (1 << 2),
};
typedef void (* mdns_browse_cb)(const char *name, const char *type, const char *domain, const char *hostname, int family, const char *address, int port, struct keyval *txt);
@ -58,13 +60,11 @@ mdns_cname(char *name);
* Call only from the main thread!
*
* @in type Type of service to look for, e.g. "_raop._tcp"
* @in family AF_INET to browse for ipv4 services, AF_INET6 for ipv6,
AF_UNSPEC for both
* @in flags See mdns_options (only supported by Avahi implementation)
* @in cb Callback when service state changes (e.g. appears/disappears)
* @return 0 on success, -1 on error
*/
int
mdns_browse(char *type, int family, mdns_browse_cb cb, enum mdns_options flags);
mdns_browse(char *type, mdns_browse_cb cb, enum mdns_options flags);
#endif /* !__MDNS_H__ */

View File

@ -52,6 +52,7 @@
#endif
#include "logger.h"
#include "conffile.h"
#include "mdns.h"
#define MDNSERR avahi_strerror(avahi_client_errno(mdns_client))
@ -1160,15 +1161,21 @@ mdns_cname(char *name)
}
int
mdns_browse(char *type, int family, mdns_browse_cb cb, enum mdns_options flags)
mdns_browse(char *type, mdns_browse_cb cb, enum mdns_options flags)
{
struct mdns_browser *mb;
AvahiServiceBrowser *b;
int family;
DPRINTF(E_DBG, L_MDNS, "Adding service browser for type %s\n", type);
CHECK_NULL(L_MDNS, mb = calloc(1, sizeof(struct mdns_browser)));
if (flags & MDNS_IPV4ONLY || !cfg_getbool(cfg_getsec(cfg, "general"), "ipv6"))
family = AF_INET;
else
family = AF_UNSPEC;
mb->protocol = avahi_af_to_proto(family);
mb->type = strdup(type);
mb->flags = flags;

View File

@ -50,6 +50,7 @@
#endif
#include "logger.h"
#include "conffile.h"
/* Main event base, from main.c */
extern struct event_base *evbase_main;
@ -872,10 +873,11 @@ mdns_browse_callback(DNSServiceRef sdRef, DNSServiceFlags flags,
}
int
mdns_browse(char *regtype, int family, mdns_browse_cb cb, enum mdns_options flags)
mdns_browse(char *regtype, mdns_browse_cb cb, enum mdns_options flags)
{
struct mdns_browser *mb;
DNSServiceErrorType err;
int family;
DPRINTF(E_DBG, L_MDNS, "Adding service browser for type %s\n", regtype);
@ -884,6 +886,11 @@ mdns_browse(char *regtype, int family, mdns_browse_cb cb, enum mdns_options flag
mb->flags = flags;
mb->cb = cb;
if (flags & MDNS_IPV4ONLY || !cfg_getbool(cfg_getsec(cfg, "general"), "ipv6"))
family = AF_INET;
else
family = AF_UNSPEC;
/* flags are ignored in DNS-SD implementation */
switch(family) {
case AF_UNSPEC:

View File

@ -4363,7 +4363,6 @@ static int
airplay_init(void)
{
int v6enabled;
int family;
int ret;
int i;
@ -4412,15 +4411,7 @@ airplay_init(void)
goto out_stop_timing;
}
if (v6enabled)
v6enabled = !((timing_6svc.fd < 0) || (control_6svc.fd < 0));
if (v6enabled)
family = AF_UNSPEC;
else
family = AF_INET;
ret = mdns_browse("_airplay._tcp", family, airplay_device_cb, MDNS_CONNECTION_TEST);
ret = mdns_browse("_airplay._tcp", airplay_device_cb, MDNS_CONNECTION_TEST);
if (ret < 0)
{
DPRINTF(E_LOG, L_AIRPLAY, "Could not add mDNS browser for AirPlay devices\n");

View File

@ -2445,7 +2445,6 @@ static int
cast_init(void)
{
struct decode_ctx *decode_ctx;
int family;
int i;
int ret;
@ -2484,12 +2483,7 @@ cast_init(void)
goto out_tls_deinit;
}
if (cfg_getbool(cfg_getsec(cfg, "general"), "ipv6"))
family = AF_UNSPEC;
else
family = AF_INET;
ret = mdns_browse("_googlecast._tcp", family, cast_device_cb, 0);
ret = mdns_browse("_googlecast._tcp", cast_device_cb, 0);
if (ret < 0)
{
DPRINTF(E_LOG, L_CAST, "Could not add mDNS browser for Chromecast devices\n");

View File

@ -4815,7 +4815,6 @@ raop_init(void)
char *ptr;
gpg_error_t gc_err;
int v6enabled;
int family;
int ret;
timing_4svc.fd = -1;
@ -4900,15 +4899,7 @@ raop_init(void)
goto out_stop_timing;
}
if (v6enabled)
v6enabled = !((timing_6svc.fd < 0) || (control_6svc.fd < 0));
if (v6enabled)
family = AF_UNSPEC;
else
family = AF_INET;
ret = mdns_browse("_raop._tcp", family, raop_device_cb, MDNS_CONNECTION_TEST);
ret = mdns_browse("_raop._tcp", raop_device_cb, MDNS_CONNECTION_TEST);
if (ret < 0)
{
DPRINTF(E_LOG, L_RAOP, "Could not add mDNS browser for AirPlay devices\n");

View File

@ -783,7 +783,7 @@ remote_pairing_init(void)
cmdbase = commands_base_new(evbase_main, NULL);
// No ipv6 for remote at the moment
ret = mdns_browse("_touch-remote._tcp", AF_INET, touch_remote_cb, 0);
ret = mdns_browse("_touch-remote._tcp", touch_remote_cb, MDNS_IPV4ONLY);
if (ret < 0)
{
DPRINTF(E_FATAL, L_REMOTE, "Could not browse for Remote services\n");