VirtualBox

source: vbox/trunk/src/VBox/Frontends/VBoxManage/VBoxManageHostonly.cpp@ 20928

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

API/others: Renamed IConsole::discardSavedState to IConsole::forgetSavedState, added parameter. Deleted old IConsole::powerDown, renamed IConsole::powerDownAsync to IConsole::powerDown (as promised for 2.1). Implemented perl sample code for registering a hard disk. Cleaned up constant formatting in the API docs. Updated SDK changelog. Renamed com/errorprint2.h to com/errorprint.h, added a few assertion variants. Eliminated com/errorprint_legacy.h. Adjusted all files using the affected headers and APIs. Renamed tstHeadless2 to tstHeadless.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 10.6 KB
Line 
1/* $Id: VBoxManageHostonly.cpp 20928 2009-06-25 11:53:37Z vboxsync $ */
2/** @file
3 * VBoxManage - Implementation of hostonlyif command.
4 */
5
6/*
7 * Copyright (C) 2006-2009 Sun Microsystems, Inc.
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 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
18 * Clara, CA 95054 USA or visit http://www.sun.com if you need
19 * additional information or have any questions.
20 */
21
22/*******************************************************************************
23* Header Files *
24*******************************************************************************/
25#ifndef VBOX_ONLY_DOCS
26#include <VBox/com/com.h>
27#include <VBox/com/array.h>
28#include <VBox/com/ErrorInfo.h>
29#include <VBox/com/errorprint.h>
30#include <VBox/com/EventQueue.h>
31
32#include <VBox/com/VirtualBox.h>
33
34#include <vector>
35#include <list>
36#endif /* !VBOX_ONLY_DOCS */
37
38#include <iprt/cidr.h>
39#include <iprt/param.h>
40#include <iprt/path.h>
41#include <iprt/stream.h>
42#include <iprt/string.h>
43#include <iprt/net.h>
44#include <iprt/getopt.h>
45#include <iprt/ctype.h>
46
47#include <VBox/log.h>
48
49#include "VBoxManage.h"
50
51#ifndef VBOX_ONLY_DOCS
52using namespace com;
53
54#if defined(RT_OS_WINDOWS) && defined(VBOX_WITH_NETFLT)
55static int handleCreate(HandlerArg *a, int iStart, int *pcProcessed)
56{
57// if (a->argc - iStart < 1)
58// return errorSyntax(USAGE_HOSTONLYIFS, "Not enough parameters");
59
60 int index = iStart;
61 HRESULT rc;
62// Bstr name(a->argv[iStart]);
63// index++;
64
65 ComPtr<IHost> host;
66 CHECK_ERROR(a->virtualBox, COMGETTER(Host)(host.asOutParam()));
67
68 ComPtr<IHostNetworkInterface> hif;
69 ComPtr<IProgress> progress;
70
71 CHECK_ERROR(host, CreateHostOnlyNetworkInterface (hif.asOutParam(), progress.asOutParam()));
72
73 showProgress(progress);
74
75 HRESULT hr;
76 CHECK_ERROR(progress, COMGETTER(ResultCode) (&hr));
77
78 *pcProcessed = index - iStart;
79
80 if(FAILED(hr))
81 {
82 com::ProgressErrorInfo info(progress);
83 if (info.isBasicAvailable())
84 RTPrintf("Error: failed to create the host-only adapter. Error message: %lS\n", info.getText().raw());
85 else
86 RTPrintf("Error: failed to create the host-only adapter. No error message available, HRESULT code: 0x%x\n", hr);
87
88 return 1;
89 }
90
91 Bstr name;
92 CHECK_ERROR(hif, COMGETTER(Name) (name.asOutParam()));
93
94 RTPrintf("Interface '%lS' was successfully created\n", name.raw());
95
96 return 0;
97}
98
99static int handleRemove(HandlerArg *a, int iStart, int *pcProcessed)
100{
101 if (a->argc - iStart < 1)
102 return errorSyntax(USAGE_HOSTONLYIFS, "Not enough parameters");
103
104 int index = iStart;
105 HRESULT rc;
106
107 Bstr name(a->argv[iStart]);
108 index++;
109
110 ComPtr<IHost> host;
111 CHECK_ERROR(a->virtualBox, COMGETTER(Host)(host.asOutParam()));
112
113 ComPtr<IHostNetworkInterface> hif;
114 CHECK_ERROR(host, FindHostNetworkInterfaceByName(name, hif.asOutParam()));
115
116 Bstr guid;
117 CHECK_ERROR(hif, COMGETTER(Id)(guid.asOutParam()));
118
119 ComPtr<IProgress> progress;
120 CHECK_ERROR(host, RemoveHostOnlyNetworkInterface (guid, hif.asOutParam(),progress.asOutParam()));
121
122 showProgress(progress);
123
124 HRESULT hr;
125 CHECK_ERROR(progress, COMGETTER(ResultCode) (&hr));
126
127 *pcProcessed = index - iStart;
128
129 if(FAILED(hr))
130 {
131 com::ProgressErrorInfo info(progress);
132 if (info.isBasicAvailable())
133 RTPrintf("Error: failed to remove the host-only adapter. Error message: %lS\n", info.getText().raw());
134 else
135 RTPrintf("Error: failed to remove the host-only adapter. No error message available, HRESULT code: 0x%x\n", hr);
136
137 return 1;
138 }
139
140 return 0;
141}
142#endif
143
144static const RTGETOPTDEF g_aHostOnlyIPOptions[]
145 = {
146 { "--dhcp", 'd', RTGETOPT_REQ_NOTHING },
147 { "-dhcp", 'd', RTGETOPT_REQ_NOTHING }, // deprecated
148 { "--ip", 'a', RTGETOPT_REQ_STRING },
149 { "-ip", 'a', RTGETOPT_REQ_STRING }, // deprecated
150 { "--netmask", 'm', RTGETOPT_REQ_STRING },
151 { "-netmask", 'm', RTGETOPT_REQ_STRING }, // deprecated
152 { "--ipv6", 'b', RTGETOPT_REQ_STRING },
153 { "-ipv6", 'b', RTGETOPT_REQ_STRING }, // deprecated
154 { "--netmasklengthv6", 'l', RTGETOPT_REQ_UINT8 },
155 { "-netmasklengthv6", 'l', RTGETOPT_REQ_UINT8 } // deprecated
156 };
157
158static int handleIpconfig(HandlerArg *a, int iStart, int *pcProcessed)
159{
160 if (a->argc - iStart < 2)
161 return errorSyntax(USAGE_HOSTONLYIFS, "Not enough parameters");
162
163 int index = iStart;
164 HRESULT rc;
165
166 Bstr name(a->argv[iStart]);
167 index++;
168
169 bool bDhcp = false;
170 bool bNetmasklengthv6 = false;
171 uint32_t uNetmasklengthv6 = (uint32_t)-1;
172 const char *pIpv6 = NULL;
173 const char *pIp = NULL;
174 const char *pNetmask = NULL;
175
176 int c;
177 RTGETOPTUNION ValueUnion;
178 RTGETOPTSTATE GetState;
179 RTGetOptInit(&GetState,
180 a->argc,
181 a->argv,
182 g_aHostOnlyIPOptions,
183 RT_ELEMENTS(g_aHostOnlyIPOptions),
184 index,
185 0 /* fFlags */);
186 while ((c = RTGetOpt(&GetState, &ValueUnion)))
187 {
188 switch (c)
189 {
190 case 'd': // --dhcp
191 if (bDhcp)
192 return errorSyntax(USAGE_HOSTONLYIFS, "You can only specify --dhcp once.");
193 else
194 bDhcp = true;
195 break;
196 case 'a': // --ip
197 if(pIp)
198 return errorSyntax(USAGE_HOSTONLYIFS, "You can only specify --ip once.");
199 else
200 pIp = ValueUnion.psz;
201 break;
202 case 'm': // --netmask
203 if(pNetmask)
204 return errorSyntax(USAGE_HOSTONLYIFS, "You can only specify --netmask once.");
205 else
206 pNetmask = ValueUnion.psz;
207 break;
208 case 'b': // --ipv6
209 if(pIpv6)
210 return errorSyntax(USAGE_HOSTONLYIFS, "You can only specify --ipv6 once.");
211 else
212 pIpv6 = ValueUnion.psz;
213 break;
214 case 'l': // --netmasklengthv6
215 if(bNetmasklengthv6)
216 return errorSyntax(USAGE_HOSTONLYIFS, "You can only specify --netmasklengthv6 once.");
217 else
218 {
219 bNetmasklengthv6 = true;
220 uNetmasklengthv6 = ValueUnion.u8;
221 }
222 break;
223 case VINF_GETOPT_NOT_OPTION:
224 return errorSyntax(USAGE_HOSTONLYIFS, "unhandled parameter: %s", ValueUnion.psz);
225 break;
226 default:
227 if (c > 0)
228 {
229 if (RT_C_IS_GRAPH(c))
230 return errorSyntax(USAGE_HOSTONLYIFS, "unhandled option: -%c", c);
231 else
232 return errorSyntax(USAGE_HOSTONLYIFS, "unhandled option: %i", c);
233 }
234 else if (c == VERR_GETOPT_UNKNOWN_OPTION)
235 return errorSyntax(USAGE_HOSTONLYIFS, "unknown option: %s", ValueUnion.psz);
236 else if (ValueUnion.pDef)
237 return errorSyntax(USAGE_HOSTONLYIFS, "%s: %Rrs", ValueUnion.pDef->pszLong, c);
238 else
239 return errorSyntax(USAGE_HOSTONLYIFS, "%Rrs", c);
240 }
241 }
242
243 /* parameter sanity check */
244 if (bDhcp && (bNetmasklengthv6 || pIpv6 || pIp || pNetmask))
245 return errorSyntax(USAGE_HOSTONLYIFS, "You can not use --dhcp with static ip configuration parameters: --ip, --netmask, --ipv6 and --netmasklengthv6.");
246 if((pIp || pNetmask) && (bNetmasklengthv6 || pIpv6))
247 return errorSyntax(USAGE_HOSTONLYIFS, "You can not use ipv4 configuration (--ip and --netmask) with ipv6 (--ipv6 and --netmasklengthv6) simultaneously.");
248
249 ComPtr<IHost> host;
250 CHECK_ERROR(a->virtualBox, COMGETTER(Host)(host.asOutParam()));
251
252 ComPtr<IHostNetworkInterface> hif;
253 CHECK_ERROR(host, FindHostNetworkInterfaceByName(name, hif.asOutParam()));
254
255 if (FAILED(rc))
256 return errorArgument("could not find interface '%s'", a->argv[iStart]);
257
258 if (bDhcp)
259 {
260 CHECK_ERROR(hif, EnableDynamicIpConfig ());
261 }
262 else if (pIp)
263 {
264 if (!pNetmask)
265 pNetmask = "255.255.255.0"; /* ?? */
266
267 CHECK_ERROR(hif, EnableStaticIpConfig(Bstr(pIp), Bstr(pNetmask)));
268 }
269 else if (pIpv6)
270 {
271 if (uNetmasklengthv6 == (uint32_t)-1)
272 uNetmasklengthv6 = 64; /* ?? */
273
274 BOOL bIpV6Supported;
275 CHECK_ERROR(hif, COMGETTER(IPV6Supported)(&bIpV6Supported));
276 if (!bIpV6Supported)
277 {
278 RTPrintf("IPv6 setting is not supported for this adapter\n");
279 return 1;
280 }
281
282
283 Bstr ipv6str(pIpv6);
284 CHECK_ERROR(hif, EnableStaticIpConfigV6(ipv6str, (ULONG)uNetmasklengthv6));
285 }
286 else
287 {
288 return errorSyntax(USAGE_HOSTONLYIFS, "neither -dhcp nor -ip nor -ipv6 was spcfified");
289 }
290
291 return 0;
292}
293
294
295int handleHostonlyIf(HandlerArg *a)
296{
297 int result = 0;
298 if (a->argc < 1)
299 return errorSyntax(USAGE_HOSTONLYIFS, "Not enough parameters");
300
301 for (int i = 0; i < a->argc; i++)
302 {
303 if (strcmp(a->argv[i], "ipconfig") == 0)
304 {
305 int cProcessed;
306 result = handleIpconfig(a, i+1, &cProcessed);
307 break;
308// if(!rc)
309// i+= cProcessed;
310// else
311// break;
312 }
313#if defined(RT_OS_WINDOWS) && defined(VBOX_WITH_NETFLT)
314 else if (strcmp(a->argv[i], "create") == 0)
315 {
316 int cProcessed;
317 result = handleCreate(a, i+1, &cProcessed);
318 if(!result)
319 i+= cProcessed;
320 else
321 break;
322 }
323 else if (strcmp(a->argv[i], "remove") == 0)
324 {
325 int cProcessed;
326 result = handleRemove(a, i+1, &cProcessed);
327 if(!result)
328 i+= cProcessed;
329 else
330 break;
331 }
332#endif
333 else
334 {
335 result = errorSyntax(USAGE_HOSTONLYIFS, "Invalid parameter '%s'", Utf8Str(a->argv[i]).raw());
336 break;
337 }
338 }
339
340 return result;
341}
342
343#endif /* !VBOX_ONLY_DOCS */
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