DNSRecordReference DNSServiceRegistrationAddRecord(dns_service_discovery_ref ref, uint16_t rrtype, uint16_t rdlen, const char *rdata, uint32_t ttl) { mach_port_t serverPort = DNSServiceDiscoveryLookupServer(); mach_port_t clientPort; natural_t reference = 0; kern_return_t result = KERN_SUCCESS; if (!serverPort) { return kDNSServiceDiscoveryUnknownErr; } clientPort = DNSServiceDiscoveryMachPort(ref); if (!clientPort) { return kDNSServiceDiscoveryUnknownErr; } result = DNSServiceRegistrationAddRecord_rpc(serverPort, clientPort, rrtype, (record_data_t)rdata, rdlen, ttl, &reference); if (result != KERN_SUCCESS) { printf("The result of the registration was not successful. Error %d, result %s\n", result, mach_error_string(result)); } return reference; }
DNSServiceRegistrationReplyErrorType DNSServiceRegistrationRemoveRecord(dns_service_discovery_ref ref, DNSRecordReference reference) { mach_port_t serverPort = DNSServiceDiscoveryLookupServer(); mach_port_t clientPort; kern_return_t result = KERN_SUCCESS; if (!serverPort) { return kDNSServiceDiscoveryUnknownErr; } clientPort = DNSServiceDiscoveryMachPort(ref); if (!clientPort) { return kDNSServiceDiscoveryUnknownErr; } result = DNSServiceRegistrationRemoveRecord_rpc(serverPort, clientPort, (natural_t)reference); if (result != KERN_SUCCESS) { printf("The result of the registration was not successful. Error %d, result %s\n", result, mach_error_string(result)); return result; } return kDNSServiceDiscoveryNoError; }
/* * rend_addtorunloop */ static int rend_addtorunloop(dns_service_discovery_ref client) { mach_port_t port=DNSServiceDiscoveryMachPort(client); if(!port) return -1; else { CFMachPortContext context = { 0, 0, NULL, NULL, NULL }; Boolean shouldFreeInfo; CFMachPortRef cfMachPort=CFMachPortCreateWithPort(kCFAllocatorDefault, port, rend_handler, &context, &shouldFreeInfo); CFRunLoopSourceRef rls=CFMachPortCreateRunLoopSource(NULL,cfMachPort,0); CFRunLoopAddSource(CFRunLoopGetCurrent(), rls,kCFRunLoopDefaultMode); CFRelease(rls); return 0; } }