VirtualBox

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

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

--cpuidset/remove/removall

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

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette