// When a new named instance of a service is found, FoundInstance() is called. // In this sample code we turn around and immediately issue a query to resolve that service name to // find its address, port, and txtinfo, but a normal browing application would just display the name. static void FoundInstance(mDNS *const m, DNSQuestion *question, const ResourceRecord *const answer, QC_result AddRecord) { #pragma unused (question) SearcherServices *services = (SearcherServices *)question->QuestionContext; linkedServiceInfo *info; debugf("FoundInstance %##s PTR %##s", answer->name->c, answer->rdata->u.name.c); if (answer->rrtype != kDNSType_PTR) return; if (!services) { debugf("FoundInstance: services is NULL"); return; } info = (linkedServiceInfo *)OTAllocMem(sizeof(linkedServiceInfo)); if (!info) { services->lostRecords = true; return; } info->i.name = answer->rdata->u.name; info->i.InterfaceID = answer->InterfaceID; info->i.ip.type = mDNSAddrType_IPv4; info->i.ip.ip.v4 = zerov4Addr; info->i.port = zeroIPPort; info->add = AddRecord; info->dom = mDNSfalse; if (!AddRecord) // If TTL == 0 we're deleting a service, OTLIFOEnqueue(&services->serviceinfolist, &info->link); else // else we're adding a new service { ServiceInfoQuery *q = (ServiceInfoQuery *)OTAllocMem(sizeof(ServiceInfoQuery)); if (!q) { OTFreeMem(info); services->lostRecords = true; return; } mDNS_StartResolveService(m, q, &info->i, FoundInstanceInfo, services); } }
static void foobar_manage_service(mDNS *m, const ResourceRecord *answer, const domainlabel *name, bool add) { if (add) { mStatus status; service_info_query *siq = calloc(1, sizeof(*siq)); assert(siq != NULL); siq->next = service_info_query_list; service_info_query_list = siq; siq->info.name = answer->rdata->u.name; siq->info.InterfaceID = answer->InterfaceID; status = mDNS_StartResolveService(m, &siq->query, &siq->info, foobar_service_info, NULL); assert(status == mStatus_NoError); } else { service_info_query *cur = service_info_query_list; service_info_query *prev = cur; while (cur != NULL && !SameDomainLabel(&name->c[0], &cur->info.name.c[0])) { prev = cur; cur = cur->next; } if (cur != NULL) { if (prev != cur) { prev->next = cur->next; } else { service_info_query_list = cur->next; } mDNS_StopResolveService(m, &cur->query); free(cur); } } }