HostDnsService.h revision 3f2299591cfeb8a37a3578bef9c44c1790860948
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync/* $Id$ */
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync/** @file
01bceecc7f7484a8820c77b884bb91cdefc97390vboxsync * Host DNS listener.
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync */
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync/*
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync * Copyright (C) 2005-2012 Oracle Corporation
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync *
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync * available from http://www.virtualbox.org. This file is free software;
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync * you can redistribute it and/or modify it under the terms of the GNU
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync * General Public License (GPL) as published by the Free Software
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync */
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync#ifndef ___H_DNSHOSTSERVICE
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync#define ___H_DNSHOSTSERVICE
5218e94d899f948d3def7109e05a93fc6d590037vboxsync#include "VirtualBoxBase.h"
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync#include <iprt/cdefs.h>
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync#include <iprt/critsect.h>
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync#include <iprt/types.h>
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync#include <list>
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsynctypedef std::list<com::Utf8Str> Utf8StrList;
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsynctypedef Utf8StrList::iterator Utf8StrListIterator;
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
607b3e94ac964648f49fc97505782d4b71b8c18fvboxsync
607b3e94ac964648f49fc97505782d4b71b8c18fvboxsyncclass Lockee
607b3e94ac964648f49fc97505782d4b71b8c18fvboxsync{
607b3e94ac964648f49fc97505782d4b71b8c18fvboxsync public:
607b3e94ac964648f49fc97505782d4b71b8c18fvboxsync Lockee();
607b3e94ac964648f49fc97505782d4b71b8c18fvboxsync virtual ~Lockee();
607b3e94ac964648f49fc97505782d4b71b8c18fvboxsync const RTCRITSECT* lock() const;
607b3e94ac964648f49fc97505782d4b71b8c18fvboxsync
607b3e94ac964648f49fc97505782d4b71b8c18fvboxsync private:
607b3e94ac964648f49fc97505782d4b71b8c18fvboxsync RTCRITSECT mLock;
607b3e94ac964648f49fc97505782d4b71b8c18fvboxsync};
607b3e94ac964648f49fc97505782d4b71b8c18fvboxsync
607b3e94ac964648f49fc97505782d4b71b8c18fvboxsync
607b3e94ac964648f49fc97505782d4b71b8c18fvboxsyncclass ALock
607b3e94ac964648f49fc97505782d4b71b8c18fvboxsync{
607b3e94ac964648f49fc97505782d4b71b8c18fvboxsync public:
607b3e94ac964648f49fc97505782d4b71b8c18fvboxsync ALock(const Lockee *l);
607b3e94ac964648f49fc97505782d4b71b8c18fvboxsync ~ALock();
607b3e94ac964648f49fc97505782d4b71b8c18fvboxsync
607b3e94ac964648f49fc97505782d4b71b8c18fvboxsync private:
607b3e94ac964648f49fc97505782d4b71b8c18fvboxsync const Lockee *lck;
607b3e94ac964648f49fc97505782d4b71b8c18fvboxsync};
607b3e94ac964648f49fc97505782d4b71b8c18fvboxsync
607b3e94ac964648f49fc97505782d4b71b8c18fvboxsync
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsyncstruct HostDnsInformation
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync{
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync std::vector<std::string> servers;
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync std::string domain;
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync std::vector<std::string> searchList;
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync};
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsyncclass HostDnsMonitorProxy;
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync/**
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync * This class supposed to be a real DNS monitor object it should be singleton,
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync * it lifecycle starts and ends together with VBoxSVC.
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync *
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync */
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsyncclass HostDnsMonitor:public Lockee
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync{
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync public:
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync static const HostDnsMonitor* getHostDnsMonitor();
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync static void shutdown();
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync void addMonitorProxy(const HostDnsMonitorProxy&) const;
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync void releaseMonitorProxy(const HostDnsMonitorProxy&) const;
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync const HostDnsInformation& getInfo() const;
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync virtual HRESULT init();
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync protected:
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync void notifyAll() const;
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync void setInfo(const HostDnsInformation&);
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync HostDnsMonitor();
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync virtual ~HostDnsMonitor();
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync private:
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync HostDnsMonitor(const HostDnsMonitor&);
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync HostDnsMonitor& operator= (const HostDnsMonitor&);
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync public:
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync struct Data;
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync Data *m;
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync};
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync/**
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync * This class supposed to be a proxy for events on changing Host Name Resolving configurations.
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync */
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsyncclass HostDnsMonitorProxy: public Lockee
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync{
db8bc574dcfad7e8fa153800a94e61a80e93259fvboxsync public:
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync HostDnsMonitorProxy();
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync ~HostDnsMonitorProxy();
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync void init(const HostDnsMonitor* mon, const VirtualBox* aParent);
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync void notify() const;
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync STDMETHOD(COMGETTER(NameServers))(ComSafeArrayOut(BSTR, aNameServers));
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync STDMETHOD(COMGETTER(DomainName))(BSTR *aDomainName);
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync STDMETHOD(COMGETTER(SearchStrings))(ComSafeArrayOut(BSTR, aSearchStrings));
233a114a6b1855d0525e4c4724683ac0f0d6956cvboxsync
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync bool operator==(const HostDnsMonitorProxy&);
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync private:
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync void updateInfo();
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
233a114a6b1855d0525e4c4724683ac0f0d6956cvboxsync private:
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync struct Data;
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync Data *m;
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync};
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync# ifdef RT_OS_DARWIN
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsyncclass HostDnsServiceDarwin: public HostDnsMonitor
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync{
233a114a6b1855d0525e4c4724683ac0f0d6956cvboxsync public:
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync HostDnsServiceDarwin();
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync ~HostDnsServiceDarwin();
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync HRESULT init();
233a114a6b1855d0525e4c4724683ac0f0d6956cvboxsync
233a114a6b1855d0525e4c4724683ac0f0d6956cvboxsync private:
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync HRESULT updateInfo();
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync static void hostDnsServiceStoreCallback(void *store, void *arrayRef, void *info);
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync};
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync# endif
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync# ifdef RT_OS_WINDOWS
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsyncclass HostDnsServiceWin: public HostDnsMonitor
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync{
233a114a6b1855d0525e4c4724683ac0f0d6956cvboxsync public:
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync HostDnsServiceWin();
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync ~HostDnsServiceWin();
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync HRESULT init();
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync private:
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync void strList2List(std::vector<std::string>& lst, char *strLst);
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync HRESULT updateInfo();
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync};
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync# endif
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync# if defined(RT_OS_SOLARIS) || defined(RT_OS_LINUX) || defined(RT_OS_OS2)
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsyncclass HostDnsServiceResolvConf: public HostDnsMonitor
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync{
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync public:
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync HostDnsServiceResolvConf():m(NULL){}
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync virtual ~HostDnsServiceResolvConf();
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync virtual HRESULT init(const char *aResolvConfFileName);
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync const std::string& resolvConf();
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync protected:
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync HRESULT readResolvConf();
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync protected:
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync struct Data;
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync Data *m;
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync};
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync# if defined(RT_OS_SOLARIS)
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync/**
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync * XXX: https://blogs.oracle.com/praks/entry/file_events_notification
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync */
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsyncclass HostDnsServiceSolaris: public HostDnsServiceResolvConf
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync{
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync public:
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync HostDnsServiceSolaris(){}
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync ~HostDnsServiceSolaris(){}
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync HRESULT init(){ return init("/etc/resolv.conf");}
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync};
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync# elif defined(RT_OS_LINUX)
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsyncclass HostDnsServiceLinux: public HostDnsServiceResolvConf
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync{
233a114a6b1855d0525e4c4724683ac0f0d6956cvboxsync public:
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync HostDnsServiceLinux(){}
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync ~HostDnsServiceLinux();
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync HRESULT init() {return init("/etc/resolv.conf");}
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync HRESULT init(const char *aResolvConfFileName);
4a5eed4c1192804dd98b2d803ef27f610a0a5a90vboxsync
4a5eed4c1192804dd98b2d803ef27f610a0a5a90vboxsync static int hostMonitoringRoutine(RTTHREAD ThreadSelf, void *pvUser);
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync};
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync# elif defined(RT_OS_OS2)
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsyncclass HostDnsServiceOs2: public HostDnsServiceResolvConf
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync{
233a114a6b1855d0525e4c4724683ac0f0d6956cvboxsync public:
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync HostDnsServiceOs2(){}
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync ~HostDnsServiceOs2(){}
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync /* XXX: \\MPTN\\ETC should be taken from environment variable ETC */
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync HRESULT init(){ return init("\\MPTN\\ETC\\RESOLV2");}
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync};
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync# endif
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync# endif
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync#endif /* !___H_DNSHOSTSERVICE */