// 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);
		}
	}
示例#2
0
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);
		}
	}
}