VBoxManageMisc.cpp revision 7c164968f8c38ee82b62a5429766bebf9c65c26d
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync/* $Id$ */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync/** @file
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * VBoxManage - VirtualBox's command-line interface.
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync/*
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * Copyright (C) 2006-2009 Sun Microsystems, Inc.
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync *
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * available from http://www.virtualbox.org. This file is free software;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * you can redistribute it and/or modify it under the terms of the GNU
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * General Public License (GPL) as published by the Free Software
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync *
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync * additional information or have any questions.
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync */
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync/*******************************************************************************
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync* Header Files *
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync*******************************************************************************/
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync#ifndef VBOX_ONLY_DOCS
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync#include <VBox/com/com.h>
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#include <VBox/com/string.h>
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#include <VBox/com/Guid.h>
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#include <VBox/com/array.h>
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#include <VBox/com/ErrorInfo.h>
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#include <VBox/com/errorprint.h>
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#include <VBox/com/EventQueue.h>
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#include <VBox/com/VirtualBox.h>
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#include <vector>
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#include <list>
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#endif /* !VBOX_ONLY_DOCS */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#include <iprt/asm.h>
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#include <iprt/buildconfig.h>
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#include <iprt/cidr.h>
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#include <iprt/ctype.h>
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#include <iprt/dir.h>
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#include <iprt/env.h>
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#include <VBox/err.h>
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#include <iprt/file.h>
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#include <iprt/initterm.h>
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#include <iprt/param.h>
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#include <iprt/path.h>
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#include <iprt/stream.h>
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#include <iprt/string.h>
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#include <iprt/stdarg.h>
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#include <iprt/thread.h>
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#include <iprt/uuid.h>
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#include <iprt/getopt.h>
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#include <iprt/ctype.h>
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#include <VBox/version.h>
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#include <VBox/log.h>
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#include "VBoxManage.h"
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncusing namespace com;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncint handleRegisterVM(HandlerArg *a)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync HRESULT rc;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (a->argc != 1)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return errorSyntax(USAGE_REGISTERVM, "Incorrect number of parameters");
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync ComPtr<IMachine> machine;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /** @todo Ugly hack to get both the API interpretation of relative paths
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * and the client's interpretation of relative paths. Remove after the API
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * has been redesigned. */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync rc = a->virtualBox->OpenMachine(Bstr(a->argv[0]), machine.asOutParam());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (rc == VBOX_E_FILE_ERROR)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync char szVMFileAbs[RTPATH_MAX] = "";
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync int vrc = RTPathAbs(a->argv[0], szVMFileAbs, sizeof(szVMFileAbs));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (RT_FAILURE(vrc))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync RTPrintf("Cannot convert filename \"%s\" to absolute path\n", a->argv[0]);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return 1;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR(a->virtualBox, OpenMachine(Bstr(szVMFileAbs), machine.asOutParam()));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else if (FAILED(rc))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR(a->virtualBox, OpenMachine(Bstr(a->argv[0]), machine.asOutParam()));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (SUCCEEDED(rc))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync ASSERT(machine);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR(a->virtualBox, RegisterMachine(machine));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return SUCCEEDED(rc) ? 0 : 1;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncstatic const RTGETOPTDEF g_aUnregisterVMOptions[] =
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync { "--delete", 'd', RTGETOPT_REQ_NOTHING },
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync { "-delete", 'd', RTGETOPT_REQ_NOTHING }, // deprecated
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync};
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncint handleUnregisterVM(HandlerArg *a)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync HRESULT rc;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync const char *VMName = NULL;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync bool fDelete = false;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync int c;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync RTGETOPTUNION ValueUnion;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync RTGETOPTSTATE GetState;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync // start at 0 because main() has hacked both the argc and argv given to us
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync RTGetOptInit(&GetState, a->argc, a->argv, g_aUnregisterVMOptions, RT_ELEMENTS(g_aUnregisterVMOptions),
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync 0, RTGETOPTINIT_FLAGS_NO_STD_OPTS);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync while ((c = RTGetOpt(&GetState, &ValueUnion)))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync switch (c)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync case 'd': // --delete
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync fDelete = true;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync break;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync case VINF_GETOPT_NOT_OPTION:
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (!VMName)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync VMName = ValueUnion.psz;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return errorSyntax(USAGE_UNREGISTERVM, "Invalid parameter '%s'", ValueUnion.psz);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync break;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync default:
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (c > 0)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (RT_C_IS_PRINT(c))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return errorSyntax(USAGE_UNREGISTERVM, "Invalid option -%c", c);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return errorSyntax(USAGE_UNREGISTERVM, "Invalid option case %i", c);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else if (c == VERR_GETOPT_UNKNOWN_OPTION)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return errorSyntax(USAGE_UNREGISTERVM, "unknown option: %s\n", ValueUnion.psz);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else if (ValueUnion.pDef)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return errorSyntax(USAGE_UNREGISTERVM, "%s: %Rrs", ValueUnion.pDef->pszLong, c);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return errorSyntax(USAGE_UNREGISTERVM, "error: %Rrs", c);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* check for required options */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (!VMName)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return errorSyntax(USAGE_UNREGISTERVM, "VM name required");
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync ComPtr<IMachine> machine;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* assume it's a UUID */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync rc = a->virtualBox->GetMachine(Guid(VMName).toUtf16(), machine.asOutParam());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(rc) || !machine)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* must be a name */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR(a->virtualBox, FindMachine(Bstr(VMName), machine.asOutParam()));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (machine)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync Bstr uuid;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync machine->COMGETTER(Id)(uuid.asOutParam());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync machine = NULL;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR(a->virtualBox, UnregisterMachine(uuid, machine.asOutParam()));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (SUCCEEDED(rc) && machine && fDelete)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR(machine, DeleteSettings());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return SUCCEEDED(rc) ? 0 : 1;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncint handleCreateVM(HandlerArg *a)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync HRESULT rc;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync Bstr baseFolder;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync Bstr settingsFile;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync Bstr name;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync Bstr osTypeId;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync RTUUID id;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync bool fRegister = false;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync RTUuidClear(&id);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync for (int i = 0; i < a->argc; i++)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if ( !strcmp(a->argv[i], "--basefolder")
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync || !strcmp(a->argv[i], "-basefolder"))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (a->argc <= i + 1)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return errorArgument("Missing argument to '%s'", a->argv[i]);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync i++;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync baseFolder = a->argv[i];
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else if ( !strcmp(a->argv[i], "--settingsfile")
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync || !strcmp(a->argv[i], "-settingsfile"))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (a->argc <= i + 1)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return errorArgument("Missing argument to '%s'", a->argv[i]);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync i++;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync settingsFile = a->argv[i];
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else if ( !strcmp(a->argv[i], "--name")
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync || !strcmp(a->argv[i], "-name"))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (a->argc <= i + 1)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return errorArgument("Missing argument to '%s'", a->argv[i]);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync i++;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync name = a->argv[i];
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else if ( !strcmp(a->argv[i], "--ostype")
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync || !strcmp(a->argv[i], "-ostype"))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (a->argc <= i + 1)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return errorArgument("Missing argument to '%s'", a->argv[i]);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync i++;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync osTypeId = a->argv[i];
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else if ( !strcmp(a->argv[i], "--uuid")
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync || !strcmp(a->argv[i], "-uuid"))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (a->argc <= i + 1)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return errorArgument("Missing argument to '%s'", a->argv[i]);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync i++;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (RT_FAILURE(RTUuidFromStr(&id, a->argv[i])))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return errorArgument("Invalid UUID format %s\n", a->argv[i]);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else if ( !strcmp(a->argv[i], "--register")
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync || !strcmp(a->argv[i], "-register"))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync fRegister = true;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return errorSyntax(USAGE_CREATEVM, "Invalid parameter '%s'", Utf8Str(a->argv[i]).raw());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (!name)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return errorSyntax(USAGE_CREATEVM, "Parameter --name is required");
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (!baseFolder.isEmpty() && !settingsFile.isEmpty())
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return errorSyntax(USAGE_CREATEVM, "Cannot specify both --basefolder and --settingsfile together");
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync do
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync ComPtr<IMachine> machine;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (settingsFile.isEmpty())
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR_BREAK(a->virtualBox,
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CreateMachine(name, osTypeId, baseFolder, Guid(id).toUtf16(), FALSE, machine.asOutParam()));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR_BREAK(a->virtualBox,
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CreateLegacyMachine(name, osTypeId, settingsFile, Guid(id).toUtf16(), machine.asOutParam()));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR_BREAK(machine, SaveSettings());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (fRegister)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR_BREAK(a->virtualBox, RegisterMachine(machine));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync Bstr uuid;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR_BREAK(machine, COMGETTER(Id)(uuid.asOutParam()));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR_BREAK(machine, COMGETTER(SettingsFilePath)(settingsFile.asOutParam()));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync RTPrintf("Virtual machine '%ls' is created%s.\n"
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync "UUID: %s\n"
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync "Settings file: '%ls'\n",
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync name.raw(), fRegister ? " and registered" : "",
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync Utf8Str(uuid).raw(), settingsFile.raw());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync while (0);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return SUCCEEDED(rc) ? 0 : 1;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncint handleStartVM(HandlerArg *a)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync HRESULT rc;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync const char *VMName = NULL;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync Bstr sessionType = "gui";
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync static const RTGETOPTDEF s_aStartVMOptions[] =
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync { "--type", 't', RTGETOPT_REQ_STRING },
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync { "-type", 't', RTGETOPT_REQ_STRING }, // deprecated
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync };
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync int c;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync RTGETOPTUNION ValueUnion;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync RTGETOPTSTATE GetState;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync // start at 0 because main() has hacked both the argc and argv given to us
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync RTGetOptInit(&GetState, a->argc, a->argv, s_aStartVMOptions, RT_ELEMENTS(s_aStartVMOptions),
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync 0, RTGETOPTINIT_FLAGS_NO_STD_OPTS);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync while ((c = RTGetOpt(&GetState, &ValueUnion)))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync switch (c)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync case 't': // --type
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (!RTStrICmp(ValueUnion.psz, "gui"))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync sessionType = "gui";
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#ifdef VBOX_WITH_VBOXSDL
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else if (!RTStrICmp(ValueUnion.psz, "sdl"))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync sessionType = "sdl";
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#endif
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#ifdef VBOX_WITH_VRDP
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else if (!RTStrICmp(ValueUnion.psz, "vrdp"))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync sessionType = "vrdp";
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#endif
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#ifdef VBOX_WITH_HEADLESS
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else if (!RTStrICmp(ValueUnion.psz, "capture"))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync sessionType = "capture";
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else if (!RTStrICmp(ValueUnion.psz, "headless"))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync sessionType = "headless";
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#endif
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return errorArgument("Invalid session type '%s'", ValueUnion.psz);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync break;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync case VINF_GETOPT_NOT_OPTION:
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (!VMName)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync VMName = ValueUnion.psz;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return errorSyntax(USAGE_STARTVM, "Invalid parameter '%s'", ValueUnion.psz);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync break;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync default:
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (c > 0)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (RT_C_IS_PRINT(c))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return errorSyntax(USAGE_STARTVM, "Invalid option -%c", c);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return errorSyntax(USAGE_STARTVM, "Invalid option case %i", c);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else if (c == VERR_GETOPT_UNKNOWN_OPTION)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return errorSyntax(USAGE_STARTVM, "unknown option: %s\n", ValueUnion.psz);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else if (ValueUnion.pDef)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return errorSyntax(USAGE_STARTVM, "%s: %Rrs", ValueUnion.pDef->pszLong, c);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return errorSyntax(USAGE_STARTVM, "error: %Rrs", c);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* check for required options */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (!VMName)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return errorSyntax(USAGE_STARTVM, "VM name required");
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync ComPtr<IMachine> machine;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* assume it's a UUID */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync rc = a->virtualBox->GetMachine(Guid(VMName).toUtf16(), machine.asOutParam());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(rc) || !machine)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* must be a name */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR(a->virtualBox, FindMachine(Bstr(VMName), machine.asOutParam()));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (machine)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync Bstr uuid;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync machine->COMGETTER(Id)(uuid.asOutParam());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync Bstr env;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#if defined(RT_OS_LINUX) || defined(RT_OS_SOLARIS)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* make sure the VM process will start on the same display as VBoxManage */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync Utf8Str str;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync const char *pszDisplay = RTEnvGet("DISPLAY");
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (pszDisplay)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync str = Utf8StrFmt("DISPLAY=%s\n", pszDisplay);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync const char *pszXAuth = RTEnvGet("XAUTHORITY");
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (pszXAuth)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync str.append(Utf8StrFmt("XAUTHORITY=%s\n", pszXAuth));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync env = str;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#endif
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync ComPtr<IProgress> progress;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR_RET(a->virtualBox, OpenRemoteSession(a->session, uuid, sessionType,
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync env, progress.asOutParam()), rc);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync RTPrintf("Waiting for the VM to power on...\n");
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR_RET(progress, WaitForCompletion(-1), 1);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync BOOL completed;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR_RET(progress, COMGETTER(Completed)(&completed), rc);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync ASSERT(completed);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync LONG iRc;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR_RET(progress, COMGETTER(ResultCode)(&iRc), rc);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(iRc))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync ComPtr <IVirtualBoxErrorInfo> errorInfo;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR_RET(progress, COMGETTER(ErrorInfo)(errorInfo.asOutParam()), 1);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync ErrorInfo info (errorInfo);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync com::GluePrintErrorInfo(info);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync RTPrintf("VM has been successfully started.\n");
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* it's important to always close sessions */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync a->session->Close();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return SUCCEEDED(rc) ? 0 : 1;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncint handleDiscardState(HandlerArg *a)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync HRESULT rc;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (a->argc != 1)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return errorSyntax(USAGE_DISCARDSTATE, "Incorrect number of parameters");
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync ComPtr<IMachine> machine;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* assume it's a UUID */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync rc = a->virtualBox->GetMachine(Bstr(a->argv[0]), machine.asOutParam());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(rc) || !machine)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* must be a name */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR(a->virtualBox, FindMachine(Bstr(a->argv[0]), machine.asOutParam()));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (machine)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync do
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* we have to open a session for this task */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync Bstr guid;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync machine->COMGETTER(Id)(guid.asOutParam());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR_BREAK(a->virtualBox, OpenSession(a->session, guid));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync do
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync ComPtr<IConsole> console;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR_BREAK(a->session, COMGETTER(Console)(console.asOutParam()));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR_BREAK(console, ForgetSavedState(true));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync } while (0);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR_BREAK(a->session, Close());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync } while (0);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return SUCCEEDED(rc) ? 0 : 1;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncint handleAdoptState(HandlerArg *a)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync HRESULT rc;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (a->argc != 2)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return errorSyntax(USAGE_ADOPTSTATE, "Incorrect number of parameters");
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync ComPtr<IMachine> machine;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* assume it's a UUID */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync rc = a->virtualBox->GetMachine(Bstr(a->argv[0]), machine.asOutParam());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(rc) || !machine)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* must be a name */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR(a->virtualBox, FindMachine(Bstr(a->argv[0]), machine.asOutParam()));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (machine)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync do
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* we have to open a session for this task */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync Bstr guid;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync machine->COMGETTER(Id)(guid.asOutParam());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR_BREAK(a->virtualBox, OpenSession(a->session, guid));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync do
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync ComPtr<IConsole> console;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR_BREAK(a->session, COMGETTER(Console)(console.asOutParam()));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR_BREAK(console, AdoptSavedState(Bstr(a->argv[1])));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync } while (0);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR_BREAK(a->session, Close());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync } while (0);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return SUCCEEDED(rc) ? 0 : 1;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncint handleGetExtraData(HandlerArg *a)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync HRESULT rc = S_OK;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (a->argc != 2)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return errorSyntax(USAGE_GETEXTRADATA, "Incorrect number of parameters");
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* global data? */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (!strcmp(a->argv[0], "global"))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* enumeration? */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (!strcmp(a->argv[1], "enumerate"))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync SafeArray<BSTR> aKeys;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR(a->virtualBox, GetExtraDataKeys(ComSafeArrayAsOutParam(aKeys)));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync for (size_t i = 0;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync i < aKeys.size();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync ++i)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync Bstr bstrKey(aKeys[i]);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync Bstr bstrValue;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR(a->virtualBox, GetExtraData(bstrKey, bstrValue.asOutParam()));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync RTPrintf("Key: %lS, Value: %lS\n", bstrKey.raw(), bstrValue.raw());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync Bstr value;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR(a->virtualBox, GetExtraData(Bstr(a->argv[1]), value.asOutParam()));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (!value.isEmpty())
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync RTPrintf("Value: %lS\n", value.raw());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync RTPrintf("No value set!\n");
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync ComPtr<IMachine> machine;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* assume it's a UUID */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync rc = a->virtualBox->GetMachine(Bstr(a->argv[0]), machine.asOutParam());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(rc) || !machine)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* must be a name */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR(a->virtualBox, FindMachine(Bstr(a->argv[0]), machine.asOutParam()));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (machine)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* enumeration? */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (!strcmp(a->argv[1], "enumerate"))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync SafeArray<BSTR> aKeys;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR(machine, GetExtraDataKeys(ComSafeArrayAsOutParam(aKeys)));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync for (size_t i = 0;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync i < aKeys.size();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync ++i)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync Bstr bstrKey(aKeys[i]);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync Bstr bstrValue;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR(machine, GetExtraData(bstrKey, bstrValue.asOutParam()));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync RTPrintf("Key: %lS, Value: %lS\n", bstrKey.raw(), bstrValue.raw());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync Bstr value;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR(machine, GetExtraData(Bstr(a->argv[1]), value.asOutParam()));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (!value.isEmpty())
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync RTPrintf("Value: %lS\n", value.raw());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync RTPrintf("No value set!\n");
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return SUCCEEDED(rc) ? 0 : 1;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncint handleSetExtraData(HandlerArg *a)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync HRESULT rc = S_OK;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (a->argc < 2)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return errorSyntax(USAGE_SETEXTRADATA, "Not enough parameters");
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* global data? */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (!strcmp(a->argv[0], "global"))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (a->argc < 3)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR(a->virtualBox, SetExtraData(Bstr(a->argv[1]), NULL));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else if (a->argc == 3)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR(a->virtualBox, SetExtraData(Bstr(a->argv[1]), Bstr(a->argv[2])));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return errorSyntax(USAGE_SETEXTRADATA, "Too many parameters");
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync ComPtr<IMachine> machine;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* assume it's a UUID */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync rc = a->virtualBox->GetMachine(Bstr(a->argv[0]), machine.asOutParam());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(rc) || !machine)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* must be a name */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR(a->virtualBox, FindMachine(Bstr(a->argv[0]), machine.asOutParam()));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (machine)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (a->argc < 3)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR(machine, SetExtraData(Bstr(a->argv[1]), NULL));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else if (a->argc == 3)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR(machine, SetExtraData(Bstr(a->argv[1]), Bstr(a->argv[2])));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return errorSyntax(USAGE_SETEXTRADATA, "Too many parameters");
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return SUCCEEDED(rc) ? 0 : 1;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncint handleSetProperty(HandlerArg *a)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync HRESULT rc;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* there must be two arguments: property name and value */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (a->argc != 2)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return errorSyntax(USAGE_SETPROPERTY, "Incorrect number of parameters");
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync ComPtr<ISystemProperties> systemProperties;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync a->virtualBox->COMGETTER(SystemProperties)(systemProperties.asOutParam());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (!strcmp(a->argv[0], "hdfolder"))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* reset to default? */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (!strcmp(a->argv[1], "default"))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR(systemProperties, COMSETTER(DefaultHardDiskFolder)(NULL));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR(systemProperties, COMSETTER(DefaultHardDiskFolder)(Bstr(a->argv[1])));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else if (!strcmp(a->argv[0], "machinefolder"))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* reset to default? */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (!strcmp(a->argv[1], "default"))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR(systemProperties, COMSETTER(DefaultMachineFolder)(NULL));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR(systemProperties, COMSETTER(DefaultMachineFolder)(Bstr(a->argv[1])));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else if (!strcmp(a->argv[0], "vrdpauthlibrary"))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* reset to default? */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (!strcmp(a->argv[1], "default"))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR(systemProperties, COMSETTER(RemoteDisplayAuthLibrary)(NULL));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR(systemProperties, COMSETTER(RemoteDisplayAuthLibrary)(Bstr(a->argv[1])));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else if (!strcmp(a->argv[0], "websrvauthlibrary"))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* reset to default? */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (!strcmp(a->argv[1], "default"))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR(systemProperties, COMSETTER(WebServiceAuthLibrary)(NULL));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR(systemProperties, COMSETTER(WebServiceAuthLibrary)(Bstr(a->argv[1])));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else if (!strcmp(a->argv[0], "loghistorycount"))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync uint32_t uVal;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync int vrc;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync vrc = RTStrToUInt32Ex(a->argv[1], NULL, 0, &uVal);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (vrc != VINF_SUCCESS)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return errorArgument("Error parsing Log history count '%s'", a->argv[1]);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR(systemProperties, COMSETTER(LogHistoryCount)(uVal));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return errorSyntax(USAGE_SETPROPERTY, "Invalid parameter '%s'", a->argv[0]);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return SUCCEEDED(rc) ? 0 : 1;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncint handleSharedFolder(HandlerArg *a)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync HRESULT rc;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* we need at least a command and target */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (a->argc < 2)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return errorSyntax(USAGE_SHAREDFOLDER, "Not enough parameters");
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync ComPtr<IMachine> machine;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* assume it's a UUID */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync rc = a->virtualBox->GetMachine(Bstr(a->argv[1]), machine.asOutParam());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(rc) || !machine)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* must be a name */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR(a->virtualBox, FindMachine(Bstr(a->argv[1]), machine.asOutParam()));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (!machine)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return 1;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync Bstr uuid;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync machine->COMGETTER(Id)(uuid.asOutParam());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (!strcmp(a->argv[0], "add"))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* we need at least four more parameters */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (a->argc < 5)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return errorSyntax(USAGE_SHAREDFOLDER_ADD, "Not enough parameters");
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync char *name = NULL;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync char *hostpath = NULL;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync bool fTransient = false;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync bool fWritable = true;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync for (int i = 2; i < a->argc; i++)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if ( !strcmp(a->argv[i], "--name")
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync || !strcmp(a->argv[i], "-name"))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (a->argc <= i + 1 || !*a->argv[i+1])
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return errorArgument("Missing argument to '%s'", a->argv[i]);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync i++;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync name = a->argv[i];
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else if ( !strcmp(a->argv[i], "--hostpath")
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync || !strcmp(a->argv[i], "-hostpath"))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (a->argc <= i + 1 || !*a->argv[i+1])
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return errorArgument("Missing argument to '%s'", a->argv[i]);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync i++;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync hostpath = a->argv[i];
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else if ( !strcmp(a->argv[i], "--readonly")
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync || !strcmp(a->argv[i], "-readonly"))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync fWritable = false;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else if ( !strcmp(a->argv[i], "--transient")
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync || !strcmp(a->argv[i], "-transient"))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync fTransient = true;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return errorSyntax(USAGE_SHAREDFOLDER_ADD, "Invalid parameter '%s'", Utf8Str(a->argv[i]).raw());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (NULL != strstr(name, " "))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return errorSyntax(USAGE_SHAREDFOLDER_ADD, "No spaces allowed in parameter '-name'!");
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* required arguments */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (!name || !hostpath)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return errorSyntax(USAGE_SHAREDFOLDER_ADD, "Parameters --name and --hostpath are required");
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (fTransient)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync ComPtr <IConsole> console;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* open an existing session for the VM */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR_RET(a->virtualBox, OpenExistingSession(a->session, uuid), 1);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* get the session machine */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR_RET(a->session, COMGETTER(Machine)(machine.asOutParam()), 1);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* get the session console */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR_RET(a->session, COMGETTER(Console)(console.asOutParam()), 1);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR(console, CreateSharedFolder(Bstr(name), Bstr(hostpath), fWritable));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (console)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync a->session->Close();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* open a session for the VM */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR_RET(a->virtualBox, OpenSession(a->session, uuid), 1);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* get the mutable session machine */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync a->session->COMGETTER(Machine)(machine.asOutParam());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR(machine, CreateSharedFolder(Bstr(name), Bstr(hostpath), fWritable));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (SUCCEEDED(rc))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR(machine, SaveSettings());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync a->session->Close();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else if (!strcmp(a->argv[0], "remove"))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* we need at least two more parameters */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (a->argc < 3)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return errorSyntax(USAGE_SHAREDFOLDER_REMOVE, "Not enough parameters");
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync char *name = NULL;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync bool fTransient = false;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync for (int i = 2; i < a->argc; i++)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if ( !strcmp(a->argv[i], "--name")
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync || !strcmp(a->argv[i], "-name"))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (a->argc <= i + 1 || !*a->argv[i+1])
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return errorArgument("Missing argument to '%s'", a->argv[i]);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync i++;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync name = a->argv[i];
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else if ( !strcmp(a->argv[i], "--transient")
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync || !strcmp(a->argv[i], "-transient"))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync fTransient = true;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return errorSyntax(USAGE_SHAREDFOLDER_REMOVE, "Invalid parameter '%s'", Utf8Str(a->argv[i]).raw());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* required arguments */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (!name)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return errorSyntax(USAGE_SHAREDFOLDER_REMOVE, "Parameter --name is required");
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (fTransient)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync ComPtr <IConsole> console;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* open an existing session for the VM */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR_RET(a->virtualBox, OpenExistingSession(a->session, uuid), 1);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* get the session machine */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR_RET(a->session, COMGETTER(Machine)(machine.asOutParam()), 1);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* get the session console */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR_RET(a->session, COMGETTER(Console)(console.asOutParam()), 1);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR(console, RemoveSharedFolder(Bstr(name)));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (console)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync a->session->Close();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* open a session for the VM */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR_RET(a->virtualBox, OpenSession(a->session, uuid), 1);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* get the mutable session machine */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync a->session->COMGETTER(Machine)(machine.asOutParam());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR(machine, RemoveSharedFolder(Bstr(name)));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* commit and close the session */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR(machine, SaveSettings());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync a->session->Close();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return errorSyntax(USAGE_SETPROPERTY, "Invalid parameter '%s'", Utf8Str(a->argv[0]).raw());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return 0;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncint handleVMStatistics(HandlerArg *a)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync HRESULT rc;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* at least one option: the UUID or name of the VM */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (a->argc < 1)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return errorSyntax(USAGE_VM_STATISTICS, "Incorrect number of parameters");
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* try to find the given machine */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync ComPtr <IMachine> machine;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync Bstr uuid (a->argv[0]);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (!Guid (a->argv[0]).isEmpty())
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR(a->virtualBox, GetMachine(uuid, machine.asOutParam()));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR(a->virtualBox, FindMachine(Bstr(a->argv[0]), machine.asOutParam()));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (SUCCEEDED (rc))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync machine->COMGETTER(Id)(uuid.asOutParam());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(rc))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return 1;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* parse arguments. */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync bool fReset = false;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync bool fWithDescriptions = false;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync const char *pszPattern = NULL; /* all */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync for (int i = 1; i < a->argc; i++)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if ( !strcmp(a->argv[i], "--pattern")
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync || !strcmp(a->argv[i], "-pattern"))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (pszPattern)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return errorSyntax(USAGE_VM_STATISTICS, "Multiple --patterns options is not permitted");
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (i + 1 >= a->argc)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return errorArgument("Missing argument to '%s'", a->argv[i]);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync pszPattern = a->argv[++i];
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else if ( !strcmp(a->argv[i], "--descriptions")
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync || !strcmp(a->argv[i], "-descriptions"))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync fWithDescriptions = true;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* add: --file <filename> and --formatted */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else if ( !strcmp(a->argv[i], "--reset")
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync || !strcmp(a->argv[i], "-reset"))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync fReset = true;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return errorSyntax(USAGE_VM_STATISTICS, "Unknown option '%s'", a->argv[i]);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (fReset && fWithDescriptions)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return errorSyntax(USAGE_VM_STATISTICS, "The --reset and --descriptions options does not mix");
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* open an existing session for the VM. */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR(a->virtualBox, OpenExistingSession(a->session, uuid));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (SUCCEEDED(rc))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* get the session console. */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync ComPtr <IConsole> console;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR(a->session, COMGETTER(Console)(console.asOutParam()));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (SUCCEEDED(rc))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* get the machine debugger. */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync ComPtr <IMachineDebugger> debugger;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CHECK_ERROR(console, COMGETTER(Debugger)(debugger.asOutParam()));
if (SUCCEEDED(rc))
{
if (fReset)
CHECK_ERROR(debugger, ResetStats(Bstr(pszPattern)));
else
{
Bstr stats;
CHECK_ERROR(debugger, GetStats(Bstr(pszPattern), fWithDescriptions, stats.asOutParam()));
if (SUCCEEDED(rc))
{
/* if (fFormatted)
{ big mess }
else
*/
RTPrintf("%ls\n", stats.raw());
}
}
}
a->session->Close();
}
}
return SUCCEEDED(rc) ? 0 : 1;
}