VirtualBox

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

Last change on this file since 24175 was 24143, checked in by vboxsync, 16 years ago

VBoxManageModifyVM: use RTGETOPT_REQ_BOOL_ONOFF instead of RTGETOPT_REQ_STRING

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