diff --git a/src/libs/zeroconf/embed/dnssd_clientstub.c b/src/libs/zeroconf/embed/dnssd_clientstub.c index ebe0fda7486..06a64a8bc24 100644 --- a/src/libs/zeroconf/embed/dnssd_clientstub.c +++ b/src/libs/zeroconf/embed/dnssd_clientstub.c @@ -29,6 +29,10 @@ #include #include +#if APPLE_OSX_mDNSResponder +#include +#endif + #include "dnssd_ipc.h" namespace ZeroConf { namespace embeddedLib { @@ -37,7 +41,6 @@ static int gDaemonErr = kDNSServiceErr_NoError; }} extern "C" { - #if defined(_WIN32) #define _SSIZE_T @@ -47,6 +50,7 @@ extern "C" { #include #include #include + #include #define sockaddr_mdns sockaddr_in #define AF_MDNS AF_INET @@ -62,6 +66,7 @@ extern "C" { #define sleep(X) Sleep((X) * 1000) #define NOT_HAVE_SA_LEN namespace ZeroConf { namespace embeddedLib { + static int g_initWinsock = 0; #define LOG_WARNING kDebugLevelWarning #define LOG_INFO kDebugLevelInfo @@ -78,7 +83,6 @@ namespace ZeroConf { namespace embeddedLib { if ( buffer ) { vsprintf( buffer, message, args ); OutputDebugStringA( buffer ); free( buffer ); } WSASetLastError( err ); } - }} #else #include // For O_RDWR etc. @@ -88,6 +92,7 @@ namespace ZeroConf { namespace embeddedLib { #define sockaddr_mdns sockaddr_un #define AF_MDNS AF_LOCAL + #endif #ifdef Q_OS_LINUX @@ -1134,6 +1139,34 @@ fail: syslog(LOG_WARNING, "dnssd_clientstub handle_resolve_response: error reading result from daemon"); } +#if APPLE_OSX_mDNSResponder + +static int32_t libSystemVersion = 0; + +// Return true if the application linked against a version of libsystem where P2P +// interfaces were included by default when using kDNSServiceInterfaceIndexAny. +// Using 160.0.0 == 0xa00000 as the version threshold. +static int includeP2PWithIndexAny() + { + if (libSystemVersion == 0) + libSystemVersion = NSVersionOfLinkTimeLibrary("System"); + + if (libSystemVersion < 0xa00000) + return 1; + else + return 0; + } + +#else // APPLE_OSX_mDNSResponder + +// always return false for non Apple platforms +static int includeP2PWithIndexAny() + { + return 0; + } + +#endif // APPLE_OSX_mDNSResponder + DNSServiceErrorType DNSSD_API DNSServiceResolve ( DNSServiceRef *sdRef, @@ -1163,6 +1196,9 @@ DNSServiceErrorType DNSSD_API DNSServiceResolve return kDNSServiceErr_BadParam; } + if ((interfaceIndex == kDNSServiceInterfaceIndexAny) && includeP2PWithIndexAny()) + flags |= kDNSServiceFlagsIncludeP2P; + err = ConnectToServer(sdRef, flags, resolve_request, handle_resolve_response, reinterpret_cast(callBack), context); if (err) return err; // On error ConnectToServer leaves *sdRef set to NULL @@ -1221,7 +1257,12 @@ DNSServiceErrorType DNSSD_API DNSServiceQueryRecord char *ptr; size_t len; ipc_msg_hdr *hdr; - DNSServiceErrorType err = ConnectToServer(sdRef, flags, query_request, handle_query_response, reinterpret_cast(callBack), context); + DNSServiceErrorType err; + + if ((interfaceIndex == kDNSServiceInterfaceIndexAny) && includeP2PWithIndexAny()) + flags |= kDNSServiceFlagsIncludeP2P; + + err = ConnectToServer(sdRef, flags, query_request, handle_query_response, reinterpret_cast(callBack), context); if (err) return err; // On error ConnectToServer leaves *sdRef set to NULL if (!name) name = "\0"; @@ -1366,7 +1407,12 @@ DNSServiceErrorType DNSSD_API DNSServiceBrowse char *ptr; size_t len; ipc_msg_hdr *hdr; - DNSServiceErrorType err = ConnectToServer(sdRef, flags, browse_request, handle_browse_response, reinterpret_cast(callBack), context); + DNSServiceErrorType err; + + if ((interfaceIndex == kDNSServiceInterfaceIndexAny) && includeP2PWithIndexAny()) + flags |= kDNSServiceFlagsIncludeP2P; + + err = ConnectToServer(sdRef, flags, browse_request, handle_browse_response, reinterpret_cast(callBack), context); if (err) return err; // On error ConnectToServer leaves *sdRef set to NULL if (!domain) domain = ""; @@ -1450,6 +1496,9 @@ DNSServiceErrorType DNSSD_API DNSServiceRegister // No callback must have auto-rename if (!callBack && (flags & kDNSServiceFlagsNoAutoRename)) return kDNSServiceErr_BadParam; + if ((interfaceIndex == kDNSServiceInterfaceIndexAny) && includeP2PWithIndexAny()) + flags |= kDNSServiceFlagsIncludeP2P; + err = ConnectToServer(sdRef, flags, reg_service_request, callBack ? handle_regservice_response : NULL, reinterpret_cast(callBack), context); if (err) return err; // On error ConnectToServer leaves *sdRef set to NULL @@ -1595,6 +1644,9 @@ DNSServiceErrorType DNSSD_API DNSServiceRegisterRecord int f2 = (flags & kDNSServiceFlagsUnique) != 0; if (f1 + f2 != 1) return kDNSServiceErr_BadParam; + if ((interfaceIndex == kDNSServiceInterfaceIndexAny) && includeP2PWithIndexAny()) + flags |= kDNSServiceFlagsIncludeP2P; + if (!sdRef) { syslog(LOG_WARNING, "dnssd_clientstub DNSServiceRegisterRecord called with NULL DNSServiceRef"); return kDNSServiceErr_BadParam; } if (!DNSServiceRefValid(sdRef)) diff --git a/src/libs/zeroconf/embed/dnssd_ipc.h b/src/libs/zeroconf/embed/dnssd_ipc.h index f8e09fc77d7..833b51f050e 100644 --- a/src/libs/zeroconf/embed/dnssd_ipc.h +++ b/src/libs/zeroconf/embed/dnssd_ipc.h @@ -154,8 +154,9 @@ typedef enum } reply_op_t; }} extern "C" { + #if defined(_WIN64) -# pragma pack(4) +# pragma pack(push,4) #endif // Define context object big enough to hold a 64-bit pointer, @@ -179,6 +180,10 @@ typedef packedstruct // index/socket pair uniquely identifies a record. (Used to select records for removal by DNSServiceRemoveRecord()) } ipc_msg_hdr; +#if defined(_WIN64) +# pragma pack(pop) +#endif + // routines to write to and extract data from message buffers. // caller responsible for bounds checking. // ptr is the address of the pointer to the start of the field. @@ -216,4 +221,5 @@ struct CompileTimeAssertionChecks_dnssd_ipc char assert1[(sizeof(ipc_msg_hdr) == 28) ? 1 : -1]; }; }} + #endif // DNSSD_IPC_H