VBoxManageStorageController.cpp revision 89de31eab6e960abcacfb70916598ae1c2e7f737
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync/* $Id$ */
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync/** @file
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * VBoxManage - The storage controller related commands.
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync */
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync/*
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * Copyright (C) 2006-2009 Sun Microsystems, Inc.
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync *
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * available from http://www.virtualbox.org. This file is free software;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * you can redistribute it and/or modify it under the terms of the GNU
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * General Public License (GPL) as published by the Free Software
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync *
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * additional information or have any questions.
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync */
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync#ifndef VBOX_ONLY_DOCS
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync/*******************************************************************************
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync* Header Files *
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync*******************************************************************************/
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync#include <VBox/com/com.h>
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync#include <VBox/com/array.h>
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync#include <VBox/com/ErrorInfo.h>
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync#include <VBox/com/errorprint.h>
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync#include <VBox/com/VirtualBox.h>
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync#include <iprt/path.h>
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync#include <iprt/param.h>
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync#include <iprt/string.h>
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync#include <iprt/ctype.h>
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync#include <iprt/stream.h>
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync#include <iprt/getopt.h>
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync#include <VBox/log.h>
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync#include "VBoxManage.h"
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsyncusing namespace com;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync// funcs
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync///////////////////////////////////////////////////////////////////////////////
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsyncstatic const RTGETOPTDEF g_aStorageAttachOptions[] =
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync{
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync { "--storagectl", 's', RTGETOPT_REQ_STRING },
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync { "--port", 'p', RTGETOPT_REQ_UINT32 },
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync { "--device", 'd', RTGETOPT_REQ_UINT32 },
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync { "--medium", 'm', RTGETOPT_REQ_STRING },
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync { "--type", 't', RTGETOPT_REQ_STRING },
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync { "--passthrough", 'h', RTGETOPT_REQ_STRING },
80626cd34607c5dbf3f0af51b32396ce58bf493bvboxsync { "--forceunmount", 'f', RTGETOPT_REQ_NOTHING },
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync};
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsyncint handleStorageAttach(HandlerArg *a)
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync{
710a6316a22868b04400caf79719f96c18163cd3vboxsync int c = VERR_INTERNAL_ERROR; /* initialized to shut up gcc */
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync HRESULT rc = S_OK;
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync ULONG port = ~0U;
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync ULONG device = ~0U;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync bool fRunTime = false;
41b3442e21c3a79f3bc61ce67e3445757a83f281vboxsync bool fForceUnmount = false;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync const char *pszCtl = NULL;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync const char *pszType = NULL;
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync const char *pszMedium = NULL;
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync const char *pszPassThrough = NULL;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync Bstr machineuuid (a->argv[0]);
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync RTGETOPTUNION ValueUnion;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync RTGETOPTSTATE GetState;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync ComPtr<IMachine> machine;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync ComPtr<IStorageController> storageCtl;
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync ComPtr<ISystemProperties> systemProperties;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync if (a->argc < 9)
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync return errorSyntax(USAGE_STORAGEATTACH, "Too few parameters");
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync else if (a->argc > 13)
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync return errorSyntax(USAGE_STORAGEATTACH, "Too many parameters");
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
1dc37bff2fb26897f5892d8330fe2bc0c9859aecvboxsync RTGetOptInit(&GetState, a->argc, a->argv, g_aStorageAttachOptions,
fb1975a6972d89de9e515bed0248db93f04ec9d8vboxsync RT_ELEMENTS(g_aStorageAttachOptions), 1, RTGETOPTINIT_FLAGS_NO_STD_OPTS);
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync while ( SUCCEEDED(rc)
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync && (c = RTGetOpt(&GetState, &ValueUnion)))
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync switch (c)
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync case 's': // storage controller name
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync if (ValueUnion.psz)
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync pszCtl = ValueUnion.psz;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync else
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync rc = E_FAIL;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync break;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync case 'p': // port
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync port = ValueUnion.u32;
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync break;
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync }
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync case 'd': // device
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync {
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync device = ValueUnion.u32;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync break;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync case 'm': // medium <none|emptydrive|uuid|filename|host:<drive>>
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync if (ValueUnion.psz)
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync pszMedium = ValueUnion.psz;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync else
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync rc = E_FAIL;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync break;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync case 't': // type <dvddrive|hdd|fdd>
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync if (ValueUnion.psz)
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync pszType = ValueUnion.psz;
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync else
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync rc = E_FAIL;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync break;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync case 'h': // passthrough <on|off>
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync if (ValueUnion.psz)
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync pszPassThrough = ValueUnion.psz;
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync else
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync rc = E_FAIL;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync break;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
80626cd34607c5dbf3f0af51b32396ce58bf493bvboxsync case 'f': // force unmount medium during runtime
41b3442e21c3a79f3bc61ce67e3445757a83f281vboxsync {
80626cd34607c5dbf3f0af51b32396ce58bf493bvboxsync fForceUnmount = true;
41b3442e21c3a79f3bc61ce67e3445757a83f281vboxsync break;
41b3442e21c3a79f3bc61ce67e3445757a83f281vboxsync }
41b3442e21c3a79f3bc61ce67e3445757a83f281vboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync default:
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync errorGetOpt(USAGE_STORAGEATTACH, c, &ValueUnion);
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync rc = E_FAIL;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync break;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync if ( FAILED(rc)
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync || !pszCtl
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync || port == ~0U
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync || device == ~0U)
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync errorGetOpt(USAGE_STORAGEATTACH, c, &ValueUnion);
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync return 1;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync /* get the virtualbox system properties */
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync CHECK_ERROR_RET(a->virtualBox, COMGETTER(SystemProperties)(systemProperties.asOutParam()), 1);
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync /* try to find the given machine */
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync if (!Guid(machineuuid).isEmpty())
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
1dc37bff2fb26897f5892d8330fe2bc0c9859aecvboxsync CHECK_ERROR_RET(a->virtualBox, GetMachine(machineuuid, machine.asOutParam()), 1);
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync else
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
1dc37bff2fb26897f5892d8330fe2bc0c9859aecvboxsync CHECK_ERROR_RET(a->virtualBox, FindMachine(Bstr(a->argv[0]), machine.asOutParam()), 1);
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync machine->COMGETTER(Id)(machineuuid.asOutParam());
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync /* open a session for the VM */
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync rc = a->virtualBox->OpenSession(a->session, machineuuid);
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync if (FAILED(rc))
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync /* try to open an existing session for the VM */
1dc37bff2fb26897f5892d8330fe2bc0c9859aecvboxsync CHECK_ERROR_RET(a->virtualBox, OpenExistingSession(a->session, machineuuid), 1);
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync fRunTime = true;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
5f2909f8dd32d40a7e87f636c1a7c9de674be94bvboxsync if (fRunTime && !RTStrICmp(pszType, "hdd"))
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync {
5f2909f8dd32d40a7e87f636c1a7c9de674be94bvboxsync errorArgument("Hard disk drives cannot be changed while the VM is running\n");
5f2909f8dd32d40a7e87f636c1a7c9de674be94bvboxsync goto leave;
5f2909f8dd32d40a7e87f636c1a7c9de674be94bvboxsync }
5f2909f8dd32d40a7e87f636c1a7c9de674be94bvboxsync
5f2909f8dd32d40a7e87f636c1a7c9de674be94bvboxsync if (fRunTime && !RTStrICmp(pszMedium, "none"))
5f2909f8dd32d40a7e87f636c1a7c9de674be94bvboxsync {
5f2909f8dd32d40a7e87f636c1a7c9de674be94bvboxsync errorArgument("Drives cannot be removed while the VM is running\n");
2ca0ef39e90f953a6517aa2a658146c70485425dvboxsync goto leave;
2ca0ef39e90f953a6517aa2a658146c70485425dvboxsync }
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync
2ca0ef39e90f953a6517aa2a658146c70485425dvboxsync if (fRunTime && pszPassThrough)
2ca0ef39e90f953a6517aa2a658146c70485425dvboxsync {
5f2909f8dd32d40a7e87f636c1a7c9de674be94bvboxsync errorArgument("Drive passthrough state can't be changed while the VM is running\n");
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync goto leave;
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync }
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync /* get the mutable session machine */
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync a->session->COMGETTER(Machine)(machine.asOutParam());
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync /* check if the storage controller is present */
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync rc = machine->GetStorageControllerByName(Bstr(pszCtl), storageCtl.asOutParam());
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync if (FAILED(rc))
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync {
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync errorSyntax(USAGE_STORAGEATTACH, "Couldn't find the controller with the name: '%s'\n", pszCtl);
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync goto leave;
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
a771f44b96a464259788456c0c68e049e7588066vboxsync /* for sata controller check if the port count is big enough
a771f44b96a464259788456c0c68e049e7588066vboxsync * to accomodate the current port which is being assigned
a771f44b96a464259788456c0c68e049e7588066vboxsync * else just increase the port count
a771f44b96a464259788456c0c68e049e7588066vboxsync */
a771f44b96a464259788456c0c68e049e7588066vboxsync {
a771f44b96a464259788456c0c68e049e7588066vboxsync ULONG ulPortCount = 0;
a771f44b96a464259788456c0c68e049e7588066vboxsync ULONG ulMaxPortCount = 0;
a771f44b96a464259788456c0c68e049e7588066vboxsync
a771f44b96a464259788456c0c68e049e7588066vboxsync CHECK_ERROR(storageCtl, COMGETTER(MaxPortCount)(&ulMaxPortCount));
a771f44b96a464259788456c0c68e049e7588066vboxsync CHECK_ERROR(storageCtl, COMGETTER(PortCount)(&ulPortCount));
a771f44b96a464259788456c0c68e049e7588066vboxsync
a771f44b96a464259788456c0c68e049e7588066vboxsync if ( (ulPortCount != ulMaxPortCount)
a771f44b96a464259788456c0c68e049e7588066vboxsync && (port >= ulPortCount)
a771f44b96a464259788456c0c68e049e7588066vboxsync && (port < ulMaxPortCount))
a771f44b96a464259788456c0c68e049e7588066vboxsync CHECK_ERROR(storageCtl, COMSETTER(PortCount)(port + 1));
a771f44b96a464259788456c0c68e049e7588066vboxsync }
a771f44b96a464259788456c0c68e049e7588066vboxsync
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync if (!RTStrICmp(pszMedium, "none"))
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
1dc37bff2fb26897f5892d8330fe2bc0c9859aecvboxsync CHECK_ERROR(machine, DetachDevice(Bstr(pszCtl), port, device));
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync }
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync else if (!RTStrICmp(pszMedium, "emptydrive"))
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync {
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync if (fRunTime)
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync ComPtr<IMediumAttachment> mediumAttachment;
41b3442e21c3a79f3bc61ce67e3445757a83f281vboxsync DeviceType_T deviceType = DeviceType_Null;
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync rc = machine->GetMediumAttachment(Bstr(pszCtl), port, device, mediumAttachment.asOutParam());
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync if (SUCCEEDED(rc))
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
1dc37bff2fb26897f5892d8330fe2bc0c9859aecvboxsync mediumAttachment->COMGETTER(Type)(&deviceType);
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync if ( (deviceType == DeviceType_DVD)
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync || (deviceType == DeviceType_Floppy))
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync {
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync /* just unmount the floppy/dvd */
41b3442e21c3a79f3bc61ce67e3445757a83f281vboxsync CHECK_ERROR(machine, MountMedium(Bstr(pszCtl), port, device, Bstr(""), fForceUnmount));
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
41b3442e21c3a79f3bc61ce67e3445757a83f281vboxsync
41b3442e21c3a79f3bc61ce67e3445757a83f281vboxsync if ( FAILED(rc)
41b3442e21c3a79f3bc61ce67e3445757a83f281vboxsync || !( deviceType == DeviceType_DVD
41b3442e21c3a79f3bc61ce67e3445757a83f281vboxsync || deviceType == DeviceType_Floppy))
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync errorArgument("No DVD/Floppy Drive attached to the controller '%s'"
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync "at the port: %u, device: %u", pszCtl, port, device);
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync goto leave;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync else
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync {
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync StorageBus_T storageBus = StorageBus_Null;
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync DeviceType_T deviceType = DeviceType_Null;
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync com::SafeArray <DeviceType_T> saDeviceTypes;
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync ULONG driveCheck = 0;
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync /* check if the device type is supported by the controller */
1dc37bff2fb26897f5892d8330fe2bc0c9859aecvboxsync CHECK_ERROR(storageCtl, COMGETTER(Bus)(&storageBus));
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync CHECK_ERROR(systemProperties, GetDeviceTypesForStorageBus(storageBus, ComSafeArrayAsOutParam(saDeviceTypes)));
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync for (size_t i = 0; i < saDeviceTypes.size(); ++ i)
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync {
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync if ( (saDeviceTypes[i] == DeviceType_DVD)
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync || (saDeviceTypes[i] == DeviceType_Floppy))
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync driveCheck++;
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync }
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync if (!driveCheck)
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync {
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync errorArgument("The Attachment is not supported by the Storage Controller: '%s'", pszCtl);
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync goto leave;
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync }
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync if (storageBus == StorageBus_Floppy)
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync deviceType = DeviceType_Floppy;
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync else
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync deviceType = DeviceType_DVD;
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync /* attach a empty floppy/dvd drive after removing previous attachment */
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync machine->DetachDevice(Bstr(pszCtl), port, device);
1dc37bff2fb26897f5892d8330fe2bc0c9859aecvboxsync CHECK_ERROR(machine, AttachDevice(Bstr(pszCtl), port, device, deviceType, Bstr("")));
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync }
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync }
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync else
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync {
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync {
41c24e185aa1d6b5dc290edbd061c5a3c23a9e2fvboxsync /*
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync * try to determine the type of the drive from the
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync * storage controller chipset, the attachment and
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync * the medium being attached
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync */
eb381fae3bd3bff1dc6b4a194a9dab770961691evboxsync StorageControllerType_T ctlType = StorageControllerType_Null;
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync CHECK_ERROR(storageCtl, COMGETTER(ControllerType)(&ctlType));
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync if (ctlType == StorageControllerType_I82078)
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync {
41c24e185aa1d6b5dc290edbd061c5a3c23a9e2fvboxsync /*
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync * floppy controller found so lets assume the medium
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync * given by the user is also a floppy image or floppy
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync * host drive
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync */
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync pszType = "fdd";
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync }
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync else
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync {
41c24e185aa1d6b5dc290edbd061c5a3c23a9e2fvboxsync /*
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync * for SATA/SCSI/IDE it is hard to tell if it is a harddisk or
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync * a dvd being attached so lets check if the medium attachment
eb381fae3bd3bff1dc6b4a194a9dab770961691evboxsync * and the medium, both are of same type. if yes then we are
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync * sure of its type and don't need the user to enter it manually
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync * else ask the user for the type.
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync */
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync ComPtr<IMediumAttachment> mediumAttachement;
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync rc = machine->GetMediumAttachment(Bstr(pszCtl), port, device, mediumAttachement.asOutParam());
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync if (SUCCEEDED(rc))
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync {
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync DeviceType_T deviceType;
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync mediumAttachement->COMGETTER(Type)(&deviceType);
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync if (deviceType == DeviceType_DVD)
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync {
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync Bstr uuid(pszMedium);
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync ComPtr<IMedium> dvdMedium;
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync /* first assume it's a UUID */
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync rc = a->virtualBox->GetDVDImage(uuid, dvdMedium.asOutParam());
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync if (FAILED(rc) || !dvdMedium)
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync {
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync /* must be a filename, check if it's in the collection */
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync a->virtualBox->FindDVDImage(Bstr(pszMedium), dvdMedium.asOutParam());
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync }
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync if (dvdMedium)
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync {
41c24e185aa1d6b5dc290edbd061c5a3c23a9e2fvboxsync /*
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync * ok so the medium and attachment both are DVD's so it is
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync * safe to assume that we are dealing with a DVD here
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync */
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync pszType = "dvddrive";
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync }
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync }
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync else if (deviceType == DeviceType_HardDisk)
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync {
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync Bstr uuid(pszMedium);
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync ComPtr<IMedium> hardDisk;
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync /* first assume it's a UUID */
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync rc = a->virtualBox->GetHardDisk(uuid, hardDisk.asOutParam());
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync if (FAILED(rc) || !hardDisk)
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync {
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync /* must be a filename, check if it's in the collection */
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync a->virtualBox->FindHardDisk(Bstr(pszMedium), hardDisk.asOutParam());
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync }
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync if (hardDisk)
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync {
41c24e185aa1d6b5dc290edbd061c5a3c23a9e2fvboxsync /*
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync * ok so the medium and attachment both are hdd's so it is
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync * safe to assume that we are dealing with a hdd here
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync */
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync pszType = "hdd";
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync }
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync }
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync }
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync }
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync /* for all other cases lets ask the user what type of drive it is */
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync }
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync if (!pszType)
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync {
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync errorSyntax(USAGE_STORAGEATTACH, "Argument --type not specified\n");
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync goto leave;
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync }
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync /* check if the device type is supported by the controller */
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync {
9f2784134174d879b339a957156bb14151f39fd8vboxsync StorageBus_T storageBus = StorageBus_Null;
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync com::SafeArray <DeviceType_T> saDeviceTypes;
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync CHECK_ERROR(storageCtl, COMGETTER(Bus)(&storageBus));
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync CHECK_ERROR(systemProperties, GetDeviceTypesForStorageBus(storageBus, ComSafeArrayAsOutParam(saDeviceTypes)));
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync if (SUCCEEDED(rc))
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync {
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync ULONG driveCheck = 0;
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync for (size_t i = 0; i < saDeviceTypes.size(); ++ i)
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync {
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync if ( !RTStrICmp(pszType, "dvddrive")
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync && (saDeviceTypes[i] == DeviceType_DVD))
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync driveCheck++;
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync if ( !RTStrICmp(pszType, "hdd")
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync && (saDeviceTypes[i] == DeviceType_HardDisk))
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync driveCheck++;
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync if ( !RTStrICmp(pszType, "fdd")
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync && (saDeviceTypes[i] == DeviceType_Floppy))
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync driveCheck++;
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync }
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync if (!driveCheck)
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync {
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync errorArgument("The Attachment is not supported by the Storage Controller: '%s'", pszCtl);
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync goto leave;
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync }
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync }
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync else
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync goto leave;
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync }
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync if (!RTStrICmp(pszType, "dvddrive"))
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync Bstr uuid;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync ComPtr<IMedium> dvdMedium;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync if (!fRunTime)
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync ComPtr<IMediumAttachment> mediumAttachement;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync /* check if there is a dvd drive at the given location, if not attach one */
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync rc = machine->GetMediumAttachment(Bstr(pszCtl), port, device, mediumAttachement.asOutParam());
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync if (SUCCEEDED(rc))
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync DeviceType_T deviceType;
1dc37bff2fb26897f5892d8330fe2bc0c9859aecvboxsync mediumAttachement->COMGETTER(Type)(&deviceType);
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync if (deviceType != DeviceType_DVD)
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync machine->DetachDevice(Bstr(pszCtl), port, device);
2ca0ef39e90f953a6517aa2a658146c70485425dvboxsync rc = machine->AttachDevice(Bstr(pszCtl), port, device, DeviceType_DVD, Bstr(""));
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync else
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
2ca0ef39e90f953a6517aa2a658146c70485425dvboxsync rc = machine->AttachDevice(Bstr(pszCtl), port, device, DeviceType_DVD, Bstr(""));
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync /* Attach/Detach the dvd medium now */
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync do
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync /* host drive? */
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync if (!RTStrNICmp(pszMedium, "host:", 5))
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync ComPtr<IHost> host;
1dc37bff2fb26897f5892d8330fe2bc0c9859aecvboxsync CHECK_ERROR(a->virtualBox, COMGETTER(Host)(host.asOutParam()));
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync rc = host->FindHostDVDDrive(Bstr(pszMedium + 5), dvdMedium.asOutParam());
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync if (!dvdMedium)
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync /* 2nd try: try with the real name, important on Linux+libhal */
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync char szPathReal[RTPATH_MAX];
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync if (RT_FAILURE(RTPathReal(pszMedium + 5, szPathReal, sizeof(szPathReal))))
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync errorArgument("Invalid host DVD drive name \"%s\"", pszMedium + 5);
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync rc = E_FAIL;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync break;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync rc = host->FindHostDVDDrive(Bstr(szPathReal), dvdMedium.asOutParam());
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync if (!dvdMedium)
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync errorArgument("Invalid host DVD drive name \"%s\"", pszMedium + 5);
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync rc = E_FAIL;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync break;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync else
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync /* first assume it's a UUID */
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync uuid = pszMedium;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync rc = a->virtualBox->GetDVDImage(uuid, dvdMedium.asOutParam());
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync if (FAILED(rc) || !dvdMedium)
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync /* must be a filename, check if it's in the collection */
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync rc = a->virtualBox->FindDVDImage(Bstr(pszMedium), dvdMedium.asOutParam());
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync /* not registered, do that on the fly */
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync if (!dvdMedium)
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync Bstr emptyUUID;
1dc37bff2fb26897f5892d8330fe2bc0c9859aecvboxsync CHECK_ERROR(a->virtualBox, OpenDVDImage(Bstr(pszMedium),
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync emptyUUID, dvdMedium.asOutParam()));
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync if (!dvdMedium)
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync errorArgument("Invalid UUID or filename \"%s\"", pszMedium);
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync rc = E_FAIL;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync break;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync } while (0);
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync if (dvdMedium)
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync {
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync dvdMedium->COMGETTER(Id)(uuid.asOutParam());
41b3442e21c3a79f3bc61ce67e3445757a83f281vboxsync CHECK_ERROR(machine, MountMedium(Bstr(pszCtl), port, device, uuid, fForceUnmount));
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync else if ( !RTStrICmp(pszType, "hdd")
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync && !fRunTime)
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync ComPtr<IMediumAttachment> mediumAttachement;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync /* if there is anything attached at the given location, remove it */
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync machine->DetachDevice(Bstr(pszCtl), port, device);
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync /* first guess is that it's a UUID */
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync Bstr uuid(pszMedium);
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync ComPtr<IMedium> hardDisk;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync rc = a->virtualBox->GetHardDisk(uuid, hardDisk.asOutParam());
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync /* not successful? Then it must be a filename */
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync if (!hardDisk)
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync rc = a->virtualBox->FindHardDisk(Bstr(pszMedium), hardDisk.asOutParam());
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync if (FAILED(rc))
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync /* open the new hard disk object */
1dc37bff2fb26897f5892d8330fe2bc0c9859aecvboxsync CHECK_ERROR(a->virtualBox,
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync OpenHardDisk(Bstr(pszMedium),
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync AccessMode_ReadWrite, false, Bstr(""),
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync false, Bstr(""), hardDisk.asOutParam()));
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync if (hardDisk)
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync hardDisk->COMGETTER(Id)(uuid.asOutParam());
1dc37bff2fb26897f5892d8330fe2bc0c9859aecvboxsync CHECK_ERROR(machine, AttachDevice(Bstr(pszCtl), port, device, DeviceType_HardDisk, uuid));
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync else
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync errorArgument("Invalid UUID or filename \"%s\"", pszMedium);
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync rc = E_FAIL;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync else if (!RTStrICmp(pszType, "fdd"))
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync Bstr uuid;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync ComPtr<IMedium> floppyMedium;
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync ComPtr<IMediumAttachment> floppyAttachment;
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync machine->GetMediumAttachment(Bstr(pszCtl), port, device, floppyAttachment.asOutParam());
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync if ( !fRunTime
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync && !floppyAttachment)
1dc37bff2fb26897f5892d8330fe2bc0c9859aecvboxsync CHECK_ERROR(machine, AttachDevice(Bstr(pszCtl), port, device, DeviceType_Floppy, Bstr("")));
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync /* host drive? */
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync if (!RTStrNICmp(pszMedium, "host:", 5))
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync ComPtr<IHost> host;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
1dc37bff2fb26897f5892d8330fe2bc0c9859aecvboxsync CHECK_ERROR(a->virtualBox, COMGETTER(Host)(host.asOutParam()));
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync rc = host->FindHostFloppyDrive(Bstr(pszMedium + 5), floppyMedium.asOutParam());
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync if (!floppyMedium)
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync errorArgument("Invalid host floppy drive name \"%s\"", pszMedium + 5);
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync rc = E_FAIL;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync else
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync /* first assume it's a UUID */
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync uuid = pszMedium;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync rc = a->virtualBox->GetFloppyImage(uuid, floppyMedium.asOutParam());
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync if (FAILED(rc) || !floppyMedium)
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync /* must be a filename, check if it's in the collection */
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync rc = a->virtualBox->FindFloppyImage(Bstr(pszMedium), floppyMedium.asOutParam());
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync /* not registered, do that on the fly */
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync if (!floppyMedium)
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync Bstr emptyUUID;
1dc37bff2fb26897f5892d8330fe2bc0c9859aecvboxsync CHECK_ERROR(a->virtualBox,
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync OpenFloppyImage(Bstr(pszMedium),
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync emptyUUID,
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync floppyMedium.asOutParam()));
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync if (!floppyMedium)
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync {
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync errorArgument("Invalid UUID or filename \"%s\"", pszMedium);
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync rc = E_FAIL;
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync if (floppyMedium)
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync {
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync floppyMedium->COMGETTER(Id)(uuid.asOutParam());
41b3442e21c3a79f3bc61ce67e3445757a83f281vboxsync CHECK_ERROR(machine, MountMedium(Bstr(pszCtl), port, device, uuid, fForceUnmount));
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync }
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync }
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync else
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync {
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync errorArgument("Invalid --type argument '%s'", pszType);
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync rc = E_FAIL;
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync }
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync }
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync if ( pszPassThrough
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync && (SUCCEEDED(rc)))
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync {
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync ComPtr<IMediumAttachment> mattach;
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync
1dc37bff2fb26897f5892d8330fe2bc0c9859aecvboxsync CHECK_ERROR(machine, GetMediumAttachment(Bstr(pszCtl), port, device, mattach.asOutParam()));
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync if (SUCCEEDED(rc))
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync {
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync if (!RTStrICmp(pszPassThrough, "on"))
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync {
1dc37bff2fb26897f5892d8330fe2bc0c9859aecvboxsync CHECK_ERROR(machine, PassthroughDevice(Bstr(pszCtl), port, device, TRUE));
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync }
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync else if (!RTStrICmp(pszPassThrough, "off"))
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync {
1dc37bff2fb26897f5892d8330fe2bc0c9859aecvboxsync CHECK_ERROR(machine, PassthroughDevice(Bstr(pszCtl), port, device, FALSE));
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync }
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync else
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync {
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync errorArgument("Invalid --passthrough argument '%s'", pszPassThrough);
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync rc = E_FAIL;
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync }
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync }
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync else
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync {
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync errorArgument("Couldn't find the controller attachment for the controller '%s'\n", pszCtl);
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync rc = E_FAIL;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync /* commit changes */
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync if (SUCCEEDED(rc))
1dc37bff2fb26897f5892d8330fe2bc0c9859aecvboxsync CHECK_ERROR(machine, SaveSettings());
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsyncleave:
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync /* it's important to always close sessions */
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync a->session->Close();
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync return SUCCEEDED(rc) ? 0 : 1;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync}
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsyncstatic const RTGETOPTDEF g_aStorageControllerOptions[] =
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync{
2294b1479e3fb6f4e9c9550b3e15f3d3a3f1fc24vboxsync { "--name", 'n', RTGETOPT_REQ_STRING },
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync { "--add", 'a', RTGETOPT_REQ_STRING },
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync { "--controller", 'c', RTGETOPT_REQ_STRING },
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync { "--sataideemulation", 'e', RTGETOPT_REQ_UINT32 | RTGETOPT_FLAG_INDEX },
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync { "--sataportcount", 'p', RTGETOPT_REQ_UINT32 },
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync { "--remove", 'r', RTGETOPT_REQ_NOTHING },
89de31eab6e960abcacfb70916598ae1c2e7f737vboxsync { "--iobackend", 'i', RTGETOPT_REQ_STRING },
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync};
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsyncint handleStorageController(HandlerArg *a)
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync{
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync int c;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync HRESULT rc = S_OK;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync const char *pszCtl = NULL;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync const char *pszBusType = NULL;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync const char *pszCtlType = NULL;
89de31eab6e960abcacfb70916598ae1c2e7f737vboxsync const char *pszIoBackend = NULL;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync ULONG satabootdev = ~0U;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync ULONG sataidedev = ~0U;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync ULONG sataportcount = ~0U;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync bool fRemoveCtl = false;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync Bstr machineuuid (a->argv[0]);
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync ComPtr<IMachine> machine;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync RTGETOPTUNION ValueUnion;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync RTGETOPTSTATE GetState;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync if (a->argc < 4)
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync return errorSyntax(USAGE_STORAGECONTROLLER, "Too few parameters");
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync RTGetOptInit (&GetState, a->argc, a->argv, g_aStorageControllerOptions,
fb1975a6972d89de9e515bed0248db93f04ec9d8vboxsync RT_ELEMENTS(g_aStorageControllerOptions), 1, RTGETOPTINIT_FLAGS_NO_STD_OPTS);
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync while ( SUCCEEDED(rc)
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync && (c = RTGetOpt(&GetState, &ValueUnion)))
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync switch (c)
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
2294b1479e3fb6f4e9c9550b3e15f3d3a3f1fc24vboxsync case 'n': // controller name
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync if (ValueUnion.psz)
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync pszCtl = ValueUnion.psz;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync else
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync rc = E_FAIL;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync break;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync case 'a': // controller bus type <ide/sata/scsi/floppy>
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync if (ValueUnion.psz)
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync pszBusType = ValueUnion.psz;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync else
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync rc = E_FAIL;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync break;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync case 'c': // controller <lsilogic/buslogic/intelahci/piix3/piix4/ich6/i82078>
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync if (ValueUnion.psz)
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync pszCtlType = ValueUnion.psz;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync else
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync rc = E_FAIL;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync break;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync case 'e': // sataideemulation
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync satabootdev = GetState.uIndex;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync sataidedev = ValueUnion.u32;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync break;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync case 'p': // sataportcount
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync sataportcount = ValueUnion.u32;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync break;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync case 'r': // remove controller
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync fRemoveCtl = true;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync break;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
89de31eab6e960abcacfb70916598ae1c2e7f737vboxsync case 'i':
89de31eab6e960abcacfb70916598ae1c2e7f737vboxsync {
89de31eab6e960abcacfb70916598ae1c2e7f737vboxsync pszIoBackend = ValueUnion.psz;
89de31eab6e960abcacfb70916598ae1c2e7f737vboxsync break;
89de31eab6e960abcacfb70916598ae1c2e7f737vboxsync }
89de31eab6e960abcacfb70916598ae1c2e7f737vboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync default:
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync errorGetOpt(USAGE_STORAGECONTROLLER, c, &ValueUnion);
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync rc = E_FAIL;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync break;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync if (FAILED(rc))
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync return 1;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync /* try to find the given machine */
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync if (!Guid(machineuuid).isEmpty())
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
1dc37bff2fb26897f5892d8330fe2bc0c9859aecvboxsync CHECK_ERROR_RET(a->virtualBox, GetMachine (machineuuid, machine.asOutParam()), 1);
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync else
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
1dc37bff2fb26897f5892d8330fe2bc0c9859aecvboxsync CHECK_ERROR_RET(a->virtualBox, FindMachine(Bstr(a->argv[0]), machine.asOutParam()), 1);
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync machine->COMGETTER(Id)(machineuuid.asOutParam());
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync /* open a session for the VM */
1dc37bff2fb26897f5892d8330fe2bc0c9859aecvboxsync CHECK_ERROR_RET(a->virtualBox, OpenSession (a->session, machineuuid), 1);
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync /* get the mutable session machine */
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync a->session->COMGETTER(Machine)(machine.asOutParam());
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync if (!pszCtl)
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync /* it's important to always close sessions */
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync a->session->Close();
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync errorSyntax(USAGE_STORAGECONTROLLER, "Storage Controller Name not specified\n");
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync return 1;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync if (fRemoveCtl)
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync com::SafeIfaceArray<IMediumAttachment> mediumAttachments;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
1dc37bff2fb26897f5892d8330fe2bc0c9859aecvboxsync CHECK_ERROR(machine,
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync GetMediumAttachmentsOfController(Bstr(pszCtl),
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync ComSafeArrayAsOutParam(mediumAttachments)));
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync for (size_t i = 0; i < mediumAttachments.size(); ++ i)
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync ComPtr<IMediumAttachment> mediumAttach = mediumAttachments[i];
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync LONG port = 0;
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync LONG device = 0;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
1dc37bff2fb26897f5892d8330fe2bc0c9859aecvboxsync CHECK_ERROR(mediumAttach, COMGETTER(Port)(&port));
1dc37bff2fb26897f5892d8330fe2bc0c9859aecvboxsync CHECK_ERROR(mediumAttach, COMGETTER(Device)(&device));
1dc37bff2fb26897f5892d8330fe2bc0c9859aecvboxsync CHECK_ERROR(machine, DetachDevice(Bstr(pszCtl), port, device));
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync if (SUCCEEDED(rc))
1dc37bff2fb26897f5892d8330fe2bc0c9859aecvboxsync CHECK_ERROR(machine, RemoveStorageController(Bstr(pszCtl)));
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync else
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync errorArgument("Can't detach the devices connected to '%s' Controller\n"
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync "and thus its removal failed.", pszCtl);
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync else
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync if (pszBusType)
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync ComPtr<IStorageController> ctl;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync if (!RTStrICmp(pszBusType, "ide"))
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
1dc37bff2fb26897f5892d8330fe2bc0c9859aecvboxsync CHECK_ERROR(machine, AddStorageController(Bstr(pszCtl), StorageBus_IDE, ctl.asOutParam()));
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync else if (!RTStrICmp(pszBusType, "sata"))
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
1dc37bff2fb26897f5892d8330fe2bc0c9859aecvboxsync CHECK_ERROR(machine, AddStorageController(Bstr(pszCtl), StorageBus_SATA, ctl.asOutParam()));
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync else if (!RTStrICmp(pszBusType, "scsi"))
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
1dc37bff2fb26897f5892d8330fe2bc0c9859aecvboxsync CHECK_ERROR(machine, AddStorageController(Bstr(pszCtl), StorageBus_SCSI, ctl.asOutParam()));
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync else if (!RTStrICmp(pszBusType, "floppy"))
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
1dc37bff2fb26897f5892d8330fe2bc0c9859aecvboxsync CHECK_ERROR(machine, AddStorageController(Bstr(pszCtl), StorageBus_Floppy, ctl.asOutParam()));
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
b306a397b157898e6f769f640b0dfdffbf8beec7vboxsync else if (!RTStrICmp(pszBusType, "sas"))
b306a397b157898e6f769f640b0dfdffbf8beec7vboxsync {
b306a397b157898e6f769f640b0dfdffbf8beec7vboxsync CHECK_ERROR(machine, AddStorageController(Bstr(pszCtl), StorageBus_SAS, ctl.asOutParam()));
b306a397b157898e6f769f640b0dfdffbf8beec7vboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync else
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync errorArgument("Invalid --add argument '%s'", pszBusType);
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync rc = E_FAIL;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync if ( pszCtlType
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync && SUCCEEDED(rc))
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync ComPtr<IStorageController> ctl;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
1dc37bff2fb26897f5892d8330fe2bc0c9859aecvboxsync CHECK_ERROR(machine, GetStorageControllerByName(Bstr(pszCtl), ctl.asOutParam()));
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync if (SUCCEEDED(rc))
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync if (!RTStrICmp(pszCtlType, "lsilogic"))
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
1dc37bff2fb26897f5892d8330fe2bc0c9859aecvboxsync CHECK_ERROR(ctl, COMSETTER(ControllerType)(StorageControllerType_LsiLogic));
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync else if (!RTStrICmp(pszCtlType, "buslogic"))
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
1dc37bff2fb26897f5892d8330fe2bc0c9859aecvboxsync CHECK_ERROR(ctl, COMSETTER(ControllerType)(StorageControllerType_BusLogic));
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync else if (!RTStrICmp(pszCtlType, "intelahci"))
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
1dc37bff2fb26897f5892d8330fe2bc0c9859aecvboxsync CHECK_ERROR(ctl, COMSETTER(ControllerType)(StorageControllerType_IntelAhci));
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync else if (!RTStrICmp(pszCtlType, "piix3"))
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
1dc37bff2fb26897f5892d8330fe2bc0c9859aecvboxsync CHECK_ERROR(ctl, COMSETTER(ControllerType)(StorageControllerType_PIIX3));
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync else if (!RTStrICmp(pszCtlType, "piix4"))
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
1dc37bff2fb26897f5892d8330fe2bc0c9859aecvboxsync CHECK_ERROR(ctl, COMSETTER(ControllerType)(StorageControllerType_PIIX4));
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync else if (!RTStrICmp(pszCtlType, "ich6"))
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
1dc37bff2fb26897f5892d8330fe2bc0c9859aecvboxsync CHECK_ERROR(ctl, COMSETTER(ControllerType)(StorageControllerType_ICH6));
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync else if (!RTStrICmp(pszCtlType, "i82078"))
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
1dc37bff2fb26897f5892d8330fe2bc0c9859aecvboxsync CHECK_ERROR(ctl, COMSETTER(ControllerType)(StorageControllerType_I82078));
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
40f74699d21578c96f79fa80bd8563a72c7b315cvboxsync else if (!RTStrICmp(pszCtlType, "lsilogicsas"))
b306a397b157898e6f769f640b0dfdffbf8beec7vboxsync {
b306a397b157898e6f769f640b0dfdffbf8beec7vboxsync CHECK_ERROR(ctl, COMSETTER(ControllerType)(StorageControllerType_LsiLogicSas));
b306a397b157898e6f769f640b0dfdffbf8beec7vboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync else
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync errorArgument("Invalid --type argument '%s'", pszCtlType);
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync rc = E_FAIL;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync else
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync errorArgument("Couldn't find the controller with the name: '%s'\n", pszCtl);
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync rc = E_FAIL;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync if ( (sataportcount != ~0U)
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync && SUCCEEDED(rc))
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync ComPtr<IStorageController> ctl;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
1dc37bff2fb26897f5892d8330fe2bc0c9859aecvboxsync CHECK_ERROR(machine, GetStorageControllerByName(Bstr(pszCtl), ctl.asOutParam()));
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync if (SUCCEEDED(rc))
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
1dc37bff2fb26897f5892d8330fe2bc0c9859aecvboxsync CHECK_ERROR(ctl, COMSETTER(PortCount)(sataportcount));
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync else
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync errorArgument("Couldn't find the controller with the name: '%s'\n", pszCtl);
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync rc = E_FAIL;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync if ( (sataidedev != ~0U)
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync && (satabootdev != ~0U)
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync && SUCCEEDED(rc))
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync ComPtr<IStorageController> ctl;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
1dc37bff2fb26897f5892d8330fe2bc0c9859aecvboxsync CHECK_ERROR(machine, GetStorageControllerByName(Bstr(pszCtl), ctl.asOutParam()));
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync if (SUCCEEDED(rc))
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
1dc37bff2fb26897f5892d8330fe2bc0c9859aecvboxsync CHECK_ERROR(ctl, SetIDEEmulationPort(satabootdev, sataidedev));
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync else
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync errorArgument("Couldn't find the controller with the name: '%s'\n", pszCtl);
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync rc = E_FAIL;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
89de31eab6e960abcacfb70916598ae1c2e7f737vboxsync
89de31eab6e960abcacfb70916598ae1c2e7f737vboxsync if ( pszIoBackend
89de31eab6e960abcacfb70916598ae1c2e7f737vboxsync && SUCCEEDED(rc))
89de31eab6e960abcacfb70916598ae1c2e7f737vboxsync {
89de31eab6e960abcacfb70916598ae1c2e7f737vboxsync ComPtr<IStorageController> ctl;
89de31eab6e960abcacfb70916598ae1c2e7f737vboxsync
89de31eab6e960abcacfb70916598ae1c2e7f737vboxsync CHECK_ERROR(machine, GetStorageControllerByName(Bstr(pszCtl), ctl.asOutParam()));
89de31eab6e960abcacfb70916598ae1c2e7f737vboxsync
89de31eab6e960abcacfb70916598ae1c2e7f737vboxsync if (!RTStrICmp(pszIoBackend, "buffered"))
89de31eab6e960abcacfb70916598ae1c2e7f737vboxsync {
89de31eab6e960abcacfb70916598ae1c2e7f737vboxsync CHECK_ERROR(ctl, COMSETTER(IoBackend)(IoBackendType_Buffered));
89de31eab6e960abcacfb70916598ae1c2e7f737vboxsync }
89de31eab6e960abcacfb70916598ae1c2e7f737vboxsync else if (!RTStrICmp(pszIoBackend, "unbuffered"))
89de31eab6e960abcacfb70916598ae1c2e7f737vboxsync {
89de31eab6e960abcacfb70916598ae1c2e7f737vboxsync CHECK_ERROR(ctl, COMSETTER(IoBackend)(IoBackendType_Unbuffered));
89de31eab6e960abcacfb70916598ae1c2e7f737vboxsync }
89de31eab6e960abcacfb70916598ae1c2e7f737vboxsync else
89de31eab6e960abcacfb70916598ae1c2e7f737vboxsync {
89de31eab6e960abcacfb70916598ae1c2e7f737vboxsync errorArgument("Invalid --type argument '%s'", pszIoBackend);
89de31eab6e960abcacfb70916598ae1c2e7f737vboxsync rc = E_FAIL;
89de31eab6e960abcacfb70916598ae1c2e7f737vboxsync }
89de31eab6e960abcacfb70916598ae1c2e7f737vboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync /* commit changes */
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync if (SUCCEEDED(rc))
1dc37bff2fb26897f5892d8330fe2bc0c9859aecvboxsync CHECK_ERROR(machine, SaveSettings());
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync /* it's important to always close sessions */
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync a->session->Close();
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync return SUCCEEDED(rc) ? 0 : 1;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync}
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync#endif /* !VBOX_ONLY_DOCS */
41c24e185aa1d6b5dc290edbd061c5a3c23a9e2fvboxsync