summaryrefslogtreecommitdiffstats
path: root/mDNSResponder/Clients/dns-sd.c
diff options
context:
space:
mode:
Diffstat (limited to 'mDNSResponder/Clients/dns-sd.c')
-rw-r--r--mDNSResponder/Clients/dns-sd.c345
1 files changed, 269 insertions, 76 deletions
diff --git a/mDNSResponder/Clients/dns-sd.c b/mDNSResponder/Clients/dns-sd.c
index f36211e5..78c8f29f 100644
--- a/mDNSResponder/Clients/dns-sd.c
+++ b/mDNSResponder/Clients/dns-sd.c
@@ -165,6 +165,7 @@ static const char kFilePathSep = '/';
#undef _DNS_SD_LIBDISPATCH
#endif
#include "dns_sd.h"
+#include "dns_sd_internal.h"
#include "ClientCommon.h"
#if TEST_NEW_CLIENTSTUB
@@ -1520,138 +1521,321 @@ DNSServiceErrorType DNSSD_API DNSServiceCreateDelegateConnection(DNSServiceRef *
static int API_NULL_input_test()
{
- printf("Running basic API input range tests with all parameters set to 0:\n");
+ printf("Running basic API input range tests with various pointer parameters set to NULL:\n");
// Test that API's handle NULL pointers by returning an error when appropriate.
- printf("DNSServiceRefSockFD()\n");
+
+ // DNSServiceRefSockFD()
if (DNSServiceRefSockFD(0) != -1)
{
printf("DNSServiceRefSockFD(): expected dnssd_InvalidSocket return\n");
return 1;
- };
+ }
- printf("DNSServiceProcessResult()\n");
+ // DNSServiceProcessResult()
if (DNSServiceProcessResult(0) == 0)
{
printf("DNSServiceProcessResult(): expected error return\n");
return 1;
- };
+ }
- // no return value, just verify it doesn't crash
- printf("DNSServiceRefDeallocate()\n");
+ // DNSServiceRefDeallocate(): no return value, just verify it doesn't crash
DNSServiceRefDeallocate(0);
- printf("DNSServiceGetProperty()\n");
- if (DNSServiceGetProperty(0, 0, 0) == 0)
+ // DNSServiceGetProperty()
{
- printf("DNSServiceGetProperty(): expected error return\n");
- return 1;
- };
+ uint32_t result;
+ uint32_t size;
- printf("DNSServiceResolve()\n");
- if (DNSServiceResolve(0, 0, 0, 0, 0, 0, 0, 0) == 0)
+ if ( (DNSServiceGetProperty( 0, &result, &size) == 0)
+ || (DNSServiceGetProperty(kDNSServiceProperty_DaemonVersion, 0, &size) == 0)
+ || (DNSServiceGetProperty(kDNSServiceProperty_DaemonVersion, &result, 0) == 0)
+ )
+ {
+ printf("DNSServiceGetProperty(): expected error return\n");
+ return 1;
+ }
+ }
+
+ // DNSServiceResolve()
{
- printf("DNSServiceResolve(): expected error return\n");
- return 1;
- };
+ DNSServiceRef sdRef;
+ DNSServiceFlags flags = 0;
+ uint32_t interfaceIndex = 0;
+ const char *name = "name";
+ const char *regtype = "_test._tcp";
+ const char *domain = "local";
+ DNSServiceResolveReply callBack = 0;
+ void *context = 0; // can be a NULL pointer
+
+ if ( (DNSServiceResolve( 0, flags, interfaceIndex, name, regtype, domain, callBack, context) == 0)
+ || (DNSServiceResolve(&sdRef, flags, interfaceIndex, 0, regtype, domain, callBack, context) == 0)
+ || (DNSServiceResolve(&sdRef, flags, interfaceIndex, name, 0, domain, callBack, context) == 0)
+ || (DNSServiceResolve(&sdRef, flags, interfaceIndex, name, regtype, 0, callBack, context) == 0)
+ || (DNSServiceResolve(&sdRef, flags, interfaceIndex, name, regtype, domain, callBack, context) == 0)
+ )
+ {
+ printf("DNSServiceResolve(): expected error return\n");
+ return 1;
+ }
+ }
- printf("DNSServiceQueryRecord()\n");
- if (DNSServiceQueryRecord(0, 0, 0, 0, 0, 0, 0, 0) == 0)
+ // DNSServiceQueryRecord()
{
- printf("DNSServiceQueryRecord(): expected error return\n");
- return 1;
- };
+ DNSServiceRef sdRef;
+ DNSServiceFlags flags = 0;
+ uint32_t interfaceIndex = 0;
+ const char *fullname = "fullname";
+ uint16_t rrtype = 0;
+ uint16_t rrclass = 0;
+ DNSServiceQueryRecordReply callBack = 0;
+ void *context = 0; /* may be NULL */
+
+ if ( (DNSServiceQueryRecord( 0, flags, interfaceIndex, fullname, rrtype, rrclass, callBack, context) == 0)
+ || (DNSServiceQueryRecord(&sdRef, flags, interfaceIndex, 0, rrtype, rrclass, callBack, context) == 0)
+ || (DNSServiceQueryRecord(&sdRef, flags, interfaceIndex, fullname, rrtype, rrclass, 0, context) == 0)
+ )
+ {
+ printf("DNSServiceQueryRecord(): expected error return\n");
+ return 1;
+ }
+ }
- printf("DNSServiceGetAddrInfo()\n");
- if (DNSServiceGetAddrInfo(0, 0, 0, 0, 0, 0, 0) == 0)
+ // DNSServiceGetAddrInfo()
{
- printf("DNSServiceGetAddrInfo(): expected error return\n");
- return 1;
- };
+ DNSServiceRef sdRef;
+ DNSServiceFlags flags = 0;
+ uint32_t interfaceIndex = 0;
+ DNSServiceProtocol protocol = kDNSServiceProtocol_IPv4|kDNSServiceProtocol_IPv6;
+ const char *hostname = "host.local";
+ DNSServiceGetAddrInfoReply callBack = 0;
+ void *context = 0; // may be NULL
+
+ if ( (DNSServiceGetAddrInfo( 0, flags, interfaceIndex, protocol, hostname, callBack, context) == 0)
+ || (DNSServiceGetAddrInfo(&sdRef, flags, interfaceIndex, protocol, 0, callBack, context) == 0)
+ || (DNSServiceGetAddrInfo(&sdRef, flags, interfaceIndex, protocol, hostname, 0, context) == 0)
+ )
+ {
+ printf("DNSServiceGetAddrInfo(): expected error return\n");
+ return 1;
+ }
+ }
- printf("DNSServiceBrowse()\n");
- if (DNSServiceBrowse(0, 0, 0, 0, 0, 0, 0) == 0)
+ // DNSServiceBrowse()
{
- printf("DNSServiceBrowse(): expected error return\n");
- return 1;
- };
+ DNSServiceRef sdRef;
+ DNSServiceFlags flags = 0;
+ uint32_t interfaceIndex = 0;
+ const char *regtype = "_test._tcp";
+ const char *domain = 0; /* may be NULL */
+ DNSServiceBrowseReply callBack = 0;
+ void *context = 0; /* may be NULL */
+
+ if ( (DNSServiceBrowse( 0, flags, interfaceIndex, regtype, domain, callBack, context) == 0)
+ || (DNSServiceBrowse(&sdRef, flags, interfaceIndex, 0, domain, callBack, context) == 0)
+ || (DNSServiceBrowse(&sdRef, flags, interfaceIndex, regtype, domain, 0, context) == 0)
+ )
+ {
+ printf("DNSServiceBrowse(): expected error return\n");
+ return 1;
+ }
+ }
#if APPLE_OSX_mDNSResponder
- printf("DNSServiceSetDefaultDomainForUser()\n");
+ // DNSServiceSetDefaultDomainForUser()
if (DNSServiceSetDefaultDomainForUser(0, 0) == 0)
{
printf("DNSServiceSetDefaultDomainForUser(): expected error return\n");
return 1;
- };
+ }
#endif
- printf("DNSServiceRegister()\n");
- if (DNSServiceRegister(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) == 0)
+ // DNSServiceRegister()
{
- printf("DNSServiceRegister(): expected error return\n");
- return 1;
- };
+ DNSServiceRef sdRef;
+ DNSServiceFlags flags = 0;
+ uint32_t interfaceIndex = 0;
+ const char *name = 0; /* may be NULL */
+ const char *regtype = "_test._tcp";
+ const char *domain = 0; /* may be NULL */
+ const char *host = 0; /* may be NULL */
+ uint16_t port = 0x2211; /* In network byte order */
+ uint16_t txtLen = 1;
+ const void *txtRecord = "\0"; /* may be NULL */
+ DNSServiceRegisterReply callBack = 0; /* may be NULL */
+ void *context = 0; /* may be NULL */
+
+ if ( (DNSServiceRegister( 0, flags, interfaceIndex, name, regtype, domain, host, port, txtLen, txtRecord, callBack, context) == 0)
+ || (DNSServiceRegister(&sdRef, flags, interfaceIndex, name, 0, domain, host, port, txtLen, txtRecord, callBack, context) == 0)
+ )
+ {
+ printf("DNSServiceRegister(): expected error return\n");
+ return 1;
+ }
+ }
- printf("DNSServiceEnumerateDomains()\n");
- if (DNSServiceEnumerateDomains(0, 0, 0, 0, 0) == 0)
+ // DNSServiceEnumerateDomains()
{
- printf("DNSServiceEnumerateDomains(): expected error return\n");
- return 1;
- };
+ DNSServiceRef sdRef;
+ DNSServiceFlags flags = 0;
+ uint32_t interfaceIndex = 0;
+ DNSServiceDomainEnumReply callBack = 0;
+ void *context = 0; /* may be NULL */
+
+ if ( (DNSServiceEnumerateDomains( 0, flags, interfaceIndex, callBack, context) == 0)
+ || (DNSServiceEnumerateDomains(&sdRef, flags, interfaceIndex, 0, context) == 0)
+ )
+ {
+ printf("DNSServiceEnumerateDomains(): expected error return\n");
+ return 1;
+ }
+ }
- printf("DNSServiceCreateConnection()\n");
+ // DNSServiceCreateConnection()
if (DNSServiceCreateConnection(0) == 0)
{
printf("DNSServiceCreateConnection(): expected error return\n");
return 1;
- };
+ }
#if APPLE_OSX_mDNSResponder
- printf("DNSServiceCreateDelegateConnection()\n");
+ // DNSServiceCreateDelegateConnection()
if (DNSServiceCreateDelegateConnection(0, 0, 0) == 0)
{
printf("DNSServiceCreateDelegateConnection(): expected error return\n");
return 1;
- };
+ }
#endif
- printf("DNSServiceRegisterRecord()\n");
- if (DNSServiceRegisterRecord(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) == 0)
+ // DNSServiceRegisterRecord()
{
- printf("DNSServiceRegisterRecord(): expected error return\n");
- return 1;
- };
+ DNSServiceRef sdRef;
+ DNSRecordRef RecordRef;
+ DNSServiceFlags flags = 0;
+ uint32_t interfaceIndex = 0;
+ const char *fullname = "test1._test._tcp.local";
+ uint16_t rrtype = kDNSServiceType_TXT;
+ uint16_t rrclass = kDNSServiceClass_IN;
+ uint16_t rdlen = 1;
+ const void *rdata = "\0";
+ uint32_t ttl = 0;
+ DNSServiceRegisterRecordReply callBack = 0;
+ void *context = 0; /* may be NULL */
+
+ // Need an initialize sdRef
+ if (DNSServiceCreateConnection(&sdRef))
+ {
+ printf("DNSServiceCreateConnection(): failed\n");
+ return 1;
+ }
- printf("DNSServiceAddRecord()\n");
- if (DNSServiceAddRecord(0, 0, 0, 0, 0, 0, 0) == 0)
- {
- printf("DNSServiceAddRecord(): expected error return\n");
- return 1;
- };
+ if ( (DNSServiceRegisterRecord( 0, &RecordRef, flags, interfaceIndex, fullname, rrtype, rrclass, rdlen, rdata, ttl, callBack, context) == 0)
+ || (DNSServiceRegisterRecord(sdRef, &RecordRef, flags, interfaceIndex, 0, rrtype, rrclass, rdlen, rdata, ttl, callBack, context) == 0)
+ || (DNSServiceRegisterRecord(sdRef, &RecordRef, flags, interfaceIndex, fullname, rrtype, rrclass, rdlen, 0, ttl, callBack, context) == 0)
+ || (DNSServiceRegisterRecord(sdRef, &RecordRef, flags, interfaceIndex, fullname, rrtype, rrclass, rdlen, rdata, ttl, 0, context) == 0)
+ )
+ {
+ printf("DNSServiceRegisterRecord(): expected error return\n");
+ return 1;
+ }
+ }
- printf("DNSServiceUpdateRecord()\n");
- if (DNSServiceUpdateRecord(0, 0, 0, 0, 0, 0) == 0)
+ // DNSServiceAddRecord(), DNSServiceUpdateRecord(), and DNSServiceRemoveRecord() verify that they
+ // get a valid DNSServiceRef returned from DNSServiceRegister()
{
- printf("DNSServiceUpdateRecord(): expected error return\n");
- return 1;
- };
+ DNSServiceErrorType err;
+ Opaque16 registerPort = { { 0x12, 0x34 } };
+ static const char TXT[] = "\xC" "First String";
+ DNSServiceRef sdRef;
+
+ DNSRecordRef RecordRef;
+ DNSServiceFlags flags = 0;
+ uint16_t rrtype = kDNSServiceType_TXT;
+ uint16_t rdlen = 1;
+ const void *rdata = "\0";
+ uint32_t ttl = 100;
+
+ err = DNSServiceRegister(&sdRef, 0, 0, "Test", "_test._tcp.", "", NULL, registerPort.NotAnInteger, sizeof(TXT)-1, TXT, reg_reply, NULL);
+ if (err)
+ {
+ printf("DNSServiceRegister() failed with: %d\n", err);
+ return 1;
+ }
+
+ // DNSServiceAddRecord()
+ if ( (DNSServiceAddRecord( 0, &RecordRef, flags, rrtype, rdlen, rdata, ttl) == 0)
+ || (DNSServiceAddRecord(sdRef, 0, flags, rrtype, rdlen, rdata, ttl) == 0)
+ || (DNSServiceAddRecord(sdRef, &RecordRef, flags, rrtype, rdlen, 0, ttl) == 0)
+ )
- printf("DNSServiceRemoveRecord()\n");
- if (DNSServiceRemoveRecord(0, 0, 0) == 0)
- {
- printf("DNSServiceRemoveRecord(): expected error return\n");
- return 1;
- };
+ {
+ printf("DNSServiceAddRecord(): expected error return\n");
+ return 1;
+ }
+
+ // (rdlen == 0 && rdata == 0) should indicate a TXT with rdata containing only a 0 length byte.
+ if (DNSServiceAddRecord(sdRef, &RecordRef, flags, rrtype, 0, 0, ttl) == kDNSServiceErr_BadParam)
+ {
+ printf("DNSServiceAddRecord(): with (rdlen == 0 && rdata == 0) returned kDNSServiceErr_BadParam\n");
+ return 1;
+ }
+
+ // DNSServiceUpdateRecord()
+ // Note, RecordRef can be NULL per explanation with declaration in dns_sd.h
+ if ( (DNSServiceUpdateRecord( 0, RecordRef, flags, rdlen, rdata, ttl) == 0)
+ || (DNSServiceUpdateRecord(sdRef, RecordRef, flags, rdlen, 0, ttl) == 0)
+ )
+ {
+ printf("DNSServiceUpdateRecord(): expected error return\n");
+ return 1;
+ }
+
+ // (rdlen == 0 && rdata == 0) should indicate a TXT with rdata containing only a 0 length byte.
+ if (DNSServiceUpdateRecord(sdRef, RecordRef, flags, 0, 0, ttl) == kDNSServiceErr_BadParam)
+ {
+ printf("DNSServiceUpdateRecord(): with (rdlen == 0 && rdata == 0) returned kDNSServiceErr_BadParam\n");
+ return 1;
+ }
+
+ // DNSServiceRemoveRecord()
+ if ( (DNSServiceRemoveRecord( 0, RecordRef, flags) == 0)
+ || (DNSServiceRemoveRecord(sdRef, 0, flags) == 0)
+ )
+ {
+ printf("DNSServiceRemoveRecord(): expected error return\n");
+ return 1;
+ }
+
+ DNSServiceRefDeallocate(sdRef);
+ }
- printf("DNSServiceReconfirmRecord()\n");
- if (DNSServiceReconfirmRecord(0, 0, 0, 0, 0, 0, 0) == 0)
+ // DNSServiceReconfirmRecord()
{
- printf("DNSServiceReconfirmRecord(): expected error return\n");
- return 1;
- };
+ DNSServiceFlags flags = 0;
+ uint32_t interfaceIndex = 0;
+ const char *fullname = "aaa._test._tcp.local";
+ uint16_t rrtype = kDNSServiceType_TXT;
+ uint16_t rrclass = kDNSServiceClass_IN;
+ uint16_t rdlen = 1;
+ const void *rdata = "\0";
+
+ if ( (DNSServiceReconfirmRecord(flags, interfaceIndex, 0, rrtype, rrclass, rdlen, rdata) == 0)
+ || (DNSServiceReconfirmRecord(flags, interfaceIndex, fullname, rrtype, rrclass, rdlen, 0) == 0)
+ )
+ {
+ printf("DNSServiceReconfirmRecord(): expected error return\n");
+ return 1;
+ }
+ // (rdlen == 0 && rdata == 0) should indicate a TXT with rdata containing only a 0 length byte.
+ if (DNSServiceReconfirmRecord(flags, interfaceIndex, fullname, rrtype, rrclass, 0, 0) == kDNSServiceErr_BadParam)
+ {
+ printf("DNSServiceReconfirmRecord(): with (rdlen == 0 && rdata == 0) returned kDNSServiceErr_BadParam\n");
+ return 1;
+ }
+ }
- printf("Basic API input range tests with all parameters set to 0: PASSED\n");
+ printf("Basic API input range tests: PASSED\n");
return 0;
}
@@ -1739,6 +1923,14 @@ int main(int argc, char **argv)
flags |= kDNSServiceFlagsIncludeP2P;
printf("Setting kDNSServiceFlagsIncludeP2P\n");
}
+
+ if (argc > 1 && !strcasecmp(argv[1], "-fmc"))
+ {
+ argc--;
+ argv++;
+ flags |= kDNSServiceFlagsForceMulticast;
+ printf("Setting kDNSServiceFlagsForceMulticast flag for this request\n");
+ }
if (argc > 1 && !strcasecmp(argv[1], "-includeAWDL"))
{
@@ -2002,6 +2194,7 @@ int main(int argc, char **argv)
case 'g':
case 'G': {
flags |= kDNSServiceFlagsReturnIntermediates;
+
if (operation == 'g')
{
flags |= kDNSServiceFlagsSuppressUnusable;