VirtualBox

source: vbox/trunk/src/VBox/Main/DHCPServerImpl.cpp@ 22503

Last change on this file since 22503 was 22186, checked in by vboxsync, 15 years ago

Main: fix more windows warnings

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 7.2 KB
Line 
1/* $Id: DHCPServerImpl.cpp 22186 2009-08-11 17:44:54Z vboxsync $ */
2
3/** @file
4 *
5 * VirtualBox COM class implementation
6 */
7
8/*
9 * Copyright (C) 2006-2008 Sun Microsystems, Inc.
10 *
11 * This file is part of VirtualBox Open Source Edition (OSE), as
12 * available from http://www.virtualbox.org. This file is free software;
13 * you can redistribute it and/or modify it under the terms of the GNU
14 * General Public License (GPL) as published by the Free Software
15 * Foundation, in version 2 as it comes in the "COPYING" file of the
16 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
17 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
18 *
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
20 * Clara, CA 95054 USA or visit http://www.sun.com if you need
21 * additional information or have any questions.
22 */
23
24#include "DHCPServerRunner.h"
25#include "DHCPServerImpl.h"
26#include "Logging.h"
27
28#include <VBox/settings.h>
29
30// constructor / destructor
31/////////////////////////////////////////////////////////////////////////////
32
33DEFINE_EMPTY_CTOR_DTOR (DHCPServer)
34
35HRESULT DHCPServer::FinalConstruct()
36{
37 return S_OK;
38}
39
40void DHCPServer::FinalRelease()
41{
42 uninit ();
43}
44
45void DHCPServer::uninit()
46{
47 /* Enclose the state transition Ready->InUninit->NotReady */
48 AutoUninitSpan autoUninitSpan(this);
49 if (autoUninitSpan.uninitDone())
50 return;
51
52// /* we uninit children and reset mParent
53// * and VirtualBox::removeDependentChild() needs a write lock */
54// AutoMultiWriteLock2 alock (mVirtualBox->lockHandle(), this->treeLock());
55
56 mVirtualBox->removeDependentChild (this);
57
58 unconst(mVirtualBox).setNull();
59}
60
61HRESULT DHCPServer::init(VirtualBox *aVirtualBox, IN_BSTR aName)
62{
63 AssertReturn(aName != NULL, E_INVALIDARG);
64
65 AutoInitSpan autoInitSpan(this);
66 AssertReturn(autoInitSpan.isOk(), E_FAIL);
67
68 /* share VirtualBox weakly (parent remains NULL so far) */
69 unconst(mVirtualBox) = aVirtualBox;
70
71 unconst(mName) = aName;
72 m.IPAddress = "0.0.0.0";
73 m.networkMask = "0.0.0.0";
74 m.enabled = FALSE;
75 m.lowerIP = "0.0.0.0";
76 m.upperIP = "0.0.0.0";
77
78 /* register with VirtualBox early, since uninit() will
79 * unconditionally unregister on failure */
80 aVirtualBox->addDependentChild (this);
81
82 /* Confirm a successful initialization */
83 autoInitSpan.setSucceeded();
84
85 return S_OK;
86}
87
88HRESULT DHCPServer::init(VirtualBox *aVirtualBox,
89 const settings::DHCPServer &data)
90{
91 /* Enclose the state transition NotReady->InInit->Ready */
92 AutoInitSpan autoInitSpan(this);
93 AssertReturn(autoInitSpan.isOk(), E_FAIL);
94
95 /* share VirtualBox weakly (parent remains NULL so far) */
96 unconst(mVirtualBox) = aVirtualBox;
97
98 aVirtualBox->addDependentChild (this);
99
100 unconst(mName) = data.strNetworkName;
101 m.IPAddress = data.strIPAddress;
102 m.networkMask = data.strIPNetworkMask;
103 m.enabled = data.fEnabled;
104 m.lowerIP = data.strIPLower;
105 m.upperIP = data.strIPUpper;
106
107 autoInitSpan.setSucceeded();
108
109 return S_OK;
110}
111
112HRESULT DHCPServer::saveSettings(settings::DHCPServer &data)
113{
114 AutoCaller autoCaller(this);
115 CheckComRCReturnRC(autoCaller.rc());
116
117 AutoReadLock alock(this);
118
119 data.strNetworkName = mName;
120 data.strIPAddress = m.IPAddress;
121 data.strIPNetworkMask = m.networkMask;
122 data.fEnabled = !!m.enabled;
123 data.strIPLower = m.lowerIP;
124 data.strIPUpper = m.upperIP;
125
126 return S_OK;
127}
128
129STDMETHODIMP DHCPServer::COMGETTER(NetworkName) (BSTR *aName)
130{
131 CheckComArgOutPointerValid(aName);
132
133 AutoCaller autoCaller(this);
134 CheckComRCReturnRC(autoCaller.rc());
135
136 mName.cloneTo(aName);
137
138 return S_OK;
139}
140
141STDMETHODIMP DHCPServer::COMGETTER(Enabled) (BOOL *aEnabled)
142{
143 CheckComArgOutPointerValid(aEnabled);
144
145 AutoCaller autoCaller(this);
146 CheckComRCReturnRC(autoCaller.rc());
147
148 *aEnabled = m.enabled;
149
150 return S_OK;
151}
152
153STDMETHODIMP DHCPServer::COMSETTER(Enabled) (BOOL aEnabled)
154{
155 AutoCaller autoCaller(this);
156 CheckComRCReturnRC(autoCaller.rc());
157
158 /* VirtualBox::saveSettings() needs a write lock */
159 AutoMultiWriteLock2 alock (mVirtualBox, this);
160
161 m.enabled = aEnabled;
162
163 HRESULT rc = mVirtualBox->saveSettings();
164
165 return rc;
166}
167
168STDMETHODIMP DHCPServer::COMGETTER(IPAddress) (BSTR *aIPAddress)
169{
170 CheckComArgOutPointerValid(aIPAddress);
171
172 AutoCaller autoCaller(this);
173 CheckComRCReturnRC(autoCaller.rc());
174
175 m.IPAddress.cloneTo(aIPAddress);
176
177 return S_OK;
178}
179
180STDMETHODIMP DHCPServer::COMGETTER(NetworkMask) (BSTR *aNetworkMask)
181{
182 CheckComArgOutPointerValid(aNetworkMask);
183
184 AutoCaller autoCaller(this);
185 CheckComRCReturnRC(autoCaller.rc());
186
187 m.networkMask.cloneTo(aNetworkMask);
188
189 return S_OK;
190}
191
192STDMETHODIMP DHCPServer::COMGETTER(LowerIP) (BSTR *aIPAddress)
193{
194 CheckComArgOutPointerValid(aIPAddress);
195
196 AutoCaller autoCaller(this);
197 CheckComRCReturnRC(autoCaller.rc());
198
199 m.lowerIP.cloneTo(aIPAddress);
200
201 return S_OK;
202}
203
204STDMETHODIMP DHCPServer::COMGETTER(UpperIP) (BSTR *aIPAddress)
205{
206 CheckComArgOutPointerValid(aIPAddress);
207
208 AutoCaller autoCaller(this);
209 CheckComRCReturnRC(autoCaller.rc());
210
211 m.upperIP.cloneTo(aIPAddress);
212
213 return S_OK;
214}
215
216STDMETHODIMP DHCPServer::SetConfiguration (IN_BSTR aIPAddress, IN_BSTR aNetworkMask, IN_BSTR aLowerIP, IN_BSTR aUpperIP)
217{
218 AssertReturn(aIPAddress != NULL, E_INVALIDARG);
219 AssertReturn(aNetworkMask != NULL, E_INVALIDARG);
220 AssertReturn(aLowerIP != NULL, E_INVALIDARG);
221 AssertReturn(aUpperIP != NULL, E_INVALIDARG);
222
223 AutoCaller autoCaller(this);
224 CheckComRCReturnRC(autoCaller.rc());
225
226 /* VirtualBox::saveSettings() needs a write lock */
227 AutoMultiWriteLock2 alock (mVirtualBox, this);
228
229 m.IPAddress = aIPAddress;
230 m.networkMask = aNetworkMask;
231 m.lowerIP = aLowerIP;
232 m.upperIP = aUpperIP;
233
234 return mVirtualBox->saveSettings();
235}
236
237STDMETHODIMP DHCPServer::Start(IN_BSTR aNetworkName, IN_BSTR aTrunkName, IN_BSTR aTrunkType)
238{
239 /* Silently ignore attepmts to run disabled servers. */
240 if (!m.enabled)
241 return S_OK;
242
243 m.dhcp.setOption(DHCPCFG_NETNAME, Utf8Str(aNetworkName), true);
244 Bstr tmp(aTrunkName);
245 if (!tmp.isEmpty())
246 m.dhcp.setOption(DHCPCFG_TRUNKNAME, Utf8Str(tmp), true);
247 m.dhcp.setOption(DHCPCFG_TRUNKTYPE, Utf8Str(aTrunkType), true);
248 //temporary hack for testing
249 // DHCPCFG_NAME
250 char strMAC[13];
251 Guid guid;
252 guid.create();
253 RTStrPrintf (strMAC, sizeof(strMAC), "080027%02X%02X%02X",
254 guid.ptr()->au8[0], guid.ptr()->au8[1], guid.ptr()->au8[2]);
255 m.dhcp.setOption(DHCPCFG_MACADDRESS, strMAC, true);
256 m.dhcp.setOption(DHCPCFG_IPADDRESS, Utf8Str(m.IPAddress), true);
257 // DHCPCFG_LEASEDB,
258 // DHCPCFG_VERBOSE,
259 // DHCPCFG_GATEWAY,
260 m.dhcp.setOption(DHCPCFG_LOWERIP, Utf8Str(m.lowerIP), true);
261 m.dhcp.setOption(DHCPCFG_UPPERIP, Utf8Str(m.upperIP), true);
262 m.dhcp.setOption(DHCPCFG_NETMASK, Utf8Str(m.networkMask), true);
263
264 // DHCPCFG_HELP,
265 // DHCPCFG_VERSION,
266 // DHCPCFG_NOTOPT_MAXVAL
267 m.dhcp.setOption(DHCPCFG_BEGINCONFIG, "", true);
268
269 return RT_FAILURE(m.dhcp.start()) ? E_FAIL : S_OK;
270 //m.dhcp.detachFromServer(); /* need to do this to avoid server shutdown on runner destruction */
271}
272
273STDMETHODIMP DHCPServer::Stop (void)
274{
275 return RT_FAILURE(m.dhcp.stop()) ? E_FAIL : S_OK;
276}
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