gctrl.cpp revision ca0ee85505c252493a3ee53577848ef8939f991b
77b1a2d8b5dbe2c0b5200794914239fee3c8ee5dvboxsync * Guest Control Service: Internal function used by service, Main and testcase.
e64031e20c39650a7bc902a3e1aba613b9415deevboxsync * Copyright (C) 2010 Sun Microsystems, Inc.
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * available from http://www.virtualbox.org. This file is free software;
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * you can redistribute it and/or modify it under the terms of the GNU
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * General Public License (GPL) as published by the Free Software
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * additional information or have any questions.
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync/** @page pg_svc_guest_control Guest Control HGCM Service
43747b1f0bc8302a238fb35e55857a5e9aa1933dvboxsync * @todo Write up some nice text here.
16a9adc14900ca18e6909679a579f6833425e030vboxsync/*******************************************************************************
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync* Header Files *
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync*******************************************************************************/
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync/** @todo Remove unused header files below! */
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * Creates the argument list as an array used for executing a program.
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * @returns VBox status code.
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * @todo Respect spaces when quoting for arguments, e.g. "c:\\program files\\".
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * @todo Handle empty ("") argguments.
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsyncint gctrlPrepareExecArgv(char *pszArgs, void **ppvList, uint32_t *pcbList, uint32_t *pcArgs)
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync int rc = RTGetOptArgvFromString(&ppaArg, &iArgs, pszArgs, NULL);
9496f2d398b49813176939d7a339ae513d5175efvboxsync for (int i=0; i<iArgs; i++)
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync if (i > 0) /* Insert space as delimiter. */
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync rc = RTStrAAppendN(&pszTemp, ppaArg[i], strlen(ppaArg[i]));
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync *pcbList = strlen(pszTemp) + 1; /* Include zero termination. */
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync * Appends environment variables to the environment block. Each var=value pair is separated
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync * by NULL (\0) sequence. The whole block will be stored in one blob and disassembled on the
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync * guest side later to fit into the HGCM param structure.
7766bf675357fd940d8c49e69a5d72dc6eaa6be4vboxsync * @returns VBox status code.
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsyncint gctrlAddToExecEnvv(char *pszEnv, void **ppvList, uint32_t *pcbList, uint32_t *pcEnv)
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync uint32_t cbNewLen = *pcbList + cbLen + 1; /* Include zero termination. */
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync char *pvTmp = (char*)RTMemRealloc(*ppvList, cbNewLen);
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync pvTmp[cbNewLen - 1] = '\0'; /* Add zero termination. */
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync /* Reset counters. */
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync *pcbList += cbLen + 1; /* Include zero termination. */
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsyncint gctrlAllocateExecBlock(PVBOXGUESTCTRLEXECBLOCK *ppBlock,
61d064a54f03596920c3918f58ecc7764074a5d8vboxsync const char *pszCmd, uint32_t fFlags,
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync uint32_t cArgs, const char * const *papszArgs,
16a9adc14900ca18e6909679a579f6833425e030vboxsync uint32_t cEnvVars, const char * const *papszEnv,
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync const char *pszStdIn, const char *pszStdOut, const char *pszStdErr,
16a9adc14900ca18e6909679a579f6833425e030vboxsync const char *pszUsername, const char *pszPassword, RTMSINTERVAL cMillies)
16a9adc14900ca18e6909679a579f6833425e030vboxsync PVBOXGUESTCTRLEXECBLOCK pNewBlock = (VBOXGUESTCTRLEXECBLOCK*)RTMemAlloc(sizeof(VBOXGUESTCTRLEXECBLOCK));
16a9adc14900ca18e6909679a579f6833425e030vboxsync if (pNewBlock)
63c12491acc2b8b95c8ac454f1c48b98eec8f7d8vboxsync *ppBlock = pNewBlock;
63c12491acc2b8b95c8ac454f1c48b98eec8f7d8vboxsync rc = VINF_SUCCESS;
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync rc = VERR_NO_MEMORY;
63c12491acc2b8b95c8ac454f1c48b98eec8f7d8vboxsyncint gctrlFreeExecBlock(PVBOXGUESTCTRLEXECBLOCK pBlock)
63c12491acc2b8b95c8ac454f1c48b98eec8f7d8vboxsync AssertPtr(pBlock);
63c12491acc2b8b95c8ac454f1c48b98eec8f7d8vboxsync RTStrFree(pBlock->pszCmd);
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync RTMemFree(pBlock->pvArgs);
b5ad839a3757b305d4e98d7264da2b53c9cd27f0vboxsync RTMemFree(pBlock->pvEnv);
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync RTStrFree(pBlock->pszStdIn);
61b5982fad4660d0fe3dd6ceba9eda85eb32f7e8vboxsync RTStrFree(pBlock->pszStdOut);
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync RTStrFree(pBlock->pszStdErr);
681fd85cc7cd49e9cf66a917d6ae9ff36eb7d9e9vboxsync RTStrFree(pBlock->pszUsername);
681fd85cc7cd49e9cf66a917d6ae9ff36eb7d9e9vboxsync RTStrFree(pBlock->pszPassword);
681fd85cc7cd49e9cf66a917d6ae9ff36eb7d9e9vboxsync RT_ZERO(*pBlock);
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync return VINF_SUCCESS;
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsyncint gctrlPrepareHostCmdExec(PVBOXHGCMSVCPARM *ppaParms, uint32_t *pcParms,
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync PVBOXGUESTCTRLEXECBLOCK pBlock)
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync AssertPtr(ppaParms);
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync AssertPtr(pBlock);
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync PVBOXHGCMSVCPARM pNewParms =
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync (VBOXHGCMSVCPARM*)RTMemAlloc(sizeof(VBOXHGCMSVCPARM) * 13);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync if (pNewParms)
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync pNewParms[0].setUInt32(HOST_EXEC_CMD);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync pNewParms[1].setUInt32(pBlock->u32Flags);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync pNewParms[2].setPointer((void*)pBlock->pszCmd, (uint32_t)strlen(pBlock->pszCmd) + 1);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync pNewParms[3].setUInt32(pBlock->u32Args);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync pNewParms[4].setPointer((void*)pBlock->pvArgs, pBlock->cbArgs);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync pNewParms[5].setUInt32(pBlock->u32EnvVars);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync pNewParms[6].setPointer((void*)pBlock->pvEnv, pBlock->cbEnv);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync pNewParms[7].setPointer((void*)pBlock->pszStdIn, (uint32_t)strlen(pBlock->pszStdIn) + 1);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync pNewParms[8].setPointer((void*)pBlock->pszStdOut, (uint32_t)strlen(pBlock->pszStdOut) + 1);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync pNewParms[9].setPointer((void*)pBlock->pszStdErr, (uint32_t)strlen(pBlock->pszStdErr) + 1);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync pNewParms[10].setPointer((void*)pBlock->pszUsername, (uint32_t)strlen(pBlock->pszUsername) + 1);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync pNewParms[11].setPointer((void*)pBlock->pszPassword, (uint32_t)strlen(pBlock->pszPassword) + 1);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync pNewParms[12].setUInt32(pBlock->cMillies);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync *ppaParms = pNewParms;
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync rc = VINF_SUCCESS;
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync rc = VERR_NO_MEMORY;
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync if (pcParms)
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync *pcParms = 13;
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsyncvoid gctrlFreeHostCmd(PVBOXHGCMSVCPARM paParms)
16a9adc14900ca18e6909679a579f6833425e030vboxsync RTMemFree(paParms);