diff options
Diffstat (limited to 'mDNSResponder/mDNSShared/uds_daemon.c')
-rw-r--r-- | mDNSResponder/mDNSShared/uds_daemon.c | 630 |
1 files changed, 248 insertions, 382 deletions
diff --git a/mDNSResponder/mDNSShared/uds_daemon.c b/mDNSResponder/mDNSShared/uds_daemon.c index 2552c8a7..946ad162 100644 --- a/mDNSResponder/mDNSShared/uds_daemon.c +++ b/mDNSResponder/mDNSShared/uds_daemon.c @@ -34,6 +34,7 @@ #include "DNSCommon.h" #include "uDNS.h" #include "uds_daemon.h" +#include "dns_sd_internal.h" // Normally we append search domains only for queries with a single label that are not // fully qualified. This can be overridden to apply search domains for queries (that are @@ -54,8 +55,10 @@ mDNSBool AlwaysAppendSearchDomains = mDNSfalse; #include <sys/proc_info.h> // for struct proc_bsdshortinfo #include <libproc.h> // for proc_pidinfo() #endif //LOCAL_PEEREPID -//upto 16 characters of process name (defined in <sys/proc.h> but we do not want to include that file) -#define MAXCOMLEN 16 + +#ifdef UNIT_TEST +#include "unittest.h" +#endif #if APPLE_OSX_mDNSResponder #include <WebFilterDNS/WebFilterDNS.h> @@ -84,188 +87,6 @@ int WCFNameResolvesToName(WCFConnection *conn, char* fromName, char* toName, uid // *************************************************************************** #if COMPILER_LIKES_PRAGMA_MARK #pragma mark - -#pragma mark - Types and Data Structures -#endif - -typedef enum -{ - t_uninitialized, - t_morecoming, - t_complete, - t_error, - t_terminated -} transfer_state; - -typedef struct request_state request_state; - -typedef void (*req_termination_fn)(request_state *request); - -typedef struct registered_record_entry -{ - struct registered_record_entry *next; - mDNSu32 key; - client_context_t regrec_client_context; - request_state *request; - mDNSBool external_advertise; - mDNSInterfaceID origInterfaceID; - AuthRecord *rr; // Pointer to variable-sized AuthRecord (Why a pointer? Why not just embed it here?) -} registered_record_entry; - -// A single registered service: ServiceRecordSet + bookkeeping -// Note that we duplicate some fields from parent service_info object -// to facilitate cleanup, when instances and parent may be deallocated at different times. -typedef struct service_instance -{ - struct service_instance *next; - request_state *request; - AuthRecord *subtypes; - mDNSBool renameonmemfree; // Set on config change when we deregister original name - mDNSBool clientnotified; // Has client been notified of successful registration yet? - mDNSBool default_local; // is this the "local." from an empty-string registration? - mDNSBool external_advertise; // is this is being advertised externally? - domainname domain; - ServiceRecordSet srs; // note -- variable-sized object -- must be last field in struct -} service_instance; - -// for multi-domain default browsing -typedef struct browser_t -{ - struct browser_t *next; - domainname domain; - DNSQuestion q; -} browser_t; - -#ifdef _WIN32 - typedef unsigned int pid_t; - typedef unsigned int socklen_t; -#endif - -struct request_state -{ - request_state *next; - request_state *primary; // If this operation is on a shared socket, pointer to primary - // request_state for the original DNSServiceCreateConnection() operation - dnssd_sock_t sd; - pid_t process_id; // Client's PID value - char pid_name[MAXCOMLEN]; // Client's process name - char uuid[UUID_SIZE]; - mDNSBool validUUID; - dnssd_sock_t errsd; - mDNSu32 uid; - void * platform_data; - - // Note: On a shared connection these fields in the primary structure, including hdr, are re-used - // for each new request. This is because, until we've read the ipc_msg_hdr to find out what the - // operation is, we don't know if we're going to need to allocate a new request_state or not. - transfer_state ts; - mDNSu32 hdr_bytes; // bytes of header already read - ipc_msg_hdr hdr; - mDNSu32 data_bytes; // bytes of message data already read - char *msgbuf; // pointer to data storage to pass to free() - const char *msgptr; // pointer to data to be read from (may be modified) - char *msgend; // pointer to byte after last byte of message - - // reply, termination, error, and client context info - int no_reply; // don't send asynchronous replies to client - mDNSs32 time_blocked; // record time of a blocked client - int unresponsiveness_reports; - struct reply_state *replies; // corresponding (active) reply list - req_termination_fn terminate; - DNSServiceFlags flags; - mDNSu32 interfaceIndex; - - union - { - registered_record_entry *reg_recs; // list of registrations for a connection-oriented request - struct - { - mDNSInterfaceID interface_id; - mDNSBool default_domain; - mDNSBool ForceMCast; - domainname regtype; - browser_t *browsers; - const mDNSu8 *AnonData; - } browser; - struct - { - mDNSInterfaceID InterfaceID; - mDNSu16 txtlen; - void *txtdata; - mDNSIPPort port; - domainlabel name; - char type_as_string[MAX_ESCAPED_DOMAIN_NAME]; - domainname type; - mDNSBool default_domain; - domainname host; - mDNSBool autoname; // Set if this name is tied to the Computer Name - mDNSBool autorename; // Set if this client wants us to automatically rename on conflict - mDNSBool allowremotequery; // Respond to unicast queries from outside the local link? - int num_subtypes; - mDNSBool AnonData; - service_instance *instances; - } servicereg; - struct - { - mDNSInterfaceID interface_id; - mDNSu32 flags; - mDNSu32 protocol; - DNSQuestion q4; - DNSQuestion *q42; - DNSQuestion q6; - DNSQuestion *q62; - mDNSu8 v4ans; - mDNSu8 v6ans; - } addrinfo; - struct - { - mDNSIPPort ReqExt; // External port we originally requested, for logging purposes - NATTraversalInfo NATinfo; - } pm; - struct - { - DNSServiceFlags flags; - DNSQuestion q_all; - DNSQuestion q_default; - DNSQuestion q_autoall; - } enumeration; - struct - { - DNSQuestion q; - DNSQuestion *q2; - mDNSu8 ans; - } queryrecord; - struct - { - DNSQuestion qtxt; - DNSQuestion qsrv; - const ResourceRecord *txt; - const ResourceRecord *srv; - mDNSs32 ReportTime; - mDNSBool external_advertise; - } resolve; - } u; -}; - -// struct physically sits between ipc message header and call-specific fields in the message buffer -typedef struct -{ - DNSServiceFlags flags; // Note: This field is in NETWORK byte order - mDNSu32 ifi; // Note: This field is in NETWORK byte order - DNSServiceErrorType error; // Note: This field is in NETWORK byte order -} reply_hdr; - -typedef struct reply_state -{ - struct reply_state *next; // If there are multiple unsent replies - mDNSu32 totallen; - mDNSu32 nwriten; - ipc_msg_hdr mhdr[1]; - reply_hdr rhdr[1]; -} reply_state; - -// *************************************************************************** -#if COMPILER_LIKES_PRAGMA_MARK -#pragma mark - #pragma mark - Globals #endif @@ -363,7 +184,7 @@ mDNSlocal void my_throttled_perror(char *err_msg) // LogMcastQuestion/LogMcastQ should be called after the DNSQuestion struct is initialized(especially for q->TargetQID) // Hence all calls are made after mDNS_StartQuery()/mDNS_StopQuery()/mDNS_StopBrowse() is called. -mDNSlocal void LogMcastQuestion(mDNS *const m, const DNSQuestion *const q, request_state *req, q_state status) +mDNSlocal void LogMcastQuestion(const DNSQuestion *const q, request_state *req, q_state status) { if (mDNSOpaque16IsZero(q->TargetQID)) // Check for Mcast Query { @@ -381,16 +202,16 @@ mDNSlocal void LogMcastQuestion(mDNS *const m, const DNSQuestion *const q, reque q->InterfaceID == mDNSInterface_LocalOnly ? "lo" : q->InterfaceID == mDNSInterface_P2P ? "p2p" : q->InterfaceID == mDNSInterface_BLE ? "BLE" : - q->InterfaceID == mDNSInterface_Any ? "any" : InterfaceNameForID(m, q->InterfaceID), + q->InterfaceID == mDNSInterface_Any ? "any" : InterfaceNameForID(&mDNSStorage, q->InterfaceID), req->process_id, req->pid_name); - LogMcastStateInfo(m, mflag, mDNSfalse, mDNSfalse); + LogMcastStateInfo(mflag, mDNSfalse, mDNSfalse); } return; } // LogMcastService/LogMcastS should be called after the AuthRecord struct is initialized // Hence all calls are made after mDNS_Register()/ just before mDNS_Deregister() -mDNSlocal void LogMcastService(mDNS *const m, const AuthRecord *const ar, request_state *req, reg_state status) +mDNSlocal void LogMcastService(const AuthRecord *const ar, request_state *req, reg_state status) { if (!AuthRecord_uDNS(ar)) // Check for Mcast Service { @@ -408,16 +229,17 @@ mDNSlocal void LogMcastService(mDNS *const m, const AuthRecord *const ar, reques ar->resrec.InterfaceID == mDNSInterface_LocalOnly ? "lo" : ar->resrec.InterfaceID == mDNSInterface_P2P ? "p2p" : ar->resrec.InterfaceID == mDNSInterface_BLE ? "BLE" : - ar->resrec.InterfaceID == mDNSInterface_Any ? "all" : InterfaceNameForID(m, ar->resrec.InterfaceID), + ar->resrec.InterfaceID == mDNSInterface_Any ? "all" : InterfaceNameForID(&mDNSStorage, ar->resrec.InterfaceID), req->process_id, req->pid_name); - LogMcastStateInfo(m, mflag, mDNSfalse, mDNSfalse); + LogMcastStateInfo(mflag, mDNSfalse, mDNSfalse); } return; } // For complete Mcast State Log, pass mDNStrue to mstatelog in LogMcastStateInfo() -mDNSexport void LogMcastStateInfo(mDNS *const m, mDNSBool mflag, mDNSBool start, mDNSBool mstatelog) +mDNSexport void LogMcastStateInfo(mDNSBool mflag, mDNSBool start, mDNSBool mstatelog) { + mDNS *const m = &mDNSStorage; if (!mstatelog) { if (!all_requests) @@ -862,13 +684,6 @@ mDNSlocal void external_start_advertising_helper(service_instance *const instanc external_start_advertising_service(&instance->srs.RR_PTR.resrec, instance->request->flags); external_start_advertising_service(&instance->srs.RR_SRV.resrec, instance->request->flags); -#if APPLE_OSX_mDNSResponder - if (applyToBLE(instance->srs.RR_SRV.resrec.InterfaceID, instance->request->flags)) - { - start_BLE_advertise(& instance->srs, instance->srs.RR_SRV.resrec.name , instance->srs.RR_SRV.resrec.rrtype, instance->request->flags); - } -#endif // APPLE_OSX_mDNSResponder - external_start_advertising_service(&instance->srs.RR_TXT.resrec, instance->request->flags); for (e = instance->srs.Extras; e; e = e->next) @@ -964,13 +779,13 @@ mDNSlocal void unlink_and_free_service_instance(service_instance *srv) // Count how many other service records we have locally with the same name, but different rdata. // For auto-named services, we can have at most one per machine -- if we allowed two auto-named services of // the same type on the same machine, we'd get into an infinite autoimmune-response loop of continuous renaming. -mDNSexport int CountPeerRegistrations(mDNS *const m, ServiceRecordSet *const srs) +mDNSexport int CountPeerRegistrations(ServiceRecordSet *const srs) { int count = 0; ResourceRecord *r = &srs->RR_SRV.resrec; AuthRecord *rr; - for (rr = m->ResourceRecords; rr; rr=rr->next) + for (rr = mDNSStorage.ResourceRecords; rr; rr=rr->next) if (rr->resrec.rrtype == kDNSType_SRV && SameDomainName(rr->resrec.name, r->name) && !IdenticalSameNameRecord(&rr->resrec, r)) count++; @@ -1056,8 +871,8 @@ mDNSlocal void regservice_callback(mDNS *const m, ServiceRecordSet *const srs, m LogInfo("regservice_callback: calling external_start_advertising_helper()"); external_start_advertising_helper(instance); } - if (instance->request->u.servicereg.autoname && CountPeerRegistrations(m, srs) == 0) - RecordUpdatedNiceLabel(m, 0); // Successfully got new name, tell user immediately + if (instance->request->u.servicereg.autoname && CountPeerRegistrations(srs) == 0) + RecordUpdatedNiceLabel(0); // Successfully got new name, tell user immediately } else if (result == mStatus_MemFree) { @@ -1080,7 +895,7 @@ mDNSlocal void regservice_callback(mDNS *const m, ServiceRecordSet *const srs, m if (instance->request->u.servicereg.autorename) { external_stop_advertising_helper(instance); - if (instance->request->u.servicereg.autoname && CountPeerRegistrations(m, srs) == 0) + if (instance->request->u.servicereg.autoname && CountPeerRegistrations(srs) == 0) { // On conflict for an autoname service, rename and reregister *all* autoname services IncrementLabelSuffix(&m->nicelabel, mDNStrue); @@ -1253,7 +1068,7 @@ mDNSlocal void connection_termination(request_state *request) ptr->external_advertise = mDNSfalse; external_stop_advertising_service(&ptr->rr->resrec, request->flags); } - LogMcastS(&mDNSStorage, ptr->rr, request, reg_stop); + LogMcastS(ptr->rr, request, reg_stop); mDNS_Deregister(&mDNSStorage, ptr->rr); // Will free ptr->rr for us freeL("registered_record_entry/connection_termination", ptr); } @@ -1283,11 +1098,12 @@ mDNSlocal void handle_cancel_request(request_state *request) mDNSlocal mStatus handle_regrecord_request(request_state *request) { mStatus err = mStatus_BadParamErr; + AuthRecord *rr; if (request->terminate != connection_termination) { LogMsg("%3d: DNSServiceRegisterRecord(not a shared connection ref)", request->sd); return(err); } - AuthRecord *rr = read_rr_from_ipc_msg(request, 1, 1); + rr = read_rr_from_ipc_msg(request, 1, 1); if (rr) { registered_record_entry *re; @@ -1333,7 +1149,7 @@ mDNSlocal mStatus handle_regrecord_request(request_state *request) } else { - LogMcastS(&mDNSStorage, rr, request, reg_start); + LogMcastS(rr, request, reg_start); re->next = request->u.reg_recs; request->u.reg_recs = re; } @@ -1366,7 +1182,7 @@ mDNSlocal void regservice_termination_callback(request_state *request) // We can't clear p->request *after* the calling mDNS_DeregisterService/unlink_and_free_service_instance // because by then we might have already freed p p->request = NULL; - LogMcastS(&mDNSStorage, &p->srs.RR_SRV, request, reg_stop); + LogMcastS(&p->srs.RR_SRV, request, reg_stop); if (mDNS_DeregisterService(&mDNSStorage, &p->srs)) { unlink_and_free_service_instance(p); @@ -1400,7 +1216,6 @@ mDNSlocal mStatus add_record_to_service(request_state *request, service_instance { ServiceRecordSet *srs = &instance->srs; mStatus result; - mDNSu32 coreFlags = 0; // translate to corresponding mDNSCore flag definitions size_t size = rdlen > sizeof(RDataBody) ? rdlen : sizeof(RDataBody); ExtraResourceRecord *extra = mallocL("ExtraResourceRecord", sizeof(*extra) - sizeof(RDataBody) + size); if (!extra) { my_perror("ERROR: malloc"); return mStatus_NoMemoryErr; } @@ -1413,18 +1228,13 @@ mDNSlocal mStatus add_record_to_service(request_state *request, service_instance // use InterfaceID value from DNSServiceRegister() call that created the original service extra->r.resrec.InterfaceID = request->u.servicereg.InterfaceID; - if (request->flags & kDNSServiceFlagsIncludeP2P) - coreFlags |= coreFlagIncludeP2P; - if (request->flags & kDNSServiceFlagsIncludeAWDL) - coreFlags |= coreFlagIncludeAWDL; - - result = mDNS_AddRecordToService(&mDNSStorage, srs, extra, &extra->r.rdatastorage, ttl, coreFlags); + result = mDNS_AddRecordToService(&mDNSStorage, srs, extra, &extra->r.rdatastorage, ttl, request->flags); if (result) { freeL("ExtraResourceRecord/add_record_to_service", extra); return result; } - LogMcastS(&mDNSStorage, &srs->RR_PTR, request, reg_start); + LogMcastS(&srs->RR_PTR, request, reg_start); extra->ClientID = request->hdr.reg_index; if ( instance->external_advertise @@ -1461,8 +1271,9 @@ mDNSlocal mStatus handle_add_request(request_state *request) if (mDNSIPPortIsZero(request->u.servicereg.port)) { LogMsg("%3d: DNSServiceAddRecord: adding record to a service registered with zero port", request->sd); return(mStatus_BadParamErr); } - LogOperation("%3d: DNSServiceAddRecord(%X, %##s, %s, %d)", request->sd, flags, - (request->u.servicereg.instances) ? request->u.servicereg.instances->srs.RR_SRV.resrec.name->c : NULL, DNSTypeName(rrtype), rdlen); + LogOperation("%3d: DNSServiceAddRecord(%X, %##s, %s, %d) PID[%d](%s)", request->sd, flags, + (request->u.servicereg.instances) ? request->u.servicereg.instances->srs.RR_SRV.resrec.name->c : NULL, DNSTypeName(rrtype), rdlen, + request->process_id, request->pid_name); for (i = request->u.servicereg.instances; i; i = i->next) { @@ -1552,8 +1363,9 @@ mDNSlocal mStatus handle_update_request(request_state *request) if (reptr->key == hdr->reg_index) { result = update_record(reptr->rr, rdlen, rdata, ttl, &reptr->external_advertise); - LogOperation("%3d: DNSServiceUpdateRecord(%##s, %s)", - request->sd, reptr->rr->resrec.name->c, reptr->rr ? DNSTypeName(reptr->rr->resrec.rrtype) : "<NONE>"); + LogOperation("%3d: DNSServiceUpdateRecord(%##s, %s) PID[%d](%s)", + request->sd, reptr->rr->resrec.name->c, reptr->rr ? DNSTypeName(reptr->rr->resrec.rrtype) : "<NONE>", + request->process_id, request->pid_name); goto end; } } @@ -1601,9 +1413,10 @@ mDNSlocal mStatus handle_update_request(request_state *request) end: if (request->terminate == regservice_termination_callback) - LogOperation("%3d: DNSServiceUpdateRecord(%##s, %s)", request->sd, + LogOperation("%3d: DNSServiceUpdateRecord(%##s, %s) PID[%d](%s)", request->sd, (request->u.servicereg.instances) ? request->u.servicereg.instances->srs.RR_SRV.resrec.name->c : NULL, - rr ? DNSTypeName(rr->resrec.rrtype) : "<NONE>"); + rr ? DNSTypeName(rr->resrec.rrtype) : "<NONE>", + request->process_id, request->pid_name); return(result); } @@ -1619,14 +1432,15 @@ mDNSlocal mStatus remove_record(request_state *request) e = *ptr; *ptr = e->next; // unlink - LogOperation("%3d: DNSServiceRemoveRecord(%u %s)", request->sd, e->key, RRDisplayString(&mDNSStorage, &e->rr->resrec)); + LogOperation("%3d: DNSServiceRemoveRecord(%u %s) PID[%d](%s)", + request->sd, e->key, RRDisplayString(&mDNSStorage, &e->rr->resrec), request->process_id, request->pid_name); e->rr->RecordContext = NULL; if (e->external_advertise) { external_stop_advertising_service(&e->rr->resrec, request->flags); e->external_advertise = mDNSfalse; } - LogMcastS(&mDNSStorage, e->rr, request, reg_stop); + LogMcastS(e->rr, request, reg_stop); err = mDNS_Deregister(&mDNSStorage, e->rr); // Will free e->rr for us; we're responsible for freeing e if (err) { @@ -1673,9 +1487,9 @@ mDNSlocal mStatus handle_removerecord_request(request_state *request) { service_instance *i; mDNSu16 rrtype = 0; - LogOperation("%3d: DNSServiceRemoveRecord(%##s, %s)", request->sd, + LogOperation("%3d: DNSServiceRemoveRecord(%##s, %s) PID[%d](%s)", request->sd, (request->u.servicereg.instances) ? request->u.servicereg.instances->srs.RR_SRV.resrec.name->c : NULL, - rrtype ? DNSTypeName(rrtype) : "<NONE>"); + rrtype ? DNSTypeName(rrtype) : "<NONE>", request->process_id, request->pid_name); for (i = request->u.servicereg.instances; i; i = i->next) { err = remove_extra(request, i, &rrtype); @@ -1822,20 +1636,6 @@ mDNSlocal mStatus register_service_instance(request_state *request, const domain const mDNSBool DomainIsLocal = SameDomainName(domain, &localdomain); mStatus result; mDNSInterfaceID interfaceID = request->u.servicereg.InterfaceID; - mDNSu32 coreFlags = 0; - - if (request->flags & kDNSServiceFlagsIncludeP2P) - coreFlags |= coreFlagIncludeP2P; - if (request->flags & kDNSServiceFlagsIncludeAWDL) - coreFlags |= coreFlagIncludeAWDL; - - // Client guarantees that record names are unique, so we can skip sending out initial - // probe messages. Standard name conflict resolution is still done if a conflict is discovered. - if (request->flags & kDNSServiceFlagsKnownUnique) - coreFlags |= coreFlagKnownUnique; - - if (request->flags & kDNSServiceFlagsWakeOnlyService) - coreFlags |= coreFlagWakeOnly; // If the client specified an interface, but no domain, then we honor the specified interface for the "local" (mDNS) // registration but for the wide-area registrations we don't (currently) have any concept of a wide-area unicast @@ -1891,14 +1691,14 @@ mDNSlocal mStatus register_service_instance(request_state *request, const domain request->u.servicereg.port, request->u.servicereg.txtdata, request->u.servicereg.txtlen, instance->subtypes, request->u.servicereg.num_subtypes, - interfaceID, regservice_callback, instance, coreFlags); + interfaceID, regservice_callback, instance, request->flags); if (!result) { *ptr = instance; // Append this to the end of our request->u.servicereg.instances list LogOperation("%3d: DNSServiceRegister(%##s, %u) ADDED", instance->request->sd, instance->srs.RR_SRV.resrec.name->c, mDNSVal16(request->u.servicereg.port)); - LogMcastS(&mDNSStorage, &instance->srs.RR_SRV, request, reg_start); + LogMcastS(&instance->srs.RR_SRV, request, reg_start); } else { @@ -2028,6 +1828,7 @@ mDNSlocal mDNSBool PreDefinedInterfaceIndex(mDNSu32 interfaceIndex) case kDNSServiceInterfaceIndexLocalOnly: case kDNSServiceInterfaceIndexUnicast: case kDNSServiceInterfaceIndexP2P: + case kDNSServiceInterfaceIndexBLE: return mDNStrue; default: return mDNSfalse; @@ -2190,8 +1991,17 @@ mDNSlocal mStatus handle_regservice_request(request_state *request) request->pid_name, count+1, srv.c, mDNSVal16(request->u.servicereg.port)); } +#if APPLE_OSX_mDNSResponder && ENABLE_BLE_TRIGGERED_BONJOUR + // Determine if this request should be promoted to use BLE triggered feature. + if (shouldUseBLE(InterfaceID, 0, &request->u.servicereg.type, &d)) + { + request->flags |= (kDNSServiceFlagsAutoTrigger | kDNSServiceFlagsIncludeAWDL); + LogInfo("handle_regservice_request: registration promoted to use kDNSServiceFlagsAutoTrigger"); + } +#endif // APPLE_OSX_mDNSResponder && ENABLE_BLE_TRIGGERED_BONJOUR + LogOperation("%3d: DNSServiceRegister(%X, %d, \"%s\", \"%s\", \"%s\", \"%s\", %u) START PID[%d](%s)", - request->sd, flags, interfaceIndex, name, request->u.servicereg.type_as_string, domain, host, + request->sd, request->flags, interfaceIndex, name, request->u.servicereg.type_as_string, domain, host, mDNSVal16(request->u.servicereg.port), request->process_id, request->pid_name); // We need to unconditionally set request->terminate, because even if we didn't successfully @@ -2280,8 +2090,8 @@ mDNSlocal void FoundInstance(mDNS *const m, DNSQuestion *question, const Resourc validReply: - LogOperation("%3d: DNSServiceBrowse(%##s, %s) RESULT %s %d: %s", - req->sd, question->qname.c, DNSTypeName(question->qtype), AddRecord ? "Add" : "Rmv", + LogOperation("%3d: DNSServiceBrowse(%##s, %s) RESULT %s interface %d: %s", + req->sd, question->qname.c, DNSTypeName(question->qtype), AddRecord ? "ADD" : "RMV", mDNSPlatformInterfaceIndexfromInterfaceID(m, answer->InterfaceID, mDNSfalse), RRDisplayString(m, answer)); append_reply(req, rep); @@ -2289,7 +2099,6 @@ validReply: mDNSlocal void SetQuestionPolicy(DNSQuestion *q, request_state *req) { - int i; q->euid = req->uid; // The policy is either based on pid or UUID. Pass a zero pid // to the "core" if the UUID is valid. If we always pass the pid, @@ -2303,10 +2112,7 @@ mDNSlocal void SetQuestionPolicy(DNSQuestion *q, request_state *req) // pid in the question, we will reevaluate this strategy. if (req->validUUID) { - for (i = 0; i < UUID_SIZE; i++) - { - q->uuid[i] = req->uuid[i]; - } + mDNSPlatformMemCopy(q->uuid, req->uuid, UUID_SIZE); q->pid = 0; } else @@ -2344,15 +2150,24 @@ mDNSlocal mStatus add_domain_to_browser(request_state *info, const domainname *d { b->next = info->u.browser.browsers; info->u.browser.browsers = b; - LogOperation("%3d: DNSServiceBrowse(%##s) START PID[%d](%s)", info->sd, b->q.qname.c, info->process_id, - info->pid_name); - LogMcastQ(&mDNSStorage, &b->q, info, q_start); + +#if APPLE_OSX_mDNSResponder && ENABLE_BLE_TRIGGERED_BONJOUR + // Determine if this request should be promoted to use BLE triggered discovery. + if (shouldUseBLE(info->u.browser.interface_id, 0, &info->u.browser.regtype, (domainname *) d)) + { + info->flags |= (kDNSServiceFlagsAutoTrigger | kDNSServiceFlagsIncludeAWDL); + b->q.flags |= (kDNSServiceFlagsAutoTrigger | kDNSServiceFlagsIncludeAWDL); + LogInfo("add_domain_to_browser: request promoted to use kDNSServiceFlagsAutoTrigger"); + } +#endif // APPLE_OSX_mDNSResponder && ENABLE_BLE_TRIGGERED_BONJOUR + + LogMcastQ(&b->q, info, q_start); if (callExternalHelpers(info->u.browser.interface_id, &b->domain, info->flags)) { domainname tmp; ConstructServiceName(&tmp, NULL, &info->u.browser.regtype, &b->domain); LogInfo("add_domain_to_browser: calling external_start_browsing_for_service()"); - external_start_browsing_for_service(info->u.browser.interface_id, &tmp, kDNSType_PTR, info->flags, &b->q); + external_start_browsing_for_service(info->u.browser.interface_id, &tmp, kDNSType_PTR, info->flags); } } return err; @@ -2380,10 +2195,12 @@ mDNSlocal void browse_termination_callback(request_state *info) external_stop_browsing_for_service(ptr->q.InterfaceID, &tmp, kDNSType_PTR, ptr->q.flags); } + LogOperation("%3d: DNSServiceBrowse(%X, %d, \"%##s\") STOP PID[%d](%s)", + info->sd, info->flags, info->interfaceIndex, ptr->q.qname.c, info->process_id, info->pid_name); + info->u.browser.browsers = ptr->next; - LogOperation("%3d: DNSServiceBrowse(%##s) STOP PID[%d](%s)", info->sd, ptr->q.qname.c, info->process_id, info->pid_name); mDNS_StopBrowse(&mDNSStorage, &ptr->q); // no need to error-check result - LogMcastQ(&mDNSStorage, &ptr->q, info, q_stop); + LogMcastQ(&ptr->q, info, q_stop); freeL("browser_t/browse_termination_callback", ptr); } } @@ -2617,7 +2434,7 @@ mDNSexport void udsserver_handle_configchange(mDNS *const m) // Let the platform layer get the current DNS information mDNS_Lock(m); - mDNSPlatformSetDNSConfig(m, mDNSfalse, mDNSfalse, mDNSNULL, &RegDomains, &BrowseDomains, mDNSfalse); + mDNSPlatformSetDNSConfig(mDNSfalse, mDNSfalse, mDNSNULL, &RegDomains, &BrowseDomains, mDNSfalse); mDNS_Unlock(m); // Any automatic registration domains are also implicitly automatic browsing domains @@ -2759,7 +2576,7 @@ mDNSlocal mStatus handle_browse_request(request_state *request) request->u.browser.browsers = NULL; LogOperation("%3d: DNSServiceBrowse(%X, %d, \"%##s\", \"%s\") START PID[%d](%s)", - request->sd, request->flags, interfaceIndex, request->u.browser.regtype.c, domain, request->process_id, request->pid_name); + request->sd, request->flags, interfaceIndex, request->u.browser.regtype.c, domain, request->process_id, request->pid_name); if (request->u.browser.default_domain) { @@ -2822,7 +2639,9 @@ mDNSlocal void resolve_result_callback(mDNS *const m, DNSQuestion *question, con (answer->RecordType == kDNSRecordTypePacketNegative) ? kDNSServiceErr_NoSuchRecord : kDNSServiceErr_NoError; (void)m; // Unused - LogOperation("%3d: DNSServiceResolve(%##s) %s %s", req->sd, question->qname.c, AddRecord ? "ADD" : "RMV", RRDisplayString(m, answer)); + LogOperation("%3d: DNSServiceResolve(%##s) %s interface %d: %s", + req->sd, question->qname.c, AddRecord ? "ADD" : "RMV", + mDNSPlatformInterfaceIndexfromInterfaceID(m, answer->InterfaceID, mDNSfalse), RRDisplayString(m, answer)); if (!AddRecord) { @@ -2872,10 +2691,11 @@ mDNSlocal void resolve_result_callback(mDNS *const m, DNSQuestion *question, con mDNSlocal void resolve_termination_callback(request_state *request) { - LogOperation("%3d: DNSServiceResolve(%##s) STOP PID[%d](%s)", request->sd, request->u.resolve.qtxt.qname.c, request->process_id, request->pid_name); + LogOperation("%3d: DNSServiceResolve(%X, %d, \"%##s\") STOP PID[%d](%s)", + request->sd, request->flags, request->interfaceIndex, request->u.resolve.qtxt.qname.c, request->process_id, request->pid_name); mDNS_StopQuery(&mDNSStorage, &request->u.resolve.qtxt); mDNS_StopQuery(&mDNSStorage, &request->u.resolve.qsrv); - LogMcastQ(&mDNSStorage, &request->u.resolve.qsrv, request, q_stop); + LogMcastQ(&request->u.resolve.qsrv, request, q_stop); if (request->u.resolve.external_advertise) external_stop_resolving_service(request->u.resolve.qsrv.InterfaceID, &request->u.resolve.qsrv.qname, request->flags); } @@ -2931,6 +2751,15 @@ mDNSlocal mStatus handle_resolve_request(request_state *request) mDNSPlatformMemZero(&request->u.resolve, sizeof(request->u.resolve)); +#if APPLE_OSX_mDNSResponder && ENABLE_BLE_TRIGGERED_BONJOUR + // Determine if this request should be promoted to use BLE triggered discovery. + if (shouldUseBLE(InterfaceID, 0, (domainname *)SkipLeadingLabels(&fqdn, 1), &fqdn)) + { + flags |= (kDNSServiceFlagsAutoTrigger | kDNSServiceFlagsIncludeAWDL); + LogInfo("handle_resolve_request: request promoted to use kDNSServiceFlagsAutoTrigger"); + } +#endif // APPLE_OSX_mDNSResponder && ENABLE_BLE_TRIGGERED_BONJOUR + request->flags = flags; request->interfaceIndex = interfaceIndex; @@ -2998,8 +2827,9 @@ mDNSlocal mStatus handle_resolve_request(request_state *request) #endif // ask the questions - LogOperation("%3d: DNSServiceResolve(%X %d %##s) START PID[%d](%s)", request->sd, flags, interfaceIndex, + LogOperation("%3d: DNSServiceResolve(%X, %d, \"%##s\") START PID[%d](%s)", request->sd, flags, interfaceIndex, request->u.resolve.qsrv.qname.c, request->process_id, request->pid_name); + err = mDNS_StartQuery(&mDNSStorage, &request->u.resolve.qsrv); if (!err) @@ -3012,7 +2842,7 @@ mDNSlocal mStatus handle_resolve_request(request_state *request) else { request->terminate = resolve_termination_callback; - LogMcastQ(&mDNSStorage, &request->u.resolve.qsrv, request, q_start); + LogMcastQ(&request->u.resolve.qsrv, request, q_start); if (callExternalHelpers(InterfaceID, &fqdn, flags)) { request->u.resolve.external_advertise = mDNStrue; @@ -3039,7 +2869,7 @@ mDNSlocal mStatus handle_resolve_request(request_state *request) // Returns -1 to tell the caller that it should not try to reissue the query anymore // Returns 1 on successfully appending a search domain and the caller should reissue the new query // Returns 0 when there are no more search domains and the caller should reissue the query -mDNSlocal int AppendNewSearchDomain(mDNS *const m, DNSQuestion *question) +mDNSlocal int AppendNewSearchDomain(DNSQuestion *question) { domainname *sd; mStatus err; @@ -3068,7 +2898,7 @@ mDNSlocal int AppendNewSearchDomain(mDNS *const m, DNSQuestion *question) LogInfo("AppendSearchDomain: qnameOrig %##s", question->qnameOrig->c); } - sd = uDNS_GetNextSearchDomain(m, question->InterfaceID, &question->SearchListIndex, !question->AppendLocalSearchDomains); + sd = uDNS_GetNextSearchDomain(question->InterfaceID, &question->SearchListIndex, !question->AppendLocalSearchDomains); // We use -1 to indicate that we have searched all the domains and should try the single label // query directly on the wire. uDNS_GetNextSearchDomain should never return a negative value if (question->SearchListIndex == -1) @@ -3088,7 +2918,7 @@ mDNSlocal int AppendNewSearchDomain(mDNS *const m, DNSQuestion *question) // without appending search domains, then we are done. if (!sd && !ApplySearchDomainsFirst(question)) { - LogInfo("AppnedNewSearchDomain: No more search domains for question with name %##s (%s), not trying anymore", question->qname.c, DNSTypeName(question->qtype)); + LogInfo("AppendNewSearchDomain: No more search domains for question with name %##s (%s), not trying anymore", question->qname.c, DNSTypeName(question->qtype)); return -1; } @@ -3139,7 +2969,7 @@ mDNSlocal mDNSBool DomainInSearchList(const domainname *domain, mDNSBool exclude } // The caller already checks that this is a dotlocal question. -mDNSlocal mDNSBool ShouldDeliverNegativeResponse(mDNS *const m, DNSQuestion *question) +mDNSlocal mDNSBool ShouldDeliverNegativeResponse(DNSQuestion *question) { mDNSu16 qtype; @@ -3165,7 +2995,7 @@ mDNSlocal mDNSBool ShouldDeliverNegativeResponse(mDNS *const m, DNSQuestion *que return mDNSfalse; } qtype = (question->qtype == kDNSType_A ? kDNSType_AAAA : kDNSType_A); - if (!mDNS_CheckForCacheRecord(m, question, qtype)) + if (!mDNS_CheckForCacheRecord(&mDNSStorage, question, qtype)) { LogOperation("ShouldDeliverNegativeResponse:Question %##s (%s) not answering local question with negative unicast response" " (can't find positive record)", question->qname.c, DNSTypeName(question->qtype)); @@ -3289,7 +3119,7 @@ mDNSlocal mStatus SendAdditionalQuery(DNSQuestion *q, request_state *request, mS #endif // APPLE_OSX_mDNSResponder // This function tries to append a search domain if valid and possible. If so, returns true. -mDNSlocal mDNSBool RetryQuestionWithSearchDomains(mDNS *const m, DNSQuestion *question, request_state *req, QC_result AddRecord) +mDNSlocal mDNSBool RetryQuestionWithSearchDomains(DNSQuestion *question, request_state *req, QC_result AddRecord) { int result; // RetryWithSearchDomains tells the core to call us back so that we can retry with search domains if there is no @@ -3303,7 +3133,7 @@ mDNSlocal mDNSBool RetryQuestionWithSearchDomains(mDNS *const m, DNSQuestion *qu if ((AddRecord != QC_suppressed) && question->SearchListIndex != -1 && question->AppendSearchDomains) { question->RetryWithSearchDomains = 0; - result = AppendNewSearchDomain(m, question); + result = AppendNewSearchDomain(question); // As long as the result is either zero or 1, we retry the question. If we exahaust the search // domains (result is zero) we try the original query (as it was before appending the search // domains) as such on the wire as a last resort if we have not tried them before. For queries @@ -3312,7 +3142,7 @@ mDNSlocal mDNSBool RetryQuestionWithSearchDomains(mDNS *const m, DNSQuestion *qu if (result != -1) { mStatus err; - err = mDNS_StartQuery(m, question); + err = mDNS_StartQuery(&mDNSStorage, question); if (!err) { LogOperation("%3d: RetryQuestionWithSearchDomains(%##s, %s), retrying after appending search domain", req->sd, question->qname.c, DNSTypeName(question->qtype)); @@ -3348,9 +3178,10 @@ mDNSlocal void queryrecord_result_reply(mDNS *const m, request_state *req, DNSQu ConvertDomainNameToCString(answer->name, name); - LogOperation("%3d: %s(%##s, %s) %s %s", req->sd, + LogOperation("%3d: %s(%##s, %s) RESULT %s interface %d: %s", req->sd, req->hdr.op == query_request ? "DNSServiceQueryRecord" : "DNSServiceGetAddrInfo", - question->qname.c, DNSTypeName(question->qtype), AddRecord ? "ADD" : "RMV", RRDisplayString(m, answer)); + question->qname.c, DNSTypeName(question->qtype), AddRecord ? "ADD" : "RMV", + mDNSPlatformInterfaceIndexfromInterfaceID(m, answer->InterfaceID, mDNSfalse), RRDisplayString(m, answer)); len = sizeof(DNSServiceFlags); // calculate reply data length len += sizeof(mDNSu32); // interface index @@ -3597,7 +3428,7 @@ mDNSlocal void queryrecord_result_callback(mDNS *const m, DNSQuestion *question, // As we ignore negative unicast answers below, we would never reach the code where the search domains are appended. // To keep things simple, we handle unicast ".local" separately here. LogInfo("queryrecord_result_callback: Retrying .local question %##s (%s) as unicast after appending search domains", question->qname.c, DNSTypeName(question->qtype)); - if (RetryQuestionWithSearchDomains(m, question, req, AddRecord)) + if (RetryQuestionWithSearchDomains(question, req, AddRecord)) return; if (question->AppendSearchDomains && !question->AppendLocalSearchDomains && IsLocalDomain(&question->qname)) { @@ -3661,7 +3492,7 @@ mDNSlocal void queryrecord_result_callback(mDNS *const m, DNSQuestion *question, return; } #if APPLE_OSX_mDNSResponder - if (!ShouldDeliverNegativeResponse(m, question)) + if (!ShouldDeliverNegativeResponse(question)) { return; } @@ -3687,7 +3518,7 @@ mDNSlocal void queryrecord_result_callback(mDNS *const m, DNSQuestion *question, // normally happen just once because after we append .local, we ignore all negative // responses for .local above. LogInfo("queryrecord_result_callback: Retrying question %##s (%s) after appending search domains", question->qname.c, DNSTypeName(question->qtype)); - if (RetryQuestionWithSearchDomains(m, question, req, AddRecord)) + if (RetryQuestionWithSearchDomains(question, req, AddRecord)) { // Note: We need to call SendAdditionalQuery every time after appending a search domain as .local could // be anywhere in the search domain list. @@ -3705,12 +3536,12 @@ mDNSlocal void queryrecord_result_callback(mDNS *const m, DNSQuestion *question, mDNSlocal void queryrecord_termination_callback(request_state *request) { - LogOperation("%3d: DNSServiceQueryRecord(%##s, %s) STOP PID[%d](%s)", - request->sd, request->u.queryrecord.q.qname.c, DNSTypeName(request->u.queryrecord.q.qtype), request->process_id, request->pid_name); + LogOperation("%3d: DNSServiceQueryRecord(%X, %d, %##s, %s) STOP PID[%d](%s)", + request->sd, request->flags, request->interfaceIndex, request->u.queryrecord.q.qname.c, DNSTypeName(request->u.queryrecord.q.qtype), request->process_id, request->pid_name); if (request->u.queryrecord.q.QuestionContext) { mDNS_StopQuery(&mDNSStorage, &request->u.queryrecord.q); // no need to error check - LogMcastQ(&mDNSStorage, &request->u.queryrecord.q, request, q_stop); + LogMcastQ(&request->u.queryrecord.q, request, q_stop); request->u.queryrecord.q.QuestionContext = mDNSNULL; } else @@ -3725,10 +3556,10 @@ mDNSlocal void queryrecord_termination_callback(request_state *request) request->u.queryrecord.q.qnameOrig = mDNSNULL; } - if (callExternalHelpers(request->u.queryrecord.q.InterfaceID, &request->u.queryrecord.q.qname, request->flags)) + if (callExternalHelpers(request->u.queryrecord.q.InterfaceID, &request->u.queryrecord.q.qname, request->u.queryrecord.q.flags)) { LogInfo("queryrecord_termination_callback: calling external_stop_browsing_for_service()"); - external_stop_browsing_for_service(request->u.queryrecord.q.InterfaceID, &request->u.queryrecord.q.qname, request->u.queryrecord.q.qtype, request->flags); + external_stop_browsing_for_service(request->u.queryrecord.q.InterfaceID, &request->u.queryrecord.q.qname, request->u.queryrecord.q.qtype, request->u.queryrecord.q.flags); } if (request->u.queryrecord.q2) { @@ -3736,7 +3567,7 @@ mDNSlocal void queryrecord_termination_callback(request_state *request) { LogInfo("queryrecord_termination_callback: Stopping q2 %##s", request->u.queryrecord.q2->qname.c); mDNS_StopQuery(&mDNSStorage, request->u.queryrecord.q2); - LogMcastQ(&mDNSStorage, request->u.queryrecord.q2, request, q_stop); + LogMcastQ(request->u.queryrecord.q2, request, q_stop); } else { @@ -3764,7 +3595,7 @@ mDNSlocal void queryrecord_termination_callback(request_state *request) v4q = &request->u.queryrecord.q; else if (request->u.queryrecord.q.qtype == kDNSType_AAAA) v6q = &request->u.queryrecord.q; - mDNSPlatformTriggerDNSRetry(&mDNSStorage, v4q, v6q); + mDNSPlatformTriggerDNSRetry(v4q, v6q); } } #endif // APPLE_OSX_mDNSResponder @@ -3842,6 +3673,7 @@ mDNSlocal mStatus handle_queryrecord_request(request_state *request) q->QuestionCallback = queryrecord_result_callback; q->QuestionContext = request; q->SearchListIndex = 0; + q->StopTime = 0; q->DNSSECAuthInfo = mDNSNULL; q->DAIFreeCallback = mDNSNULL; @@ -3881,8 +3713,18 @@ mDNSlocal mStatus handle_queryrecord_request(request_state *request) q->qnameOrig = mDNSNULL; SetQuestionPolicy(q, request); +#if APPLE_OSX_mDNSResponder && ENABLE_BLE_TRIGGERED_BONJOUR + // Determine if this request should be promoted to use BLE triggered discovery. + if (shouldUseBLE(InterfaceID, rrtype, (domainname *)SkipLeadingLabels(&q->qname, 1), &q->qname)) + { + q->flags |= (kDNSServiceFlagsAutoTrigger | kDNSServiceFlagsIncludeAWDL); + request->flags |= (kDNSServiceFlagsAutoTrigger | kDNSServiceFlagsIncludeAWDL); + LogInfo("handle_queryrecord_request: request promoted to use kDNSServiceFlagsAutoTrigger"); + } +#endif // APPLE_OSX_mDNSResponder && ENABLE_BLE_TRIGGERED_BONJOUR + LogOperation("%3d: DNSServiceQueryRecord(%X, %d, %##s, %s) START PID[%d](%s)", - request->sd, flags, interfaceIndex, q->qname.c, DNSTypeName(q->qtype), request->process_id, request->pid_name); + request->sd, request->flags, interfaceIndex, q->qname.c, DNSTypeName(q->qtype), request->process_id, request->pid_name); err = mDNS_StartQuery(&mDNSStorage, q); if (err) @@ -3892,11 +3734,11 @@ mDNSlocal mStatus handle_queryrecord_request(request_state *request) else { request->terminate = queryrecord_termination_callback; - LogMcastQ(&mDNSStorage, q, request, q_start); - if (callExternalHelpers(q->InterfaceID, &q->qname, flags)) + LogMcastQ(q, request, q_start); + if (callExternalHelpers(q->InterfaceID, &q->qname, q->flags)) { LogInfo("handle_queryrecord_request: calling external_start_browsing_for_service()"); - external_start_browsing_for_service(q->InterfaceID, &q->qname, q->qtype, flags, q); + external_start_browsing_for_service(q->InterfaceID, &q->qname, q->qtype, q->flags); } } @@ -3984,7 +3826,7 @@ mDNSlocal void enum_result_callback(mDNS *const m, reply = format_enumeration_reply(request, domain, flags, kDNSServiceInterfaceIndexAny, kDNSServiceErr_NoError); if (!reply) { LogMsg("ERROR: enum_result_callback, format_enumeration_reply"); return; } - LogOperation("%3d: DNSServiceEnumerateDomains(%#2s) RESULT %s: %s", request->sd, question->qname.c, AddRecord ? "Add" : "Rmv", domain); + LogOperation("%3d: DNSServiceEnumerateDomains(%#2s) RESULT %s: %s", request->sd, question->qname.c, AddRecord ? "ADD" : "RMV", domain); append_reply(request, reply); } @@ -4071,10 +3913,11 @@ mDNSlocal mStatus handle_reconfirm_request(request_state *request) status = mDNS_ReconfirmByValue(&mDNSStorage, &rr->resrec); LogOperation( (status == mStatus_NoError) ? - "%3d: DNSServiceReconfirmRecord(%s) interface %d initiated" : - "%3d: DNSServiceReconfirmRecord(%s) interface %d failed: %d", + "%3d: DNSServiceReconfirmRecord(%s) interface %d initiated PID[%d](%s)" : + "%3d: DNSServiceReconfirmRecord(%s) interface %d failed PID[%d](%s) status %d", request->sd, RRDisplayString(&mDNSStorage, &rr->resrec), - mDNSPlatformInterfaceIndexfromInterfaceID(&mDNSStorage, rr->resrec.InterfaceID, mDNSfalse), status); + mDNSPlatformInterfaceIndexfromInterfaceID(&mDNSStorage, rr->resrec.InterfaceID, mDNSfalse), + request->process_id, request->pid_name, status); freeL("AuthRecord/handle_reconfirm_request", rr); } return(status); @@ -4410,7 +4253,7 @@ mDNSlocal void addrinfo_termination_callback(request_state *request) if (request->u.addrinfo.q4.QuestionContext) { mDNS_StopQuery(&mDNSStorage, &request->u.addrinfo.q4); - LogMcastQ(&mDNSStorage, &request->u.addrinfo.q4, request, q_stop); + LogMcastQ(&request->u.addrinfo.q4, request, q_stop); request->u.addrinfo.q4.QuestionContext = mDNSNULL; if (callExternalHelpers(request->u.addrinfo.interface_id, &request->u.addrinfo.q4.qname, request->flags)) @@ -4430,7 +4273,7 @@ mDNSlocal void addrinfo_termination_callback(request_state *request) { LogInfo("addrinfo_termination_callback: Stopping q42 %##s", request->u.addrinfo.q42->qname.c); mDNS_StopQuery(&mDNSStorage, request->u.addrinfo.q42); - LogMcastQ(&mDNSStorage, request->u.addrinfo.q42, request, q_stop); + LogMcastQ(request->u.addrinfo.q42, request, q_stop); } if (request->u.addrinfo.q42->qnameOrig) { @@ -4445,7 +4288,7 @@ mDNSlocal void addrinfo_termination_callback(request_state *request) if (request->u.addrinfo.q6.QuestionContext) { mDNS_StopQuery(&mDNSStorage, &request->u.addrinfo.q6); - LogMcastQ(&mDNSStorage, &request->u.addrinfo.q6, request, q_stop); + LogMcastQ(&request->u.addrinfo.q6, request, q_stop); request->u.addrinfo.q6.QuestionContext = mDNSNULL; if (callExternalHelpers(request->u.addrinfo.interface_id, &request->u.addrinfo.q6.qname, request->flags)) @@ -4465,7 +4308,7 @@ mDNSlocal void addrinfo_termination_callback(request_state *request) { LogInfo("addrinfo_termination_callback: Stopping q62 %##s", request->u.addrinfo.q62->qname.c); mDNS_StopQuery(&mDNSStorage, request->u.addrinfo.q62); - LogMcastQ(&mDNSStorage, request->u.addrinfo.q62, request, q_stop); + LogMcastQ(request->u.addrinfo.q62, request, q_stop); } if (request->u.addrinfo.q62->qnameOrig) { @@ -4487,7 +4330,7 @@ mDNSlocal void addrinfo_termination_callback(request_state *request) // valid response again. if (request->u.addrinfo.q4.TimeoutQuestion && !request->u.addrinfo.v4ans) { - mDNSPlatformUpdateDNSStatus(&mDNSStorage, &request->u.addrinfo.q4); + mDNSPlatformUpdateDNSStatus(&request->u.addrinfo.q4); } // If we have a v4 answer and if we timed out prematurely before, provide // a trigger to the upper layer so that it can retry questions if needed. @@ -4498,12 +4341,12 @@ mDNSlocal void addrinfo_termination_callback(request_state *request) { if (request->u.addrinfo.q6.TimeoutQuestion && !request->u.addrinfo.v6ans) { - mDNSPlatformUpdateDNSStatus(&mDNSStorage, &request->u.addrinfo.q6); + mDNSPlatformUpdateDNSStatus(&request->u.addrinfo.q6); } if (request->u.addrinfo.v6ans) v6q = &request->u.addrinfo.q6; } - mDNSPlatformTriggerDNSRetry(&mDNSStorage, v4q, v6q); + mDNSPlatformTriggerDNSRetry(v4q, v6q); } #endif // APPLE_OSX_mDNSResponder } @@ -4606,6 +4449,8 @@ mDNSlocal mStatus handle_addrinfo_request(request_state *request) SetQuestionPolicy(&request->u.addrinfo.q4, request); SetQuestionPolicy(&request->u.addrinfo.q6, request); + request->u.addrinfo.q4.StopTime = request->u.addrinfo.q6.StopTime = 0; + request->u.addrinfo.q4.DNSSECAuthInfo = request->u.addrinfo.q6.DNSSECAuthInfo = mDNSNULL; request->u.addrinfo.q4.DAIFreeCallback = request->u.addrinfo.q6.DAIFreeCallback = mDNSNULL; @@ -4649,11 +4494,11 @@ mDNSlocal mStatus handle_addrinfo_request(request_state *request) if (!err) { request->terminate = addrinfo_termination_callback; - LogMcastQ(&mDNSStorage, &request->u.addrinfo.q6, request, q_start); + LogMcastQ(&request->u.addrinfo.q6, request, q_start); if (callExternalHelpers(InterfaceID, &d, flags)) { LogInfo("handle_addrinfo_request: calling external_start_browsing_for_service() for kDNSServiceType_AAAA record"); - external_start_browsing_for_service(InterfaceID, &d, kDNSServiceType_AAAA, flags, &request->u.addrinfo.q6); + external_start_browsing_for_service(InterfaceID, &d, kDNSServiceType_AAAA, flags); } } } @@ -4705,11 +4550,11 @@ mDNSlocal mStatus handle_addrinfo_request(request_state *request) if (!err) { request->terminate = addrinfo_termination_callback; - LogMcastQ(&mDNSStorage, &request->u.addrinfo.q4, request, q_start); + LogMcastQ(&request->u.addrinfo.q4, request, q_start); if (callExternalHelpers(InterfaceID, &d, flags)) { LogInfo("handle_addrinfo_request: calling external_start_browsing_for_service() for kDNSServiceType_A record"); - external_start_browsing_for_service(InterfaceID, &d, kDNSServiceType_A, flags, &request->u.addrinfo.q4); + external_start_browsing_for_service(InterfaceID, &d, kDNSServiceType_A, flags); } } } @@ -4831,7 +4676,7 @@ mDNSlocal void read_msg(request_state *req) { dnssd_sock_t x = *(dnssd_sock_t *)CMSG_DATA(cmsg); LogOperation("%3d: Got len %d, BPF %d", req->sd, cmsg->cmsg_len, x); - mDNSPlatformReceiveBPF_fd(&mDNSStorage, x); + mDNSPlatformReceiveBPF_fd(x); } else #endif // APPLE_OSX_mDNSResponder @@ -4933,6 +4778,52 @@ rerror: req->ts = t_error; } +mDNSlocal mStatus handle_client_request(request_state *req) +{ + mStatus err = mStatus_NoError; + switch(req->hdr.op) + { + // These are all operations that have their own first-class request_state object + case connection_request: + LogOperation("%3d: DNSServiceCreateConnection START PID[%d](%s)", + req->sd, req->process_id, req->pid_name); + req->terminate = connection_termination; + break; + case connection_delegate_request: + LogOperation("%3d: DNSServiceCreateDelegateConnection START PID[%d](%s)", + req->sd, req->process_id, req->pid_name); + req->terminate = connection_termination; + handle_connection_delegate_request(req); + break; + case resolve_request: err = handle_resolve_request (req); break; + case query_request: err = handle_queryrecord_request (req); break; + case browse_request: err = handle_browse_request (req); break; + case reg_service_request: err = handle_regservice_request (req); break; + case enumeration_request: err = handle_enum_request (req); break; + case reconfirm_record_request: err = handle_reconfirm_request (req); break; + case setdomain_request: err = handle_setdomain_request (req); break; + case getproperty_request: handle_getproperty_request (req); break; + case getpid_request: handle_getpid_request (req); break; + case port_mapping_request: err = handle_port_mapping_request(req); break; + case addrinfo_request: err = handle_addrinfo_request (req); break; + case send_bpf: /* Do nothing for send_bpf */ break; + + // These are all operations that work with an existing request_state object + case reg_record_request: err = handle_regrecord_request (req); break; + case add_record_request: err = handle_add_request (req); break; + case update_record_request: err = handle_update_request (req); break; + case remove_record_request: err = handle_removerecord_request(req); break; + case cancel_request: handle_cancel_request (req); break; + case release_request: err = handle_release_request (req); break; + default: LogMsg("request_callback: %3d:ERROR: Unsupported UDS req:%d PID[%d][%s]", + req->sd, req->hdr.op, req->process_id, req->pid_name); + err = mStatus_BadParamErr; + break; + } + + return err; +} + #define RecordOrientedOp(X) \ ((X) == reg_record_request || (X) == add_record_request || (X) == update_record_request || (X) == remove_record_request) @@ -5022,12 +4913,8 @@ mDNSlocal void request_callback(int fd, short filter, void *info) // relevant bits if (req->validUUID) { - int i; newreq->validUUID = mDNStrue; - for (i = 0; i < UUID_SIZE; i++) - { - newreq->uuid[i] = req->uuid[i]; - } + mDNSPlatformMemCopy(newreq->uuid, req->uuid, UUID_SIZE); } else { @@ -5050,44 +4937,10 @@ mDNSlocal void request_callback(int fd, short filter, void *info) // If we're shutting down, don't allow new client requests // We do allow "cancel" and "getproperty" during shutdown if (mDNSStorage.ShutdownTime && req->hdr.op != cancel_request && req->hdr.op != getproperty_request) - { err = mStatus_ServiceNotRunning; - } else - { - switch(req->hdr.op) - { - // These are all operations that have their own first-class request_state object - case connection_request: - LogOperation("%3d: DNSServiceCreateConnection START PID[%d](%s)", - req->sd, req->process_id, req->pid_name); - req->terminate = connection_termination; - break; - case connection_delegate_request: handle_connection_delegate_request(req); break; - case resolve_request: err = handle_resolve_request (req); break; - case query_request: err = handle_queryrecord_request (req); break; - case browse_request: err = handle_browse_request (req); break; - case reg_service_request: err = handle_regservice_request (req); break; - case enumeration_request: err = handle_enum_request (req); break; - case reconfirm_record_request: err = handle_reconfirm_request (req); break; - case setdomain_request: err = handle_setdomain_request (req); break; - case getproperty_request: handle_getproperty_request (req); break; - case getpid_request: handle_getpid_request (req); break; - case port_mapping_request: err = handle_port_mapping_request(req); break; - case addrinfo_request: err = handle_addrinfo_request (req); break; - case send_bpf: /* Do nothing for send_bpf */ break; - - // These are all operations that work with an existing request_state object - case reg_record_request: err = handle_regrecord_request (req); break; - case add_record_request: err = handle_add_request (req); break; - case update_record_request: err = handle_update_request (req); break; - case remove_record_request: err = handle_removerecord_request(req); break; - case cancel_request: handle_cancel_request (req); break; - case release_request: err = handle_release_request (req); break; - default: LogMsg("request_callback: %3d:ERROR: Unsupported UDS req:%d PID[%d][%s]", - req->sd, req->hdr.op, req->process_id, req->pid_name); break; - } - } + err = handle_client_request(req); + // req->msgbuf may be NULL, e.g. for connection_request or remove_record_request if (req->msgbuf) freeL("request_state msgbuf", req->msgbuf); @@ -5371,7 +5224,7 @@ mDNSexport int udsserver_exit(void) return 0; } -mDNSlocal void LogClientInfo(mDNS *const m, request_state *req) +mDNSlocal void LogClientInfo(request_state *req) { char prefix[16]; if (req->primary) @@ -5393,8 +5246,8 @@ mDNSlocal void LogClientInfo(mDNS *const m, request_state *req) req->process_id, req->pid_name); for (p = req->u.reg_recs; p; p=p->next) LogMsgNoIdent(" -> DNSServiceRegisterRecord 0x%08X %2d %3d %s PID[%d](%s)", - req->flags, req->interfaceIndex, p->key, ARDisplayString(m, p->rr), req->process_id, req->pid_name); - for (r = req->next; r; r=r->next) if (r->primary == req) LogClientInfo(m, r); + req->flags, req->interfaceIndex, p->key, ARDisplayString(&mDNSStorage, p->rr), req->process_id, req->pid_name); + for (r = req->next; r; r=r->next) if (r->primary == req) LogClientInfo(r); } else if (req->terminate == regservice_termination_callback) { @@ -5595,7 +5448,7 @@ mDNSlocal char *RecordTypeName(mDNSu8 rtype) } } -mDNSlocal void LogEtcHosts(mDNS *const m) +mDNSlocal int LogEtcHosts(mDNS *const m) { mDNSBool showheader = mDNStrue; const AuthRecord *ar; @@ -5631,6 +5484,7 @@ mDNSlocal void LogEtcHosts(mDNS *const m) if (showheader) LogMsgNoIdent("<None>"); else if (truncated) LogMsgNoIdent("<Truncated: to 50 records, Total records %d, Total Auth Groups %d, Auth Slots %d>", count, m->rrauth.rrauth_totalused, authslot); + return count; } mDNSlocal void LogLocalOnlyAuthRecords(mDNS *const m) @@ -5674,7 +5528,7 @@ mDNSlocal char *AnonInfoToString(AnonymousInfo *ai, char *anonstr, int anstrlen) return anonstr; } -mDNSlocal void LogOneAuthRecord(mDNS *const m, const AuthRecord *ar, mDNSs32 now, const char *const ifname) +mDNSlocal void LogOneAuthRecord(const AuthRecord *ar, mDNSs32 now, const char *const ifname) { char anstr[256]; if (AuthRecord_uDNS(ar)) @@ -5686,7 +5540,7 @@ mDNSlocal void LogOneAuthRecord(mDNS *const m, const AuthRecord *ar, mDNSs32 now "-U-", ar->state, ar->AllowRemoteQuery ? "☠" : " ", - ARDisplayString(m, ar)); + ARDisplayString(&mDNSStorage, ar)); } else { @@ -5697,18 +5551,18 @@ mDNSlocal void LogOneAuthRecord(mDNS *const m, const AuthRecord *ar, mDNSs32 now ifname ? ifname : "ALL", ar->resrec.RecordType, ar->AllowRemoteQuery ? "☠" : " ", - ARDisplayString(m, ar), AnonInfoToString(ar->resrec.AnonInfo, anstr, sizeof(anstr))); + ARDisplayString(&mDNSStorage, ar), AnonInfoToString(ar->resrec.AnonInfo, anstr, sizeof(anstr))); } } -mDNSlocal void LogAuthRecords(mDNS *const m, const mDNSs32 now, AuthRecord *ResourceRecords, int *proxy) +mDNSlocal void LogAuthRecords(const mDNSs32 now, AuthRecord *ResourceRecords, int *proxy) { mDNSBool showheader = mDNStrue; const AuthRecord *ar; OwnerOptData owner = zeroOwner; for (ar = ResourceRecords; ar; ar=ar->next) { - const char *const ifname = InterfaceNameForID(m, ar->resrec.InterfaceID); + const char *const ifname = InterfaceNameForID(&mDNSStorage, ar->resrec.InterfaceID); if ((ar->WakeUp.HMAC.l[0] != 0) == (proxy != mDNSNULL)) { if (showheader) { showheader = mDNSfalse; LogMsgNoIdent(" Int Next Expire if State"); } @@ -5725,22 +5579,22 @@ mDNSlocal void LogAuthRecords(mDNS *const m, const mDNSs32 now, AuthRecord *Reso } if (AuthRecord_uDNS(ar)) { - LogOneAuthRecord(m, ar, now, ifname); + LogOneAuthRecord(ar, now, ifname); } else if (ar->ARType == AuthRecordLocalOnly) { - LogMsgNoIdent(" LO %s", ARDisplayString(m, ar)); + LogMsgNoIdent(" LO %s", ARDisplayString(&mDNSStorage, ar)); } else if (ar->ARType == AuthRecordP2P) { if (ar->resrec.InterfaceID == mDNSInterface_BLE) - LogMsgNoIdent(" BLE %s", ARDisplayString(m, ar)); + LogMsgNoIdent(" BLE %s", ARDisplayString(&mDNSStorage, ar)); else - LogMsgNoIdent(" PP %s", ARDisplayString(m, ar)); + LogMsgNoIdent(" PP %s", ARDisplayString(&mDNSStorage, ar)); } else { - LogOneAuthRecord(m, ar, now, ifname); + LogOneAuthRecord(ar, now, ifname); if (ar->resrec.AnonInfo) { ResourceRecord *nsec3 = ar->resrec.AnonInfo->nsec3RR; @@ -5751,7 +5605,7 @@ mDNSlocal void LogAuthRecords(mDNS *const m, const mDNSs32 now, AuthRecord *Reso ar->AnnounceCount ? (ar->LastAPTime + ar->ThisAPInterval - now) / mDNSPlatformOneSecond : 0, ar->TimeExpire ? (ar->TimeExpire - now) / mDNSPlatformOneSecond : 0, ifname ? ifname : "ALL", - RRDisplayString(m, nsec3)); + RRDisplayString(&mDNSStorage, nsec3)); } } } @@ -5759,7 +5613,7 @@ mDNSlocal void LogAuthRecords(mDNS *const m, const mDNSs32 now, AuthRecord *Reso if (showheader) LogMsgNoIdent("<None>"); } -mDNSlocal void PrintOneCacheRecord(mDNS *const m, const CacheRecord *cr, mDNSu32 slot, const mDNSu32 remain, const char *ifname, mDNSu32 *CacheUsed) +mDNSlocal void PrintOneCacheRecord(const CacheRecord *cr, mDNSu32 slot, const mDNSu32 remain, const char *ifname, mDNSu32 *CacheUsed) { LogMsgNoIdent("%3d %s%8d %-7s%s %-6s%s", slot, @@ -5769,11 +5623,11 @@ mDNSlocal void PrintOneCacheRecord(mDNS *const m, const CacheRecord *cr, mDNSu32 (cr->resrec.RecordType == kDNSRecordTypePacketNegative) ? "-" : (cr->resrec.RecordType & kDNSRecordTypePacketUniqueMask) ? " " : "+", DNSTypeName(cr->resrec.rrtype), - CRDisplayString(m, cr)); + CRDisplayString(&mDNSStorage, cr)); (*CacheUsed)++; } -mDNSlocal void PrintCachedRecords(mDNS *const m, const CacheRecord *cr, mDNSu32 slot, const mDNSu32 remain, const char *ifname, mDNSu32 *CacheUsed) +mDNSlocal void PrintCachedRecords(const CacheRecord *cr, mDNSu32 slot, const mDNSu32 remain, const char *ifname, mDNSu32 *CacheUsed) { CacheRecord *nsec; CacheRecord *soa; @@ -5783,13 +5637,13 @@ mDNSlocal void PrintCachedRecords(mDNS *const m, const CacheRecord *cr, mDNSu32 // their own lifetime. If the main cache record expires, they also expire. while (nsec) { - PrintOneCacheRecord(m, nsec, slot, remain, ifname, CacheUsed); + PrintOneCacheRecord(nsec, slot, remain, ifname, CacheUsed); nsec = nsec->next; } soa = cr->soa; if (soa) { - PrintOneCacheRecord(m, soa, slot, remain, ifname, CacheUsed); + PrintOneCacheRecord(soa, slot, remain, ifname, CacheUsed); } if (cr->resrec.AnonInfo) { @@ -5806,7 +5660,7 @@ mDNSlocal void PrintCachedRecords(mDNS *const m, const CacheRecord *cr, mDNSu32 (nsec3->RecordType == kDNSRecordTypePacketNegative) ? "-" : (nsec3->RecordType & kDNSRecordTypePacketUniqueMask) ? " " : "+", DNSTypeName(nsec3->rrtype), - RRDisplayString(m, nsec3)); + RRDisplayString(&mDNSStorage, nsec3)); } } } @@ -5873,11 +5727,15 @@ mDNSexport void LogMDNSStatistics(mDNS *const m) LogMsgNoIdent("Wakeup on Resolves %u", m->mDNSStats.WakeOnResolves); } -mDNSexport void udsserver_info(mDNS *const m) +mDNSexport void udsserver_info() { + mDNS *const m = &mDNSStorage; const mDNSs32 now = mDNS_TimeNow(m); mDNSu32 CacheUsed = 0, CacheActive = 0, slot; int ProxyA = 0, ProxyD = 0; + mDNSu32 groupCount = 0; + mDNSu32 mcastRecordCount = 0; + mDNSu32 ucastRecordCount = 0; const CacheGroup *cg; const CacheRecord *cr; const DNSQuestion *q; @@ -5892,30 +5750,33 @@ mDNSexport void udsserver_info(mDNS *const m) { for (cg = m->rrcache_hash[slot]; cg; cg=cg->next) { - CacheUsed++; // Count one cache entity for the CacheGroup object + groupCount++; // Count one cache entity for the CacheGroup object for (cr = cg->members; cr; cr=cr->next) { const mDNSs32 remain = cr->resrec.rroriginalttl - (now - cr->TimeRcvd) / mDNSPlatformOneSecond; const char *ifname; mDNSInterfaceID InterfaceID = cr->resrec.InterfaceID; + mDNSu32 *const countPtr = InterfaceID ? &mcastRecordCount : &ucastRecordCount; if (!InterfaceID && cr->resrec.rDNSServer && cr->resrec.rDNSServer->scoped) InterfaceID = cr->resrec.rDNSServer->interface; ifname = InterfaceNameForID(m, InterfaceID); if (cr->CRActiveQuestion) CacheActive++; - PrintOneCacheRecord(m, cr, slot, remain, ifname, &CacheUsed); - PrintCachedRecords(m, cr, slot, remain, ifname, &CacheUsed); + PrintOneCacheRecord(cr, slot, remain, ifname, countPtr); + PrintCachedRecords(cr, slot, remain, ifname, countPtr); } } } + CacheUsed = groupCount + mcastRecordCount + ucastRecordCount; if (m->rrcache_totalused != CacheUsed) LogMsgNoIdent("Cache use mismatch: rrcache_totalused is %lu, true count %lu", m->rrcache_totalused, CacheUsed); if (m->rrcache_active != CacheActive) LogMsgNoIdent("Cache use mismatch: rrcache_active is %lu, true count %lu", m->rrcache_active, CacheActive); - LogMsgNoIdent("Cache currently contains %lu entities; %lu referenced by active questions", CacheUsed, CacheActive); + LogMsgNoIdent("Cache size %u entities; %u in use (%u group, %u multicast, %u unicast); %u referenced by active questions", + m->rrcache_size, CacheUsed, groupCount, mcastRecordCount, ucastRecordCount, CacheActive); LogMsgNoIdent("--------- Auth Records ---------"); - LogAuthRecords(m, now, m->ResourceRecords, mDNSNULL); + LogAuthRecords(now, m->ResourceRecords, mDNSNULL); LogMsgNoIdent("--------- LocalOnly, P2P Auth Records ---------"); LogLocalOnlyAuthRecords(m); @@ -5924,13 +5785,13 @@ mDNSexport void udsserver_info(mDNS *const m) LogEtcHosts(m); LogMsgNoIdent("------ Duplicate Records -------"); - LogAuthRecords(m, now, m->DuplicateRecords, mDNSNULL); + LogAuthRecords(now, m->DuplicateRecords, mDNSNULL); LogMsgNoIdent("----- Auth Records Proxied -----"); - LogAuthRecords(m, now, m->ResourceRecords, &ProxyA); + LogAuthRecords(now, m->ResourceRecords, &ProxyA); LogMsgNoIdent("-- Duplicate Records Proxied ---"); - LogAuthRecords(m, now, m->DuplicateRecords, &ProxyD); + LogAuthRecords(now, m->DuplicateRecords, &ProxyD); LogMsgNoIdent("---------- Questions -----------"); if (!m->Questions) LogMsgNoIdent("<None>"); @@ -5947,12 +5808,13 @@ mDNSexport void udsserver_info(mDNS *const m) char *ifname = InterfaceNameForID(m, q->InterfaceID); CacheUsed++; if (q->ThisQInterval) CacheActive++; - LogMsgNoIdent("%6d%6d %-7s%s%s %5d 0x%x%x 0x%p 0x%p %1d %2d %-5s%##s%s%s", + LogMsgNoIdent("%6d%6d %-7s%s%s %5d 0x%x%x%x%x 0x%p 0x%p %1d %2d %-5s%##s%s%s", i, n, ifname ? ifname : mDNSOpaque16IsZero(q->TargetQID) ? "" : "-U-", mDNSOpaque16IsZero(q->TargetQID) ? (q->LongLived ? "l" : " ") : (q->LongLived ? "L" : "O"), PrivateQuery(q) ? "P" : q->ValidationRequired ? "V" : q->ValidatingResponse ? "R" : " ", - q->CurrentAnswers, q->validDNSServers.l[1], q->validDNSServers.l[0], q, q->DuplicateOf, + q->CurrentAnswers, q->validDNSServers.l[3], q->validDNSServers.l[2], q->validDNSServers.l[1], + q->validDNSServers.l[0], q, q->DuplicateOf, q->SuppressUnusable, q->SuppressQuery, DNSTypeName(q->qtype), q->qname.c, AnonInfoToString(q->AnonInfo, anonstr, sizeof(anonstr)), q->DuplicateOf ? " (dup)" : ""); @@ -5980,7 +5842,7 @@ mDNSexport void udsserver_info(mDNS *const m) LogMsgNoIdent("%3d: Orhpan operation %p; parent %p not found in request list", req->sd); } // For non-subbordinate operations, and subbordinate operations that have lost their parent, write out their info - LogClientInfo(m, req); + LogClientInfo(req); foundparent:; } } @@ -6098,7 +5960,6 @@ foundparent:; LogInfo("--- DNSSEC Statistics ---"); - LogInfo("Next Stats Time %u", m->NextStatLogTime - mDNSPlatformUTC()); LogMsgNoIdent("Unicast Cache size %u", m->rrcache_totalused_unicast); LogInfo("DNSSEC Cache size %u", m->DNSSECStats.TotalMemUsed); if (m->rrcache_totalused_unicast) @@ -6133,9 +5994,10 @@ foundparent:; LogMsgNoIdent("BonjourEnabled %d", m->BonjourEnabled); #endif // BONJOUR_ON_DEMAND -#if APPLE_OSX_mDNSResponder +#if APPLE_OSX_mDNSResponder && ENABLE_BLE_TRIGGERED_BONJOUR LogMsgNoIdent("EnableBLEBasedDiscovery %d", EnableBLEBasedDiscovery); -#endif // APPLE_OSX_mDNSResponder + LogMsgNoIdent("DefaultToBLETriggered %d", DefaultToBLETriggered); +#endif // APPLE_OSX_mDNSResponder && ENABLE_BLE_TRIGGERED_BONJOUR if (!m->NewQuestions) LogMsgNoIdent("NewQuestion <NONE>"); @@ -6340,7 +6202,7 @@ mDNSexport mDNSs32 udsserver_idle(mDNSs32 nextevent) else if (result == t_error) { LogMsg("%3d: Could not write data to client PID[%d](%s) because of error - aborting connection", r->sd, r->process_id, r->pid_name); - LogClientInfo(&mDNSStorage, r); + LogClientInfo(r); abort_request(r); } break; @@ -6369,7 +6231,7 @@ mDNSexport mDNSs32 udsserver_idle(mDNSs32 nextevent) if (++r->unresponsiveness_reports >= 60) { LogMsg("%3d: Client PID[%d](%s) unresponsive; aborting connection", r->sd, r->process_id, r->pid_name); - LogClientInfo(&mDNSStorage, r); + LogClientInfo(r); abort_request(r); } } @@ -6395,7 +6257,11 @@ struct CompileTimeAssertionChecks_uds_daemon char sizecheck_request_state [(sizeof(request_state) <= 2954) ? 1 : -1]; char sizecheck_registered_record_entry[(sizeof(registered_record_entry) <= 60) ? 1 : -1]; char sizecheck_service_instance [(sizeof(service_instance) <= 6552) ? 1 : -1]; - char sizecheck_browser_t [(sizeof(browser_t) <= 1150) ? 1 : -1]; + char sizecheck_browser_t [(sizeof(browser_t) <= 1202) ? 1 : -1]; char sizecheck_reply_hdr [(sizeof(reply_hdr) <= 12) ? 1 : -1]; char sizecheck_reply_state [(sizeof(reply_state) <= 64) ? 1 : -1]; }; + +#ifdef UNIT_TEST +#include "../unittests/uds_daemon_ut.c" +#endif // UNIT_TEST |