VirtualBox

source: vbox/trunk/src/VBox/Main/src-server/HostDnsService.h@ 63490

Last change on this file since 63490 was 62485, checked in by vboxsync, 8 years ago

(C) 2016

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 6.2 KB
Line 
1/* $Id: HostDnsService.h 62485 2016-07-22 18:36:43Z vboxsync $ */
2/** @file
3 * Host DNS listener.
4 */
5
6/*
7 * Copyright (C) 2005-2016 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 */
17
18#ifndef ___H_DNSHOSTSERVICE
19#define ___H_DNSHOSTSERVICE
20#include "VirtualBoxBase.h"
21
22#include <iprt/cdefs.h>
23#include <iprt/types.h>
24#include <iprt/cpp/lock.h>
25
26#include <list>
27#include <vector>
28
29typedef std::list<com::Utf8Str> Utf8StrList;
30typedef Utf8StrList::iterator Utf8StrListIterator;
31
32class HostDnsMonitorProxy;
33typedef const HostDnsMonitorProxy *PCHostDnsMonitorProxy;
34
35class HostDnsInformation
36{
37 public:
38 static const uint32_t IGNORE_SERVER_ORDER = RT_BIT_32(0);
39 static const uint32_t IGNORE_SUFFIXES = RT_BIT_32(1);
40
41 public:
42 std::vector<std::string> servers;
43 std::string domain;
44 std::vector<std::string> searchList;
45 bool equals(const HostDnsInformation &, uint32_t fLaxComparison = 0) const;
46};
47
48/**
49 * This class supposed to be a real DNS monitor object it should be singleton,
50 * it lifecycle starts and ends together with VBoxSVC.
51 */
52class HostDnsMonitor
53{
54 public:
55 static const HostDnsMonitor *getHostDnsMonitor(VirtualBox *virtualbox);
56 static void shutdown();
57
58 void addMonitorProxy(PCHostDnsMonitorProxy) const;
59 void releaseMonitorProxy(PCHostDnsMonitorProxy) const;
60 const HostDnsInformation &getInfo() const;
61 /* @note: method will wait till client call
62 HostDnsService::monitorThreadInitializationDone() */
63 virtual HRESULT init(VirtualBox *virtualbox);
64
65 protected:
66 explicit HostDnsMonitor(bool fThreaded = false);
67 virtual ~HostDnsMonitor();
68
69 void setInfo(const HostDnsInformation &);
70
71 /* this function used only if HostDnsMonitor::HostDnsMonitor(true) */
72 void monitorThreadInitializationDone();
73 virtual void monitorThreadShutdown() = 0;
74 virtual int monitorWorker() = 0;
75
76 private:
77 HostDnsMonitor(const HostDnsMonitor &);
78 HostDnsMonitor& operator= (const HostDnsMonitor &);
79 static DECLCALLBACK(int) threadMonitoringRoutine(RTTHREAD, void *);
80 void pollGlobalExtraData();
81
82 protected:
83 mutable RTCLockMtx m_LockMtx;
84
85 public:
86 struct Data;
87 Data *m;
88};
89
90/**
91 * This class supposed to be a proxy for events on changing Host Name Resolving configurations.
92 */
93class HostDnsMonitorProxy
94{
95 public:
96 HostDnsMonitorProxy();
97 ~HostDnsMonitorProxy();
98 void init(const HostDnsMonitor *aMonitor, VirtualBox *virtualbox);
99 void notify() const;
100
101 HRESULT GetNameServers(std::vector<com::Utf8Str> &aNameServers);
102 HRESULT GetDomainName(com::Utf8Str *pDomainName);
103 HRESULT GetSearchStrings(std::vector<com::Utf8Str> &aSearchStrings);
104
105 bool operator==(PCHostDnsMonitorProxy&);
106
107 private:
108 void updateInfo();
109
110 private:
111 mutable RTCLockMtx m_LockMtx;
112
113 private:
114 struct Data;
115 Data *m;
116};
117
118# ifdef RT_OS_DARWIN
119class HostDnsServiceDarwin : public HostDnsMonitor
120{
121 public:
122 HostDnsServiceDarwin();
123 ~HostDnsServiceDarwin();
124 virtual HRESULT init(VirtualBox *virtualbox);
125
126 protected:
127 virtual void monitorThreadShutdown();
128 virtual int monitorWorker();
129
130 private:
131 HRESULT updateInfo();
132 static void hostDnsServiceStoreCallback(void *store, void *arrayRef, void *info);
133 struct Data;
134 Data *m;
135};
136# endif
137# ifdef RT_OS_WINDOWS
138class HostDnsServiceWin : public HostDnsMonitor
139{
140 public:
141 HostDnsServiceWin();
142 ~HostDnsServiceWin();
143 virtual HRESULT init(VirtualBox *virtualbox);
144
145 protected:
146 virtual void monitorThreadShutdown();
147 virtual int monitorWorker();
148
149 private:
150 HRESULT updateInfo();
151
152 private:
153 struct Data;
154 Data *m;
155};
156# endif
157# if defined(RT_OS_SOLARIS) || defined(RT_OS_LINUX) || defined(RT_OS_OS2) || defined(RT_OS_FREEBSD)
158class HostDnsServiceResolvConf: public HostDnsMonitor
159{
160 public:
161 explicit HostDnsServiceResolvConf(bool fThreaded = false) : HostDnsMonitor(fThreaded), m(NULL) {}
162 virtual ~HostDnsServiceResolvConf();
163 virtual HRESULT init(VirtualBox *virtualbox, const char *aResolvConfFileName);
164 const std::string& resolvConf() const;
165
166 protected:
167 HRESULT readResolvConf();
168 /* While not all hosts supports Hosts DNS change notifiaction
169 * default implementation offers return VERR_IGNORE.
170 */
171 virtual void monitorThreadShutdown() {}
172 virtual int monitorWorker() {return VERR_IGNORED;}
173
174 protected:
175 struct Data;
176 Data *m;
177};
178# if defined(RT_OS_SOLARIS)
179/**
180 * XXX: https://blogs.oracle.com/praks/entry/file_events_notification
181 */
182class HostDnsServiceSolaris : public HostDnsServiceResolvConf
183{
184 public:
185 HostDnsServiceSolaris(){}
186 ~HostDnsServiceSolaris(){}
187 virtual HRESULT init(VirtualBox *virtualbox) {
188 return HostDnsServiceResolvConf::init(virtualbox, "/etc/resolv.conf");
189 }
190};
191
192# elif defined(RT_OS_LINUX)
193class HostDnsServiceLinux : public HostDnsServiceResolvConf
194{
195 public:
196 HostDnsServiceLinux():HostDnsServiceResolvConf(true){}
197 virtual ~HostDnsServiceLinux();
198 virtual HRESULT init(VirtualBox *virtualbox) {
199 return HostDnsServiceResolvConf::init(virtualbox, "/etc/resolv.conf");
200 }
201
202 protected:
203 virtual void monitorThreadShutdown();
204 virtual int monitorWorker();
205};
206
207# elif defined(RT_OS_FREEBSD)
208class HostDnsServiceFreebsd: public HostDnsServiceResolvConf
209{
210 public:
211 HostDnsServiceFreebsd(){}
212 ~HostDnsServiceFreebsd(){}
213 virtual HRESULT init(VirtualBox *virtualbox) {
214 return HostDnsServiceResolvConf::init(virtualbox, "/etc/resolv.conf");
215 }
216};
217
218# elif defined(RT_OS_OS2)
219class HostDnsServiceOs2 : public HostDnsServiceResolvConf
220{
221 public:
222 HostDnsServiceOs2(){}
223 ~HostDnsServiceOs2(){}
224 /* XXX: \\MPTN\\ETC should be taken from environment variable ETC */
225 virtual HRESULT init(VirtualBox *virtualbox) {
226 return HostDnsServiceResolvConf::init(virtualbox, "\\MPTN\\ETC\\RESOLV2");
227 }
228};
229
230# endif
231# endif
232
233#endif /* !___H_DNSHOSTSERVICE */
Note: See TracBrowser for help on using the repository browser.

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