VirtualBox

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

Last change on this file since 76366 was 76366, checked in by vboxsync, 6 years ago

include/VBox/com/Guid.h: Don't include iprt/err.h for no good reason. bugref:9344

  • 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 76366 2018-12-22 02:16:26Z vboxsync $ */
2/** @file
3 * Host DNS listener.
4 */
5
6/*
7 * Copyright (C) 2005-2017 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/err.h> /* VERR_IGNORED */
23#include <iprt/cpp/lock.h>
24
25#include <list>
26#include <vector>
27
28typedef std::list<com::Utf8Str> Utf8StrList;
29typedef Utf8StrList::iterator Utf8StrListIterator;
30
31class HostDnsMonitorProxy;
32typedef const HostDnsMonitorProxy *PCHostDnsMonitorProxy;
33
34class HostDnsInformation
35{
36 public:
37 static const uint32_t IGNORE_SERVER_ORDER = RT_BIT_32(0);
38 static const uint32_t IGNORE_SUFFIXES = RT_BIT_32(1);
39
40 public:
41 std::vector<std::string> servers;
42 std::string domain;
43 std::vector<std::string> searchList;
44 bool equals(const HostDnsInformation &, uint32_t fLaxComparison = 0) const;
45};
46
47/**
48 * This class supposed to be a real DNS monitor object it should be singleton,
49 * it lifecycle starts and ends together with VBoxSVC.
50 */
51class HostDnsMonitor
52{
53 DECLARE_CLS_COPY_CTOR_ASSIGN_NOOP(HostDnsMonitor);
54
55 public:
56 static HostDnsMonitor *createHostDnsMonitor();
57 static void shutdown();
58
59 /* @note: method will wait till client call
60 HostDnsService::monitorThreadInitializationDone() */
61 virtual HRESULT init(HostDnsMonitorProxy *proxy);
62
63 protected:
64 explicit HostDnsMonitor(bool fThreaded = false);
65 virtual ~HostDnsMonitor();
66
67 void setInfo(const HostDnsInformation &);
68
69 /* this function used only if HostDnsMonitor::HostDnsMonitor(true) */
70 void monitorThreadInitializationDone();
71 virtual void monitorThreadShutdown() = 0;
72 virtual int monitorWorker() = 0;
73
74 private:
75 static DECLCALLBACK(int) threadMonitoringRoutine(RTTHREAD, void *);
76
77 protected:
78 mutable RTCLockMtx m_LockMtx;
79
80 public:
81 struct Data;
82 Data *m;
83};
84
85/**
86 * This class supposed to be a proxy for events on changing Host Name Resolving configurations.
87 */
88class HostDnsMonitorProxy
89{
90 public:
91 HostDnsMonitorProxy();
92 ~HostDnsMonitorProxy();
93 void init(VirtualBox *virtualbox);
94 void notify(const HostDnsInformation &info);
95
96 HRESULT GetNameServers(std::vector<com::Utf8Str> &aNameServers);
97 HRESULT GetDomainName(com::Utf8Str *pDomainName);
98 HRESULT GetSearchStrings(std::vector<com::Utf8Str> &aSearchStrings);
99
100 private:
101 void pollGlobalExtraData();
102 bool updateInfo(const HostDnsInformation &info);
103
104 private:
105 mutable RTCLockMtx m_LockMtx;
106
107 private:
108 struct Data;
109 Data *m;
110};
111
112# if defined(RT_OS_DARWIN) || defined(DOXYGEN_RUNNING)
113class HostDnsServiceDarwin : public HostDnsMonitor
114{
115 public:
116 HostDnsServiceDarwin();
117 ~HostDnsServiceDarwin();
118 virtual HRESULT init(HostDnsMonitorProxy *proxy);
119
120 protected:
121 virtual void monitorThreadShutdown();
122 virtual int monitorWorker();
123
124 private:
125 HRESULT updateInfo();
126 static void hostDnsServiceStoreCallback(void *store, void *arrayRef, void *info);
127 struct Data;
128 Data *m;
129};
130# endif
131# if defined(RT_OS_WINDOWS) || defined(DOXYGEN_RUNNING)
132class HostDnsServiceWin : public HostDnsMonitor
133{
134 public:
135 HostDnsServiceWin();
136 ~HostDnsServiceWin();
137 virtual HRESULT init(HostDnsMonitorProxy *proxy);
138
139 protected:
140 virtual void monitorThreadShutdown();
141 virtual int monitorWorker();
142
143 private:
144 HRESULT updateInfo();
145
146 private:
147 struct Data;
148 Data *m;
149};
150# endif
151# if defined(RT_OS_SOLARIS) || defined(RT_OS_LINUX) || defined(RT_OS_OS2) || defined(RT_OS_FREEBSD) \
152 || defined(DOXYGEN_RUNNING)
153class HostDnsServiceResolvConf: public HostDnsMonitor
154{
155 public:
156 explicit HostDnsServiceResolvConf(bool fThreaded = false) : HostDnsMonitor(fThreaded), m(NULL) {}
157 virtual ~HostDnsServiceResolvConf();
158 virtual HRESULT init(HostDnsMonitorProxy *proxy, const char *aResolvConfFileName);
159 const std::string& resolvConf() const;
160
161 protected:
162 HRESULT readResolvConf();
163 /* While not all hosts supports Hosts DNS change notifiaction
164 * default implementation offers return VERR_IGNORE.
165 */
166 virtual void monitorThreadShutdown() {}
167 virtual int monitorWorker() {return VERR_IGNORED;}
168
169 protected:
170 struct Data;
171 Data *m;
172};
173# if defined(RT_OS_SOLARIS) || defined(DOXYGEN_RUNNING)
174/**
175 * XXX: https://blogs.oracle.com/praks/entry/file_events_notification
176 */
177class HostDnsServiceSolaris : public HostDnsServiceResolvConf
178{
179 public:
180 HostDnsServiceSolaris(){}
181 ~HostDnsServiceSolaris(){}
182 virtual HRESULT init(HostDnsMonitorProxy *proxy) {
183 return HostDnsServiceResolvConf::init(proxy, "/etc/resolv.conf");
184 }
185};
186
187# endif
188# if defined(RT_OS_LINUX) || defined(DOXYGEN_RUNNING)
189class HostDnsServiceLinux : public HostDnsServiceResolvConf
190{
191 public:
192 HostDnsServiceLinux():HostDnsServiceResolvConf(true){}
193 virtual ~HostDnsServiceLinux();
194 virtual HRESULT init(HostDnsMonitorProxy *proxy) {
195 return HostDnsServiceResolvConf::init(proxy, "/etc/resolv.conf");
196 }
197
198 protected:
199 virtual void monitorThreadShutdown();
200 virtual int monitorWorker();
201};
202
203# endif
204# if defined(RT_OS_FREEBSD) || defined(DOXYGEN_RUNNING)
205class HostDnsServiceFreebsd: public HostDnsServiceResolvConf
206{
207 public:
208 HostDnsServiceFreebsd(){}
209 ~HostDnsServiceFreebsd(){}
210 virtual HRESULT init(HostDnsMonitorProxy *proxy) {
211 return HostDnsServiceResolvConf::init(proxy, "/etc/resolv.conf");
212 }
213};
214
215# endif
216# if defined(RT_OS_OS2) || defined(DOXYGEN_RUNNING)
217class HostDnsServiceOs2 : public HostDnsServiceResolvConf
218{
219 public:
220 HostDnsServiceOs2(){}
221 ~HostDnsServiceOs2(){}
222 /* XXX: \\MPTN\\ETC should be taken from environment variable ETC */
223 virtual HRESULT init(HostDnsMonitorProxy *proxy) {
224 return HostDnsServiceResolvConf::init(proxy, "\\MPTN\\ETC\\RESOLV2");
225 }
226};
227
228# endif
229# endif
230
231#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