bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync/* $Id$ */
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync/** @file
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * VBoxManage - The storage controller related commands.
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync */
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync/*
340c9153ef85fdaf7acf99926a068a62197308cfvboxsync * Copyright (C) 2006-2015 Oracle Corporation
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
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{
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync { "--storagectl", 's', RTGETOPT_REQ_STRING },
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync { "--port", 'p', RTGETOPT_REQ_UINT32 },
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync { "--device", 'd', RTGETOPT_REQ_UINT32 },
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync { "--type", 't', RTGETOPT_REQ_STRING },
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync { "--medium", 'm', RTGETOPT_REQ_STRING },
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync { "--mtype", 'M', RTGETOPT_REQ_STRING },
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync { "--passthrough", 'h', RTGETOPT_REQ_STRING },
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync { "--tempeject", 'e', RTGETOPT_REQ_STRING },
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync { "--nonrotational", 'n', RTGETOPT_REQ_STRING },
6febf3149010855617e4a37e2c49f93d68930d44vboxsync { "--discard", 'u', RTGETOPT_REQ_STRING },
2e8034536f2ada0455cc5c85f746e5e1cd49eea0vboxsync { "--hotpluggable", 'o', RTGETOPT_REQ_STRING },
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync { "--bandwidthgroup", 'b', RTGETOPT_REQ_STRING },
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync { "--forceunmount", 'f', RTGETOPT_REQ_NOTHING },
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync { "--comment", 'C', RTGETOPT_REQ_STRING },
80e46f984efd827517661c0e081a36014ca41af8vboxsync { "--setuuid", 'q', RTGETOPT_REQ_STRING },
80e46f984efd827517661c0e081a36014ca41af8vboxsync { "--setparentuuid", 'Q', RTGETOPT_REQ_STRING },
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync // iSCSI options
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync { "--server", 'S', RTGETOPT_REQ_STRING },
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync { "--target", 'T', RTGETOPT_REQ_STRING },
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync { "--tport", 'P', RTGETOPT_REQ_STRING },
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync { "--lun", 'L', RTGETOPT_REQ_STRING },
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync { "--encodedlun", 'E', RTGETOPT_REQ_STRING },
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync { "--username", 'U', RTGETOPT_REQ_STRING },
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync { "--password", 'W', RTGETOPT_REQ_STRING },
48dafba24ef28f07a241e5857a43b327822574a8vboxsync { "--initiator", 'N', RTGETOPT_REQ_STRING },
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync { "--intnet", 'I', 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;
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync ULONG device = ~0U;
41b3442e21c3a79f3bc61ce67e3445757a83f281vboxsync bool fForceUnmount = false;
06782e19f5e2144408396dcec922c423c5ef9da8vboxsync bool fSetMediumType = false;
80e46f984efd827517661c0e081a36014ca41af8vboxsync bool fSetNewUuid = false;
80e46f984efd827517661c0e081a36014ca41af8vboxsync bool fSetNewParentUuid = false;
340c9153ef85fdaf7acf99926a068a62197308cfvboxsync MediumType_T enmMediumType = MediumType_Normal;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync Bstr bstrComment;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync const char *pszCtl = NULL;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync DeviceType_T devTypeRequested = DeviceType_Null;
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync const char *pszMedium = NULL;
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync const char *pszPassThrough = NULL;
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync const char *pszTempEject = NULL;
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync const char *pszNonRotational = NULL;
6febf3149010855617e4a37e2c49f93d68930d44vboxsync const char *pszDiscard = NULL;
2e8034536f2ada0455cc5c85f746e5e1cd49eea0vboxsync const char *pszHotPluggable = NULL;
63b785c3291332a86a9bc473e68f08121368898bvboxsync const char *pszBandwidthGroup = NULL;
80e46f984efd827517661c0e081a36014ca41af8vboxsync Bstr bstrNewUuid;
80e46f984efd827517661c0e081a36014ca41af8vboxsync Bstr bstrNewParentUuid;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync // iSCSI options
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync Bstr bstrServer;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync Bstr bstrTarget;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync Bstr bstrPort;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync Bstr bstrLun;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync Bstr bstrUsername;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync Bstr bstrPassword;
48dafba24ef28f07a241e5857a43b327822574a8vboxsync Bstr bstrInitiator;
c0a5da26f7222b0a486d6d9ba4d1f475a78a2c73vboxsync Bstr bstrIso;
c0a5da26f7222b0a486d6d9ba4d1f475a78a2c73vboxsync Utf8Str strIso;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync bool fIntNet = false;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync RTGETOPTUNION ValueUnion;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync RTGETOPTSTATE GetState;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync ComPtr<IMachine> machine;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync ComPtr<IStorageController> storageCtl;
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync ComPtr<ISystemProperties> systemProperties;
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
c0a5da26f7222b0a486d6d9ba4d1f475a78a2c73vboxsync case 'm': // medium <none|emptydrive|additions|uuid|filename|host:<drive>|iSCSI>
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)
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync {
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync if (!RTStrICmp(ValueUnion.psz, "hdd"))
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync devTypeRequested = DeviceType_HardDisk;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync else if (!RTStrICmp(ValueUnion.psz, "fdd"))
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync devTypeRequested = DeviceType_Floppy;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync else if (!RTStrICmp(ValueUnion.psz, "dvddrive"))
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync devTypeRequested = DeviceType_DVD;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync else
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync return errorArgument("Invalid --type argument '%s'", ValueUnion.psz);
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync }
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
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync case 'e': // tempeject <on|off>
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync {
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync if (ValueUnion.psz)
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync pszTempEject = ValueUnion.psz;
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync else
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync rc = E_FAIL;
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync break;
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync }
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync case 'n': // nonrotational <on|off>
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync {
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync if (ValueUnion.psz)
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync pszNonRotational = ValueUnion.psz;
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync else
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync rc = E_FAIL;
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync break;
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync }
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync
1dcb29173110bb3b9e583ec29ce181ad198fe8davboxsync case 'u': // discard <on|off>
6febf3149010855617e4a37e2c49f93d68930d44vboxsync {
6febf3149010855617e4a37e2c49f93d68930d44vboxsync if (ValueUnion.psz)
6febf3149010855617e4a37e2c49f93d68930d44vboxsync pszDiscard = ValueUnion.psz;
6febf3149010855617e4a37e2c49f93d68930d44vboxsync else
6febf3149010855617e4a37e2c49f93d68930d44vboxsync rc = E_FAIL;
6febf3149010855617e4a37e2c49f93d68930d44vboxsync break;
6febf3149010855617e4a37e2c49f93d68930d44vboxsync }
6febf3149010855617e4a37e2c49f93d68930d44vboxsync
2e8034536f2ada0455cc5c85f746e5e1cd49eea0vboxsync case 'o': // hotpluggable <on|off>
2e8034536f2ada0455cc5c85f746e5e1cd49eea0vboxsync {
2e8034536f2ada0455cc5c85f746e5e1cd49eea0vboxsync if (ValueUnion.psz)
2e8034536f2ada0455cc5c85f746e5e1cd49eea0vboxsync pszHotPluggable = ValueUnion.psz;
2e8034536f2ada0455cc5c85f746e5e1cd49eea0vboxsync else
2e8034536f2ada0455cc5c85f746e5e1cd49eea0vboxsync rc = E_FAIL;
2e8034536f2ada0455cc5c85f746e5e1cd49eea0vboxsync break;
2e8034536f2ada0455cc5c85f746e5e1cd49eea0vboxsync }
2e8034536f2ada0455cc5c85f746e5e1cd49eea0vboxsync
63b785c3291332a86a9bc473e68f08121368898bvboxsync case 'b': // bandwidthgroup <name>
63b785c3291332a86a9bc473e68f08121368898bvboxsync {
63b785c3291332a86a9bc473e68f08121368898bvboxsync if (ValueUnion.psz)
63b785c3291332a86a9bc473e68f08121368898bvboxsync pszBandwidthGroup = ValueUnion.psz;
63b785c3291332a86a9bc473e68f08121368898bvboxsync else
63b785c3291332a86a9bc473e68f08121368898bvboxsync rc = E_FAIL;
63b785c3291332a86a9bc473e68f08121368898bvboxsync break;
63b785c3291332a86a9bc473e68f08121368898bvboxsync }
63b785c3291332a86a9bc473e68f08121368898bvboxsync
80626cd34607c5dbf3f0af51b32396ce58bf493bvboxsync case 'f': // force unmount medium during runtime
41b3442e21c3a79f3bc61ce67e3445757a83f281vboxsync {
80626cd34607c5dbf3f0af51b32396ce58bf493bvboxsync fForceUnmount = true;
41b3442e21c3a79f3bc61ce67e3445757a83f281vboxsync break;
41b3442e21c3a79f3bc61ce67e3445757a83f281vboxsync }
41b3442e21c3a79f3bc61ce67e3445757a83f281vboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync case 'C':
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync if (ValueUnion.psz)
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync bstrComment = ValueUnion.psz;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync else
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync rc = E_FAIL;
80e46f984efd827517661c0e081a36014ca41af8vboxsync break;
80e46f984efd827517661c0e081a36014ca41af8vboxsync
80e46f984efd827517661c0e081a36014ca41af8vboxsync case 'q':
80e46f984efd827517661c0e081a36014ca41af8vboxsync if (ValueUnion.psz)
80e46f984efd827517661c0e081a36014ca41af8vboxsync {
80e46f984efd827517661c0e081a36014ca41af8vboxsync bstrNewUuid = ValueUnion.psz;
80e46f984efd827517661c0e081a36014ca41af8vboxsync fSetNewUuid = true;
80e46f984efd827517661c0e081a36014ca41af8vboxsync }
80e46f984efd827517661c0e081a36014ca41af8vboxsync else
80e46f984efd827517661c0e081a36014ca41af8vboxsync rc = E_FAIL;
80e46f984efd827517661c0e081a36014ca41af8vboxsync break;
80e46f984efd827517661c0e081a36014ca41af8vboxsync
80e46f984efd827517661c0e081a36014ca41af8vboxsync case 'Q':
80e46f984efd827517661c0e081a36014ca41af8vboxsync if (ValueUnion.psz)
80e46f984efd827517661c0e081a36014ca41af8vboxsync {
80e46f984efd827517661c0e081a36014ca41af8vboxsync bstrNewParentUuid = ValueUnion.psz;
80e46f984efd827517661c0e081a36014ca41af8vboxsync fSetNewParentUuid = true;
80e46f984efd827517661c0e081a36014ca41af8vboxsync }
80e46f984efd827517661c0e081a36014ca41af8vboxsync else
80e46f984efd827517661c0e081a36014ca41af8vboxsync rc = E_FAIL;
80e46f984efd827517661c0e081a36014ca41af8vboxsync break;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync case 'S': // --server
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync bstrServer = ValueUnion.psz;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync break;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync case 'T': // --target
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync bstrTarget = ValueUnion.psz;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync break;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync case 'P': // --tport
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync bstrPort = ValueUnion.psz;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync break;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync case 'L': // --lun
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync bstrLun = ValueUnion.psz;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync break;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync case 'E': // --encodedlun
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync bstrLun = BstrFmt("enc%s", ValueUnion.psz);
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync break;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync case 'U': // --username
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync bstrUsername = ValueUnion.psz;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync break;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync case 'W': // --password
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync bstrPassword = ValueUnion.psz;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync break;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync
48dafba24ef28f07a241e5857a43b327822574a8vboxsync case 'N': // --initiator
48dafba24ef28f07a241e5857a43b327822574a8vboxsync bstrInitiator = ValueUnion.psz;
48dafba24ef28f07a241e5857a43b327822574a8vboxsync break;
48dafba24ef28f07a241e5857a43b327822574a8vboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync case 'M': // --type
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync {
340c9153ef85fdaf7acf99926a068a62197308cfvboxsync int vrc = parseMediumType(ValueUnion.psz, &enmMediumType);
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync if (RT_FAILURE(vrc))
340c9153ef85fdaf7acf99926a068a62197308cfvboxsync return errorArgument("Invalid medium type '%s'", ValueUnion.psz);
06782e19f5e2144408396dcec922c423c5ef9da8vboxsync fSetMediumType = true;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync break;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync }
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync case 'I': // --intnet
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync fIntNet = true;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync break;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync default:
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync errorGetOpt(USAGE_STORAGEATTACH, c, &ValueUnion);
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync rc = E_FAIL;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync break;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
194a8ad893b721dfc22ac5f955671f09db015a3fvboxsync
e073b07dcb5c9827f0530a9bfa2643356c5656dbvboxsync if (FAILED(rc))
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync return 1;
e073b07dcb5c9827f0530a9bfa2643356c5656dbvboxsync
e073b07dcb5c9827f0530a9bfa2643356c5656dbvboxsync if (!pszCtl)
e073b07dcb5c9827f0530a9bfa2643356c5656dbvboxsync return errorSyntax(USAGE_STORAGEATTACH, "Storage controller name not specified");
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync /* get the virtualbox system properties */
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync CHECK_ERROR_RET(a->virtualBox, COMGETTER(SystemProperties)(systemProperties.asOutParam()), 1);
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync // find the machine, lock it, get the mutable session machine
508452243fd3328f7b9e0405d39fb9dc004e31b8vboxsync CHECK_ERROR_RET(a->virtualBox, FindMachine(Bstr(a->argv[0]).raw(),
508452243fd3328f7b9e0405d39fb9dc004e31b8vboxsync machine.asOutParam()), 1);
f409459bdd4c15cdb8d7fb6c6d54338cce9ac814vboxsync CHECK_ERROR_RET(machine, LockMachine(a->session, LockType_Shared), 1);
f409459bdd4c15cdb8d7fb6c6d54338cce9ac814vboxsync SessionType_T st;
f409459bdd4c15cdb8d7fb6c6d54338cce9ac814vboxsync CHECK_ERROR_RET(a->session, COMGETTER(Type)(&st), 1);
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync a->session->COMGETTER(Machine)(machine.asOutParam());
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync try
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync {
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync bool fRunTime = (st == SessionType_Shared);
bc04c0fb1382c98fb74fb38ac5dbd3f06ea6a92bvboxsync
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync if (fRunTime)
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
bc04c0fb1382c98fb74fb38ac5dbd3f06ea6a92bvboxsync if (pszPassThrough)
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync throw Utf8Str("Drive passthrough state cannot be changed while the VM is running\n");
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync else if (pszBandwidthGroup)
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync throw Utf8Str("Bandwidth group cannot be changed while the VM is running\n");
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync }
41b3442e21c3a79f3bc61ce67e3445757a83f281vboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync /* check if the storage controller is present */
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync rc = machine->GetStorageControllerByName(Bstr(pszCtl).raw(),
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync storageCtl.asOutParam());
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync if (FAILED(rc))
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync throw Utf8StrFmt("Could not find a controller named '%s'\n", pszCtl);
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync StorageBus_T storageBus = StorageBus_Null;
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync CHECK_ERROR_RET(storageCtl, COMGETTER(Bus)(&storageBus), 1);
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync ULONG maxPorts = 0;
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync CHECK_ERROR_RET(systemProperties, GetMaxPortCountForStorageBus(storageBus, &maxPorts), 1);
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync ULONG maxDevices = 0;
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync CHECK_ERROR_RET(systemProperties, GetMaxDevicesPerPortForStorageBus(storageBus, &maxDevices), 1);
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync if (port == ~0U)
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync {
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync if (maxPorts == 1)
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync port = 0;
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync else
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync return errorSyntax(USAGE_STORAGEATTACH, "Port not specified");
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync }
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync if (device == ~0U)
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync {
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync if (maxDevices == 1)
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync device = 0;
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync else
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync return errorSyntax(USAGE_STORAGEATTACH, "Device not specified");
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync }
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync /* for sata controller check if the port count is big enough
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * to accommodate the current port which is being assigned
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * else just increase the port count
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync */
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync {
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync ULONG ulPortCount = 0;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync ULONG ulMaxPortCount = 0;
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync CHECK_ERROR(storageCtl, COMGETTER(MaxPortCount)(&ulMaxPortCount));
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync CHECK_ERROR(storageCtl, COMGETTER(PortCount)(&ulPortCount));
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync if ( (ulPortCount != ulMaxPortCount)
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync && (port >= ulPortCount)
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync && (port < ulMaxPortCount))
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync CHECK_ERROR(storageCtl, COMSETTER(PortCount)(port + 1));
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync }
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync StorageControllerType_T ctlType = StorageControllerType_Null;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync CHECK_ERROR(storageCtl, COMGETTER(ControllerType)(&ctlType));
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync if (!RTStrICmp(pszMedium, "none"))
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync {
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync CHECK_ERROR(machine, DetachDevice(Bstr(pszCtl).raw(), port, device));
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync }
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync else if (!RTStrICmp(pszMedium, "emptydrive"))
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync {
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync if (fRunTime)
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync {
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync ComPtr<IMediumAttachment> mediumAttachment;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync DeviceType_T deviceType = DeviceType_Null;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync rc = machine->GetMediumAttachment(Bstr(pszCtl).raw(), port, device,
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync mediumAttachment.asOutParam());
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync if (SUCCEEDED(rc))
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync {
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync mediumAttachment->COMGETTER(Type)(&deviceType);
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync if ( (deviceType == DeviceType_DVD)
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync || (deviceType == DeviceType_Floppy))
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync {
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync /* just unmount the floppy/dvd */
df2a53dee17325742e7464e7f53d3f99dc500f3avboxsync CHECK_ERROR(machine, UnmountMedium(Bstr(pszCtl).raw(),
df2a53dee17325742e7464e7f53d3f99dc500f3avboxsync port,
df2a53dee17325742e7464e7f53d3f99dc500f3avboxsync device,
df2a53dee17325742e7464e7f53d3f99dc500f3avboxsync fForceUnmount));
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync }
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync }
9113fcf881235e2b3df9ce4760b299c929ac3a62vboxsync else if (devTypeRequested == DeviceType_DVD)
9113fcf881235e2b3df9ce4760b299c929ac3a62vboxsync {
9113fcf881235e2b3df9ce4760b299c929ac3a62vboxsync /*
9113fcf881235e2b3df9ce4760b299c929ac3a62vboxsync * Try to attach an empty DVD drive as a hotplug operation.
9113fcf881235e2b3df9ce4760b299c929ac3a62vboxsync * Main will complain if the controller doesn't support hotplugging.
9113fcf881235e2b3df9ce4760b299c929ac3a62vboxsync */
1871985cb4854e5bfb2ead8174ee28dbfce74df5vboxsync CHECK_ERROR(machine, AttachDeviceWithoutMedium(Bstr(pszCtl).raw(), port, device,
1871985cb4854e5bfb2ead8174ee28dbfce74df5vboxsync devTypeRequested));
9113fcf881235e2b3df9ce4760b299c929ac3a62vboxsync deviceType = DeviceType_DVD; /* To avoid the error message below. */
9113fcf881235e2b3df9ce4760b299c929ac3a62vboxsync }
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync if ( FAILED(rc)
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync || !( deviceType == DeviceType_DVD
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync || deviceType == DeviceType_Floppy)
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync )
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync throw Utf8StrFmt("No DVD/Floppy Drive attached to the controller '%s'"
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync "at the port: %u, device: %u", pszCtl, port, device);
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync }
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync else
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync {
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync DeviceType_T deviceType = DeviceType_Null;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync com::SafeArray <DeviceType_T> saDeviceTypes;
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync ULONG driveCheck = 0;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync /* check if the device type is supported by the controller */
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync CHECK_ERROR(systemProperties, GetDeviceTypesForStorageBus(storageBus, ComSafeArrayAsOutParam(saDeviceTypes)));
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync for (size_t i = 0; i < saDeviceTypes.size(); ++ i)
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync {
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync if ( (saDeviceTypes[i] == DeviceType_DVD)
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync || (saDeviceTypes[i] == DeviceType_Floppy))
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync driveCheck++;
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync }
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync if (!driveCheck)
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync throw Utf8StrFmt("The attachment is not supported by the storage controller '%s'", pszCtl);
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync if (storageBus == StorageBus_Floppy)
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync deviceType = DeviceType_Floppy;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync else
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync deviceType = DeviceType_DVD;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync /* attach a empty floppy/dvd drive after removing previous attachment */
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync machine->DetachDevice(Bstr(pszCtl).raw(), port, device);
1871985cb4854e5bfb2ead8174ee28dbfce74df5vboxsync CHECK_ERROR(machine, AttachDeviceWithoutMedium(Bstr(pszCtl).raw(), port, device,
1871985cb4854e5bfb2ead8174ee28dbfce74df5vboxsync deviceType));
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync }
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync } // end if (!RTStrICmp(pszMedium, "emptydrive"))
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync else
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync {
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync ComPtr<IMedium> pMedium2Mount;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync // not "none", not "emptydrive": then it must be a UUID or filename or hostdrive or iSCSI;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync // for all these we first need to know the type of drive we're attaching to
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync {
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync /*
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * try to determine the type of the drive from the
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * storage controller chipset, the attachment and
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * the medium being attached
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync */
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync if (ctlType == StorageControllerType_I82078) // floppy controller
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync devTypeRequested = DeviceType_Floppy;
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync else
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync {
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync /*
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * for SATA/SCSI/IDE it is hard to tell if it is a harddisk or
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * a dvd being attached so lets check if the medium attachment
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * and the medium, both are of same type. if yes then we are
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * sure of its type and don't need the user to enter it manually
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * else ask the user for the type.
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync */
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync ComPtr<IMediumAttachment> mediumAttachment;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync rc = machine->GetMediumAttachment(Bstr(pszCtl).raw(), port,
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync device,
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync mediumAttachment.asOutParam());
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync if (SUCCEEDED(rc))
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync {
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync DeviceType_T deviceType;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync mediumAttachment->COMGETTER(Type)(&deviceType);
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync if (pszMedium)
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync {
c0a5da26f7222b0a486d6d9ba4d1f475a78a2c73vboxsync if (!RTStrICmp(pszMedium, "additions"))
c0a5da26f7222b0a486d6d9ba4d1f475a78a2c73vboxsync {
c0a5da26f7222b0a486d6d9ba4d1f475a78a2c73vboxsync ComPtr<ISystemProperties> pProperties;
c0a5da26f7222b0a486d6d9ba4d1f475a78a2c73vboxsync CHECK_ERROR(a->virtualBox,
c0a5da26f7222b0a486d6d9ba4d1f475a78a2c73vboxsync COMGETTER(SystemProperties)(pProperties.asOutParam()));
c0a5da26f7222b0a486d6d9ba4d1f475a78a2c73vboxsync CHECK_ERROR(pProperties, COMGETTER(DefaultAdditionsISO)(bstrIso.asOutParam()));
c0a5da26f7222b0a486d6d9ba4d1f475a78a2c73vboxsync strIso = Utf8Str(bstrIso);
8061fbf7d0edfa63d1a7c4b6134d02f1c4180ac4vboxsync if (strIso.isEmpty())
8061fbf7d0edfa63d1a7c4b6134d02f1c4180ac4vboxsync throw Utf8Str("Cannot find the Guest Additions ISO image\n");
c0a5da26f7222b0a486d6d9ba4d1f475a78a2c73vboxsync pszMedium = strIso.c_str();
c0a5da26f7222b0a486d6d9ba4d1f475a78a2c73vboxsync if (devTypeRequested == DeviceType_Null)
c0a5da26f7222b0a486d6d9ba4d1f475a78a2c73vboxsync devTypeRequested = DeviceType_DVD;
c0a5da26f7222b0a486d6d9ba4d1f475a78a2c73vboxsync }
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync ComPtr<IMedium> pExistingMedium;
a9f530691071e3496b072915b0c5ceabd4e05ea5vboxsync rc = openMedium(a, pszMedium, deviceType,
a9f530691071e3496b072915b0c5ceabd4e05ea5vboxsync AccessMode_ReadWrite,
a9f530691071e3496b072915b0c5ceabd4e05ea5vboxsync pExistingMedium,
a9f530691071e3496b072915b0c5ceabd4e05ea5vboxsync false /* fForceNewUuidOnOpen */,
a9f530691071e3496b072915b0c5ceabd4e05ea5vboxsync true /* fSilent */);
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync if (SUCCEEDED(rc) && pExistingMedium)
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync {
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync if ( (deviceType == DeviceType_DVD)
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync || (deviceType == DeviceType_HardDisk)
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync )
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync devTypeRequested = deviceType;
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync }
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync }
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync else
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync devTypeRequested = deviceType;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync }
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync }
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync }
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync if (devTypeRequested == DeviceType_Null) // still the initializer value?
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync throw Utf8Str("Argument --type must be specified\n");
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync /* check if the device type is supported by the controller */
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync com::SafeArray <DeviceType_T> saDeviceTypes;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync CHECK_ERROR(systemProperties, GetDeviceTypesForStorageBus(storageBus, ComSafeArrayAsOutParam(saDeviceTypes)));
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync if (SUCCEEDED(rc))
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync ULONG driveCheck = 0;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync for (size_t i = 0; i < saDeviceTypes.size(); ++ i)
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync if (saDeviceTypes[i] == devTypeRequested)
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync driveCheck++;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync if (!driveCheck)
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync throw Utf8StrFmt("The given attachment is not supported by the storage controller '%s'", pszCtl);
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync else
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync goto leave;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync // find the medium given
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync /* host drive? */
794c574111980e7fb3a86847e5495156afa13134vboxsync if (!RTStrNICmp(pszMedium, RT_STR_TUPLE("host:")))
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync ComPtr<IHost> host;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync CHECK_ERROR(a->virtualBox, COMGETTER(Host)(host.asOutParam()));
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync if (devTypeRequested == DeviceType_DVD)
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
1207f59aa62006952dbb0bf7700decf34d8caeb2vboxsync rc = host->FindHostDVDDrive(Bstr(pszMedium + 5).raw(),
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync pMedium2Mount.asOutParam());
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync if (!pMedium2Mount)
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))))
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync throw Utf8StrFmt("Invalid host DVD drive name \"%s\"", pszMedium + 5);
1207f59aa62006952dbb0bf7700decf34d8caeb2vboxsync rc = host->FindHostDVDDrive(Bstr(szPathReal).raw(),
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync pMedium2Mount.asOutParam());
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync if (!pMedium2Mount)
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync throw Utf8StrFmt("Invalid host DVD drive name \"%s\"", pszMedium + 5);
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync else
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync // floppy
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync rc = host->FindHostFloppyDrive(Bstr(pszMedium + 5).raw(),
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync pMedium2Mount.asOutParam());
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync if (!pMedium2Mount)
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync throw Utf8StrFmt("Invalid host floppy drive name \"%s\"", pszMedium + 5);
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync }
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync else if (!RTStrICmp(pszMedium, "iSCSI"))
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync /* check for required options */
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync if (bstrServer.isEmpty() || bstrTarget.isEmpty())
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync throw Utf8StrFmt("Parameters --server and --target are required for iSCSI media");
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync /** @todo move the location stuff to Main, which can use pfnComposeName
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * from the disk backends to construct the location properly. Also do
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * not use slashes to separate the parts, as otherwise only the last
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * element containing information will be shown. */
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync Bstr bstrISCSIMedium;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync if ( bstrLun.isEmpty()
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync || (bstrLun == "0")
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync || (bstrLun == "enc0")
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync )
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync bstrISCSIMedium = BstrFmt("%ls|%ls", bstrServer.raw(), bstrTarget.raw());
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync else
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync bstrISCSIMedium = BstrFmt("%ls|%ls|%ls", bstrServer.raw(), bstrTarget.raw(), bstrLun.raw());
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync
340c9153ef85fdaf7acf99926a068a62197308cfvboxsync CHECK_ERROR(a->virtualBox, CreateMedium(Bstr("iSCSI").raw(),
340c9153ef85fdaf7acf99926a068a62197308cfvboxsync bstrISCSIMedium.raw(),
340c9153ef85fdaf7acf99926a068a62197308cfvboxsync AccessMode_ReadWrite,
340c9153ef85fdaf7acf99926a068a62197308cfvboxsync DeviceType_HardDisk,
340c9153ef85fdaf7acf99926a068a62197308cfvboxsync pMedium2Mount.asOutParam()));
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync if (FAILED(rc)) goto leave;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync if (!bstrPort.isEmpty())
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync bstrServer = BstrFmt("%ls:%ls", bstrServer.raw(), bstrPort.raw());
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync // set the other iSCSI parameters as properties
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync com::SafeArray <BSTR> names;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync com::SafeArray <BSTR> values;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync Bstr("TargetAddress").detachTo(names.appendedRaw());
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync bstrServer.detachTo(values.appendedRaw());
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync Bstr("TargetName").detachTo(names.appendedRaw());
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync bstrTarget.detachTo(values.appendedRaw());
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync if (!bstrLun.isEmpty())
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync {
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync Bstr("LUN").detachTo(names.appendedRaw());
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync bstrLun.detachTo(values.appendedRaw());
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync }
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync if (!bstrUsername.isEmpty())
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync {
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync Bstr("InitiatorUsername").detachTo(names.appendedRaw());
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync bstrUsername.detachTo(values.appendedRaw());
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync }
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync if (!bstrPassword.isEmpty())
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync {
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync Bstr("InitiatorSecret").detachTo(names.appendedRaw());
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync bstrPassword.detachTo(values.appendedRaw());
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync }
b6eb6140917e0b633bba260f465976326b36aee2vboxsync if (!bstrInitiator.isEmpty())
48dafba24ef28f07a241e5857a43b327822574a8vboxsync {
48dafba24ef28f07a241e5857a43b327822574a8vboxsync Bstr("InitiatorName").detachTo(names.appendedRaw());
48dafba24ef28f07a241e5857a43b327822574a8vboxsync bstrInitiator.detachTo(values.appendedRaw());
48dafba24ef28f07a241e5857a43b327822574a8vboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync /// @todo add --targetName and --targetPassword options
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync if (fIntNet)
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync Bstr("HostIPStack").detachTo(names.appendedRaw());
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync Bstr("0").detachTo(values.appendedRaw());
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync CHECK_ERROR(pMedium2Mount, SetProperties(ComSafeArrayAsInParam(names),
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync ComSafeArrayAsInParam(values)));
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync if (FAILED(rc)) goto leave;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync Bstr guid;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync CHECK_ERROR(pMedium2Mount, COMGETTER(Id)(guid.asOutParam()));
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync if (FAILED(rc)) goto leave;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync RTPrintf("iSCSI disk created. UUID: %s\n", Utf8Str(guid).c_str());
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync else
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync if (!pszMedium)
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync {
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync ComPtr<IMediumAttachment> mediumAttachment;
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync rc = machine->GetMediumAttachment(Bstr(pszCtl).raw(), port,
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync device,
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync mediumAttachment.asOutParam());
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync if (FAILED(rc))
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync throw Utf8Str("Missing --medium argument");
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync }
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync else
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync {
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync Bstr bstrMedium(pszMedium);
a9f530691071e3496b072915b0c5ceabd4e05ea5vboxsync rc = openMedium(a, pszMedium, devTypeRequested,
a9f530691071e3496b072915b0c5ceabd4e05ea5vboxsync AccessMode_ReadWrite, pMedium2Mount,
a9f530691071e3496b072915b0c5ceabd4e05ea5vboxsync fSetNewUuid, false /* fSilent */);
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync if (FAILED(rc) || !pMedium2Mount)
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync throw Utf8StrFmt("Invalid UUID or filename \"%s\"", pszMedium);
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync }
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
80e46f984efd827517661c0e081a36014ca41af8vboxsync // set medium/parent medium UUID, if so desired
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync if (pMedium2Mount && (fSetNewUuid || fSetNewParentUuid))
80e46f984efd827517661c0e081a36014ca41af8vboxsync {
1cd59fdf671ca60c64d77e3f7046aaecf7003824vboxsync CHECK_ERROR(pMedium2Mount, SetIds(fSetNewUuid, bstrNewUuid.raw(),
80e46f984efd827517661c0e081a36014ca41af8vboxsync fSetNewParentUuid, bstrNewParentUuid.raw()));
80e46f984efd827517661c0e081a36014ca41af8vboxsync if (FAILED(rc))
80e46f984efd827517661c0e081a36014ca41af8vboxsync throw Utf8Str("Failed to set the medium/parent medium UUID");
80e46f984efd827517661c0e081a36014ca41af8vboxsync }
80e46f984efd827517661c0e081a36014ca41af8vboxsync
3221176430afca4d1be145b04bf50163fab4fdb1vboxsync // set medium type, if so desired
06782e19f5e2144408396dcec922c423c5ef9da8vboxsync if (pMedium2Mount && fSetMediumType)
3221176430afca4d1be145b04bf50163fab4fdb1vboxsync {
340c9153ef85fdaf7acf99926a068a62197308cfvboxsync CHECK_ERROR(pMedium2Mount, COMSETTER(Type)(enmMediumType));
dbfa5765a2a72c30564ef1bd950720e89a06c96avboxsync if (FAILED(rc))
dbfa5765a2a72c30564ef1bd950720e89a06c96avboxsync throw Utf8Str("Failed to set the medium type");
3221176430afca4d1be145b04bf50163fab4fdb1vboxsync }
3221176430afca4d1be145b04bf50163fab4fdb1vboxsync
3221176430afca4d1be145b04bf50163fab4fdb1vboxsync if (pMedium2Mount && !bstrComment.isEmpty())
3221176430afca4d1be145b04bf50163fab4fdb1vboxsync {
3221176430afca4d1be145b04bf50163fab4fdb1vboxsync CHECK_ERROR(pMedium2Mount, COMSETTER(Description)(bstrComment.raw()));
3221176430afca4d1be145b04bf50163fab4fdb1vboxsync }
3221176430afca4d1be145b04bf50163fab4fdb1vboxsync
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync if (pszMedium)
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync {
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync switch (devTypeRequested)
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync {
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync case DeviceType_DVD:
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync case DeviceType_Floppy:
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync {
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync if (!fRunTime)
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync {
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync ComPtr<IMediumAttachment> mediumAttachment;
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync // check if there is a dvd/floppy drive at the given location, if not attach one first
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync rc = machine->GetMediumAttachment(Bstr(pszCtl).raw(),
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync port,
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync device,
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync mediumAttachment.asOutParam());
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync if (SUCCEEDED(rc))
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync {
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync DeviceType_T deviceType;
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync mediumAttachment->COMGETTER(Type)(&deviceType);
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync if (deviceType != devTypeRequested)
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync {
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync machine->DetachDevice(Bstr(pszCtl).raw(), port, device);
1871985cb4854e5bfb2ead8174ee28dbfce74df5vboxsync rc = machine->AttachDeviceWithoutMedium(Bstr(pszCtl).raw(),
1871985cb4854e5bfb2ead8174ee28dbfce74df5vboxsync port,
1871985cb4854e5bfb2ead8174ee28dbfce74df5vboxsync device,
1871985cb4854e5bfb2ead8174ee28dbfce74df5vboxsync devTypeRequested); // DeviceType_DVD or DeviceType_Floppy
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync }
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync }
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync else
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync {
1871985cb4854e5bfb2ead8174ee28dbfce74df5vboxsync rc = machine->AttachDeviceWithoutMedium(Bstr(pszCtl).raw(),
1871985cb4854e5bfb2ead8174ee28dbfce74df5vboxsync port,
1871985cb4854e5bfb2ead8174ee28dbfce74df5vboxsync device,
1871985cb4854e5bfb2ead8174ee28dbfce74df5vboxsync devTypeRequested); // DeviceType_DVD or DeviceType_Floppy
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync }
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync }
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync if (pMedium2Mount)
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync {
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync CHECK_ERROR(machine, MountMedium(Bstr(pszCtl).raw(),
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync port,
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync device,
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync pMedium2Mount,
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync fForceUnmount));
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync }
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync } // end DeviceType_DVD or DeviceType_Floppy:
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync break;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync case DeviceType_HardDisk:
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync {
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync // if there is anything attached at the given location, remove it
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync machine->DetachDevice(Bstr(pszCtl).raw(), port, device);
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync CHECK_ERROR(machine, AttachDevice(Bstr(pszCtl).raw(),
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync port,
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync device,
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync DeviceType_HardDisk,
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync pMedium2Mount));
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync }
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync break;
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync }
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync if ( pszPassThrough
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync && (SUCCEEDED(rc)))
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync {
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync ComPtr<IMediumAttachment> mattach;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync CHECK_ERROR(machine, GetMediumAttachment(Bstr(pszCtl).raw(), port,
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync device, mattach.asOutParam()));
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync if (SUCCEEDED(rc))
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync {
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync if (!RTStrICmp(pszPassThrough, "on"))
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync {
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync CHECK_ERROR(machine, PassthroughDevice(Bstr(pszCtl).raw(),
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync port, device, TRUE));
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync }
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync else if (!RTStrICmp(pszPassThrough, "off"))
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync {
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync CHECK_ERROR(machine, PassthroughDevice(Bstr(pszCtl).raw(),
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync port, device, FALSE));
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync }
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync else
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync throw Utf8StrFmt("Invalid --passthrough argument '%s'", pszPassThrough);
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync }
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync else
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync throw Utf8StrFmt("Couldn't find the controller attachment for the controller '%s'\n", pszCtl);
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync }
63b785c3291332a86a9bc473e68f08121368898bvboxsync
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync if ( pszTempEject
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync && (SUCCEEDED(rc)))
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync {
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync ComPtr<IMediumAttachment> mattach;
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync CHECK_ERROR(machine, GetMediumAttachment(Bstr(pszCtl).raw(), port,
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync device, mattach.asOutParam()));
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync if (SUCCEEDED(rc))
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync {
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync if (!RTStrICmp(pszTempEject, "on"))
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync {
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync CHECK_ERROR(machine, TemporaryEjectDevice(Bstr(pszCtl).raw(),
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync port, device, TRUE));
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync }
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync else if (!RTStrICmp(pszTempEject, "off"))
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync {
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync CHECK_ERROR(machine, TemporaryEjectDevice(Bstr(pszCtl).raw(),
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync port, device, FALSE));
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync }
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync else
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync throw Utf8StrFmt("Invalid --tempeject argument '%s'", pszTempEject);
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync }
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync else
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync throw Utf8StrFmt("Couldn't find the controller attachment for the controller '%s'\n", pszCtl);
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync }
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync if ( pszNonRotational
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync && (SUCCEEDED(rc)))
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync {
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync ComPtr<IMediumAttachment> mattach;
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync CHECK_ERROR(machine, GetMediumAttachment(Bstr(pszCtl).raw(), port,
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync device, mattach.asOutParam()));
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync if (SUCCEEDED(rc))
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync {
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync if (!RTStrICmp(pszNonRotational, "on"))
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync {
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync CHECK_ERROR(machine, NonRotationalDevice(Bstr(pszCtl).raw(),
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync port, device, TRUE));
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync }
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync else if (!RTStrICmp(pszNonRotational, "off"))
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync {
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync CHECK_ERROR(machine, NonRotationalDevice(Bstr(pszCtl).raw(),
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync port, device, FALSE));
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync }
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync else
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync throw Utf8StrFmt("Invalid --nonrotational argument '%s'", pszNonRotational);
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync }
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync else
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync throw Utf8StrFmt("Couldn't find the controller attachment for the controller '%s'\n", pszCtl);
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync }
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync
6b74e8c9c04e1d625ccd055b5a25050a15831b21vboxsync if ( pszDiscard
6febf3149010855617e4a37e2c49f93d68930d44vboxsync && (SUCCEEDED(rc)))
6febf3149010855617e4a37e2c49f93d68930d44vboxsync {
6febf3149010855617e4a37e2c49f93d68930d44vboxsync ComPtr<IMediumAttachment> mattach;
6febf3149010855617e4a37e2c49f93d68930d44vboxsync CHECK_ERROR(machine, GetMediumAttachment(Bstr(pszCtl).raw(), port,
6febf3149010855617e4a37e2c49f93d68930d44vboxsync device, mattach.asOutParam()));
6febf3149010855617e4a37e2c49f93d68930d44vboxsync
6febf3149010855617e4a37e2c49f93d68930d44vboxsync if (SUCCEEDED(rc))
6febf3149010855617e4a37e2c49f93d68930d44vboxsync {
6febf3149010855617e4a37e2c49f93d68930d44vboxsync if (!RTStrICmp(pszDiscard, "on"))
6febf3149010855617e4a37e2c49f93d68930d44vboxsync {
dfb2e698385f22ba39053f27fe2711e463acd3a1vboxsync CHECK_ERROR(machine, SetAutoDiscardForDevice(Bstr(pszCtl).raw(),
dfb2e698385f22ba39053f27fe2711e463acd3a1vboxsync port, device, TRUE));
6febf3149010855617e4a37e2c49f93d68930d44vboxsync }
6febf3149010855617e4a37e2c49f93d68930d44vboxsync else if (!RTStrICmp(pszDiscard, "off"))
6febf3149010855617e4a37e2c49f93d68930d44vboxsync {
dfb2e698385f22ba39053f27fe2711e463acd3a1vboxsync CHECK_ERROR(machine, SetAutoDiscardForDevice(Bstr(pszCtl).raw(),
dfb2e698385f22ba39053f27fe2711e463acd3a1vboxsync port, device, FALSE));
6febf3149010855617e4a37e2c49f93d68930d44vboxsync }
6febf3149010855617e4a37e2c49f93d68930d44vboxsync else
515d43bd83e097dbf72b54267e8288b53f13b3a0vboxsync throw Utf8StrFmt("Invalid --discard argument '%s'", pszDiscard);
6febf3149010855617e4a37e2c49f93d68930d44vboxsync }
6febf3149010855617e4a37e2c49f93d68930d44vboxsync else
6febf3149010855617e4a37e2c49f93d68930d44vboxsync throw Utf8StrFmt("Couldn't find the controller attachment for the controller '%s'\n", pszCtl);
6febf3149010855617e4a37e2c49f93d68930d44vboxsync }
6febf3149010855617e4a37e2c49f93d68930d44vboxsync
2e8034536f2ada0455cc5c85f746e5e1cd49eea0vboxsync if ( pszHotPluggable
2e8034536f2ada0455cc5c85f746e5e1cd49eea0vboxsync && (SUCCEEDED(rc)))
2e8034536f2ada0455cc5c85f746e5e1cd49eea0vboxsync {
2e8034536f2ada0455cc5c85f746e5e1cd49eea0vboxsync ComPtr<IMediumAttachment> mattach;
2e8034536f2ada0455cc5c85f746e5e1cd49eea0vboxsync CHECK_ERROR(machine, GetMediumAttachment(Bstr(pszCtl).raw(), port,
2e8034536f2ada0455cc5c85f746e5e1cd49eea0vboxsync device, mattach.asOutParam()));
2e8034536f2ada0455cc5c85f746e5e1cd49eea0vboxsync
2e8034536f2ada0455cc5c85f746e5e1cd49eea0vboxsync if (SUCCEEDED(rc))
2e8034536f2ada0455cc5c85f746e5e1cd49eea0vboxsync {
2e8034536f2ada0455cc5c85f746e5e1cd49eea0vboxsync if (!RTStrICmp(pszHotPluggable, "on"))
2e8034536f2ada0455cc5c85f746e5e1cd49eea0vboxsync {
2e8034536f2ada0455cc5c85f746e5e1cd49eea0vboxsync CHECK_ERROR(machine, SetHotPluggableForDevice(Bstr(pszCtl).raw(),
2e8034536f2ada0455cc5c85f746e5e1cd49eea0vboxsync port, device, TRUE));
2e8034536f2ada0455cc5c85f746e5e1cd49eea0vboxsync }
2e8034536f2ada0455cc5c85f746e5e1cd49eea0vboxsync else if (!RTStrICmp(pszHotPluggable, "off"))
2e8034536f2ada0455cc5c85f746e5e1cd49eea0vboxsync {
2e8034536f2ada0455cc5c85f746e5e1cd49eea0vboxsync CHECK_ERROR(machine, SetHotPluggableForDevice(Bstr(pszCtl).raw(),
2e8034536f2ada0455cc5c85f746e5e1cd49eea0vboxsync port, device, FALSE));
2e8034536f2ada0455cc5c85f746e5e1cd49eea0vboxsync }
2e8034536f2ada0455cc5c85f746e5e1cd49eea0vboxsync else
2e8034536f2ada0455cc5c85f746e5e1cd49eea0vboxsync throw Utf8StrFmt("Invalid --hotpluggable argument '%s'", pszHotPluggable);
2e8034536f2ada0455cc5c85f746e5e1cd49eea0vboxsync }
2e8034536f2ada0455cc5c85f746e5e1cd49eea0vboxsync else
2e8034536f2ada0455cc5c85f746e5e1cd49eea0vboxsync throw Utf8StrFmt("Couldn't find the controller attachment for the controller '%s'\n", pszCtl);
2e8034536f2ada0455cc5c85f746e5e1cd49eea0vboxsync }
6febf3149010855617e4a37e2c49f93d68930d44vboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync if ( pszBandwidthGroup
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync && !fRunTime
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync && SUCCEEDED(rc))
63b785c3291332a86a9bc473e68f08121368898bvboxsync {
63b785c3291332a86a9bc473e68f08121368898bvboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync if (!RTStrICmp(pszBandwidthGroup, "none"))
63b785c3291332a86a9bc473e68f08121368898bvboxsync {
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync /* Just remove the bandwidth gorup. */
1871985cb4854e5bfb2ead8174ee28dbfce74df5vboxsync CHECK_ERROR(machine, SetNoBandwidthGroupForDevice(Bstr(pszCtl).raw(),
1871985cb4854e5bfb2ead8174ee28dbfce74df5vboxsync port, device));
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync }
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync else
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync {
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync ComPtr<IBandwidthControl> bwCtrl;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync ComPtr<IBandwidthGroup> bwGroup;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync CHECK_ERROR(machine, COMGETTER(BandwidthControl)(bwCtrl.asOutParam()));
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync
63b785c3291332a86a9bc473e68f08121368898bvboxsync if (SUCCEEDED(rc))
63b785c3291332a86a9bc473e68f08121368898bvboxsync {
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync CHECK_ERROR(bwCtrl, GetBandwidthGroup(Bstr(pszBandwidthGroup).raw(), bwGroup.asOutParam()));
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync if (SUCCEEDED(rc))
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync {
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync CHECK_ERROR(machine, SetBandwidthGroupForDevice(Bstr(pszCtl).raw(),
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync port, device, bwGroup));
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync }
63b785c3291332a86a9bc473e68f08121368898bvboxsync }
63b785c3291332a86a9bc473e68f08121368898bvboxsync }
63b785c3291332a86a9bc473e68f08121368898bvboxsync }
63b785c3291332a86a9bc473e68f08121368898bvboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync /* commit changes */
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync if (SUCCEEDED(rc))
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync CHECK_ERROR(machine, SaveSettings());
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync }
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync catch (const Utf8Str &strError)
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync {
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync errorArgument("%s", strError.c_str());
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync rc = E_FAIL;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync // machine must always be unlocked, even on errors
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsyncleave:
825c2485cf84eec495985ffd605a1c9cddee8c32vboxsync a->session->UnlockMachine();
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 },
2f5c096f8c07bf1779807cc3b108440a7f910b35vboxsync { "--portcount", 'p', RTGETOPT_REQ_UINT32 },
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync { "--remove", 'r', RTGETOPT_REQ_NOTHING },
aceec09dd145a4d6fb14f2ea75a459cc88b334abvboxsync { "--hostiocache", 'i', RTGETOPT_REQ_STRING },
bf88068260ded16af90b7da4867240fbdd9c8017vboxsync { "--bootable", 'b', 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;
aceec09dd145a4d6fb14f2ea75a459cc88b334abvboxsync const char *pszHostIOCache = NULL;
bf88068260ded16af90b7da4867240fbdd9c8017vboxsync const char *pszBootable = NULL;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync ULONG satabootdev = ~0U;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync ULONG sataidedev = ~0U;
2f5c096f8c07bf1779807cc3b108440a7f910b35vboxsync ULONG portcount = ~0U;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync bool fRemoveCtl = false;
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
2f5c096f8c07bf1779807cc3b108440a7f910b35vboxsync case 'p': // portcount
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
2f5c096f8c07bf1779807cc3b108440a7f910b35vboxsync portcount = ValueUnion.u32;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync break;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync case 'r': // remove controller
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync fRemoveCtl = true;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync break;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
89de31eab6e960abcacfb70916598ae1c2e7f737vboxsync case 'i':
89de31eab6e960abcacfb70916598ae1c2e7f737vboxsync {
aceec09dd145a4d6fb14f2ea75a459cc88b334abvboxsync pszHostIOCache = ValueUnion.psz;
89de31eab6e960abcacfb70916598ae1c2e7f737vboxsync break;
89de31eab6e960abcacfb70916598ae1c2e7f737vboxsync }
89de31eab6e960abcacfb70916598ae1c2e7f737vboxsync
bf88068260ded16af90b7da4867240fbdd9c8017vboxsync case 'b':
bf88068260ded16af90b7da4867240fbdd9c8017vboxsync {
bf88068260ded16af90b7da4867240fbdd9c8017vboxsync pszBootable = ValueUnion.psz;
bf88068260ded16af90b7da4867240fbdd9c8017vboxsync break;
bf88068260ded16af90b7da4867240fbdd9c8017vboxsync }
bf88068260ded16af90b7da4867240fbdd9c8017vboxsync
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 */
508452243fd3328f7b9e0405d39fb9dc004e31b8vboxsync CHECK_ERROR_RET(a->virtualBox, FindMachine(Bstr(a->argv[0]).raw(),
508452243fd3328f7b9e0405d39fb9dc004e31b8vboxsync machine.asOutParam()), 1);
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync /* open a session for the VM */
f409459bdd4c15cdb8d7fb6c6d54338cce9ac814vboxsync CHECK_ERROR_RET(machine, LockMachine(a->session, LockType_Write), 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 */
825c2485cf84eec495985ffd605a1c9cddee8c32vboxsync a->session->UnlockMachine();
e073b07dcb5c9827f0530a9bfa2643356c5656dbvboxsync errorSyntax(USAGE_STORAGECONTROLLER, "Storage controller name not specified\n");
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync return 1;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync if (fRemoveCtl)
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
dad2c11c7cb6ce93d5db9a3266ed2b004d41c917vboxsync CHECK_ERROR(machine, RemoveStorageController(Bstr(pszCtl).raw()));
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync else
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync if (pszBusType)
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync ComPtr<IStorageController> ctl;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync if (!RTStrICmp(pszBusType, "ide"))
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
1207f59aa62006952dbb0bf7700decf34d8caeb2vboxsync CHECK_ERROR(machine, AddStorageController(Bstr(pszCtl).raw(),
1207f59aa62006952dbb0bf7700decf34d8caeb2vboxsync StorageBus_IDE,
1207f59aa62006952dbb0bf7700decf34d8caeb2vboxsync ctl.asOutParam()));
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync else if (!RTStrICmp(pszBusType, "sata"))
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
1207f59aa62006952dbb0bf7700decf34d8caeb2vboxsync CHECK_ERROR(machine, AddStorageController(Bstr(pszCtl).raw(),
1207f59aa62006952dbb0bf7700decf34d8caeb2vboxsync StorageBus_SATA,
1207f59aa62006952dbb0bf7700decf34d8caeb2vboxsync ctl.asOutParam()));
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync else if (!RTStrICmp(pszBusType, "scsi"))
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
1207f59aa62006952dbb0bf7700decf34d8caeb2vboxsync CHECK_ERROR(machine, AddStorageController(Bstr(pszCtl).raw(),
1207f59aa62006952dbb0bf7700decf34d8caeb2vboxsync StorageBus_SCSI,
1207f59aa62006952dbb0bf7700decf34d8caeb2vboxsync ctl.asOutParam()));
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync else if (!RTStrICmp(pszBusType, "floppy"))
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
1207f59aa62006952dbb0bf7700decf34d8caeb2vboxsync CHECK_ERROR(machine, AddStorageController(Bstr(pszCtl).raw(),
1207f59aa62006952dbb0bf7700decf34d8caeb2vboxsync StorageBus_Floppy,
1207f59aa62006952dbb0bf7700decf34d8caeb2vboxsync ctl.asOutParam()));
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
b306a397b157898e6f769f640b0dfdffbf8beec7vboxsync else if (!RTStrICmp(pszBusType, "sas"))
b306a397b157898e6f769f640b0dfdffbf8beec7vboxsync {
1207f59aa62006952dbb0bf7700decf34d8caeb2vboxsync CHECK_ERROR(machine, AddStorageController(Bstr(pszCtl).raw(),
1207f59aa62006952dbb0bf7700decf34d8caeb2vboxsync StorageBus_SAS,
1207f59aa62006952dbb0bf7700decf34d8caeb2vboxsync ctl.asOutParam()));
b306a397b157898e6f769f640b0dfdffbf8beec7vboxsync }
35779b5ff92d92bc215bf98458583ed33162762fvboxsync else if (!RTStrICmp(pszBusType, "usb"))
35779b5ff92d92bc215bf98458583ed33162762fvboxsync {
35779b5ff92d92bc215bf98458583ed33162762fvboxsync CHECK_ERROR(machine, AddStorageController(Bstr(pszCtl).raw(),
35779b5ff92d92bc215bf98458583ed33162762fvboxsync StorageBus_USB,
35779b5ff92d92bc215bf98458583ed33162762fvboxsync ctl.asOutParam()));
35779b5ff92d92bc215bf98458583ed33162762fvboxsync }
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
1207f59aa62006952dbb0bf7700decf34d8caeb2vboxsync CHECK_ERROR(machine, GetStorageControllerByName(Bstr(pszCtl).raw(),
1207f59aa62006952dbb0bf7700decf34d8caeb2vboxsync 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 }
35779b5ff92d92bc215bf98458583ed33162762fvboxsync else if (!RTStrICmp(pszCtlType, "usb"))
35779b5ff92d92bc215bf98458583ed33162762fvboxsync {
35779b5ff92d92bc215bf98458583ed33162762fvboxsync CHECK_ERROR(ctl, COMSETTER(ControllerType)(StorageControllerType_USB));
35779b5ff92d92bc215bf98458583ed33162762fvboxsync }
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
2f5c096f8c07bf1779807cc3b108440a7f910b35vboxsync if ( (portcount != ~0U)
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync && SUCCEEDED(rc))
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync ComPtr<IStorageController> ctl;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
1207f59aa62006952dbb0bf7700decf34d8caeb2vboxsync CHECK_ERROR(machine, GetStorageControllerByName(Bstr(pszCtl).raw(),
1207f59aa62006952dbb0bf7700decf34d8caeb2vboxsync ctl.asOutParam()));
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync if (SUCCEEDED(rc))
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
2f5c096f8c07bf1779807cc3b108440a7f910b35vboxsync CHECK_ERROR(ctl, COMSETTER(PortCount)(portcount));
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync else
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync errorArgument("Couldn't find the controller with the name: '%s'\n", pszCtl);
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync rc = E_FAIL;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
aceec09dd145a4d6fb14f2ea75a459cc88b334abvboxsync if ( pszHostIOCache
89de31eab6e960abcacfb70916598ae1c2e7f737vboxsync && SUCCEEDED(rc))
89de31eab6e960abcacfb70916598ae1c2e7f737vboxsync {
aceec09dd145a4d6fb14f2ea75a459cc88b334abvboxsync ComPtr<IStorageController> ctl;
89de31eab6e960abcacfb70916598ae1c2e7f737vboxsync
1207f59aa62006952dbb0bf7700decf34d8caeb2vboxsync CHECK_ERROR(machine, GetStorageControllerByName(Bstr(pszCtl).raw(),
1207f59aa62006952dbb0bf7700decf34d8caeb2vboxsync ctl.asOutParam()));
89de31eab6e960abcacfb70916598ae1c2e7f737vboxsync
39fa431e2dbe885a37b126ccd293f8e8255812a6vboxsync if (SUCCEEDED(rc))
aceec09dd145a4d6fb14f2ea75a459cc88b334abvboxsync {
39fa431e2dbe885a37b126ccd293f8e8255812a6vboxsync if (!RTStrICmp(pszHostIOCache, "on"))
39fa431e2dbe885a37b126ccd293f8e8255812a6vboxsync {
39fa431e2dbe885a37b126ccd293f8e8255812a6vboxsync CHECK_ERROR(ctl, COMSETTER(UseHostIOCache)(TRUE));
39fa431e2dbe885a37b126ccd293f8e8255812a6vboxsync }
39fa431e2dbe885a37b126ccd293f8e8255812a6vboxsync else if (!RTStrICmp(pszHostIOCache, "off"))
39fa431e2dbe885a37b126ccd293f8e8255812a6vboxsync {
39fa431e2dbe885a37b126ccd293f8e8255812a6vboxsync CHECK_ERROR(ctl, COMSETTER(UseHostIOCache)(FALSE));
39fa431e2dbe885a37b126ccd293f8e8255812a6vboxsync }
39fa431e2dbe885a37b126ccd293f8e8255812a6vboxsync else
39fa431e2dbe885a37b126ccd293f8e8255812a6vboxsync {
39fa431e2dbe885a37b126ccd293f8e8255812a6vboxsync errorArgument("Invalid --hostiocache argument '%s'", pszHostIOCache);
39fa431e2dbe885a37b126ccd293f8e8255812a6vboxsync rc = E_FAIL;
39fa431e2dbe885a37b126ccd293f8e8255812a6vboxsync }
aceec09dd145a4d6fb14f2ea75a459cc88b334abvboxsync }
aceec09dd145a4d6fb14f2ea75a459cc88b334abvboxsync else
aceec09dd145a4d6fb14f2ea75a459cc88b334abvboxsync {
39fa431e2dbe885a37b126ccd293f8e8255812a6vboxsync errorArgument("Couldn't find the controller with the name: '%s'\n", pszCtl);
aceec09dd145a4d6fb14f2ea75a459cc88b334abvboxsync rc = E_FAIL;
aceec09dd145a4d6fb14f2ea75a459cc88b334abvboxsync }
89de31eab6e960abcacfb70916598ae1c2e7f737vboxsync }
bf88068260ded16af90b7da4867240fbdd9c8017vboxsync
bf88068260ded16af90b7da4867240fbdd9c8017vboxsync if ( pszBootable
bf88068260ded16af90b7da4867240fbdd9c8017vboxsync && SUCCEEDED(rc))
bf88068260ded16af90b7da4867240fbdd9c8017vboxsync {
bf88068260ded16af90b7da4867240fbdd9c8017vboxsync if (SUCCEEDED(rc))
bf88068260ded16af90b7da4867240fbdd9c8017vboxsync {
bf88068260ded16af90b7da4867240fbdd9c8017vboxsync if (!RTStrICmp(pszBootable, "on"))
bf88068260ded16af90b7da4867240fbdd9c8017vboxsync {
bf88068260ded16af90b7da4867240fbdd9c8017vboxsync CHECK_ERROR(machine, SetStorageControllerBootable(Bstr(pszCtl).raw(), TRUE));
bf88068260ded16af90b7da4867240fbdd9c8017vboxsync }
bf88068260ded16af90b7da4867240fbdd9c8017vboxsync else if (!RTStrICmp(pszBootable, "off"))
bf88068260ded16af90b7da4867240fbdd9c8017vboxsync {
bf88068260ded16af90b7da4867240fbdd9c8017vboxsync CHECK_ERROR(machine, SetStorageControllerBootable(Bstr(pszCtl).raw(), FALSE));
bf88068260ded16af90b7da4867240fbdd9c8017vboxsync }
bf88068260ded16af90b7da4867240fbdd9c8017vboxsync else
bf88068260ded16af90b7da4867240fbdd9c8017vboxsync {
77bbd3327e8130eb01de6c1c1d1ef54e0ab48be8vboxsync errorArgument("Invalid --bootable argument '%s'", pszBootable);
bf88068260ded16af90b7da4867240fbdd9c8017vboxsync rc = E_FAIL;
bf88068260ded16af90b7da4867240fbdd9c8017vboxsync }
bf88068260ded16af90b7da4867240fbdd9c8017vboxsync }
bf88068260ded16af90b7da4867240fbdd9c8017vboxsync else
bf88068260ded16af90b7da4867240fbdd9c8017vboxsync {
bf88068260ded16af90b7da4867240fbdd9c8017vboxsync errorArgument("Couldn't find the controller with the name: '%s'\n", pszCtl);
bf88068260ded16af90b7da4867240fbdd9c8017vboxsync rc = E_FAIL;
bf88068260ded16af90b7da4867240fbdd9c8017vboxsync }
bf88068260ded16af90b7da4867240fbdd9c8017vboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync /* commit changes */
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync if (SUCCEEDED(rc))
1dc37bff2fb26897f5892d8330fe2bc0c9859aecvboxsync CHECK_ERROR(machine, SaveSettings());
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync /* it's important to always close sessions */
825c2485cf84eec495985ffd605a1c9cddee8c32vboxsync a->session->UnlockMachine();
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync return SUCCEEDED(rc) ? 0 : 1;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync}
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync#endif /* !VBOX_ONLY_DOCS */
41c24e185aa1d6b5dc290edbd061c5a3c23a9e2fvboxsync