VBoxManageMisc.cpp revision e289394a1f095c5a9c2629e3479ec8f5b305b73a
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync * VBoxManage - VirtualBox's command-line interface.
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync * Copyright (C) 2006-2011 Oracle Corporation
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync * available from http://www.virtualbox.org. This file is free software;
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync * you can redistribute it and/or modify it under the terms of the GNU
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync * General Public License (GPL) as published by the Free Software
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync/*******************************************************************************
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync* Header Files *
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync*******************************************************************************/
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync#endif /* !VBOX_ONLY_DOCS */
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsyncusing namespace com;
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync return errorSyntax(USAGE_REGISTERVM, "Incorrect number of parameters");
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync /** @todo Ugly hack to get both the API interpretation of relative paths
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync * and the client's interpretation of relative paths. Remove after the API
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync * has been redesigned. */
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync rc = a->virtualBox->OpenMachine(Bstr(a->argv[0]).raw(),
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync int vrc = RTPathAbs(a->argv[0], szVMFileAbs, sizeof(szVMFileAbs));
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync RTMsgError("Cannot convert filename \"%s\" to absolute path", a->argv[0]);
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync CHECK_ERROR(a->virtualBox, OpenMachine(Bstr(szVMFileAbs).raw(),
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync CHECK_ERROR(a->virtualBox, OpenMachine(Bstr(a->argv[0]).raw(),
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync CHECK_ERROR(a->virtualBox, RegisterMachine(machine));
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync { "-delete", 'd', RTGETOPT_REQ_NOTHING }, // deprecated
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync bool fDelete = false;
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync // start at 0 because main() has hacked both the argc and argv given to us
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync RTGetOptInit(&GetState, a->argc, a->argv, g_aUnregisterVMOptions, RT_ELEMENTS(g_aUnregisterVMOptions),
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync return errorSyntax(USAGE_UNREGISTERVM, "Invalid parameter '%s'", ValueUnion.psz);
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync return errorSyntax(USAGE_UNREGISTERVM, "Invalid option -%c", c);
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync return errorSyntax(USAGE_UNREGISTERVM, "Invalid option case %i", c);
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync return errorSyntax(USAGE_UNREGISTERVM, "unknown option: %s\n", ValueUnion.psz);
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync return errorSyntax(USAGE_UNREGISTERVM, "%s: %Rrs", ValueUnion.pDef->pszLong, c);
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync return errorSyntax(USAGE_UNREGISTERVM, "error: %Rrs", c);
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync /* check for required options */
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync return errorSyntax(USAGE_UNREGISTERVM, "VM name required");
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync CHECK_ERROR(a->virtualBox, FindMachine(Bstr(VMName).raw(),
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync CleanupMode_T cleanupMode = CleanupMode_DetachAllReturnNone;
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync cleanupMode = CleanupMode_DetachAllReturnHardDisksOnly;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync CHECK_ERROR(machine, Delete(ComSafeArrayAsInParam(aMedia), pProgress.asOutParam()));
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync bool fRegister = false;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync for (int i = 0; i < a->argc; i++)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync return errorArgument("Missing argument to '%s'", a->argv[i]);
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync return errorArgument("Missing argument to '%s'", a->argv[i]);
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync return errorArgument("Missing argument to '%s'", a->argv[i]);
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync return errorArgument("Missing argument to '%s'", a->argv[i]);
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync return errorArgument("Invalid UUID format %s\n", a->argv[i]);
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync return errorSyntax(USAGE_CREATEVM, "Invalid parameter '%s'", Utf8Str(a->argv[i]).c_str());
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync /* check for required options */
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync return errorSyntax(USAGE_CREATEVM, "Parameter --name is required");
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync CHECK_ERROR_BREAK(a->virtualBox, RegisterMachine(machine));
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync CHECK_ERROR_BREAK(machine, COMGETTER(Id)(uuid.asOutParam()));
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync CHECK_ERROR_BREAK(machine, COMGETTER(SettingsFilePath)(settingsFile.asOutParam()));
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync "UUID: %s\n"
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync "Settings file: '%ls'\n",
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync { "-type", 't', RTGETOPT_REQ_STRING }, // deprecated
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync // start at 0 because main() has hacked both the argc and argv given to us
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync RTGetOptInit(&GetState, a->argc, a->argv, s_aStartVMOptions, RT_ELEMENTS(s_aStartVMOptions),
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync return errorSyntax(USAGE_STARTVM, "Invalid parameter '%s'", ValueUnion.psz);
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync return errorSyntax(USAGE_STARTVM, "Invalid option -%c", c);
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync return errorSyntax(USAGE_STARTVM, "Invalid option case %i", c);
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync return errorSyntax(USAGE_STARTVM, "unknown option: %s\n", ValueUnion.psz);
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync return errorSyntax(USAGE_STARTVM, "%s: %Rrs", ValueUnion.pDef->pszLong, c);
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync return errorSyntax(USAGE_STARTVM, "error: %Rrs", c);
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync /* check for required options */
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync return errorSyntax(USAGE_STARTVM, "VM name required");
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync CHECK_ERROR(a->virtualBox, FindMachine(Bstr(VMName).raw(),
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync /* make sure the VM process will start on the same display as VBoxManage */
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync str.append(Utf8StrFmt("XAUTHORITY=%s\n", pszXAuth));
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync CHECK_ERROR_RET(machine, LaunchVMProcess(a->session, sessionType.raw(),
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync CHECK_ERROR_RET(progress, WaitForCompletion(-1), 1);
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync CHECK_ERROR_RET(progress, COMGETTER(Completed)(&completed), rc);
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync CHECK_ERROR_RET(progress, COMGETTER(ResultCode)(&iRc), rc);
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync /* it's important to always close sessions */
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync return errorSyntax(USAGE_DISCARDSTATE, "Incorrect number of parameters");
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync CHECK_ERROR(a->virtualBox, FindMachine(Bstr(a->argv[0]).raw(),
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync /* we have to open a session for this task */
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync CHECK_ERROR_BREAK(machine, LockMachine(a->session, LockType_Write));
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync CHECK_ERROR_BREAK(a->session, COMGETTER(Console)(console.asOutParam()));
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync CHECK_ERROR_BREAK(console, DiscardSavedState(true /* fDeleteFile */));
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync } while (0);
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync } while (0);
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync return errorSyntax(USAGE_ADOPTSTATE, "Incorrect number of parameters");
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync CHECK_ERROR(a->virtualBox, FindMachine(Bstr(a->argv[0]).raw(),
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync /* we have to open a session for this task */
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync CHECK_ERROR_BREAK(machine, LockMachine(a->session, LockType_Write));
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync CHECK_ERROR_BREAK(a->session, COMGETTER(Console)(console.asOutParam()));
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync CHECK_ERROR_BREAK(console, AdoptSavedState(Bstr(a->argv[1]).raw()));
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync } while (0);
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync } while (0);
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync return errorSyntax(USAGE_GETEXTRADATA, "Incorrect number of parameters");
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync /* global data? */
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync /* enumeration? */
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync CHECK_ERROR(a->virtualBox, GetExtraDataKeys(ComSafeArrayAsOutParam(aKeys)));
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync CHECK_ERROR(a->virtualBox, GetExtraData(bstrKey.raw(),
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync RTPrintf("Key: %lS, Value: %lS\n", bstrKey.raw(), bstrValue.raw());
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync CHECK_ERROR(a->virtualBox, GetExtraData(Bstr(a->argv[1]).raw(),
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync CHECK_ERROR(a->virtualBox, FindMachine(Bstr(a->argv[0]).raw(),
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync /* enumeration? */
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync CHECK_ERROR(machine, GetExtraDataKeys(ComSafeArrayAsOutParam(aKeys)));
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync RTPrintf("Key: %lS, Value: %lS\n", bstrKey.raw(), bstrValue.raw());
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync CHECK_ERROR(machine, GetExtraData(Bstr(a->argv[1]).raw(),
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync return errorSyntax(USAGE_SETEXTRADATA, "Not enough parameters");
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync /* global data? */
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync /** @todo passing NULL is deprecated */
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync CHECK_ERROR(a->virtualBox, SetExtraData(Bstr(a->argv[1]).raw(),
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync CHECK_ERROR(a->virtualBox, SetExtraData(Bstr(a->argv[1]).raw(),
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync return errorSyntax(USAGE_SETEXTRADATA, "Too many parameters");
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync CHECK_ERROR(a->virtualBox, FindMachine(Bstr(a->argv[0]).raw(),
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync /** @todo passing NULL is deprecated */
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync CHECK_ERROR(machine, SetExtraData(Bstr(a->argv[1]).raw(),
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync CHECK_ERROR(machine, SetExtraData(Bstr(a->argv[1]).raw(),
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync return errorSyntax(USAGE_SETEXTRADATA, "Too many parameters");
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync /* there must be two arguments: property name and value */
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync return errorSyntax(USAGE_SETPROPERTY, "Incorrect number of parameters");
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync a->virtualBox->COMGETTER(SystemProperties)(systemProperties.asOutParam());
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync /* reset to default? */
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync CHECK_ERROR(systemProperties, COMSETTER(DefaultMachineFolder)(NULL));
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync CHECK_ERROR(systemProperties, COMSETTER(DefaultMachineFolder)(Bstr(a->argv[1]).raw()));
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync RTStrmPrintf(g_pStdErr, "Warning: 'vrdpauthlibrary' is deprecated. Use 'vrdeauthlibrary'.\n");
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync /* reset to default? */
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync CHECK_ERROR(systemProperties, COMSETTER(VRDEAuthLibrary)(NULL));
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync CHECK_ERROR(systemProperties, COMSETTER(VRDEAuthLibrary)(Bstr(a->argv[1]).raw()));
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync /* reset to default? */
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync CHECK_ERROR(systemProperties, COMSETTER(WebServiceAuthLibrary)(NULL));
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync CHECK_ERROR(systemProperties, COMSETTER(WebServiceAuthLibrary)(Bstr(a->argv[1]).raw()));
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync /* disable? */
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync CHECK_ERROR(systemProperties, COMSETTER(DefaultVRDEExtPack)(NULL));
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync CHECK_ERROR(systemProperties, COMSETTER(DefaultVRDEExtPack)(Bstr(a->argv[1]).raw()));
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync return errorArgument("Error parsing Log history count '%s'", a->argv[1]);
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync CHECK_ERROR(systemProperties, COMSETTER(LogHistoryCount)(uVal));
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync return errorSyntax(USAGE_SETPROPERTY, "Invalid parameter '%s'", a->argv[0]);
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync /* we need at least a command and target */
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync return errorSyntax(USAGE_SHAREDFOLDER, "Not enough parameters");
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync CHECK_ERROR(a->virtualBox, FindMachine(Bstr(a->argv[1]).raw(),
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync /* we need at least four more parameters */
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync return errorSyntax(USAGE_SHAREDFOLDER_ADD, "Not enough parameters");
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync bool fTransient = false;
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync bool fAutoMount = false;
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync return errorArgument("Missing argument to '%s'", a->argv[i]);
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync return errorArgument("Missing argument to '%s'", a->argv[i]);
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync return errorSyntax(USAGE_SHAREDFOLDER_ADD, "Invalid parameter '%s'", Utf8Str(a->argv[i]).c_str());
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync return errorSyntax(USAGE_SHAREDFOLDER_ADD, "No spaces allowed in parameter '-name'!");
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync /* required arguments */
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync return errorSyntax(USAGE_SHAREDFOLDER_ADD, "Parameters --name and --hostpath are required");
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync /* open an existing session for the VM */
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync CHECK_ERROR_RET(machine, LockMachine(a->session, LockType_Shared), 1);
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync /* get the session machine */
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync CHECK_ERROR_RET(a->session, COMGETTER(Machine)(machine.asOutParam()), 1);
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync /* get the session console */
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync CHECK_ERROR_RET(a->session, COMGETTER(Console)(console.asOutParam()), 1);
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync CHECK_ERROR(console, CreateSharedFolder(Bstr(name).raw(),
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync /* open a session for the VM */
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync CHECK_ERROR_RET(machine, LockMachine(a->session, LockType_Write), 1);
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync /* get the mutable session machine */
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync a->session->COMGETTER(Machine)(machine.asOutParam());
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync CHECK_ERROR(machine, CreateSharedFolder(Bstr(name).raw(),
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync /* we need at least two more parameters */
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync return errorSyntax(USAGE_SHAREDFOLDER_REMOVE, "Not enough parameters");
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync bool fTransient = false;
b7a07b07543924f45c1fffd2f90de582038b8ba6vboxsync return errorArgument("Missing argument to '%s'", a->argv[i]);
return errorSyntax(USAGE_SHAREDFOLDER_REMOVE, "Invalid parameter '%s'", Utf8Str(a->argv[i]).c_str());
if (!name)
if (fTransient)
if (console)
CHECK_ERROR2_RET(a->virtualBox, COMGETTER(ExtensionPackManager)(ptrExtPackMgr.asOutParam()), RTEXITCODE_FAILURE);
int ch;
bool fReplace = false;
RTGetOptInit(&GetState, a->argc, a->argv, s_aInstallOptions, RT_ELEMENTS(s_aInstallOptions), 1, 0 /*fFlags*/);
switch (ch)
fReplace = true;
case VINF_GETOPT_NOT_OPTION:
if (pszName)
if (!pszName)
CHECK_ERROR2_RET(ptrExtPackMgr, OpenExtPackFile(bstrTarball.raw(), ptrExtPackFile.asOutParam()), RTEXITCODE_FAILURE);
CHECK_ERROR2_RET(ptrExtPackFile, Install(fReplace, NULL, ptrProgress.asOutParam()), RTEXITCODE_FAILURE);
return RTEXITCODE_FAILURE;
bool fForced = false;
RTGetOptInit(&GetState, a->argc, a->argv, s_aUninstallOptions, RT_ELEMENTS(s_aUninstallOptions), 1, 0);
switch (ch)
fForced = true;
case VINF_GETOPT_NOT_OPTION:
if (pszName)
if (!pszName)
CHECK_ERROR2_RET(ptrExtPackMgr, Uninstall(bstrName.raw(), fForced, NULL, ptrProgress.asOutParam()), RTEXITCODE_FAILURE);
return RTEXITCODE_FAILURE;
return RTEXITCODE_SUCCESS;