diff options
Diffstat (limited to 'mDNSResponder/Clients/dns-sd.c')
-rw-r--r-- | mDNSResponder/Clients/dns-sd.c | 345 |
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; |