From 16b50c700f517efdf2a1528eaa603fd2c3200453 Mon Sep 17 00:00:00 2001 From: Brian Kendall Date: Fri, 28 Oct 2022 13:12:56 -0400 Subject: [PATCH] Add optional parameter for binding service to specific interface --- avahicore.cpp | 14 +++++++++----- bonjour.cpp | 4 ++-- qzeroconf.h | 2 +- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/avahicore.cpp b/avahicore.cpp index b9dd1ca..8fe08c2 100644 --- a/avahicore.cpp +++ b/avahicore.cpp @@ -72,7 +72,7 @@ public: ref->ready = 1; if (ref->registerWaiting) { ref->registerWaiting = 0; - ref->registerService(ref->name.toUtf8(), ref->type.toUtf8(), ref->domain.toUtf8(), ref->port); + ref->registerService(ref->name.toUtf8(), ref->type.toUtf8(), ref->domain.toUtf8(), ref->port, 0); } break; case AVAHI_SERVER_COLLISION: @@ -230,7 +230,7 @@ public: resolvers.clear(); } - void registerService(const char *name, const char *type, const char *domain, quint16 port) + void registerService(const char *name, const char *type, const char *domain, quint16 port, quint32 interface) { qint32 ret; group = avahi_s_entry_group_new(server, QZeroConfPrivate::groupCallback, this); @@ -239,7 +239,11 @@ public: return; } - ret = avahi_server_add_service_strlst(server, group, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, AVAHI_PUBLISH_UPDATE, name, type, domain, NULL, port, txt); + if (interface <= 0) { + interface = AVAHI_IF_UNSPEC; + } + + ret = avahi_server_add_service_strlst(server, group, interface, AVAHI_PROTO_UNSPEC, AVAHI_PUBLISH_UPDATE, name, type, domain, NULL, port, txt); if (ret < 0) { avahi_s_entry_group_free(group); group = NULL; @@ -290,14 +294,14 @@ QZeroConf::~QZeroConf() delete pri; } -void QZeroConf::startServicePublish(const char *name, const char *type, const char *domain, quint16 port) +void QZeroConf::startServicePublish(const char *name, const char *type, const char *domain, quint16 port, quint32 interface) { if (pri->group) { emit error(QZeroConf::serviceRegistrationFailed); return; } if (pri->ready) - pri->registerService(name, type, domain, port); + pri->registerService(name, type, domain, port, interface); else { pri->registerWaiting = 1; pri->name = name; diff --git a/bonjour.cpp b/bonjour.cpp index c43e0e9..2698af0 100644 --- a/bonjour.cpp +++ b/bonjour.cpp @@ -268,7 +268,7 @@ QZeroConf::~QZeroConf() delete pri; } -void QZeroConf::startServicePublish(const char *name, const char *type, const char *domain, quint16 port) +void QZeroConf::startServicePublish(const char *name, const char *type, const char *domain, quint16 port, quint32 interface) { DNSServiceErrorType err; @@ -277,7 +277,7 @@ void QZeroConf::startServicePublish(const char *name, const char *type, const ch return; } - err = DNSServiceRegister(&pri->dnssRef, 0, 0, + err = DNSServiceRegister(&pri->dnssRef, 0, interface, name, type, domain, diff --git a/qzeroconf.h b/qzeroconf.h index 4597591..cbbbb0d 100644 --- a/qzeroconf.h +++ b/qzeroconf.h @@ -50,7 +50,7 @@ public: }; QZeroConf(QObject *parent = Q_NULLPTR); ~QZeroConf(); - void startServicePublish(const char *name, const char *type, const char *domain, quint16 port); + void startServicePublish(const char *name, const char *type, const char *domain, quint16 port, quint32 interface = 0); void stopServicePublish(void); bool publishExists(void); inline void startBrowser(QString type)