VirtualBox

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

Last change on this file since 25275 was 24879, checked in by vboxsync, 14 years ago

Frontends/VBoxManage: eliminate redundant code when using showProgress()

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 10.4 KB
Line 
1/* $Id: VBoxManageHostonly.cpp 24879 2009-11-23 16:34:12Z 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 rc = showProgress(progress);
74 *pcProcessed = index - iStart;
75 if (FAILED(rc))
76 {
77 com::ProgressErrorInfo info(progress);
78 if (info.isBasicAvailable())
79 RTPrintf("Error: failed to create the host-only adapter. Error message: %lS\n", info.getText().raw());
80 else
81 RTPrintf("Error: failed to create the host-only adapter. No error message available, HRESULT code: 0x%x\n", rc);
82
83 return 1;
84 }
85
86 Bstr name;
87 CHECK_ERROR(hif, COMGETTER(Name) (name.asOutParam()));
88
89 RTPrintf("Interface '%lS' was successfully created\n", name.raw());
90
91 return 0;
92}
93
94static int handleRemove(HandlerArg *a, int iStart, int *pcProcessed)
95{
96 if (a->argc - iStart < 1)
97 return errorSyntax(USAGE_HOSTONLYIFS, "Not enough parameters");
98
99 int index = iStart;
100 HRESULT rc;
101
102 Bstr name(a->argv[iStart]);
103 index++;
104
105 ComPtr<IHost> host;
106 CHECK_ERROR(a->virtualBox, COMGETTER(Host)(host.asOutParam()));
107
108 ComPtr<IHostNetworkInterface> hif;
109 CHECK_ERROR(host, FindHostNetworkInterfaceByName(name, hif.asOutParam()));
110
111 Bstr guid;
112 CHECK_ERROR(hif, COMGETTER(Id)(guid.asOutParam()));
113
114 ComPtr<IProgress> progress;
115 CHECK_ERROR(host, RemoveHostOnlyNetworkInterface (guid, progress.asOutParam()));
116
117 rc = showProgress(progress);
118 *pcProcessed = index - iStart;
119 if (FAILED(rc))
120 {
121 com::ProgressErrorInfo info(progress);
122 if (info.isBasicAvailable())
123 RTPrintf("Error: failed to remove the host-only adapter. Error message: %lS\n", info.getText().raw());
124 else
125 RTPrintf("Error: failed to remove the host-only adapter. No error message available, HRESULT code: 0x%x\n", rc);
126
127 return 1;
128 }
129
130 return 0;
131}
132#endif
133
134static const RTGETOPTDEF g_aHostOnlyIPOptions[]
135 = {
136 { "--dhcp", 'd', RTGETOPT_REQ_NOTHING },
137 { "-dhcp", 'd', RTGETOPT_REQ_NOTHING }, // deprecated
138 { "--ip", 'a', RTGETOPT_REQ_STRING },
139 { "-ip", 'a', RTGETOPT_REQ_STRING }, // deprecated
140 { "--netmask", 'm', RTGETOPT_REQ_STRING },
141 { "-netmask", 'm', RTGETOPT_REQ_STRING }, // deprecated
142 { "--ipv6", 'b', RTGETOPT_REQ_STRING },
143 { "-ipv6", 'b', RTGETOPT_REQ_STRING }, // deprecated
144 { "--netmasklengthv6", 'l', RTGETOPT_REQ_UINT8 },
145 { "-netmasklengthv6", 'l', RTGETOPT_REQ_UINT8 } // deprecated
146 };
147
148static int handleIpconfig(HandlerArg *a, int iStart, int *pcProcessed)
149{
150 if (a->argc - iStart < 2)
151 return errorSyntax(USAGE_HOSTONLYIFS, "Not enough parameters");
152
153 int index = iStart;
154 HRESULT rc;
155
156 Bstr name(a->argv[iStart]);
157 index++;
158
159 bool bDhcp = false;
160 bool bNetmasklengthv6 = false;
161 uint32_t uNetmasklengthv6 = (uint32_t)-1;
162 const char *pIpv6 = NULL;
163 const char *pIp = NULL;
164 const char *pNetmask = NULL;
165
166 int c;
167 RTGETOPTUNION ValueUnion;
168 RTGETOPTSTATE GetState;
169 RTGetOptInit(&GetState,
170 a->argc,
171 a->argv,
172 g_aHostOnlyIPOptions,
173 RT_ELEMENTS(g_aHostOnlyIPOptions),
174 index,
175 0 /* fFlags */);
176 while ((c = RTGetOpt(&GetState, &ValueUnion)))
177 {
178 switch (c)
179 {
180 case 'd': // --dhcp
181 if (bDhcp)
182 return errorSyntax(USAGE_HOSTONLYIFS, "You can only specify --dhcp once.");
183 else
184 bDhcp = true;
185 break;
186 case 'a': // --ip
187 if(pIp)
188 return errorSyntax(USAGE_HOSTONLYIFS, "You can only specify --ip once.");
189 else
190 pIp = ValueUnion.psz;
191 break;
192 case 'm': // --netmask
193 if(pNetmask)
194 return errorSyntax(USAGE_HOSTONLYIFS, "You can only specify --netmask once.");
195 else
196 pNetmask = ValueUnion.psz;
197 break;
198 case 'b': // --ipv6
199 if(pIpv6)
200 return errorSyntax(USAGE_HOSTONLYIFS, "You can only specify --ipv6 once.");
201 else
202 pIpv6 = ValueUnion.psz;
203 break;
204 case 'l': // --netmasklengthv6
205 if(bNetmasklengthv6)
206 return errorSyntax(USAGE_HOSTONLYIFS, "You can only specify --netmasklengthv6 once.");
207 else
208 {
209 bNetmasklengthv6 = true;
210 uNetmasklengthv6 = ValueUnion.u8;
211 }
212 break;
213 case VINF_GETOPT_NOT_OPTION:
214 return errorSyntax(USAGE_HOSTONLYIFS, "unhandled parameter: %s", ValueUnion.psz);
215 break;
216 default:
217 if (c > 0)
218 {
219 if (RT_C_IS_GRAPH(c))
220 return errorSyntax(USAGE_HOSTONLYIFS, "unhandled option: -%c", c);
221 else
222 return errorSyntax(USAGE_HOSTONLYIFS, "unhandled option: %i", c);
223 }
224 else if (c == VERR_GETOPT_UNKNOWN_OPTION)
225 return errorSyntax(USAGE_HOSTONLYIFS, "unknown option: %s", ValueUnion.psz);
226 else if (ValueUnion.pDef)
227 return errorSyntax(USAGE_HOSTONLYIFS, "%s: %Rrs", ValueUnion.pDef->pszLong, c);
228 else
229 return errorSyntax(USAGE_HOSTONLYIFS, "%Rrs", c);
230 }
231 }
232
233 /* parameter sanity check */
234 if (bDhcp && (bNetmasklengthv6 || pIpv6 || pIp || pNetmask))
235 return errorSyntax(USAGE_HOSTONLYIFS, "You can not use --dhcp with static ip configuration parameters: --ip, --netmask, --ipv6 and --netmasklengthv6.");
236 if((pIp || pNetmask) && (bNetmasklengthv6 || pIpv6))
237 return errorSyntax(USAGE_HOSTONLYIFS, "You can not use ipv4 configuration (--ip and --netmask) with ipv6 (--ipv6 and --netmasklengthv6) simultaneously.");
238
239 ComPtr<IHost> host;
240 CHECK_ERROR(a->virtualBox, COMGETTER(Host)(host.asOutParam()));
241
242 ComPtr<IHostNetworkInterface> hif;
243 CHECK_ERROR(host, FindHostNetworkInterfaceByName(name, hif.asOutParam()));
244
245 if (FAILED(rc))
246 return errorArgument("could not find interface '%s'", a->argv[iStart]);
247
248 if (bDhcp)
249 {
250 CHECK_ERROR(hif, EnableDynamicIpConfig ());
251 }
252 else if (pIp)
253 {
254 if (!pNetmask)
255 pNetmask = "255.255.255.0"; /* ?? */
256
257 CHECK_ERROR(hif, EnableStaticIpConfig(Bstr(pIp), Bstr(pNetmask)));
258 }
259 else if (pIpv6)
260 {
261 if (uNetmasklengthv6 == (uint32_t)-1)
262 uNetmasklengthv6 = 64; /* ?? */
263
264 BOOL bIpV6Supported;
265 CHECK_ERROR(hif, COMGETTER(IPV6Supported)(&bIpV6Supported));
266 if (!bIpV6Supported)
267 {
268 RTPrintf("IPv6 setting is not supported for this adapter\n");
269 return 1;
270 }
271
272
273 Bstr ipv6str(pIpv6);
274 CHECK_ERROR(hif, EnableStaticIpConfigV6(ipv6str, (ULONG)uNetmasklengthv6));
275 }
276 else
277 {
278 return errorSyntax(USAGE_HOSTONLYIFS, "neither -dhcp nor -ip nor -ipv6 was spcfified");
279 }
280
281 return 0;
282}
283
284
285int handleHostonlyIf(HandlerArg *a)
286{
287 int result = 0;
288 if (a->argc < 1)
289 return errorSyntax(USAGE_HOSTONLYIFS, "Not enough parameters");
290
291 for (int i = 0; i < a->argc; i++)
292 {
293 if (strcmp(a->argv[i], "ipconfig") == 0)
294 {
295 int cProcessed;
296 result = handleIpconfig(a, i+1, &cProcessed);
297 break;
298// if(!rc)
299// i+= cProcessed;
300// else
301// break;
302 }
303#if defined(RT_OS_WINDOWS) && defined(VBOX_WITH_NETFLT)
304 else if (strcmp(a->argv[i], "create") == 0)
305 {
306 int cProcessed;
307 result = handleCreate(a, i+1, &cProcessed);
308 if(!result)
309 i+= cProcessed;
310 else
311 break;
312 }
313 else if (strcmp(a->argv[i], "remove") == 0)
314 {
315 int cProcessed;
316 result = handleRemove(a, i+1, &cProcessed);
317 if(!result)
318 i+= cProcessed;
319 else
320 break;
321 }
322#endif
323 else
324 {
325 result = errorSyntax(USAGE_HOSTONLYIFS, "Invalid parameter '%s'", Utf8Str(a->argv[i]).raw());
326 break;
327 }
328 }
329
330 return result;
331}
332
333#endif /* !VBOX_ONLY_DOCS */
Note: See TracBrowser for help on using the repository browser.

© 2023 Oracle
ContactPrivacy policyTerms of Use