VirtualBox

Changeset 48486 in vbox for trunk/src/VBox/Main/src-server


Ignore:
Timestamp:
Sep 16, 2013 2:57:58 PM (11 years ago)
Author:
vboxsync
Message:

HostDnsServiceDarwin: listener for host's DNS configuration update.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/src-server/darwin/HostDnsServiceDarwin.cpp

    r48346 r48486  
    2222
    2323#include <iprt/err.h>
     24#include <iprt/thread.h>
     25#include <iprt/semaphore.h>
    2426
    2527#include <CoreFoundation/CoreFoundation.h>
     
    3032SCDynamicStoreRef g_store;
    3133CFRunLoopSourceRef g_DnsWatcher;
     34CFRunLoopRef g_RunLoopRef;
     35RTTHREAD g_DnsMonitoringThread;
     36RTSEMEVENT g_DnsInitEvent;
    3237
    3338static const CFStringRef kStateNetworkGlobalDNSKey = CFSTR("State:/Network/Global/DNS");
     39
     40static int hostMonitoringRoutine(RTTHREAD ThreadSelf, void *pvUser)
     41{
     42    g_RunLoopRef = CFRunLoopGetCurrent();
     43    AssertReturn(g_RunLoopRef, VERR_INTERNAL_ERROR);
     44
     45    CFRetain(g_RunLoopRef);
     46
     47    CFArrayRef watchingArrayRef = CFArrayCreate(NULL,
     48                                                (const void **)&kStateNetworkGlobalDNSKey,
     49                                                1, &kCFTypeArrayCallBacks);
     50    if (!watchingArrayRef)
     51    {
     52        CFRelease(g_DnsWatcher);
     53        return E_OUTOFMEMORY;
     54    }
     55
     56    if(SCDynamicStoreSetNotificationKeys(g_store, watchingArrayRef, NULL))
     57        CFRunLoopAddSource(CFRunLoopGetCurrent(), g_DnsWatcher, kCFRunLoopCommonModes);
     58
     59    CFRelease(watchingArrayRef);
     60
     61    RTSemEventSignal(g_DnsInitEvent);
     62
     63    CFRunLoopRun();
     64
     65    CFRelease(g_RunLoopRef);
     66}
    3467
    3568HostDnsServiceDarwin::HostDnsServiceDarwin(){}
     
    68101        return E_OUTOFMEMORY;
    69102
    70     CFArrayRef watchingArrayRef = CFArrayCreate(NULL,
    71                                                 (const void **)&kStateNetworkGlobalDNSKey,
    72                                                 1, &kCFTypeArrayCallBacks);
    73     if (!watchingArrayRef)
    74     {
    75         CFRelease(g_DnsWatcher);
    76         return E_OUTOFMEMORY;
    77     }
    78 
    79     if(SCDynamicStoreSetNotificationKeys(g_store, watchingArrayRef, NULL))
    80         CFRunLoopAddSource(CFRunLoopGetMain(), g_DnsWatcher, kCFRunLoopCommonModes);
    81 
    82     CFRelease(watchingArrayRef);
    83 
    84103    HRESULT hrc = HostDnsService::init();
    85104    AssertComRCReturn(hrc, hrc);
     105
     106    int rc = RTSemEventCreate(&g_DnsInitEvent);
     107    AssertRCReturn(rc, E_FAIL);
    86108   
    87109    return update();
     
    92114HRESULT HostDnsServiceDarwin::start()
    93115{
     116    int rc = RTThreadCreate(&g_DnsMonitoringThread, hostMonitoringRoutine,
     117                            this, 128 * _1K, RTTHREADTYPE_IO, 0, "dns-monitor");
     118    AssertRCReturn(rc, E_FAIL);
     119
     120    RTSemEventWait(g_DnsInitEvent, RT_INDEFINITE_WAIT);
     121
    94122    return S_OK;
    95123}
     
    98126void HostDnsServiceDarwin::stop()
    99127{
     128
     129    if (g_RunLoopRef)
     130        CFRunLoopStop(g_RunLoopRef);
    100131}
    101132
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette