source: rtems-libbsd/mDNSResponder/mDNSMacOSX/SymptomReporter.c @ f761b29

55-freebsd-126-freebsd-12
Last change on this file since f761b29 was f761b29, checked in by Sebastian Huber <sebastian.huber@…>, on 09/19/18 at 06:52:21

mDNSResponder: Update to v625.41.2

The sources can be obtained via:

https://opensource.apple.com/tarballs/mDNSResponder/mDNSResponder-625.41.2.tar.gz

Update #3522.

  • Property mode set to 100644
File size: 5.7 KB
Line 
1/* -*- Mode: C; tab-width: 4 -*-
2 *
3 * Copyright (c) 2015 Apple Inc. All rights reserved.
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 *     http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18#include "mDNSEmbeddedAPI.h"
19
20#include <arpa/inet.h>
21#include <dlfcn.h>
22#include <stddef.h>
23#include <stdint.h>
24#include <sys/socket.h>
25#include <Symptoms/SymptomReporter.h>
26
27#define SYMPTOM_REPORTER_mDNSResponder_NUMERIC_ID  101
28#define SYMPTOM_REPORTER_mDNSResponder_TEXT_ID     "com.apple.mDNSResponder"
29
30#define SYMPTOM_DNS_NO_REPLIES          0x00065001
31#define SYMPTOM_DNS_RESUMED_RESPONDING  0x00065002
32
33static symptom_framework_t symptomReporter;
34static symptom_framework_t (*symptom_framework_init_f)(symptom_ident_t id, const char *originator_string) = mDNSNULL;
35static symptom_t (*symptom_new_f)(symptom_framework_t framework, symptom_ident_t id) = mDNSNULL;
36static int (*symptom_set_additional_qualifier_f)(symptom_t symptom, uint32_t qualifier_type, size_t qualifier_len, void *qualifier_data) = mDNSNULL;
37static int (*symptom_send_f)(symptom_t symptom) = mDNSNULL;
38
39mDNSlocal mStatus SymptomReporterInitCheck(void)
40{
41    mStatus err;
42    static mDNSBool isInitialized = mDNSfalse;
43    static void *symptomReporterLib = mDNSNULL;
44    static const char path[] = "/System/Library/PrivateFrameworks/Symptoms.framework/Frameworks/SymptomReporter.framework/SymptomReporter";
45
46    if (!isInitialized)
47    {
48        if (!symptomReporterLib)
49        {
50            symptomReporterLib = dlopen(path, RTLD_LAZY | RTLD_LOCAL);
51            if (!symptomReporterLib)
52                goto exit;
53        }
54
55        if (!symptom_framework_init_f)
56        {
57            symptom_framework_init_f = dlsym(symptomReporterLib, "symptom_framework_init");
58            if (!symptom_framework_init_f)
59                goto exit;
60        }
61
62        if (!symptom_new_f)
63        {
64            symptom_new_f = dlsym(symptomReporterLib, "symptom_new");
65            if (!symptom_new_f)
66                goto exit;
67        }
68
69        if (!symptom_set_additional_qualifier_f)
70        {
71            symptom_set_additional_qualifier_f = dlsym(symptomReporterLib, "symptom_set_additional_qualifier");
72            if (!symptom_set_additional_qualifier_f)
73                goto exit;
74        }
75
76        if (!symptom_send_f)
77        {
78            symptom_send_f = dlsym(symptomReporterLib, "symptom_send");
79            if (!symptom_send_f)
80                goto exit;
81        }
82
83        symptomReporter = symptom_framework_init_f(SYMPTOM_REPORTER_mDNSResponder_NUMERIC_ID, SYMPTOM_REPORTER_mDNSResponder_TEXT_ID);
84        isInitialized = mDNStrue;
85    }
86
87exit:
88    err = isInitialized ? mStatus_NoError : mStatus_NotInitializedErr;
89    return err;
90}
91
92mDNSlocal mStatus SymptomReporterReportDNSReachability(const mDNSAddr *addr, mDNSBool isReachable)
93{
94    mStatus err;
95    symptom_t symptom;
96    struct sockaddr_storage sockAddr;
97    size_t sockAddrSize;
98
99    LogInfo("SymptomReporterReportDNSReachability: DNS server %#a is %sreachable", addr, isReachable ? "" : "un");
100
101    if (addr->type == mDNSAddrType_IPv4)
102    {
103        struct sockaddr_in *sin = (struct sockaddr_in *)&sockAddr;
104        sockAddrSize = sizeof(*sin);
105        mDNSPlatformMemZero(sin, sockAddrSize);
106        sin->sin_len = sockAddrSize;
107        sin->sin_family = AF_INET;
108        sin->sin_addr.s_addr = addr->ip.v4.NotAnInteger;
109    }
110    else if (addr->type == mDNSAddrType_IPv6)
111    {
112        struct sockaddr_in6* sin6 = (struct sockaddr_in6*)&sockAddr;
113        sockAddrSize = sizeof(*sin6);
114        mDNSPlatformMemZero(sin6, sockAddrSize);
115        sin6->sin6_len = sockAddrSize;
116        sin6->sin6_family = AF_INET6;
117        sin6->sin6_addr = *(struct in6_addr *)&addr->ip.v6;
118    }
119    else
120    {
121        LogMsg("SymptomReporterReportDNSReachability: addr is not an IPv4 or IPv6 address!");
122        err = mStatus_BadParamErr;
123        goto exit;
124    }
125
126    symptom = symptom_new_f(symptomReporter, isReachable ? SYMPTOM_DNS_RESUMED_RESPONDING : SYMPTOM_DNS_NO_REPLIES);
127    symptom_set_additional_qualifier_f(symptom, 1, sockAddrSize, (void *)&sockAddr);
128    symptom_send_f(symptom);
129    err = mStatus_NoError;
130
131exit:
132    return err;
133}
134
135mDNSexport mStatus SymptomReporterDNSServerReachable(mDNS *const m, const mDNSAddr *addr)
136{
137    mStatus err;
138    DNSServer *s;
139    mDNSBool found = mDNSfalse;
140
141    err = SymptomReporterInitCheck();
142    if (err != mStatus_NoError)
143        goto exit;
144
145    for (s = m->DNSServers; s; s = s->next)
146    {
147        if (s->flags & DNSServer_FlagDelete)
148            continue;
149        if ((s->flags & DNSServer_FlagUnreachable) && mDNSSameAddress(addr, &s->addr))
150        {
151            s->flags &= ~DNSServer_FlagUnreachable;
152            NumUnreachableDNSServers--;
153            found = mDNStrue;
154        }
155    }
156
157    if (!found)
158    {
159        err = mStatus_NoSuchNameErr;
160        goto exit;
161    }
162
163    err = SymptomReporterReportDNSReachability(addr, mDNStrue);
164
165exit:
166    return err;
167}
168
169mDNSexport mStatus SymptomReporterDNSServerUnreachable(DNSServer *s)
170{
171    mStatus err;
172
173    err = SymptomReporterInitCheck();
174    if (err != mStatus_NoError)
175        goto exit;
176
177    if ((s->flags & DNSServer_FlagDelete) || (s->flags & DNSServer_FlagUnreachable))
178        goto exit;
179
180    s->flags |= DNSServer_FlagUnreachable;
181    NumUnreachableDNSServers++;
182
183    err = SymptomReporterReportDNSReachability(&s->addr, mDNSfalse);
184
185exit:
186    return err;
187}
Note: See TracBrowser for help on using the repository browser.