VBoxManageGuestCtrl.cpp revision 74438a44e797e46a336de67165d59efd7d2a8bf7
deb4998ba50060c48cce222fd18a8eed053918d7vboxsync * VBoxManage - The 'guestcontrol' command.
deb4998ba50060c48cce222fd18a8eed053918d7vboxsync * Copyright (C) 2010 Oracle Corporation
deb4998ba50060c48cce222fd18a8eed053918d7vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
deb4998ba50060c48cce222fd18a8eed053918d7vboxsync * available from http://www.virtualbox.org. This file is free software;
deb4998ba50060c48cce222fd18a8eed053918d7vboxsync * you can redistribute it and/or modify it under the terms of the GNU
deb4998ba50060c48cce222fd18a8eed053918d7vboxsync * General Public License (GPL) as published by the Free Software
deb4998ba50060c48cce222fd18a8eed053918d7vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
deb4998ba50060c48cce222fd18a8eed053918d7vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
deb4998ba50060c48cce222fd18a8eed053918d7vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
deb4998ba50060c48cce222fd18a8eed053918d7vboxsync/*******************************************************************************
deb4998ba50060c48cce222fd18a8eed053918d7vboxsync* Header Files *
deb4998ba50060c48cce222fd18a8eed053918d7vboxsync*******************************************************************************/
deb4998ba50060c48cce222fd18a8eed053918d7vboxsync#include <VBox/HostServices/GuestControlSvc.h> /* for PROC_STS_XXX */
deb4998ba50060c48cce222fd18a8eed053918d7vboxsyncusing namespace com;
deb4998ba50060c48cce222fd18a8eed053918d7vboxsync * IVirtualBoxCallback implementation for handling the GuestControlCallback in
deb4998ba50060c48cce222fd18a8eed053918d7vboxsync * relation to the "guestcontrol * wait" command.
deb4998ba50060c48cce222fd18a8eed053918d7vboxsync/** @todo */
deb4998ba50060c48cce222fd18a8eed053918d7vboxsync/** Set by the signal handler. */
deb4998ba50060c48cce222fd18a8eed053918d7vboxsyncstatic volatile bool g_fExecCanceled = false;
deb4998ba50060c48cce222fd18a8eed053918d7vboxsync RTPrintf("VBoxManage guestcontrol execute <vmname>|<uuid>\n"
deb4998ba50060c48cce222fd18a8eed053918d7vboxsync " <path to program>\n"
deb4998ba50060c48cce222fd18a8eed053918d7vboxsync " --username <name> --password <password>\n"
deb4998ba50060c48cce222fd18a8eed053918d7vboxsync " [--arguments \"<arguments>\"]\n"
deb4998ba50060c48cce222fd18a8eed053918d7vboxsync " [--environment \"<NAME>=<VALUE> [<NAME>=<VALUE>]\"]\n"
deb4998ba50060c48cce222fd18a8eed053918d7vboxsync " [--flags <flags>] [--timeout <msec>]\n"
deb4998ba50060c48cce222fd18a8eed053918d7vboxsync " [--verbose] [--wait-for exit,stdout,stderr||]\n"
deb4998ba50060c48cce222fd18a8eed053918d7vboxsync * Signal handler that sets g_fCanceled.
deb4998ba50060c48cce222fd18a8eed053918d7vboxsync * This can be executed on any thread in the process, on Windows it may even be
deb4998ba50060c48cce222fd18a8eed053918d7vboxsync * a thread dedicated to delivering this signal. Do not doing anything
deb4998ba50060c48cce222fd18a8eed053918d7vboxsync * unnecessary here.
deb4998ba50060c48cce222fd18a8eed053918d7vboxsync return "started";
deb4998ba50060c48cce222fd18a8eed053918d7vboxsync return "successfully terminated";
deb4998ba50060c48cce222fd18a8eed053918d7vboxsync return "terminated by signal";
bool fWaitForExit = false;
bool fWaitForStdOut = false;
bool fWaitForStdErr = false;
bool fVerbose = false;
bool fTimeout = false;
bool usageOK = true;
usageOK = false;
char **papszArg;
int cArgs;
for (int j = 0; j < cArgs; j++)
usageOK = false;
char **papszArg;
int cArgs;
for (int j = 0; j < cArgs; j++)
usageOK = false;
usageOK = false;
usageOK = false;
|| u32TimeoutMS == 0)
usageOK = false;
fTimeout = true;
usageOK = false;
fWaitForExit = true;
fWaitForExit = true;
fWaitForStdOut = true;
fWaitForExit = true;
fWaitForStdErr = true;
usageOK = false;
fVerbose = true;
if (!usageOK)
if (machine)
if (fVerbose)
if (u32TimeoutMS == 0)
if (fVerbose)
if (fWaitForExit)
if (fTimeout)
if (fVerbose)
if (fVerbose)
else if (fVerbose)
bool fCanceledAlready = false;
if (fCancelable)
#ifdef SIGBREAK
if ( fWaitForStdOut
|| fWaitForStdErr)
cbOutputData = 0;
if (cbOutputData > 0)
if (fCompleted)
if ( fTimeout
g_fExecCanceled = false;
&& fCanceled)
if (fCancelable)
#ifdef SIGBREAK
if (fCanceled)
if (fVerbose)
else if ( fCompleted
else if (fVerbose)
RTPrintf("Exit code=%u (Status=%u [%s], Flags=%u)\n", uRetExitCode, uRetStatus, getStatus(uRetStatus), uRetFlags);
if (fVerbose)
if (a->argc == 0)