diff options
author | Max Kellermann <max@duempel.org> | 2008-12-30 16:43:58 +0100 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2008-12-30 16:43:58 +0100 |
commit | 49fa9708d51b907f0a372a1fc68a1e27c9edae5e (patch) | |
tree | d943b16f8943190cc4225040d67761a61d0394df /src/zeroconf-bonjour.c | |
parent | bbed35822e52a204bf3d82e5df4bb8d00b67af39 (diff) | |
download | mpd-49fa9708d51b907f0a372a1fc68a1e27c9edae5e.tar.gz mpd-49fa9708d51b907f0a372a1fc68a1e27c9edae5e.tar.xz mpd-49fa9708d51b907f0a372a1fc68a1e27c9edae5e.zip |
zeroconf: moved code to zeroconf-avahi.c and zeroconf-bonjour.c
Moved implementation specific code to their own sources, internal
declarations in zeroconf-internal.h.
Diffstat (limited to 'src/zeroconf-bonjour.c')
-rw-r--r-- | src/zeroconf-bonjour.c | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/src/zeroconf-bonjour.c b/src/zeroconf-bonjour.c new file mode 100644 index 000000000..03be18de9 --- /dev/null +++ b/src/zeroconf-bonjour.c @@ -0,0 +1,122 @@ +/* + * Copyright (C) 2003-2008 The Music Player Daemon Project + * http://www.musicpd.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "zeroconf-internal.h" +#include "listen.h" +#include "ioops.h" + +#include <glib.h> + +#include <dns_sd.h> + +#undef G_LOG_DOMAIN +#define G_LOG_DOMAIN "bonjour" + +static struct ioOps zeroConfIo; + +static DNSServiceRef dnsReference; + +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) { + g_warning("Failed to register zeroconf service."); + + DNSServiceRefDeallocate(dnsReference); + dnsReference = NULL; + deregisterIO(&zeroConfIo); + } else { + g_debug("Registered zeroconf service with name '%s'", name); + } +} + +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) { + g_warning("Failed to register zeroconf service."); + + if (dnsReference) { + DNSServiceRefDeallocate(dnsReference); + dnsReference = NULL; + } + return; + } + + zeroConfIo.fdset = dnsRegisterFdset; + zeroConfIo.consume = dnsRegisterFdconsume; + registerIO(&zeroConfIo); +} + +void bonjour_finish(void) +{ + deregisterIO(&zeroConfIo); + if (dnsReference != NULL) { + DNSServiceRefDeallocate(dnsReference); + dnsReference = NULL; + g_debug("Deregistered Zeroconf service."); + } +} |