Added Bonjour zeroconf support. This works now natively on MacOS X.
I couldn't test mDNSResponder support on Linux, as Debian doesn't include it - but should work as well. git-svn-id: https://svn.musicpd.org/mpd/trunk@6453 09075e82-0dd4-0310-85a5-a0d7c8717e4f
This commit is contained in:
parent
7b07a45dc4
commit
b91af54d2a
34
configure.ac
34
configure.ac
@ -586,24 +586,32 @@ no|avahi|bonjour)
|
|||||||
esac
|
esac
|
||||||
|
|
||||||
if test x$with_zeroconf != xno; then
|
if test x$with_zeroconf != xno; then
|
||||||
if test x$with_zeroconf = xauto; then
|
if test x$with_zeroconf = xavahi -o x$with_zeroconf = xauto; then
|
||||||
PKG_CHECK_MODULES([AVAHI], [avahi-client],
|
PKG_CHECK_MODULES([AVAHI], [avahi-client],
|
||||||
[with_zeroconf=avahi;AC_DEFINE([HAVE_AVAHI], 1, [Define to enable Avahi Zeroconf support])] MPD_LIBS="$MPD_LIBS $AVAHI_LIBS" MPD_CFLAGS="$MPD_CFLAGS $AVAHI_CFLAGS",
|
[found_avahi=1;AC_DEFINE([HAVE_AVAHI], 1, [Define to enable Avahi Zeroconf support])] MPD_LIBS="$MPD_LIBS $AVAHI_LIBS" MPD_CFLAGS="$MPD_CFLAGS $AVAHI_CFLAGS", found_avahi=0)
|
||||||
[with_zeroconf=auto])
|
|
||||||
elif test x$with_zeroconf = xavahi; then
|
|
||||||
PKG_CHECK_MODULES([AVAHI], [avahi-client],
|
|
||||||
[with_zeroconf=avahi;AC_DEFINE([HAVE_AVAHI], 1, [Define to enable Avahi Zeroconf support])] MPD_LIBS="$MPD_LIBS $AVAHI_LIBS" MPD_CFLAGS="$MPD_CFLAGS $AVAHI_CFLAGS")
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# In the future, should add bonjour support (for OSX) and check at autodetect
|
if test x$found_avahi = x1; then
|
||||||
# time
|
with_zeroconf=avahi
|
||||||
#if test x$with_zeroconf = xbonjour -o x$with_zeroconf = xauto; then
|
else
|
||||||
if test x$with_zeroconf = xbonjour; then
|
if test x$with_zeroconf = xavahi; then
|
||||||
AC_MSG_WARN([Bonjour support has not been implemented yet, disabling Zeroconf])
|
with_zeroconf=no
|
||||||
with_zeroconf=no
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if test x$with_zeroconf = xauto; then
|
if test x$with_zeroconf = xbonjour -o x$with_zeroconf = xauto; then
|
||||||
|
AC_CHECK_HEADER(dns_sd.h, [found_bonjour=1;AC_DEFINE(HAVE_BONJOUR,1,[Define to enable Bonjour Zeroconf support])],[found_bonjour=0])
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test x$found_bonjour = x1; then
|
||||||
|
with_zeroconf=bonjour
|
||||||
|
else
|
||||||
|
if test x$with_zeroconf = xbonjour; then
|
||||||
|
with_zeroconf=no
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test x$with_zeroconf = xauto -o x$with_zeroconf = xno; then
|
||||||
AC_MSG_WARN([No supported Zeroconf backend found, disabling Zeroconf])
|
AC_MSG_WARN([No supported Zeroconf backend found, disabling Zeroconf])
|
||||||
with_zeroconf=no
|
with_zeroconf=no
|
||||||
fi
|
fi
|
||||||
|
116
src/zeroconf.c
116
src/zeroconf.c
@ -35,6 +35,15 @@
|
|||||||
*/
|
*/
|
||||||
#define SERVICE_NAME "Music Player"
|
#define SERVICE_NAME "Music Player"
|
||||||
|
|
||||||
|
static struct ioOps zeroConfIo = {
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef HAVE_BONJOUR
|
||||||
|
#include <dns_sd.h>
|
||||||
|
|
||||||
|
static DNSServiceRef dnsReference;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Here is the implementation for Avahi (http://avahi.org) Zeroconf support */
|
/* Here is the implementation for Avahi (http://avahi.org) Zeroconf support */
|
||||||
#ifdef HAVE_AVAHI
|
#ifdef HAVE_AVAHI
|
||||||
|
|
||||||
@ -55,10 +64,6 @@ static int avahiRunning;
|
|||||||
|
|
||||||
static int avahiFdset( fd_set* rfds, fd_set* wfds, fd_set* efds );
|
static int avahiFdset( fd_set* rfds, fd_set* wfds, fd_set* efds );
|
||||||
static int avahiFdconsume( int fdCount, fd_set* rfds, fd_set* wfds, fd_set* efds );
|
static int avahiFdconsume( int fdCount, fd_set* rfds, fd_set* wfds, fd_set* efds );
|
||||||
static struct ioOps avahiIo = {
|
|
||||||
.fdset = avahiFdset,
|
|
||||||
.consume = avahiFdconsume,
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Forward Declaration */
|
/* Forward Declaration */
|
||||||
static void avahiRegisterService(AvahiClient *c);
|
static void avahiRegisterService(AvahiClient *c);
|
||||||
@ -451,19 +456,94 @@ static void init_avahi(const char *serviceName)
|
|||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
avahiIo.fdset = avahiFdset;
|
zeroConfIo.fdset = avahiFdset;
|
||||||
avahiIo.consume = avahiFdconsume;
|
zeroConfIo.consume = avahiFdconsume;
|
||||||
registerIO( &avahiIo );
|
registerIO( &zeroConfIo );
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
finishZeroconf();
|
finishZeroconf();
|
||||||
}
|
}
|
||||||
#else /* !HAVE_AVAHI */
|
|
||||||
static void init_avahi(const char *serviceName) { }
|
|
||||||
#endif /* HAVE_AVAHI */
|
#endif /* HAVE_AVAHI */
|
||||||
|
|
||||||
|
#ifdef HAVE_BONJOUR
|
||||||
|
static int dnsRegisterFdset(fd_set* rfds, fd_set* wfds, fd_set* efds)
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
|
||||||
|
if (dnsReference == NULL)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
fd = DNSServiceRefSockFD(dnsReference);
|
||||||
|
if (fd == -1)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
FD_SET(fd, rfds);
|
||||||
|
|
||||||
|
return fd;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int dnsRegisterFdconsume(int fdCount, fd_set* rfds, fd_set* wfds,
|
||||||
|
fd_set* efds)
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
|
||||||
|
if (dnsReference == NULL)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
fd = DNSServiceRefSockFD(dnsReference);
|
||||||
|
if (fd == -1)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (FD_ISSET(fd, rfds)) {
|
||||||
|
FD_CLR(fd, rfds);
|
||||||
|
|
||||||
|
DNSServiceProcessResult(dnsReference);
|
||||||
|
|
||||||
|
return fdCount - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return fdCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void dnsRegisterCallback (DNSServiceRef sdRef, DNSServiceFlags flags,
|
||||||
|
DNSServiceErrorType errorCode, const char *name,
|
||||||
|
const char *regtype, const char *domain, void *context)
|
||||||
|
{
|
||||||
|
if (errorCode != kDNSServiceErr_NoError) {
|
||||||
|
ERROR("Failed to register zeroconf service.\n");
|
||||||
|
|
||||||
|
DNSServiceRefDeallocate(dnsReference);
|
||||||
|
dnsReference = NULL;
|
||||||
|
deregisterIO( &zeroConfIo );
|
||||||
|
} else {
|
||||||
|
DEBUG("Registered zeroconf service with name '%s'\n", name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void init_zeroconf_osx(const char *serviceName)
|
||||||
|
{
|
||||||
|
DNSServiceErrorType error = DNSServiceRegister(&dnsReference,
|
||||||
|
0, 0, serviceName, SERVICE_TYPE, NULL, NULL, htons(boundPort), 0,
|
||||||
|
NULL, dnsRegisterCallback, NULL);
|
||||||
|
|
||||||
|
if (error != kDNSServiceErr_NoError) {
|
||||||
|
ERROR("Failed to register zeroconf service.\n");
|
||||||
|
|
||||||
|
if (dnsReference) {
|
||||||
|
DNSServiceRefDeallocate(dnsReference);
|
||||||
|
dnsReference = NULL;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
zeroConfIo.fdset = dnsRegisterFdset;
|
||||||
|
zeroConfIo.consume = dnsRegisterFdconsume;
|
||||||
|
registerIO( &zeroConfIo );
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void initZeroconf(void)
|
void initZeroconf(void)
|
||||||
{
|
{
|
||||||
const char* serviceName = SERVICE_NAME;
|
const char* serviceName = SERVICE_NAME;
|
||||||
@ -473,14 +553,21 @@ void initZeroconf(void)
|
|||||||
|
|
||||||
if (param && strlen(param->value) > 0)
|
if (param && strlen(param->value) > 0)
|
||||||
serviceName = param->value;
|
serviceName = param->value;
|
||||||
|
|
||||||
|
#ifdef HAVE_AVAHI
|
||||||
init_avahi(serviceName);
|
init_avahi(serviceName);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_BONJOUR
|
||||||
|
init_zeroconf_osx(serviceName);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void finishZeroconf(void)
|
void finishZeroconf(void)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_AVAHI
|
#ifdef HAVE_AVAHI
|
||||||
DEBUG( "Avahi: Shutting down interface\n" );
|
DEBUG( "Avahi: Shutting down interface\n" );
|
||||||
deregisterIO( &avahiIo );
|
deregisterIO( &zeroConfIo );
|
||||||
|
|
||||||
if( avahiGroup ) {
|
if( avahiGroup ) {
|
||||||
avahi_entry_group_free( avahiGroup );
|
avahi_entry_group_free( avahiGroup );
|
||||||
@ -495,4 +582,13 @@ void finishZeroconf(void)
|
|||||||
avahi_free( avahiName );
|
avahi_free( avahiName );
|
||||||
avahiName = NULL;
|
avahiName = NULL;
|
||||||
#endif /* HAVE_AVAHI */
|
#endif /* HAVE_AVAHI */
|
||||||
|
|
||||||
|
#ifdef HAVE_BONJOUR
|
||||||
|
deregisterIO( &zeroConfIo );
|
||||||
|
if (dnsReference != NULL) {
|
||||||
|
DNSServiceRefDeallocate(dnsReference);
|
||||||
|
dnsReference = NULL;
|
||||||
|
DEBUG("Deregistered Zeroconf service.\n");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user