VirtualBox

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

Last change on this file since 23740 was 23738, checked in by vboxsync, 16 years ago

VBoxManageModifyVM: removed unnecessary check

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