VirtualBox

source: vbox/trunk/src/VBox/Frontends/VBoxManage/VBoxManageModifyVM.cpp@ 24863

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

VBoxManageModifyVM: Merged the oss code.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 67.2 KB
Line 
1/* $Id: VBoxManageModifyVM.cpp 24863 2009-11-23 12:12:21Z vboxsync $ */
2/** @file
3 * VBoxManage - Implementation of modifyvm 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/getopt.h>
44#include <VBox/log.h>
45
46#include "VBoxManage.h"
47
48#ifndef VBOX_ONLY_DOCS
49using namespace com;
50
51
52/** @todo refine this after HDD changes; MSC 8.0/64 has trouble with handleModifyVM. */
53#if defined(_MSC_VER)
54# pragma optimize("g", off)
55#endif
56
57enum
58{
59 MODIFYVM_NAME = 1000,
60 MODIFYVM_OSTYPE,
61 MODIFYVM_MEMORY,
62 MODIFYVM_VRAM,
63 MODIFYVM_FIRMWARE,
64 MODIFYVM_ACPI,
65 MODIFYVM_IOAPIC,
66 MODIFYVM_PAE,
67 MODIFYVM_SYNTHCPU,
68 MODIFYVM_HWVIRTEX,
69 MODIFYVM_HWVIRTEXEXCLUSIVE,
70 MODIFYVM_NESTEDPAGING,
71 MODIFYVM_VTXVPID,
72 MODIFYVM_CPUS,
73 MODIFYVM_SETCPUID,
74 MODIFYVM_DELCPUID,
75 MODIFYVM_DELALLCPUID,
76 MODIFYVM_MONITORCOUNT,
77 MODIFYVM_ACCELERATE3D,
78 MODIFYVM_ACCELERATE2DVIDEO,
79 MODIFYVM_BIOSLOGOFADEIN,
80 MODIFYVM_BIOSLOGOFADEOUT,
81 MODIFYVM_BIOSLOGODISPLAYTIME,
82 MODIFYVM_BIOSLOGOIMAGEPATH,
83 MODIFYVM_BIOSBOOTMENU,
84 MODIFYVM_BIOSSYSTEMTIMEOFFSET,
85 MODIFYVM_BIOSPXEDEBUG,
86 MODIFYVM_BOOT,
87 MODIFYVM_HDA, // deprecated
88 MODIFYVM_HDB, // deprecated
89 MODIFYVM_HDD, // deprecated
90 MODIFYVM_IDECONTROLLER, // deprecated
91 MODIFYVM_SATAIDEEMULATION, // deprecated
92 MODIFYVM_SATAPORTCOUNT, // deprecated
93 MODIFYVM_SATAPORT, // deprecated
94 MODIFYVM_SATA, // deprecated
95 MODIFYVM_SCSIPORT, // deprecated
96 MODIFYVM_SCSITYPE, // deprecated
97 MODIFYVM_SCSI, // deprecated
98 MODIFYVM_DVDPASSTHROUGH, // deprecated
99 MODIFYVM_DVD, // deprecated
100 MODIFYVM_FLOPPY, // deprecated
101 MODIFYVM_NICTRACEFILE,
102 MODIFYVM_NICTRACE,
103 MODIFYVM_NICTYPE,
104 MODIFYVM_NICSPEED,
105 MODIFYVM_NIC,
106 MODIFYVM_CABLECONNECTED,
107 MODIFYVM_BRIDGEADAPTER,
108 MODIFYVM_HOSTONLYADAPTER,
109 MODIFYVM_INTNET,
110 MODIFYVM_NATNET,
111 MODIFYVM_MACADDRESS,
112 MODIFYVM_UARTMODE,
113 MODIFYVM_UART,
114 MODIFYVM_GUESTSTATISTICSINTERVAL,
115 MODIFYVM_GUESTMEMORYBALLOON,
116 MODIFYVM_AUDIOCONTROLLER,
117 MODIFYVM_AUDIO,
118 MODIFYVM_CLIPBOARD,
119 MODIFYVM_VRDPPORT,
120 MODIFYVM_VRDPADDRESS,
121 MODIFYVM_VRDPAUTHTYPE,
122 MODIFYVM_VRDPMULTICON,
123 MODIFYVM_VRDPREUSECON,
124 MODIFYVM_VRDP,
125 MODIFYVM_USBEHCI,
126 MODIFYVM_USB,
127 MODIFYVM_SNAPSHOTFOLDER,
128 MODIFYVM_TELEPORTER_ENABLED,
129 MODIFYVM_TELEPORTER_PORT,
130 MODIFYVM_TELEPORTER_ADDRESS,
131 MODIFYVM_TELEPORTER_PASSWORD,
132 MODIFYVM_HARDWARE_UUID
133};
134
135static const RTGETOPTDEF g_aModifyVMOptions[] =
136{
137 { "--name", MODIFYVM_NAME, RTGETOPT_REQ_STRING },
138 { "--ostype", MODIFYVM_OSTYPE, RTGETOPT_REQ_STRING },
139 { "--memory", MODIFYVM_MEMORY, RTGETOPT_REQ_UINT32 },
140 { "--vram", MODIFYVM_VRAM, RTGETOPT_REQ_UINT32 },
141 { "--firmware", MODIFYVM_FIRMWARE, RTGETOPT_REQ_STRING },
142 { "--acpi", MODIFYVM_ACPI, RTGETOPT_REQ_BOOL_ONOFF },
143 { "--ioapic", MODIFYVM_IOAPIC, RTGETOPT_REQ_BOOL_ONOFF },
144 { "--pae", MODIFYVM_PAE, RTGETOPT_REQ_BOOL_ONOFF },
145 { "--synthcpu", MODIFYVM_SYNTHCPU, RTGETOPT_REQ_BOOL_ONOFF },
146 { "--hwvirtex", MODIFYVM_HWVIRTEX, RTGETOPT_REQ_BOOL_ONOFF },
147 { "--hwvirtexexcl", MODIFYVM_HWVIRTEXEXCLUSIVE, RTGETOPT_REQ_BOOL_ONOFF },
148 { "--nestedpaging", MODIFYVM_NESTEDPAGING, RTGETOPT_REQ_BOOL_ONOFF },
149 { "--vtxvpid", MODIFYVM_VTXVPID, RTGETOPT_REQ_BOOL_ONOFF },
150 { "--cpuidset", MODIFYVM_SETCPUID, RTGETOPT_REQ_UINT32 | RTGETOPT_FLAG_HEX},
151 { "--cpuidremove", MODIFYVM_DELCPUID, RTGETOPT_REQ_UINT32 | RTGETOPT_FLAG_HEX},
152 { "--cpuidremoveall", MODIFYVM_DELALLCPUID, RTGETOPT_REQ_NOTHING},
153 { "--cpus", MODIFYVM_CPUS, RTGETOPT_REQ_UINT32 },
154 { "--monitorcount", MODIFYVM_MONITORCOUNT, RTGETOPT_REQ_UINT32 },
155 { "--accelerate3d", MODIFYVM_ACCELERATE3D, RTGETOPT_REQ_BOOL_ONOFF },
156 { "--accelerate2dvideo", MODIFYVM_ACCELERATE2DVIDEO, RTGETOPT_REQ_BOOL_ONOFF },
157 { "--bioslogofadein", MODIFYVM_BIOSLOGOFADEIN, RTGETOPT_REQ_BOOL_ONOFF },
158 { "--bioslogofadeout", MODIFYVM_BIOSLOGOFADEOUT, RTGETOPT_REQ_BOOL_ONOFF },
159 { "--bioslogodisplaytime", MODIFYVM_BIOSLOGODISPLAYTIME, RTGETOPT_REQ_UINT64 },
160 { "--bioslogoimagepath", MODIFYVM_BIOSLOGOIMAGEPATH, RTGETOPT_REQ_STRING },
161 { "--biosbootmenu", MODIFYVM_BIOSBOOTMENU, RTGETOPT_REQ_STRING },
162 { "--biossystemtimeoffset", MODIFYVM_BIOSSYSTEMTIMEOFFSET, RTGETOPT_REQ_UINT64 },
163 { "--biospxedebug", MODIFYVM_BIOSPXEDEBUG, RTGETOPT_REQ_BOOL_ONOFF },
164 { "--boot", MODIFYVM_BOOT, RTGETOPT_REQ_STRING | RTGETOPT_FLAG_INDEX },
165 { "--hda", MODIFYVM_HDA, RTGETOPT_REQ_STRING },
166 { "--hdb", MODIFYVM_HDB, RTGETOPT_REQ_STRING },
167 { "--hdd", MODIFYVM_HDD, RTGETOPT_REQ_STRING },
168 { "--idecontroller", MODIFYVM_IDECONTROLLER, RTGETOPT_REQ_STRING },
169 { "--sataideemulation", MODIFYVM_SATAIDEEMULATION, RTGETOPT_REQ_UINT32 | RTGETOPT_FLAG_INDEX },
170 { "--sataportcount", MODIFYVM_SATAPORTCOUNT, RTGETOPT_REQ_UINT32 },
171 { "--sataport", MODIFYVM_SATAPORT, RTGETOPT_REQ_STRING | RTGETOPT_FLAG_INDEX },
172 { "--sata", MODIFYVM_SATA, RTGETOPT_REQ_STRING },
173 { "--scsiport", MODIFYVM_SCSIPORT, RTGETOPT_REQ_STRING | RTGETOPT_FLAG_INDEX },
174 { "--scsitype", MODIFYVM_SCSITYPE, RTGETOPT_REQ_STRING },
175 { "--scsi", MODIFYVM_SCSI, RTGETOPT_REQ_STRING },
176 { "--dvdpassthrough", MODIFYVM_DVDPASSTHROUGH, RTGETOPT_REQ_STRING },
177 { "--dvd", MODIFYVM_DVD, RTGETOPT_REQ_STRING },
178 { "--floppy", MODIFYVM_FLOPPY, RTGETOPT_REQ_STRING },
179 { "--nictracefile", MODIFYVM_NICTRACEFILE, RTGETOPT_REQ_STRING | RTGETOPT_FLAG_INDEX },
180 { "--nictrace", MODIFYVM_NICTRACE, RTGETOPT_REQ_BOOL_ONOFF | RTGETOPT_FLAG_INDEX },
181 { "--nictype", MODIFYVM_NICTYPE, RTGETOPT_REQ_STRING | RTGETOPT_FLAG_INDEX },
182 { "--nicspeed", MODIFYVM_NICSPEED, RTGETOPT_REQ_UINT32 | RTGETOPT_FLAG_INDEX },
183 { "--nic", MODIFYVM_NIC, RTGETOPT_REQ_STRING | RTGETOPT_FLAG_INDEX },
184 { "--cableconnected", MODIFYVM_CABLECONNECTED, RTGETOPT_REQ_BOOL_ONOFF | RTGETOPT_FLAG_INDEX },
185 { "--bridgeadapter", MODIFYVM_BRIDGEADAPTER, RTGETOPT_REQ_STRING | RTGETOPT_FLAG_INDEX },
186 { "--hostonlyadapter", MODIFYVM_HOSTONLYADAPTER, RTGETOPT_REQ_STRING | RTGETOPT_FLAG_INDEX },
187 { "--intnet", MODIFYVM_INTNET, RTGETOPT_REQ_STRING | RTGETOPT_FLAG_INDEX },
188 { "--natnet", MODIFYVM_NATNET, RTGETOPT_REQ_STRING | RTGETOPT_FLAG_INDEX },
189 { "--macaddress", MODIFYVM_MACADDRESS, RTGETOPT_REQ_STRING | RTGETOPT_FLAG_INDEX },
190 { "--uartmode", MODIFYVM_UARTMODE, RTGETOPT_REQ_STRING | RTGETOPT_FLAG_INDEX },
191 { "--uart", MODIFYVM_UART, RTGETOPT_REQ_STRING | RTGETOPT_FLAG_INDEX },
192 { "--gueststatisticsinterval", MODIFYVM_GUESTSTATISTICSINTERVAL, RTGETOPT_REQ_UINT32 },
193 { "--guestmemoryballoon", MODIFYVM_GUESTMEMORYBALLOON, RTGETOPT_REQ_UINT32 },
194 { "--audiocontroller", MODIFYVM_AUDIOCONTROLLER, RTGETOPT_REQ_STRING },
195 { "--audio", MODIFYVM_AUDIO, RTGETOPT_REQ_STRING },
196 { "--clipboard", MODIFYVM_CLIPBOARD, RTGETOPT_REQ_STRING },
197 { "--vrdpport", MODIFYVM_VRDPPORT, RTGETOPT_REQ_STRING },
198 { "--vrdpaddress", MODIFYVM_VRDPADDRESS, RTGETOPT_REQ_STRING },
199 { "--vrdpauthtype", MODIFYVM_VRDPAUTHTYPE, RTGETOPT_REQ_STRING },
200 { "--vrdpmulticon", MODIFYVM_VRDPMULTICON, RTGETOPT_REQ_BOOL_ONOFF },
201 { "--vrdpreusecon", MODIFYVM_VRDPREUSECON, RTGETOPT_REQ_BOOL_ONOFF },
202 { "--vrdp", MODIFYVM_VRDP, RTGETOPT_REQ_BOOL_ONOFF },
203 { "--usbehci", MODIFYVM_USBEHCI, RTGETOPT_REQ_BOOL_ONOFF },
204 { "--usb", MODIFYVM_USB, RTGETOPT_REQ_BOOL_ONOFF },
205 { "--snapshotfolder", MODIFYVM_SNAPSHOTFOLDER, RTGETOPT_REQ_STRING },
206 { "--teleporterenabled", MODIFYVM_TELEPORTER_ENABLED, RTGETOPT_REQ_BOOL_ONOFF },
207 { "--teleporterport", MODIFYVM_TELEPORTER_PORT, RTGETOPT_REQ_UINT32 },
208 { "--teleporteraddress", MODIFYVM_TELEPORTER_ADDRESS, RTGETOPT_REQ_STRING },
209 { "--teleporterpassword", MODIFYVM_TELEPORTER_PASSWORD, RTGETOPT_REQ_STRING },
210 { "--hardwareuuid", MODIFYVM_HARDWARE_UUID, RTGETOPT_REQ_STRING },
211};
212
213int handleModifyVM(HandlerArg *a)
214{
215 int c;
216 HRESULT rc;
217 Bstr name;
218 Bstr machineuuid (a->argv[0]);
219 RTGETOPTUNION ValueUnion;
220 RTGETOPTSTATE GetOptState;
221 ComPtr <IMachine> machine;
222 ComPtr <IBIOSSettings> biosSettings;
223
224 /* VM ID + at least one parameter. Parameter arguments are checked
225 * individually. */
226 if (a->argc < 2)
227 return errorSyntax(USAGE_MODIFYVM, "Not enough parameters");
228
229 /* Get the number of network adapters */
230 ULONG NetworkAdapterCount = 0;
231 {
232 ComPtr <ISystemProperties> info;
233 CHECK_ERROR_RET(a->virtualBox, COMGETTER(SystemProperties)(info.asOutParam()), 1);
234 CHECK_ERROR_RET(info, COMGETTER(NetworkAdapterCount)(&NetworkAdapterCount), 1);
235 }
236 ULONG SerialPortCount = 0;
237 {
238 ComPtr <ISystemProperties> info;
239 CHECK_ERROR_RET(a->virtualBox, COMGETTER(SystemProperties)(info.asOutParam()), 1);
240 CHECK_ERROR_RET(info, COMGETTER(SerialPortCount)(&SerialPortCount), 1);
241 }
242
243 /* try to find the given machine */
244 if (!Guid(machineuuid).isEmpty())
245 {
246 CHECK_ERROR_RET(a->virtualBox, GetMachine(machineuuid, machine.asOutParam()), 1);
247 }
248 else
249 {
250 CHECK_ERROR_RET(a->virtualBox, FindMachine(Bstr(a->argv[0]), machine.asOutParam()), 1);
251 machine->COMGETTER(Id)(machineuuid.asOutParam());
252 }
253
254 /* open a session for the VM */
255 CHECK_ERROR_RET(a->virtualBox, OpenSession(a->session, machineuuid), 1);
256
257 /* get the mutable session machine */
258 a->session->COMGETTER(Machine)(machine.asOutParam());
259 machine->COMGETTER(BIOSSettings)(biosSettings.asOutParam());
260
261 RTGetOptInit(&GetOptState, a->argc, a->argv, g_aModifyVMOptions,
262 RT_ELEMENTS(g_aModifyVMOptions), 1, 0 /* fFlags */);
263
264 while ( SUCCEEDED (rc)
265 && (c = RTGetOpt(&GetOptState, &ValueUnion)))
266 {
267 switch (c)
268 {
269 case MODIFYVM_NAME:
270 {
271 CHECK_ERROR(machine, COMSETTER(Name)(Bstr(ValueUnion.psz)));
272 break;
273 }
274 case MODIFYVM_OSTYPE:
275 {
276 ComPtr<IGuestOSType> guestOSType;
277 CHECK_ERROR(a->virtualBox, GetGuestOSType(Bstr(ValueUnion.psz), guestOSType.asOutParam()));
278 if (SUCCEEDED(rc) && guestOSType)
279 {
280 CHECK_ERROR(machine, COMSETTER(OSTypeId)(Bstr(ValueUnion.psz)));
281 }
282 else
283 {
284 errorArgument("Invalid guest OS type '%s'", Utf8Str(ValueUnion.psz).raw());
285 rc = E_FAIL;
286 }
287 break;
288 }
289
290 case MODIFYVM_MEMORY:
291 {
292 CHECK_ERROR(machine, COMSETTER(MemorySize)(ValueUnion.u32));
293 break;
294 }
295
296 case MODIFYVM_VRAM:
297 {
298 CHECK_ERROR(machine, COMSETTER(VRAMSize)(ValueUnion.u32));
299 break;
300 }
301
302 case MODIFYVM_FIRMWARE:
303 {
304 if (!strcmp(ValueUnion.psz, "efi"))
305 {
306 CHECK_ERROR(machine, COMSETTER(FirmwareType)(FirmwareType_EFI));
307 }
308 else if (!strcmp(ValueUnion.psz, "efi32"))
309 {
310 CHECK_ERROR(machine, COMSETTER(FirmwareType)(FirmwareType_EFI32));
311 }
312 else if (!strcmp(ValueUnion.psz, "efi64"))
313 {
314 CHECK_ERROR(machine, COMSETTER(FirmwareType)(FirmwareType_EFI64));
315 }
316 else if (!strcmp(ValueUnion.psz, "efidual"))
317 {
318 CHECK_ERROR(machine, COMSETTER(FirmwareType)(FirmwareType_EFIDUAL));
319 }
320 else if (!strcmp(ValueUnion.psz, "bios"))
321 {
322 CHECK_ERROR(machine, COMSETTER(FirmwareType)(FirmwareType_BIOS));
323 }
324 else
325 {
326 errorArgument("Invalid --firmware argument '%s'", ValueUnion.psz);
327 rc = E_FAIL;
328 }
329 break;
330 }
331
332 case MODIFYVM_ACPI:
333 {
334 CHECK_ERROR(biosSettings, COMSETTER(ACPIEnabled)(ValueUnion.f));
335 break;
336 }
337
338 case MODIFYVM_IOAPIC:
339 {
340 CHECK_ERROR(biosSettings, COMSETTER(IOAPICEnabled)(ValueUnion.f));
341 break;
342 }
343
344 case MODIFYVM_PAE:
345 {
346 CHECK_ERROR(machine, SetCpuProperty(CpuPropertyType_PAE, ValueUnion.f));
347 break;
348 }
349
350 case MODIFYVM_SYNTHCPU:
351 {
352 CHECK_ERROR(machine, SetCpuProperty(CpuPropertyType_Synthetic, ValueUnion.f));
353 break;
354 }
355
356 case MODIFYVM_HWVIRTEX:
357 {
358 CHECK_ERROR(machine, SetHWVirtExProperty(HWVirtExPropertyType_Enabled, ValueUnion.f));
359 break;
360 }
361
362 case MODIFYVM_HWVIRTEXEXCLUSIVE:
363 {
364 CHECK_ERROR(machine, SetHWVirtExProperty(HWVirtExPropertyType_Exclusive, ValueUnion.f));
365 break;
366 }
367
368 case MODIFYVM_SETCPUID:
369 {
370 uint32_t id = ValueUnion.u32;
371 uint32_t aValue[4];
372
373 for (unsigned i = 0 ; i < 4 ; i++)
374 {
375 int vrc = RTGetOptFetchValue(&GetOptState, &ValueUnion, RTGETOPT_REQ_UINT32 | RTGETOPT_FLAG_HEX);
376 if (RT_FAILURE(vrc))
377 return errorSyntax(USAGE_MODIFYVM,
378 "Missing or Invalid argument to '%s'",
379 GetOptState.pDef->pszLong);
380 aValue[i] = ValueUnion.u32;
381 }
382 CHECK_ERROR(machine, SetCpuIdLeaf(id, aValue[0], aValue[1], aValue[2], aValue[3]));
383 break;
384 }
385
386 case MODIFYVM_DELCPUID:
387 {
388 CHECK_ERROR(machine, RemoveCpuIdLeaf(ValueUnion.u32));
389 break;
390 }
391
392 case MODIFYVM_DELALLCPUID:
393 {
394 CHECK_ERROR(machine, RemoveAllCpuIdLeafs());
395 break;
396 }
397
398 case MODIFYVM_NESTEDPAGING:
399 {
400 CHECK_ERROR(machine, SetHWVirtExProperty(HWVirtExPropertyType_NestedPaging, ValueUnion.f));
401 break;
402 }
403
404 case MODIFYVM_VTXVPID:
405 {
406 CHECK_ERROR(machine, SetHWVirtExProperty(HWVirtExPropertyType_VPID, ValueUnion.f));
407 break;
408 }
409
410 case MODIFYVM_CPUS:
411 {
412 CHECK_ERROR(machine, COMSETTER(CPUCount)(ValueUnion.u32));
413 break;
414 }
415
416 case MODIFYVM_MONITORCOUNT:
417 {
418 CHECK_ERROR(machine, COMSETTER(MonitorCount)(ValueUnion.u32));
419 break;
420 }
421
422 case MODIFYVM_ACCELERATE3D:
423 {
424 CHECK_ERROR(machine, COMSETTER(Accelerate3DEnabled)(ValueUnion.f));
425 break;
426 }
427
428#ifdef VBOX_WITH_VIDEOHWACCEL
429 case MODIFYVM_ACCELERATE2DVIDEO:
430 {
431 CHECK_ERROR(machine, COMSETTER(Accelerate2DVideoEnabled)(ValueUnion.f));
432 break;
433 }
434#endif
435
436 case MODIFYVM_BIOSLOGOFADEIN:
437 {
438 CHECK_ERROR(biosSettings, COMSETTER(LogoFadeIn)(ValueUnion.f));
439 break;
440 }
441
442 case MODIFYVM_BIOSLOGOFADEOUT:
443 {
444 CHECK_ERROR(biosSettings, COMSETTER(LogoFadeOut)(ValueUnion.f));
445 break;
446 }
447
448 case MODIFYVM_BIOSLOGODISPLAYTIME:
449 {
450 CHECK_ERROR(biosSettings, COMSETTER(LogoDisplayTime)(ValueUnion.u64));
451 break;
452 }
453
454 case MODIFYVM_BIOSLOGOIMAGEPATH:
455 {
456 CHECK_ERROR(biosSettings, COMSETTER(LogoImagePath)(Bstr(ValueUnion.psz)));
457 break;
458 }
459
460 case MODIFYVM_BIOSBOOTMENU:
461 {
462 if (!strcmp(ValueUnion.psz, "disabled"))
463 {
464 CHECK_ERROR(biosSettings, COMSETTER(BootMenuMode)(BIOSBootMenuMode_Disabled));
465 }
466 else if (!strcmp(ValueUnion.psz, "menuonly"))
467 {
468 CHECK_ERROR(biosSettings, COMSETTER(BootMenuMode)(BIOSBootMenuMode_MenuOnly));
469 }
470 else if (!strcmp(ValueUnion.psz, "messageandmenu"))
471 {
472 CHECK_ERROR(biosSettings, COMSETTER(BootMenuMode)(BIOSBootMenuMode_MessageAndMenu));
473 }
474 else
475 {
476 errorArgument("Invalid --biosbootmenu argument '%s'", ValueUnion.psz);
477 rc = E_FAIL;
478 }
479 break;
480 }
481
482 case MODIFYVM_BIOSSYSTEMTIMEOFFSET:
483 {
484 CHECK_ERROR(biosSettings, COMSETTER(TimeOffset)(ValueUnion.u64));
485 break;
486 }
487
488 case MODIFYVM_BIOSPXEDEBUG:
489 {
490 CHECK_ERROR(biosSettings, COMSETTER(PXEDebugEnabled)(ValueUnion.f));
491 break;
492 }
493
494 case MODIFYVM_BOOT:
495 {
496 if ((GetOptState.uIndex < 1) && (GetOptState.uIndex > 4))
497 return errorSyntax(USAGE_MODIFYVM,
498 "Missing or Invalid boot slot number in '%s'",
499 GetOptState.pDef->pszLong);
500
501 if (!strcmp(ValueUnion.psz, "none"))
502 {
503 CHECK_ERROR(machine, SetBootOrder(GetOptState.uIndex, DeviceType_Null));
504 }
505 else if (!strcmp(ValueUnion.psz, "floppy"))
506 {
507 CHECK_ERROR(machine, SetBootOrder(GetOptState.uIndex, DeviceType_Floppy));
508 }
509 else if (!strcmp(ValueUnion.psz, "dvd"))
510 {
511 CHECK_ERROR(machine, SetBootOrder(GetOptState.uIndex, DeviceType_DVD));
512 }
513 else if (!strcmp(ValueUnion.psz, "disk"))
514 {
515 CHECK_ERROR(machine, SetBootOrder(GetOptState.uIndex, DeviceType_HardDisk));
516 }
517 else if (!strcmp(ValueUnion.psz, "net"))
518 {
519 CHECK_ERROR(machine, SetBootOrder(GetOptState.uIndex, DeviceType_Network));
520 }
521 else
522 return errorArgument("Invalid boot device '%s'", ValueUnion.psz);
523
524 break;
525 }
526
527 case MODIFYVM_HDA: // deprecated
528 {
529 if (!strcmp(ValueUnion.psz, "none"))
530 {
531 machine->DetachDevice(Bstr("IDE Controller"), 0, 0);
532 }
533 else
534 {
535 /* first guess is that it's a UUID */
536 Bstr uuid(ValueUnion.psz);
537 ComPtr<IMedium> hardDisk;
538 rc = a->virtualBox->GetHardDisk(uuid, hardDisk.asOutParam());
539 /* not successful? Then it must be a filename */
540 if (!hardDisk)
541 {
542 rc = a->virtualBox->FindHardDisk(Bstr(ValueUnion.psz), hardDisk.asOutParam());
543 if (FAILED(rc))
544 {
545 /* open the new hard disk object */
546 CHECK_ERROR(a->virtualBox,
547 OpenHardDisk(Bstr(ValueUnion.psz),
548 AccessMode_ReadWrite, false, Bstr(""),
549 false, Bstr(""), hardDisk.asOutParam()));
550 }
551 }
552 if (hardDisk)
553 {
554 hardDisk->COMGETTER(Id)(uuid.asOutParam());
555 CHECK_ERROR(machine, AttachDevice(Bstr("IDE Controller"), 0, 0, DeviceType_HardDisk, uuid));
556 }
557 else
558 rc = E_FAIL;
559 }
560 break;
561 }
562
563 case MODIFYVM_HDB: // deprecated
564 {
565 if (!strcmp(ValueUnion.psz, "none"))
566 {
567 machine->DetachDevice(Bstr("IDE Controller"), 0, 1);
568 }
569 else
570 {
571 /* first guess is that it's a UUID */
572 Bstr uuid(ValueUnion.psz);
573 ComPtr<IMedium> hardDisk;
574 rc = a->virtualBox->GetHardDisk(uuid, hardDisk.asOutParam());
575 /* not successful? Then it must be a filename */
576 if (!hardDisk)
577 {
578 rc = a->virtualBox->FindHardDisk(Bstr(ValueUnion.psz), hardDisk.asOutParam());
579 if (FAILED(rc))
580 {
581 /* open the new hard disk object */
582 CHECK_ERROR(a->virtualBox,
583 OpenHardDisk(Bstr(ValueUnion.psz),
584 AccessMode_ReadWrite, false, Bstr(""),
585 false, Bstr(""), hardDisk.asOutParam()));
586 }
587 }
588 if (hardDisk)
589 {
590 hardDisk->COMGETTER(Id)(uuid.asOutParam());
591 CHECK_ERROR(machine, AttachDevice(Bstr("IDE Controller"), 0, 1, DeviceType_HardDisk, uuid));
592 }
593 else
594 rc = E_FAIL;
595 }
596 break;
597 }
598
599 case MODIFYVM_HDD: // deprecated
600 {
601 if (!strcmp(ValueUnion.psz, "none"))
602 {
603 machine->DetachDevice(Bstr("IDE Controller"), 1, 1);
604 }
605 else
606 {
607 /* first guess is that it's a UUID */
608 Bstr uuid(ValueUnion.psz);
609 ComPtr<IMedium> hardDisk;
610 rc = a->virtualBox->GetHardDisk(uuid, hardDisk.asOutParam());
611 /* not successful? Then it must be a filename */
612 if (!hardDisk)
613 {
614 rc = a->virtualBox->FindHardDisk(Bstr(ValueUnion.psz), hardDisk.asOutParam());
615 if (FAILED(rc))
616 {
617 /* open the new hard disk object */
618 CHECK_ERROR(a->virtualBox,
619 OpenHardDisk(Bstr(ValueUnion.psz),
620 AccessMode_ReadWrite, false, Bstr(""),
621 false, Bstr(""), hardDisk.asOutParam()));
622 }
623 }
624 if (hardDisk)
625 {
626 hardDisk->COMGETTER(Id)(uuid.asOutParam());
627 CHECK_ERROR(machine, AttachDevice(Bstr("IDE Controller"), 1, 1, DeviceType_HardDisk, uuid));
628 }
629 else
630 rc = E_FAIL;
631 }
632 break;
633 }
634
635 case MODIFYVM_IDECONTROLLER: // deprecated
636 {
637 ComPtr<IStorageController> storageController;
638 CHECK_ERROR(machine, GetStorageControllerByName(Bstr("IDE Controller"),
639 storageController.asOutParam()));
640
641 if (!RTStrICmp(ValueUnion.psz, "PIIX3"))
642 {
643 CHECK_ERROR(storageController, COMSETTER(ControllerType)(StorageControllerType_PIIX3));
644 }
645 else if (!RTStrICmp(ValueUnion.psz, "PIIX4"))
646 {
647 CHECK_ERROR(storageController, COMSETTER(ControllerType)(StorageControllerType_PIIX4));
648 }
649 else if (!RTStrICmp(ValueUnion.psz, "ICH6"))
650 {
651 CHECK_ERROR(storageController, COMSETTER(ControllerType)(StorageControllerType_ICH6));
652 }
653 else
654 {
655 errorArgument("Invalid --idecontroller argument '%s'", ValueUnion.psz);
656 rc = E_FAIL;
657 }
658 break;
659 }
660
661 case MODIFYVM_SATAIDEEMULATION: // deprecated
662 {
663 ComPtr<IStorageController> SataCtl;
664 CHECK_ERROR(machine, GetStorageControllerByName(Bstr("SATA"), SataCtl.asOutParam()));
665
666 if ((GetOptState.uIndex < 1) && (GetOptState.uIndex > 4))
667 return errorSyntax(USAGE_MODIFYVM,
668 "Missing or Invalid SATA boot slot number in '%s'",
669 GetOptState.pDef->pszLong);
670
671 if ((ValueUnion.u32 < 1) && (ValueUnion.u32 > 30))
672 return errorSyntax(USAGE_MODIFYVM,
673 "Missing or Invalid SATA port number in '%s'",
674 GetOptState.pDef->pszLong);
675
676 if (SUCCEEDED(rc))
677 CHECK_ERROR(SataCtl, SetIDEEmulationPort(GetOptState.uIndex, ValueUnion.u32));
678
679 break;
680 }
681
682 case MODIFYVM_SATAPORTCOUNT: // deprecated
683 {
684 ComPtr<IStorageController> SataCtl;
685 CHECK_ERROR(machine, GetStorageControllerByName(Bstr("SATA"), SataCtl.asOutParam()));
686
687 if (SUCCEEDED(rc) && ValueUnion.u32 > 0)
688 CHECK_ERROR(SataCtl, COMSETTER(PortCount)(ValueUnion.u32));
689
690 break;
691 }
692
693 case MODIFYVM_SATAPORT: // deprecated
694 {
695 if ((GetOptState.uIndex < 1) && (GetOptState.uIndex > 30))
696 return errorSyntax(USAGE_MODIFYVM,
697 "Missing or Invalid SATA port number in '%s'",
698 GetOptState.pDef->pszLong);
699
700 if (!strcmp(ValueUnion.psz, "none"))
701 {
702 machine->DetachDevice(Bstr("SATA"), GetOptState.uIndex, 0);
703 }
704 else
705 {
706 /* first guess is that it's a UUID */
707 Bstr uuid(ValueUnion.psz);
708 ComPtr<IMedium> hardDisk;
709 rc = a->virtualBox->GetHardDisk(uuid, hardDisk.asOutParam());
710 /* not successful? Then it must be a filename */
711 if (!hardDisk)
712 {
713 rc = a->virtualBox->FindHardDisk(Bstr(ValueUnion.psz), hardDisk.asOutParam());
714 if (FAILED(rc))
715 {
716 /* open the new hard disk object */
717 CHECK_ERROR(a->virtualBox,
718 OpenHardDisk(Bstr(ValueUnion.psz), AccessMode_ReadWrite,
719 false, Bstr(""), false,
720 Bstr(""), hardDisk.asOutParam()));
721 }
722 }
723 if (hardDisk)
724 {
725 hardDisk->COMGETTER(Id)(uuid.asOutParam());
726 CHECK_ERROR(machine,
727 AttachDevice(Bstr("SATA"), GetOptState.uIndex,
728 0, DeviceType_HardDisk, uuid));
729 }
730 else
731 rc = E_FAIL;
732 }
733 break;
734 }
735
736 case MODIFYVM_SATA: // deprecated
737 {
738 if (!strcmp(ValueUnion.psz, "on") || !strcmp(ValueUnion.psz, "enable"))
739 {
740 ComPtr<IStorageController> ctl;
741 CHECK_ERROR(machine, AddStorageController(Bstr("SATA"), StorageBus_SATA, ctl.asOutParam()));
742 CHECK_ERROR(ctl, COMSETTER(ControllerType)(StorageControllerType_IntelAhci));
743 }
744 else if (!strcmp(ValueUnion.psz, "off") || !strcmp(ValueUnion.psz, "disable"))
745 CHECK_ERROR(machine, RemoveStorageController(Bstr("SATA")));
746 else
747 return errorArgument("Invalid --usb argument '%s'", ValueUnion.psz);
748 break;
749 }
750
751 case MODIFYVM_SCSIPORT: // deprecated
752 {
753 if ((GetOptState.uIndex < 1) && (GetOptState.uIndex > 16))
754 return errorSyntax(USAGE_MODIFYVM,
755 "Missing or Invalid SCSI port number in '%s'",
756 GetOptState.pDef->pszLong);
757
758 if (!strcmp(ValueUnion.psz, "none"))
759 {
760 rc = machine->DetachDevice(Bstr("LsiLogic"), GetOptState.uIndex, 0);
761 if (FAILED(rc))
762 CHECK_ERROR(machine, DetachDevice(Bstr("BusLogic"), GetOptState.uIndex, 0));
763 }
764 else
765 {
766 /* first guess is that it's a UUID */
767 Bstr uuid(ValueUnion.psz);
768 ComPtr<IMedium> hardDisk;
769 rc = a->virtualBox->GetHardDisk(uuid, hardDisk.asOutParam());
770 /* not successful? Then it must be a filename */
771 if (!hardDisk)
772 {
773 rc = a->virtualBox->FindHardDisk(Bstr(ValueUnion.psz), hardDisk.asOutParam());
774 if (FAILED(rc))
775 {
776 /* open the new hard disk object */
777 CHECK_ERROR(a->virtualBox,
778 OpenHardDisk(Bstr(ValueUnion.psz),
779 AccessMode_ReadWrite, false, Bstr(""),
780 false, Bstr(""), hardDisk.asOutParam()));
781 }
782 }
783 if (hardDisk)
784 {
785 hardDisk->COMGETTER(Id)(uuid.asOutParam());
786 rc = machine->AttachDevice(Bstr("LsiLogic"), GetOptState.uIndex, 0, DeviceType_HardDisk, uuid);
787 if (FAILED(rc))
788 CHECK_ERROR(machine,
789 AttachDevice(Bstr("BusLogic"),
790 GetOptState.uIndex, 0,
791 DeviceType_HardDisk, uuid));
792 }
793 else
794 rc = E_FAIL;
795 }
796 break;
797 }
798
799 case MODIFYVM_SCSITYPE: // deprecated
800 {
801 ComPtr<IStorageController> ctl;
802
803 if (!RTStrICmp(ValueUnion.psz, "LsiLogic"))
804 {
805 rc = machine->RemoveStorageController(Bstr("BusLogic"));
806 if (FAILED(rc))
807 CHECK_ERROR(machine, RemoveStorageController(Bstr("LsiLogic")));
808
809 CHECK_ERROR(machine,
810 AddStorageController(Bstr("LsiLogic"),
811 StorageBus_SCSI,
812 ctl.asOutParam()));
813
814 if (SUCCEEDED(rc))
815 CHECK_ERROR(ctl, COMSETTER(ControllerType)(StorageControllerType_LsiLogic));
816 }
817 else if (!RTStrICmp(ValueUnion.psz, "BusLogic"))
818 {
819 rc = machine->RemoveStorageController(Bstr("LsiLogic"));
820 if (FAILED(rc))
821 CHECK_ERROR(machine, RemoveStorageController(Bstr("BusLogic")));
822
823 CHECK_ERROR(machine,
824 AddStorageController(Bstr("BusLogic"),
825 StorageBus_SCSI,
826 ctl.asOutParam()));
827
828 if (SUCCEEDED(rc))
829 CHECK_ERROR(ctl, COMSETTER(ControllerType)(StorageControllerType_BusLogic));
830 }
831 else
832 return errorArgument("Invalid --scsitype argument '%s'", ValueUnion.psz);
833 break;
834 }
835
836 case MODIFYVM_SCSI: // deprecated
837 {
838 if (!strcmp(ValueUnion.psz, "on") || !strcmp(ValueUnion.psz, "enable"))
839 {
840 ComPtr<IStorageController> ctl;
841
842 CHECK_ERROR(machine, AddStorageController(Bstr("BusLogic"), StorageBus_SCSI, ctl.asOutParam()));
843 if (SUCCEEDED(rc))
844 CHECK_ERROR(ctl, COMSETTER(ControllerType)(StorageControllerType_BusLogic));
845 }
846 else if (!strcmp(ValueUnion.psz, "off") || !strcmp(ValueUnion.psz, "disable"))
847 {
848 rc = machine->RemoveStorageController(Bstr("BusLogic"));
849 if (FAILED(rc))
850 CHECK_ERROR(machine, RemoveStorageController(Bstr("LsiLogic")));
851 }
852 break;
853 }
854
855 case MODIFYVM_DVDPASSTHROUGH: // deprecated
856 {
857 CHECK_ERROR(machine, PassthroughDevice(Bstr("IDE Controller"), 1, 0, !strcmp(ValueUnion.psz, "on")));
858 break;
859 }
860
861 case MODIFYVM_DVD: // deprecated
862 {
863 ComPtr<IMedium> dvdMedium;
864 Bstr uuid(ValueUnion.psz);
865
866 /* unmount? */
867 if (!strcmp(ValueUnion.psz, "none"))
868 {
869 /* nothing to do, NULL object will cause unmount */
870 }
871 /* host drive? */
872 else if (!strncmp(ValueUnion.psz, "host:", 5))
873 {
874 ComPtr<IHost> host;
875 CHECK_ERROR(a->virtualBox, COMGETTER(Host)(host.asOutParam()));
876 rc = host->FindHostDVDDrive(Bstr(ValueUnion.psz + 5), dvdMedium.asOutParam());
877 if (!dvdMedium)
878 {
879 /* 2nd try: try with the real name, important on Linux+libhal */
880 char szPathReal[RTPATH_MAX];
881 if (RT_FAILURE(RTPathReal(ValueUnion.psz + 5, szPathReal, sizeof(szPathReal))))
882 {
883 errorArgument("Invalid host DVD drive name \"%s\"", ValueUnion.psz + 5);
884 rc = E_FAIL;
885 break;
886 }
887 rc = host->FindHostDVDDrive(Bstr(szPathReal), dvdMedium.asOutParam());
888 if (!dvdMedium)
889 {
890 errorArgument("Invalid host DVD drive name \"%s\"", ValueUnion.psz + 5);
891 rc = E_FAIL;
892 break;
893 }
894 }
895 }
896 else
897 {
898 /* first assume it's a UUID */
899 rc = a->virtualBox->GetDVDImage(uuid, dvdMedium.asOutParam());
900 if (FAILED(rc) || !dvdMedium)
901 {
902 /* must be a filename, check if it's in the collection */
903 rc = a->virtualBox->FindDVDImage(Bstr(ValueUnion.psz), dvdMedium.asOutParam());
904 /* not registered, do that on the fly */
905 if (!dvdMedium)
906 {
907 Bstr emptyUUID;
908 CHECK_ERROR(a->virtualBox, OpenDVDImage(Bstr(ValueUnion.psz),
909 emptyUUID, dvdMedium.asOutParam()));
910 }
911 }
912 if (!dvdMedium)
913 {
914 rc = E_FAIL;
915 break;
916 }
917 }
918
919 /** @todo generalize this, allow arbitrary number of DVD drives
920 * and as a consequence multiple attachments and different
921 * storage controllers. */
922 if (dvdMedium)
923 dvdMedium->COMGETTER(Id)(uuid.asOutParam());
924 CHECK_ERROR(machine, MountMedium(Bstr("IDE Controller"), 1, 0, uuid, FALSE /* aForce */));
925 break;
926 }
927
928 case MODIFYVM_FLOPPY: // deprecated
929 {
930 Bstr uuid(ValueUnion.psz);
931 ComPtr<IMedium> floppyMedium;
932 ComPtr<IMediumAttachment> floppyAttachment;
933 machine->GetMediumAttachment(Bstr("Floppy Controller"), 0, 0, floppyAttachment.asOutParam());
934
935 /* disable? */
936 if (!strcmp(ValueUnion.psz, "disabled"))
937 {
938 /* disable the controller */
939 if (floppyAttachment)
940 CHECK_ERROR(machine, DetachDevice(Bstr("Floppy Controller"), 0, 0));
941 }
942 else
943 {
944 /* enable the controller */
945 if (!floppyAttachment)
946 CHECK_ERROR(machine, AttachDevice(Bstr("Floppy Controller"), 0, 0, DeviceType_Floppy, NULL));
947
948 /* unmount? */
949 if ( !strcmp(ValueUnion.psz, "none")
950 || !strcmp(ValueUnion.psz, "empty")) // deprecated
951 {
952 /* nothing to do, NULL object will cause unmount */
953 }
954 /* host drive? */
955 else if (!strncmp(ValueUnion.psz, "host:", 5))
956 {
957 ComPtr<IHost> host;
958 CHECK_ERROR(a->virtualBox, COMGETTER(Host)(host.asOutParam()));
959 rc = host->FindHostFloppyDrive(Bstr(ValueUnion.psz + 5), floppyMedium.asOutParam());
960 if (!floppyMedium)
961 {
962 errorArgument("Invalid host floppy drive name \"%s\"", ValueUnion.psz + 5);
963 rc = E_FAIL;
964 break;
965 }
966 }
967 else
968 {
969 /* first assume it's a UUID */
970 rc = a->virtualBox->GetFloppyImage(uuid, floppyMedium.asOutParam());
971 if (FAILED(rc) || !floppyMedium)
972 {
973 /* must be a filename, check if it's in the collection */
974 rc = a->virtualBox->FindFloppyImage(Bstr(ValueUnion.psz), floppyMedium.asOutParam());
975 /* not registered, do that on the fly */
976 if (!floppyMedium)
977 {
978 Bstr emptyUUID;
979 CHECK_ERROR(a->virtualBox,
980 OpenFloppyImage(Bstr(ValueUnion.psz),
981 emptyUUID,
982 floppyMedium.asOutParam()));
983 }
984 }
985 if (!floppyMedium)
986 {
987 rc = E_FAIL;
988 break;
989 }
990 }
991 floppyMedium->COMGETTER(Id)(uuid.asOutParam());
992 CHECK_ERROR(machine, MountMedium(Bstr("Floppy Controller"), 0, 0, uuid, FALSE /* aForce */));
993 }
994 break;
995 }
996
997 case MODIFYVM_NICTRACEFILE:
998 {
999 ComPtr<INetworkAdapter> nic;
1000
1001 if ((GetOptState.uIndex < 1) && (GetOptState.uIndex > NetworkAdapterCount))
1002 return errorSyntax(USAGE_MODIFYVM,
1003 "Missing or Invalid NIC slot number in '%s'",
1004 GetOptState.pDef->pszLong);
1005
1006 CHECK_ERROR_BREAK(machine, GetNetworkAdapter(GetOptState.uIndex - 1, nic.asOutParam()));
1007 ASSERT(nic);
1008
1009 CHECK_ERROR(nic, COMSETTER(TraceFile)(Bstr(ValueUnion.psz)));
1010 break;
1011 }
1012
1013 case MODIFYVM_NICTRACE:
1014 {
1015 ComPtr<INetworkAdapter> nic;
1016
1017 if ((GetOptState.uIndex < 1) && (GetOptState.uIndex > NetworkAdapterCount))
1018 return errorSyntax(USAGE_MODIFYVM,
1019 "Missing or Invalid NIC slot number in '%s'",
1020 GetOptState.pDef->pszLong);
1021
1022 CHECK_ERROR_BREAK(machine, GetNetworkAdapter(GetOptState.uIndex - 1, nic.asOutParam()));
1023 ASSERT(nic);
1024
1025 CHECK_ERROR(nic, COMSETTER(TraceEnabled)(ValueUnion.f));
1026 break;
1027 }
1028
1029 case MODIFYVM_NICTYPE:
1030 {
1031 ComPtr<INetworkAdapter> nic;
1032
1033 if ((GetOptState.uIndex < 1) && (GetOptState.uIndex > NetworkAdapterCount))
1034 return errorSyntax(USAGE_MODIFYVM,
1035 "Missing or Invalid NIC slot number in '%s'",
1036 GetOptState.pDef->pszLong);
1037
1038 CHECK_ERROR_BREAK(machine, GetNetworkAdapter(GetOptState.uIndex - 1, nic.asOutParam()));
1039 ASSERT(nic);
1040
1041 if (!strcmp(ValueUnion.psz, "Am79C970A"))
1042 {
1043 CHECK_ERROR(nic, COMSETTER(AdapterType)(NetworkAdapterType_Am79C970A));
1044 }
1045 else if (!strcmp(ValueUnion.psz, "Am79C973"))
1046 {
1047 CHECK_ERROR(nic, COMSETTER(AdapterType)(NetworkAdapterType_Am79C973));
1048 }
1049#ifdef VBOX_WITH_E1000
1050 else if (!strcmp(ValueUnion.psz, "82540EM"))
1051 {
1052 CHECK_ERROR(nic, COMSETTER(AdapterType)(NetworkAdapterType_I82540EM));
1053 }
1054 else if (!strcmp(ValueUnion.psz, "82543GC"))
1055 {
1056 CHECK_ERROR(nic, COMSETTER(AdapterType)(NetworkAdapterType_I82543GC));
1057 }
1058 else if (!strcmp(ValueUnion.psz, "82545EM"))
1059 {
1060 CHECK_ERROR(nic, COMSETTER(AdapterType)(NetworkAdapterType_I82545EM));
1061 }
1062#endif
1063#ifdef VBOX_WITH_VIRTIO
1064 else if (!strcmp(ValueUnion.psz, "virtio"))
1065 {
1066 CHECK_ERROR(nic, COMSETTER(AdapterType)(NetworkAdapterType_Virtio));
1067 }
1068#endif /* VBOX_WITH_VIRTIO */
1069 else
1070 {
1071 errorArgument("Invalid NIC type '%s' specified for NIC %lu", ValueUnion.psz, GetOptState.uIndex);
1072 rc = E_FAIL;
1073 }
1074 break;
1075 }
1076
1077 case MODIFYVM_NICSPEED:
1078 {
1079 ComPtr<INetworkAdapter> nic;
1080
1081 if ((GetOptState.uIndex < 1) && (GetOptState.uIndex > NetworkAdapterCount))
1082 return errorSyntax(USAGE_MODIFYVM,
1083 "Missing or Invalid NIC slot number in '%s'",
1084 GetOptState.pDef->pszLong);
1085
1086 if ((ValueUnion.u32 < 1000) && (ValueUnion.u32 > 4000000))
1087 {
1088 errorArgument("Invalid --nicspeed%lu argument '%u'", GetOptState.uIndex, ValueUnion.u32);
1089 rc = E_FAIL;
1090 break;
1091 }
1092
1093 CHECK_ERROR_BREAK(machine, GetNetworkAdapter(GetOptState.uIndex - 1, nic.asOutParam()));
1094 ASSERT(nic);
1095
1096 CHECK_ERROR(nic, COMSETTER(LineSpeed)(ValueUnion.u32));
1097 break;
1098 }
1099
1100 case MODIFYVM_NIC:
1101 {
1102 ComPtr<INetworkAdapter> nic;
1103
1104 if ((GetOptState.uIndex < 1) && (GetOptState.uIndex > NetworkAdapterCount))
1105 return errorSyntax(USAGE_MODIFYVM,
1106 "Missing or Invalid NIC slot number in '%s'",
1107 GetOptState.pDef->pszLong);
1108
1109 CHECK_ERROR_BREAK(machine, GetNetworkAdapter(GetOptState.uIndex - 1, nic.asOutParam()));
1110 ASSERT(nic);
1111
1112 if (!strcmp(ValueUnion.psz, "none"))
1113 {
1114 CHECK_ERROR(nic, COMSETTER(Enabled)(FALSE));
1115 }
1116 else if (!strcmp(ValueUnion.psz, "null"))
1117 {
1118 CHECK_ERROR(nic, COMSETTER(Enabled)(TRUE));
1119 CHECK_ERROR(nic, Detach());
1120 }
1121 else if (!strcmp(ValueUnion.psz, "nat"))
1122 {
1123 CHECK_ERROR(nic, COMSETTER(Enabled)(TRUE));
1124 CHECK_ERROR(nic, AttachToNAT());
1125 }
1126 else if ( !strcmp(ValueUnion.psz, "bridged")
1127 || !strcmp(ValueUnion.psz, "hostif")) /* backward compatibility */
1128 {
1129 CHECK_ERROR(nic, COMSETTER(Enabled)(TRUE));
1130 CHECK_ERROR(nic, AttachToBridgedInterface());
1131 }
1132 else if (!strcmp(ValueUnion.psz, "intnet"))
1133 {
1134 CHECK_ERROR(nic, COMSETTER(Enabled)(TRUE));
1135 CHECK_ERROR(nic, AttachToInternalNetwork());
1136 }
1137#if defined(VBOX_WITH_NETFLT)
1138 else if (!strcmp(ValueUnion.psz, "hostonly"))
1139 {
1140
1141 CHECK_ERROR(nic, COMSETTER(Enabled)(TRUE));
1142 CHECK_ERROR(nic, AttachToHostOnlyInterface());
1143 }
1144#endif
1145 else
1146 {
1147 errorArgument("Invalid type '%s' specfied for NIC %lu", ValueUnion.psz, GetOptState.uIndex);
1148 rc = E_FAIL;
1149 }
1150 break;
1151 }
1152
1153 case MODIFYVM_CABLECONNECTED:
1154 {
1155 ComPtr<INetworkAdapter> nic;
1156
1157 if ((GetOptState.uIndex < 1) && (GetOptState.uIndex > NetworkAdapterCount))
1158 return errorSyntax(USAGE_MODIFYVM,
1159 "Missing or Invalid NIC slot number in '%s'",
1160 GetOptState.pDef->pszLong);
1161
1162 CHECK_ERROR_BREAK(machine, GetNetworkAdapter(GetOptState.uIndex - 1, nic.asOutParam()));
1163 ASSERT(nic);
1164
1165 CHECK_ERROR(nic, COMSETTER(CableConnected)(ValueUnion.f));
1166 break;
1167 }
1168
1169 case MODIFYVM_BRIDGEADAPTER:
1170 case MODIFYVM_HOSTONLYADAPTER:
1171 {
1172 ComPtr<INetworkAdapter> nic;
1173
1174 if ((GetOptState.uIndex < 1) && (GetOptState.uIndex > NetworkAdapterCount))
1175 return errorSyntax(USAGE_MODIFYVM,
1176 "Missing or Invalid NIC slot number in '%s'",
1177 GetOptState.pDef->pszLong);
1178
1179 CHECK_ERROR_BREAK(machine, GetNetworkAdapter(GetOptState.uIndex - 1, nic.asOutParam()));
1180 ASSERT(nic);
1181
1182 /* remove it? */
1183 if (!strcmp(ValueUnion.psz, "none"))
1184 {
1185 CHECK_ERROR(nic, COMSETTER(HostInterface)(NULL));
1186 }
1187 else
1188 {
1189 CHECK_ERROR(nic, COMSETTER(HostInterface)(Bstr(ValueUnion.psz)));
1190 }
1191 break;
1192 }
1193
1194 case MODIFYVM_INTNET:
1195 {
1196 ComPtr<INetworkAdapter> nic;
1197
1198 if ((GetOptState.uIndex < 1) && (GetOptState.uIndex > NetworkAdapterCount))
1199 return errorSyntax(USAGE_MODIFYVM,
1200 "Missing or Invalid NIC slot number in '%s'",
1201 GetOptState.pDef->pszLong);
1202
1203 CHECK_ERROR_BREAK(machine, GetNetworkAdapter(GetOptState.uIndex - 1, nic.asOutParam()));
1204 ASSERT(nic);
1205
1206 /* remove it? */
1207 if (!strcmp(ValueUnion.psz, "none"))
1208 {
1209 CHECK_ERROR(nic, COMSETTER(InternalNetwork)(NULL));
1210 }
1211 else
1212 {
1213 CHECK_ERROR(nic, COMSETTER(InternalNetwork)(Bstr(ValueUnion.psz)));
1214 }
1215 break;
1216 }
1217
1218 case MODIFYVM_NATNET:
1219 {
1220 ComPtr<INetworkAdapter> nic;
1221
1222 if ((GetOptState.uIndex < 1) && (GetOptState.uIndex > NetworkAdapterCount))
1223 return errorSyntax(USAGE_MODIFYVM,
1224 "Missing or Invalid NIC slot number in '%s'",
1225 GetOptState.pDef->pszLong);
1226
1227 CHECK_ERROR_BREAK(machine, GetNetworkAdapter(GetOptState.uIndex - 1, nic.asOutParam()));
1228 ASSERT(nic);
1229
1230 CHECK_ERROR(nic, COMSETTER(NATNetwork)(Bstr(ValueUnion.psz)));
1231
1232 break;
1233 }
1234
1235 case MODIFYVM_MACADDRESS:
1236 {
1237 ComPtr<INetworkAdapter> nic;
1238
1239 if ((GetOptState.uIndex < 1) && (GetOptState.uIndex > NetworkAdapterCount))
1240 return errorSyntax(USAGE_MODIFYVM,
1241 "Missing or Invalid NIC slot number in '%s'",
1242 GetOptState.pDef->pszLong);
1243
1244 CHECK_ERROR_BREAK(machine, GetNetworkAdapter(GetOptState.uIndex - 1, nic.asOutParam()));
1245 ASSERT(nic);
1246
1247 /* generate one? */
1248 if (!strcmp(ValueUnion.psz, "auto"))
1249 {
1250 CHECK_ERROR(nic, COMSETTER(MACAddress)(NULL));
1251 }
1252 else
1253 {
1254 CHECK_ERROR(nic, COMSETTER(MACAddress)(Bstr(ValueUnion.psz)));
1255 }
1256 break;
1257 }
1258
1259 case MODIFYVM_UARTMODE:
1260 {
1261 ComPtr<ISerialPort> uart;
1262 char *pszIRQ = NULL;
1263
1264 if ((GetOptState.uIndex < 1) && (GetOptState.uIndex > SerialPortCount))
1265 return errorSyntax(USAGE_MODIFYVM,
1266 "Missing or Invalid Serial Port number in '%s'",
1267 GetOptState.pDef->pszLong);
1268
1269 CHECK_ERROR_BREAK(machine, GetSerialPort(GetOptState.uIndex - 1, uart.asOutParam()));
1270 ASSERT(uart);
1271
1272 if (!strcmp(ValueUnion.psz, "disconnected"))
1273 {
1274 CHECK_ERROR(uart, COMSETTER(HostMode)(PortMode_Disconnected));
1275 }
1276 else if ( !strcmp(ValueUnion.psz, "server")
1277 || !strcmp(ValueUnion.psz, "client")
1278 || !strcmp(ValueUnion.psz, "file"))
1279 {
1280 const char *pszMode = ValueUnion.psz;
1281
1282 int vrc = RTGetOptFetchValue(&GetOptState, &ValueUnion, RTGETOPT_REQ_STRING);
1283 if (RT_FAILURE(vrc))
1284 return errorSyntax(USAGE_MODIFYVM,
1285 "Missing or Invalid argument to '%s'",
1286 GetOptState.pDef->pszLong);
1287
1288 CHECK_ERROR(uart, COMSETTER(Path)(Bstr(ValueUnion.psz)));
1289
1290 if (!strcmp(pszMode, "server"))
1291 {
1292 CHECK_ERROR(uart, COMSETTER(HostMode)(PortMode_HostPipe));
1293 CHECK_ERROR(uart, COMSETTER(Server)(TRUE));
1294 }
1295 else if (!strcmp(pszMode, "client"))
1296 {
1297 CHECK_ERROR(uart, COMSETTER(HostMode)(PortMode_HostPipe));
1298 CHECK_ERROR(uart, COMSETTER(Server)(FALSE));
1299 }
1300 else if (!strcmp(pszMode, "file"))
1301 {
1302 CHECK_ERROR(uart, COMSETTER(HostMode)(PortMode_RawFile));
1303 }
1304 }
1305 else
1306 {
1307 CHECK_ERROR(uart, COMSETTER(Path)(Bstr(ValueUnion.psz)));
1308 CHECK_ERROR(uart, COMSETTER(HostMode)(PortMode_HostDevice));
1309 }
1310 break;
1311 }
1312
1313 case MODIFYVM_UART:
1314 {
1315 ComPtr<ISerialPort> uart;
1316
1317 if ((GetOptState.uIndex < 1) && (GetOptState.uIndex > SerialPortCount))
1318 return errorSyntax(USAGE_MODIFYVM,
1319 "Missing or Invalid Serial Port number in '%s'",
1320 GetOptState.pDef->pszLong);
1321
1322 CHECK_ERROR_BREAK(machine, GetSerialPort(GetOptState.uIndex - 1, uart.asOutParam()));
1323 ASSERT(uart);
1324
1325 if (!strcmp(ValueUnion.psz, "off") || !strcmp(ValueUnion.psz, "disable"))
1326 CHECK_ERROR(uart, COMSETTER(Enabled)(FALSE));
1327 else
1328 {
1329 const char *pszIOBase = ValueUnion.psz;
1330 uint32_t uVal = 0;
1331
1332 int vrc = RTGetOptFetchValue(&GetOptState, &ValueUnion, RTGETOPT_REQ_UINT32) != MODIFYVM_UART;
1333 if (RT_FAILURE(vrc))
1334 return errorSyntax(USAGE_MODIFYVM,
1335 "Missing or Invalid argument to '%s'",
1336 GetOptState.pDef->pszLong);
1337
1338 CHECK_ERROR(uart, COMSETTER(IRQ)(ValueUnion.u32));
1339
1340 vrc = RTStrToUInt32Ex(pszIOBase, NULL, 0, &uVal);
1341 if (vrc != VINF_SUCCESS || uVal == 0)
1342 return errorArgument("Error parsing UART I/O base '%s'", pszIOBase);
1343 CHECK_ERROR(uart, COMSETTER(IOBase)(uVal));
1344
1345 CHECK_ERROR(uart, COMSETTER(Enabled)(TRUE));
1346 }
1347 break;
1348 }
1349
1350 case MODIFYVM_GUESTSTATISTICSINTERVAL:
1351 {
1352 CHECK_ERROR(machine, COMSETTER(StatisticsUpdateInterval)(ValueUnion.u32));
1353 break;
1354 }
1355
1356#ifdef VBOX_WITH_MEM_BALLOONING
1357 case MODIFYVM_GUESTMEMORYBALLOON:
1358 {
1359 CHECK_ERROR(machine, COMSETTER(MemoryBalloonSize)(ValueUnion.u32));
1360 break;
1361 }
1362#endif
1363
1364 case MODIFYVM_AUDIOCONTROLLER:
1365 {
1366 ComPtr<IAudioAdapter> audioAdapter;
1367 machine->COMGETTER(AudioAdapter)(audioAdapter.asOutParam());
1368 ASSERT(audioAdapter);
1369
1370 if (!strcmp(ValueUnion.psz, "sb16"))
1371 CHECK_ERROR(audioAdapter, COMSETTER(AudioController)(AudioControllerType_SB16));
1372 else if (!strcmp(ValueUnion.psz, "ac97"))
1373 CHECK_ERROR(audioAdapter, COMSETTER(AudioController)(AudioControllerType_AC97));
1374 else
1375 {
1376 errorArgument("Invalid --audiocontroller argument '%s'", ValueUnion.psz);
1377 rc = E_FAIL;
1378 }
1379 break;
1380 }
1381
1382 case MODIFYVM_AUDIO:
1383 {
1384 ComPtr<IAudioAdapter> audioAdapter;
1385 machine->COMGETTER(AudioAdapter)(audioAdapter.asOutParam());
1386 ASSERT(audioAdapter);
1387
1388 /* disable? */
1389 if (!strcmp(ValueUnion.psz, "none"))
1390 {
1391 CHECK_ERROR(audioAdapter, COMSETTER(Enabled)(false));
1392 }
1393 else if (!strcmp(ValueUnion.psz, "null"))
1394 {
1395 CHECK_ERROR(audioAdapter, COMSETTER(AudioDriver)(AudioDriverType_Null));
1396 CHECK_ERROR(audioAdapter, COMSETTER(Enabled)(true));
1397 }
1398#ifdef RT_OS_WINDOWS
1399#ifdef VBOX_WITH_WINMM
1400 else if (!strcmp(ValueUnion.psz, "winmm"))
1401 {
1402 CHECK_ERROR(audioAdapter, COMSETTER(AudioDriver)(AudioDriverType_WinMM));
1403 CHECK_ERROR(audioAdapter, COMSETTER(Enabled)(true));
1404 }
1405#endif
1406 else if (!strcmp(ValueUnion.psz, "dsound"))
1407 {
1408 CHECK_ERROR(audioAdapter, COMSETTER(AudioDriver)(AudioDriverType_DirectSound));
1409 CHECK_ERROR(audioAdapter, COMSETTER(Enabled)(true));
1410 }
1411#endif /* RT_OS_WINDOWS */
1412#ifdef RT_OS_LINUX
1413# ifdef VBOX_WITH_ALSA
1414 else if (!strcmp(ValueUnion.psz, "alsa"))
1415 {
1416 CHECK_ERROR(audioAdapter, COMSETTER(AudioDriver)(AudioDriverType_ALSA));
1417 CHECK_ERROR(audioAdapter, COMSETTER(Enabled)(true));
1418 }
1419# endif
1420# ifdef VBOX_WITH_PULSE
1421 else if (!strcmp(ValueUnion.psz, "pulse"))
1422 {
1423 CHECK_ERROR(audioAdapter, COMSETTER(AudioDriver)(AudioDriverType_Pulse));
1424 CHECK_ERROR(audioAdapter, COMSETTER(Enabled)(true));
1425 }
1426# endif
1427#endif /* !RT_OS_LINUX */
1428#ifdef RT_OS_SOLARIS
1429 else if (!strcmp(ValueUnion.psz, "solaudio"))
1430 {
1431 CHECK_ERROR(audioAdapter, COMSETTER(AudioDriver)(AudioDriverType_SolAudio));
1432 CHECK_ERROR(audioAdapter, COMSETTER(Enabled)(true));
1433 }
1434#endif /* !RT_OS_SOLARIS */
1435#ifdef RT_OS_DARWIN
1436 else if (!strcmp(ValueUnion.psz, "coreaudio"))
1437 {
1438 CHECK_ERROR(audioAdapter, COMSETTER(AudioDriver)(AudioDriverType_CoreAudio));
1439 CHECK_ERROR(audioAdapter, COMSETTER(Enabled)(true));
1440 }
1441
1442#endif /* !RT_OS_DARWIN */
1443# if defined(RT_OS_FREEBSD) || defined(RT_OS_LINUX) || defined(VBOX_WITH_SOLARIS_OSS)
1444 else if (!strcmp(ValueUnion.psz, "oss"))
1445 {
1446 CHECK_ERROR(audioAdapter, COMSETTER(AudioDriver)(AudioDriverType_OSS));
1447 CHECK_ERROR(audioAdapter, COMSETTER(Enabled)(true));
1448 }
1449# endif
1450 else
1451 {
1452 errorArgument("Invalid --audio argument '%s'", ValueUnion.psz);
1453 rc = E_FAIL;
1454 }
1455 break;
1456 }
1457
1458 case MODIFYVM_CLIPBOARD:
1459 {
1460 if (!strcmp(ValueUnion.psz, "disabled"))
1461 {
1462 CHECK_ERROR(machine, COMSETTER(ClipboardMode)(ClipboardMode_Disabled));
1463 }
1464 else if (!strcmp(ValueUnion.psz, "hosttoguest"))
1465 {
1466 CHECK_ERROR(machine, COMSETTER(ClipboardMode)(ClipboardMode_HostToGuest));
1467 }
1468 else if (!strcmp(ValueUnion.psz, "guesttohost"))
1469 {
1470 CHECK_ERROR(machine, COMSETTER(ClipboardMode)(ClipboardMode_GuestToHost));
1471 }
1472 else if (!strcmp(ValueUnion.psz, "bidirectional"))
1473 {
1474 CHECK_ERROR(machine, COMSETTER(ClipboardMode)(ClipboardMode_Bidirectional));
1475 }
1476 else
1477 {
1478 errorArgument("Invalid --clipboard argument '%s'", ValueUnion.psz);
1479 rc = E_FAIL;
1480 }
1481 break;
1482 }
1483
1484#ifdef VBOX_WITH_VRDP
1485 case MODIFYVM_VRDPPORT:
1486 {
1487 ComPtr<IVRDPServer> vrdpServer;
1488 machine->COMGETTER(VRDPServer)(vrdpServer.asOutParam());
1489 ASSERT(vrdpServer);
1490
1491 if (!strcmp(ValueUnion.psz, "default"))
1492 CHECK_ERROR(vrdpServer, COMSETTER(Ports)(Bstr("0")));
1493 else
1494 CHECK_ERROR(vrdpServer, COMSETTER(Ports)(Bstr(ValueUnion.psz)));
1495 break;
1496 }
1497
1498 case MODIFYVM_VRDPADDRESS:
1499 {
1500 ComPtr<IVRDPServer> vrdpServer;
1501 machine->COMGETTER(VRDPServer)(vrdpServer.asOutParam());
1502 ASSERT(vrdpServer);
1503
1504 CHECK_ERROR(vrdpServer, COMSETTER(NetAddress)(Bstr(ValueUnion.psz)));
1505 break;
1506 }
1507
1508 case MODIFYVM_VRDPAUTHTYPE:
1509 {
1510 ComPtr<IVRDPServer> vrdpServer;
1511 machine->COMGETTER(VRDPServer)(vrdpServer.asOutParam());
1512 ASSERT(vrdpServer);
1513
1514 if (!strcmp(ValueUnion.psz, "null"))
1515 {
1516 CHECK_ERROR(vrdpServer, COMSETTER(AuthType)(VRDPAuthType_Null));
1517 }
1518 else if (!strcmp(ValueUnion.psz, "external"))
1519 {
1520 CHECK_ERROR(vrdpServer, COMSETTER(AuthType)(VRDPAuthType_External));
1521 }
1522 else if (!strcmp(ValueUnion.psz, "guest"))
1523 {
1524 CHECK_ERROR(vrdpServer, COMSETTER(AuthType)(VRDPAuthType_Guest));
1525 }
1526 else
1527 {
1528 errorArgument("Invalid --vrdpauthtype argument '%s'", ValueUnion.psz);
1529 rc = E_FAIL;
1530 }
1531 break;
1532 }
1533
1534 case MODIFYVM_VRDPMULTICON:
1535 {
1536 ComPtr<IVRDPServer> vrdpServer;
1537 machine->COMGETTER(VRDPServer)(vrdpServer.asOutParam());
1538 ASSERT(vrdpServer);
1539
1540 CHECK_ERROR(vrdpServer, COMSETTER(AllowMultiConnection)(ValueUnion.f));
1541 break;
1542 }
1543
1544 case MODIFYVM_VRDPREUSECON:
1545 {
1546 ComPtr<IVRDPServer> vrdpServer;
1547 machine->COMGETTER(VRDPServer)(vrdpServer.asOutParam());
1548 ASSERT(vrdpServer);
1549
1550 CHECK_ERROR(vrdpServer, COMSETTER(ReuseSingleConnection)(ValueUnion.f));
1551 break;
1552 }
1553
1554 case MODIFYVM_VRDP:
1555 {
1556 ComPtr<IVRDPServer> vrdpServer;
1557 machine->COMGETTER(VRDPServer)(vrdpServer.asOutParam());
1558 ASSERT(vrdpServer);
1559
1560 CHECK_ERROR(vrdpServer, COMSETTER(Enabled)(ValueUnion.f));
1561 break;
1562 }
1563#endif /* VBOX_WITH_VRDP */
1564
1565 case MODIFYVM_USBEHCI:
1566 {
1567 ComPtr<IUSBController> UsbCtl;
1568 CHECK_ERROR(machine, COMGETTER(USBController)(UsbCtl.asOutParam()));
1569 if (SUCCEEDED(rc))
1570 CHECK_ERROR(UsbCtl, COMSETTER(EnabledEhci)(ValueUnion.f));
1571 break;
1572 }
1573
1574 case MODIFYVM_USB:
1575 {
1576 ComPtr<IUSBController> UsbCtl;
1577 CHECK_ERROR(machine, COMGETTER(USBController)(UsbCtl.asOutParam()));
1578 if (SUCCEEDED(rc))
1579 CHECK_ERROR(UsbCtl, COMSETTER(Enabled)(ValueUnion.f));
1580 break;
1581 }
1582
1583 case MODIFYVM_SNAPSHOTFOLDER:
1584 {
1585 if (!strcmp(ValueUnion.psz, "default"))
1586 CHECK_ERROR(machine, COMSETTER(SnapshotFolder)(NULL));
1587 else
1588 CHECK_ERROR(machine, COMSETTER(SnapshotFolder)(Bstr(ValueUnion.psz)));
1589 break;
1590 }
1591
1592 case MODIFYVM_TELEPORTER_ENABLED:
1593 {
1594 CHECK_ERROR(machine, COMSETTER(TeleporterEnabled)(ValueUnion.f));
1595 break;
1596 }
1597
1598 case MODIFYVM_TELEPORTER_PORT:
1599 {
1600 CHECK_ERROR(machine, COMSETTER(TeleporterPort)(ValueUnion.u32));
1601 break;
1602 }
1603
1604 case MODIFYVM_TELEPORTER_ADDRESS:
1605 {
1606 CHECK_ERROR(machine, COMSETTER(TeleporterAddress)(Bstr(ValueUnion.psz)));
1607 break;
1608 }
1609
1610 case MODIFYVM_TELEPORTER_PASSWORD:
1611 {
1612 CHECK_ERROR(machine, COMSETTER(TeleporterPassword)(Bstr(ValueUnion.psz)));
1613 break;
1614 }
1615
1616 case MODIFYVM_HARDWARE_UUID:
1617 {
1618 CHECK_ERROR(machine, COMSETTER(HardwareUUID)(Bstr(ValueUnion.psz)));
1619 break;
1620 }
1621
1622 default:
1623 {
1624 errorGetOpt(USAGE_MODIFYVM, c, &ValueUnion);
1625 rc = E_FAIL;
1626 break;
1627 }
1628 }
1629 }
1630
1631 /* commit changes */
1632 if (SUCCEEDED(rc))
1633 CHECK_ERROR(machine, SaveSettings());
1634
1635 /* it's important to always close sessions */
1636 a->session->Close();
1637
1638 return SUCCEEDED(rc) ? 0 : 1;
1639}
1640
1641#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