VirtualBox

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

Last change on this file since 52497 was 50263, checked in by vboxsync, 11 years ago

Main/HostDnsService:

  • Generic part could be used with threading on or off: OS which can monitor changes on DNS structures might need this (e.g. Windows, Darwin, Linux)
  • ResolvConf based (Linux, Solaris, FreeBSD ans Os/2) doesn't use scanf based resovl.conf parsing new Slirp's parser used instead. It's configured to provide strings instead of addresses. (to resolve xtracker/7034c2)
  • Darwin monitoring code has been refactored.
  • linux changed to handle cases described in xtracker/7034c3
  • Windows monitors changes on register changes.
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 5.9 KB
Line 
1/* $Id: HostDnsService.h 50263 2014-01-28 19:29:52Z vboxsync $ */
2/** @file
3 * Host DNS listener.
4 */
5
6/*
7 * Copyright (C) 2005-2012 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/critsect.h>
24#include <iprt/types.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 Lockee
36{
37 public:
38 Lockee();
39 virtual ~Lockee();
40 const RTCRITSECT* lock() const;
41
42 private:
43 RTCRITSECT mLock;
44};
45
46class ALock
47{
48 public:
49 explicit ALock(const Lockee *l);
50 ~ALock();
51
52 private:
53 const Lockee *lockee;
54};
55
56class HostDnsInformation
57{
58 public:
59 std::vector<std::string> servers;
60 std::string domain;
61 std::vector<std::string> searchList;
62};
63
64/**
65 * This class supposed to be a real DNS monitor object it should be singleton,
66 * it lifecycle starts and ends together with VBoxSVC.
67 */
68class HostDnsMonitor : public Lockee
69{
70 public:
71 static const HostDnsMonitor *getHostDnsMonitor();
72 static void shutdown();
73
74 void addMonitorProxy(PCHostDnsMonitorProxy) const;
75 void releaseMonitorProxy(PCHostDnsMonitorProxy) const;
76 const HostDnsInformation &getInfo() const;
77 /* @note: method will wait till client call
78 HostDnsService::monitorThreadInitializationDone() */
79 virtual HRESULT init();
80
81 protected:
82 explicit HostDnsMonitor(bool fThreaded = false);
83 virtual ~HostDnsMonitor();
84
85 void notifyAll() const;
86 void setInfo(const HostDnsInformation &);
87
88 /* this function used only if HostDnsMonitor::HostDnsMonitor(true) */
89 void monitorThreadInitializationDone();
90 virtual void monitorThreadShutdown() = 0;
91 virtual int monitorWorker() = 0;
92
93 private:
94 HostDnsMonitor(const HostDnsMonitor &);
95 HostDnsMonitor& operator= (const HostDnsMonitor &);
96 static int threadMonitoringRoutine(RTTHREAD, void *);
97
98 public:
99 struct Data;
100 Data *m;
101};
102
103/**
104 * This class supposed to be a proxy for events on changing Host Name Resolving configurations.
105 */
106class HostDnsMonitorProxy : public Lockee
107{
108 public:
109 HostDnsMonitorProxy();
110 ~HostDnsMonitorProxy();
111 void init(const HostDnsMonitor *aMonitor, const VirtualBox *aParent);
112 void notify() const;
113
114 HRESULT GetNameServers(ComSafeArrayOut(BSTR, aNameServers));
115 HRESULT GetDomainName(BSTR *aDomainName);
116 HRESULT GetSearchStrings(ComSafeArrayOut(BSTR, aSearchStrings));
117
118 bool operator==(PCHostDnsMonitorProxy&);
119
120 private:
121 void updateInfo();
122
123 private:
124 struct Data;
125 Data *m;
126};
127
128# ifdef RT_OS_DARWIN
129class HostDnsServiceDarwin : public HostDnsMonitor
130{
131 public:
132 HostDnsServiceDarwin();
133 ~HostDnsServiceDarwin();
134 HRESULT init();
135
136 protected:
137 virtual void monitorThreadShutdown();
138 virtual int monitorWorker();
139
140 private:
141 HRESULT updateInfo();
142 static void hostDnsServiceStoreCallback(void *store, void *arrayRef, void *info);
143 struct Data;
144 Data *m;
145};
146# endif
147# ifdef RT_OS_WINDOWS
148class HostDnsServiceWin : public HostDnsMonitor
149{
150 public:
151 HostDnsServiceWin();
152 ~HostDnsServiceWin();
153 HRESULT init();
154
155 protected:
156 virtual void monitorThreadShutdown();
157 virtual int monitorWorker();
158
159 private:
160 void strList2List(std::vector<std::string>& lst, char *strLst);
161 HRESULT updateInfo();
162
163 private:
164 struct Data;
165 Data *m;
166};
167# endif
168# if defined(RT_OS_SOLARIS) || defined(RT_OS_LINUX) || defined(RT_OS_OS2) || defined(RT_OS_FREEBSD)
169class HostDnsServiceResolvConf: public HostDnsMonitor
170{
171 public:
172 explicit HostDnsServiceResolvConf(bool fThreaded = false) : HostDnsMonitor(fThreaded), m(NULL) {}
173 virtual ~HostDnsServiceResolvConf();
174 virtual HRESULT init(const char *aResolvConfFileName);
175 const std::string& resolvConf() const;
176
177 protected:
178 HRESULT readResolvConf();
179 /* While not all hosts supports Hosts DNS change notifiaction
180 * default implementation offers return VERR_IGNORE.
181 */
182 virtual void monitorThreadShutdown() {}
183 virtual int monitorWorker() {return VERR_IGNORED;}
184
185 protected:
186 struct Data;
187 Data *m;
188};
189# if defined(RT_OS_SOLARIS)
190/**
191 * XXX: https://blogs.oracle.com/praks/entry/file_events_notification
192 */
193class HostDnsServiceSolaris : public HostDnsServiceResolvConf
194{
195 public:
196 HostDnsServiceSolaris(){}
197 ~HostDnsServiceSolaris(){}
198 HRESULT init(){ return HostDnsServiceResolvConf::init("/etc/resolv.conf");}
199};
200
201# elif defined(RT_OS_LINUX)
202class HostDnsServiceLinux : public HostDnsServiceResolvConf
203{
204 public:
205 HostDnsServiceLinux():HostDnsServiceResolvConf(true){}
206 virtual ~HostDnsServiceLinux();
207 virtual HRESULT init(){ return HostDnsServiceResolvConf::init("/etc/resolv.conf");}
208
209 protected:
210 virtual void monitorThreadShutdown();
211 virtual int monitorWorker();
212};
213
214# elif defined(RT_OS_FREEBSD)
215class HostDnsServiceFreebsd: public HostDnsServiceResolvConf
216{
217 public:
218 HostDnsServiceFreebsd(){}
219 ~HostDnsServiceFreebsd(){}
220 HRESULT init(){ return HostDnsServiceResolvConf::init("/etc/resolv.conf");}
221};
222
223# elif defined(RT_OS_OS2)
224class HostDnsServiceOs2 : public HostDnsServiceResolvConf
225{
226 public:
227 HostDnsServiceOs2(){}
228 ~HostDnsServiceOs2(){}
229 /* XXX: \\MPTN\\ETC should be taken from environment variable ETC */
230 HRESULT init(){ return init("\\MPTN\\ETC\\RESOLV2");}
231};
232
233# endif
234# endif
235
236#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