HostDnsService.h revision 5218e94d899f948d3def7109e05a93fc6d590037
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/* $Id$ */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/** @file
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Host DNS listener.
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Copyright (C) 2005-2012 Oracle Corporation
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * This file is part of VirtualBox Open Source Edition (OSE), as
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * available from http://www.virtualbox.org. This file is free software;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * you can redistribute it and/or modify it under the terms of the GNU
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * General Public License (GPL) as published by the Free Software
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Foundation, in version 2 as it comes in the "COPYING" file of the
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi#ifndef ___H_DNSHOSTSERVICE
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi#define ___H_DNSHOSTSERVICE
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi#include "VirtualBoxBase.h"
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi#include <iprt/cdefs.h>
2c2c41837e330b002c4220a39638150db504fe0evi#include <iprt/critsect.h>
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi#include <iprt/types.h>
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi#include <list>
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vitypedef std::list<com::Utf8Str> Utf8StrList;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vitypedef Utf8StrList::iterator Utf8StrListIterator;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viclass HostDnsService
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vipublic:
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi HostDnsService();
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi virtual ~HostDnsService();
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi virtual HRESULT init(const VirtualBox *aParent);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi virtual HRESULT start(void);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi virtual void stop(void);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi STDMETHOD(COMGETTER(NameServers))(ComSafeArrayOut(BSTR, aNameServers));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi STDMETHOD(COMGETTER(DomainName))(BSTR *aDomainName);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi STDMETHOD(COMGETTER(SearchStrings))(ComSafeArrayOut(BSTR, aSearchStrings));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viprotected:
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi virtual HRESULT update(void);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /* XXX: hide it with struct Data together with <list> */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi Utf8StrList m_llNameServers;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi Utf8StrList m_llSearchStrings;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi com::Utf8Str m_DomainName;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi RTCRITSECT m_hCritSect;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viprivate:
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi const VirtualBox *mParent;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi HostDnsService(const HostDnsService& service){ NOREF(service); }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi HostDnsService& operator =(const HostDnsService& service){ NOREF(service); return *this; }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi};
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi# ifdef RT_OS_DARWIN
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viclass HostDnsServiceDarwin: public HostDnsService
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vipublic:
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi HostDnsServiceDarwin();
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi virtual ~HostDnsServiceDarwin();
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi virtual HRESULT init(const VirtualBox *aParent);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi virtual HRESULT start(void);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi virtual void stop(void);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi virtual HRESULT update();
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viprivate:
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi static void hostDnsServiceStoreCallback(void *store, void *arrayRef, void *info);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi};
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi# endif
# ifdef RT_OS_WINDOWS
class HostDnsServiceWin: public HostDnsService
{
public:
HostDnsServiceWin();
virtual ~HostDnsServiceWin();
virtual HRESULT init(const VirtualBox *aParent);
virtual HRESULT start(void);
virtual void stop(void);
virtual HRESULT update();
private:
void strList2List(Utf8StrList& lst, char *strLst);
};
# endif
#if defined(RT_OS_SOLARIS) || defined(RT_OS_LINUX) || defined(RT_OS_OS2)
class HostDnsServiceResolvConf: public HostDnsService
{
public:
HostDnsServiceResolvConf(const char *aResolvConfFileName = "/etc/resolv.conf");
virtual ~HostDnsServiceResolvConf();
virtual HRESULT init(VirtualBox *aParent);
virtual HRESULT update();
protected:
com::Utf8Str m_ResolvConfFilename;
RTFILE m_ResolvConfFile;
};
# if defined(RT_OS_SOLARIS)
/**
* XXX: https://blogs.oracle.com/praks/entry/file_events_notification
*/
class HostDnsServiceSolaris: public HostDnsServiceResolvConf
{
public:
HostDnsServiceSolaris(){}
virtual ~HostDnsServiceSolaris(){}
};
# elif defined(RT_OS_LINUX)
/**
* XXX: http://www.ibm.com/developerworks/linux/library/l-ubuntu-inotify/index.html
*/
class HostDnsServiceLinux: public HostDnsServiceResolvConf
{
public:
HostDnsServiceLinux(){}
virtual ~HostDnsServiceLinux(){}
};
# elif defined(RT_OS_OS2)
class HostDnsServiceOs2: public HostDnsServiceResolvConf
{
public:
HostDnsServiceOs2()
{
/* XXX: \\MPTN\\ETC should be taken from environment variable ETC */
::HostDnsServiceResolvConf("\\MPTN\\ETC\\RESOLV2");
}
virtual ~HostDnsServiceOs2(){}
};
# endif
#endif
#endif /* !___H_DNSHOSTSERVICE */