+//===========================================================================================================================
+// QueryStatsGetDomainString
+//===========================================================================================================================
+
+mDNSlocal const char * QueryStatsGetDomainString(const QueryStats *inStats)
+{
+ return (inStats->altDomainStr ? inStats->altDomainStr : inStats->domainStr);
+}
+
+//===========================================================================================================================
+// QueryStatsDomainTest
+//===========================================================================================================================
+
+mDNSlocal mDNSBool QueryStatsDomainTest(const QueryStats *inStats, const domainname *inQueryName)
+{
+ const domainname * parentDomain;
+ int labelCount;
+
+ if (inStats->domain[0] == 0) return (mDNStrue);
+
+ labelCount = CountLabels(inQueryName);
+ if (labelCount < inStats->labelCount) return (mDNSfalse);
+
+ parentDomain = SkipLeadingLabels(inQueryName, labelCount - inStats->labelCount);
+ return (SameDomainName(parentDomain, (const domainname *)inStats->domain));
+}
+
+//===========================================================================================================================
+// QueryStatsHostnameTest
+//===========================================================================================================================
+
+mDNSlocal mDNSBool QueryStatsHostnameTest(const QueryStats *inStats, const domainname *inQueryName)
+{
+ return (SameDomainName(inQueryName, (const domainname *)inStats->domain));
+}
+
+//===========================================================================================================================
+// QueryStatsContentiCloudTest
+//===========================================================================================================================
+
+mDNSlocal const uint8_t *LocateLabelSuffix(const uint8_t *inLabel, const uint8_t *inSuffixPtr, size_t inSuffixLen);
+
+#define kContentSuffixStr "-content"
+
+mDNSlocal mDNSBool QueryStatsContentiCloudTest(const QueryStats *inStats, const domainname *inQueryName)
+{
+ const mDNSu8 * const firstLabel = inQueryName->c;
+ const uint8_t * suffix;
+ const domainname * parentDomain;
+ int labelCount;
+
+ (void) inStats; // Unused.
+
+ labelCount = CountLabels(inQueryName);
+ if (labelCount != 3) return (mDNSfalse);
+
+ suffix = LocateLabelSuffix(firstLabel, (const uint8_t *)kContentSuffixStr, sizeof_string(kContentSuffixStr));
+ if (suffix && (suffix > &firstLabel[1]))
+ {
+ parentDomain = SkipLeadingLabels(inQueryName, 1);
+ if (SameDomainName(parentDomain, (const domainname *)"\x6" "icloud" "\x3" "com"))
+ {
+ return (mDNStrue);
+ }
+ }
+
+ return (mDNSfalse);
+}
+
+mDNSlocal const uint8_t *LocateLabelSuffix(const uint8_t *inLabel, const uint8_t *inSuffixPtr, size_t inSuffixLen)
+{
+ const uint8_t * ptr;
+ const uint8_t * lp;
+ const uint8_t * sp;
+ size_t len;
+ const size_t labelLen = inLabel[0];
+
+ if (labelLen < inSuffixLen) return (NULL);
+
+ ptr = &inLabel[1 + labelLen - inSuffixLen];
+ lp = ptr;
+ sp = inSuffixPtr;
+ for (len = inSuffixLen; len > 0; --len)
+ {
+ if (tolower(*lp) != tolower(*sp)) return (NULL);
+ ++lp;
+ ++sp;
+ }
+
+ return (ptr);
+}
+
+//===========================================================================================================================
+// QueryStatsCourierPushTest
+//===========================================================================================================================
+
+#define kCourierSuffixStr "-courier"
+
+mDNSlocal mDNSBool QueryStatsCourierPushTest(const QueryStats *inStats, const domainname *inQueryName)
+{
+ const mDNSu8 * const firstLabel = inQueryName->c;
+ const uint8_t * suffix;
+ const uint8_t * ptr;
+ const domainname * parentDomain;
+ int labelCount;
+
+ (void) inStats; // Unused.
+
+ labelCount = CountLabels(inQueryName);
+ if (labelCount != 4) return (mDNSfalse);
+
+ suffix = LocateLabelSuffix(firstLabel, (const mDNSu8 *)kCourierSuffixStr, sizeof_string(kCourierSuffixStr));
+ if (suffix && (suffix > &firstLabel[1]))
+ {
+ for (ptr = &firstLabel[1]; ptr < suffix; ++ptr)
+ {
+ if (!isdigit(*ptr)) break;
+ }
+ if (ptr == suffix)
+ {
+ parentDomain = SkipLeadingLabels(inQueryName, 1);
+ if (SameDomainName(parentDomain, (const domainname *)"\x4" "push" "\x5" "apple" "\x3" "com"))
+ {
+ return (mDNStrue);
+ }
+ }
+ }
+
+ return (mDNSfalse);
+}
+