b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync/* $Id$ */
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync/** @file
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync * IPRT Testcase - RTProcCreateEx.
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync */
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync/*
c7814cf6e1240a519cbec0441e033d0e2470ed00vboxsync * Copyright (C) 2010-2012 Oracle Corporation
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync *
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync * available from http://www.virtualbox.org. This file is free software;
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync * you can redistribute it and/or modify it under the terms of the GNU
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync * General Public License (GPL) as published by the Free Software
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync *
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync * The contents of this file may alternatively be used under the terms
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync * of the Common Development and Distribution License Version 1.0
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync * VirtualBox OSE distribution, in which case the provisions of the
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync * CDDL are applicable instead of those of the GPL.
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync *
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync * You may elect to license modified versions of this file under the
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync * terms and conditions of either the GPL or the CDDL or both.
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync */
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync/*******************************************************************************
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync* Header Files *
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync*******************************************************************************/
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync#include <iprt/process.h>
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync#include <iprt/assert.h>
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync#include <iprt/env.h>
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync#include <iprt/err.h>
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync#include <iprt/initterm.h>
9ac9eda1e04d193f54339eaeffe1c8b2f8ea04b1vboxsync#include <iprt/mem.h>
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync#include <iprt/message.h>
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync#include <iprt/param.h>
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync#include <iprt/pipe.h>
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync#include <iprt/string.h>
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync#include <iprt/stream.h>
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync#include <iprt/test.h>
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync#include <iprt/thread.h>
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync
9ac9eda1e04d193f54339eaeffe1c8b2f8ea04b1vboxsync#ifdef RT_OS_WINDOWS
9ac9eda1e04d193f54339eaeffe1c8b2f8ea04b1vboxsync# define SECURITY_WIN32
9ac9eda1e04d193f54339eaeffe1c8b2f8ea04b1vboxsync# include <windows.h>
9ac9eda1e04d193f54339eaeffe1c8b2f8ea04b1vboxsync# include <Security.h>
9ac9eda1e04d193f54339eaeffe1c8b2f8ea04b1vboxsync#endif
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync/*******************************************************************************
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync* Global Variables *
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync*******************************************************************************/
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsyncstatic char g_szExecName[RTPATH_MAX];
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync
4ee5a4cd660730c997785c6cbc12881a115079e8vboxsyncstatic const char * const g_apszArgs4[] =
4ee5a4cd660730c997785c6cbc12881a115079e8vboxsync{
4ee5a4cd660730c997785c6cbc12881a115079e8vboxsync /* 0 */ "non existing non executable file",
4ee5a4cd660730c997785c6cbc12881a115079e8vboxsync /* 1 */ "--testcase-child-4",
4ee5a4cd660730c997785c6cbc12881a115079e8vboxsync /* 2 */ "a b",
4ee5a4cd660730c997785c6cbc12881a115079e8vboxsync /* 3 */ " cdef",
4ee5a4cd660730c997785c6cbc12881a115079e8vboxsync /* 4 */ "ghijkl ",
4ee5a4cd660730c997785c6cbc12881a115079e8vboxsync /* 5 */ "\"",
4ee5a4cd660730c997785c6cbc12881a115079e8vboxsync /* 6 */ "\\",
4ee5a4cd660730c997785c6cbc12881a115079e8vboxsync /* 7 */ "\\\"",
4ee5a4cd660730c997785c6cbc12881a115079e8vboxsync /* 8 */ "\\\"\\",
4ee5a4cd660730c997785c6cbc12881a115079e8vboxsync /* 9 */ "\\\\\"\\",
049743ebbd65da248764ca883df368f6cf6238cbvboxsync /*10 */ "%TEMP%",
049743ebbd65da248764ca883df368f6cf6238cbvboxsync /*11 */ "%TEMP%\filename",
049743ebbd65da248764ca883df368f6cf6238cbvboxsync /*12 */ "%TEMP%postfix",
049743ebbd65da248764ca883df368f6cf6238cbvboxsync /*13 */ "Prefix%TEMP%postfix",
049743ebbd65da248764ca883df368f6cf6238cbvboxsync /*14 */ "%",
049743ebbd65da248764ca883df368f6cf6238cbvboxsync /*15 */ "%%",
049743ebbd65da248764ca883df368f6cf6238cbvboxsync /*16 */ "%%%",
049743ebbd65da248764ca883df368f6cf6238cbvboxsync /*17 */ "%X",
049743ebbd65da248764ca883df368f6cf6238cbvboxsync /*18 */ "%%X",
4ee5a4cd660730c997785c6cbc12881a115079e8vboxsync NULL
4ee5a4cd660730c997785c6cbc12881a115079e8vboxsync};
4ee5a4cd660730c997785c6cbc12881a115079e8vboxsync
4e3469ac31db1401d787d60312d2179bc09757b9vboxsync
9ac9eda1e04d193f54339eaeffe1c8b2f8ea04b1vboxsyncstatic int tstRTCreateProcEx5Child(int argc, char **argv)
9ac9eda1e04d193f54339eaeffe1c8b2f8ea04b1vboxsync{
230bd8589bba39933ac5ec21482d6186d675e604vboxsync int rc = RTR3InitExeNoArguments(0);
049743ebbd65da248764ca883df368f6cf6238cbvboxsync if (RT_FAILURE(rc))
9ac9eda1e04d193f54339eaeffe1c8b2f8ea04b1vboxsync return RTMsgInitFailure(rc);
9ac9eda1e04d193f54339eaeffe1c8b2f8ea04b1vboxsync
9ac9eda1e04d193f54339eaeffe1c8b2f8ea04b1vboxsync#ifdef RT_OS_WINDOWS
9ac9eda1e04d193f54339eaeffe1c8b2f8ea04b1vboxsync char szUser[_1K];
9ac9eda1e04d193f54339eaeffe1c8b2f8ea04b1vboxsync DWORD cbLen = sizeof(szUser);
9ac9eda1e04d193f54339eaeffe1c8b2f8ea04b1vboxsync /** @todo Does not yet handle ERROR_MORE_DATA for user names longer than 32767. */
343a0f715a7abe21308b4a564698ab9c93473fcavboxsync if (!GetUserName(szUser, &cbLen))
9ac9eda1e04d193f54339eaeffe1c8b2f8ea04b1vboxsync {
343a0f715a7abe21308b4a564698ab9c93473fcavboxsync RTPrintf("GetUserName failed with last error=%ld\n", GetLastError());
049743ebbd65da248764ca883df368f6cf6238cbvboxsync return RTEXITCODE_FAILURE;
9ac9eda1e04d193f54339eaeffe1c8b2f8ea04b1vboxsync }
049743ebbd65da248764ca883df368f6cf6238cbvboxsync# if 0 /* Does not work on NT4 (yet). */
049743ebbd65da248764ca883df368f6cf6238cbvboxsync DWORD cbSid = 0;
049743ebbd65da248764ca883df368f6cf6238cbvboxsync DWORD cbDomain = 0;
049743ebbd65da248764ca883df368f6cf6238cbvboxsync SID_NAME_USE sidUse;
049743ebbd65da248764ca883df368f6cf6238cbvboxsync /* First try to figure out how much space for SID + domain name we need. */
049743ebbd65da248764ca883df368f6cf6238cbvboxsync BOOL bRet = LookupAccountName(NULL /* current system*/,
049743ebbd65da248764ca883df368f6cf6238cbvboxsync szUser,
049743ebbd65da248764ca883df368f6cf6238cbvboxsync NULL,
049743ebbd65da248764ca883df368f6cf6238cbvboxsync &cbSid,
049743ebbd65da248764ca883df368f6cf6238cbvboxsync NULL,
049743ebbd65da248764ca883df368f6cf6238cbvboxsync &cbDomain,
049743ebbd65da248764ca883df368f6cf6238cbvboxsync &sidUse);
049743ebbd65da248764ca883df368f6cf6238cbvboxsync if (!bRet)
9ac9eda1e04d193f54339eaeffe1c8b2f8ea04b1vboxsync {
049743ebbd65da248764ca883df368f6cf6238cbvboxsync DWORD dwErr = GetLastError();
049743ebbd65da248764ca883df368f6cf6238cbvboxsync if (dwErr != ERROR_INSUFFICIENT_BUFFER)
9ac9eda1e04d193f54339eaeffe1c8b2f8ea04b1vboxsync {
049743ebbd65da248764ca883df368f6cf6238cbvboxsync RTPrintf("LookupAccountName(1) failed with last error=%ld\n", dwErr);
049743ebbd65da248764ca883df368f6cf6238cbvboxsync return RTEXITCODE_FAILURE;
9ac9eda1e04d193f54339eaeffe1c8b2f8ea04b1vboxsync }
049743ebbd65da248764ca883df368f6cf6238cbvboxsync }
9ac9eda1e04d193f54339eaeffe1c8b2f8ea04b1vboxsync
049743ebbd65da248764ca883df368f6cf6238cbvboxsync /* Now try getting the real SID + domain name. */
049743ebbd65da248764ca883df368f6cf6238cbvboxsync SID *pSid = (SID *)RTMemAlloc(cbSid);
049743ebbd65da248764ca883df368f6cf6238cbvboxsync AssertPtr(pSid);
049743ebbd65da248764ca883df368f6cf6238cbvboxsync char *pszDomain = (char *)RTMemAlloc(cbDomain); /* Size in TCHAR! */
049743ebbd65da248764ca883df368f6cf6238cbvboxsync AssertPtr(pszDomain);
049743ebbd65da248764ca883df368f6cf6238cbvboxsync
049743ebbd65da248764ca883df368f6cf6238cbvboxsync if (!LookupAccountName(NULL /* Current system */,
049743ebbd65da248764ca883df368f6cf6238cbvboxsync szUser,
049743ebbd65da248764ca883df368f6cf6238cbvboxsync pSid,
049743ebbd65da248764ca883df368f6cf6238cbvboxsync &cbSid,
049743ebbd65da248764ca883df368f6cf6238cbvboxsync pszDomain,
049743ebbd65da248764ca883df368f6cf6238cbvboxsync &cbDomain,
049743ebbd65da248764ca883df368f6cf6238cbvboxsync &sidUse))
049743ebbd65da248764ca883df368f6cf6238cbvboxsync {
049743ebbd65da248764ca883df368f6cf6238cbvboxsync RTPrintf("LookupAccountName(2) failed with last error=%ld\n", GetLastError());
049743ebbd65da248764ca883df368f6cf6238cbvboxsync return RTEXITCODE_FAILURE;
9ac9eda1e04d193f54339eaeffe1c8b2f8ea04b1vboxsync }
049743ebbd65da248764ca883df368f6cf6238cbvboxsync RTMemFree(pSid);
049743ebbd65da248764ca883df368f6cf6238cbvboxsync RTMemFree(pszDomain);
049743ebbd65da248764ca883df368f6cf6238cbvboxsync# endif
9ac9eda1e04d193f54339eaeffe1c8b2f8ea04b1vboxsync#else
9ac9eda1e04d193f54339eaeffe1c8b2f8ea04b1vboxsync /** @todo Lookup UID/effective UID, maybe GID? */
9ac9eda1e04d193f54339eaeffe1c8b2f8ea04b1vboxsync#endif
049743ebbd65da248764ca883df368f6cf6238cbvboxsync return RTEXITCODE_SUCCESS;
9ac9eda1e04d193f54339eaeffe1c8b2f8ea04b1vboxsync}
9ac9eda1e04d193f54339eaeffe1c8b2f8ea04b1vboxsync
4e3469ac31db1401d787d60312d2179bc09757b9vboxsyncstatic void tstRTCreateProcEx5(const char *pszUser, const char *pszPassword)
9ac9eda1e04d193f54339eaeffe1c8b2f8ea04b1vboxsync{
4e3469ac31db1401d787d60312d2179bc09757b9vboxsync RTTestISubF("As user \"%s\" with password \"%s\"", pszUser, pszPassword);
9ac9eda1e04d193f54339eaeffe1c8b2f8ea04b1vboxsync
9ac9eda1e04d193f54339eaeffe1c8b2f8ea04b1vboxsync const char * apszArgs[3] =
9ac9eda1e04d193f54339eaeffe1c8b2f8ea04b1vboxsync {
9ac9eda1e04d193f54339eaeffe1c8b2f8ea04b1vboxsync "test", /* user name */
9ac9eda1e04d193f54339eaeffe1c8b2f8ea04b1vboxsync "--testcase-child-5",
9ac9eda1e04d193f54339eaeffe1c8b2f8ea04b1vboxsync NULL
9ac9eda1e04d193f54339eaeffe1c8b2f8ea04b1vboxsync };
9ac9eda1e04d193f54339eaeffe1c8b2f8ea04b1vboxsync
9ac9eda1e04d193f54339eaeffe1c8b2f8ea04b1vboxsync RTPROCESS hProc;
343a0f715a7abe21308b4a564698ab9c93473fcavboxsync
343a0f715a7abe21308b4a564698ab9c93473fcavboxsync /* Test for invalid logons. */
343a0f715a7abe21308b4a564698ab9c93473fcavboxsync RTTESTI_CHECK_RC_RETV(RTProcCreateEx(g_szExecName, apszArgs, RTENV_DEFAULT, 0 /*fFlags*/, NULL,
e6475eda5d15be9afba6cdbaca6d2d324d37bb05vboxsync NULL, NULL, "non-existing-user", "wrong-password", &hProc), VERR_AUTHENTICATION_FAILURE);
343a0f715a7abe21308b4a564698ab9c93473fcavboxsync /* Test for invalid application. */
8e03ddcc7e406ba01ce5adb465bc1bb034681b40vboxsync RTTESTI_CHECK_RC_RETV(RTProcCreateEx("non-existing-app", apszArgs, RTENV_DEFAULT, 0 /*fFlags*/, NULL,
eb164f7d77f5b3bee0fe6fbdd46521550e3306c4vboxsync NULL, NULL, NULL, NULL, &hProc), VERR_FILE_NOT_FOUND);
343a0f715a7abe21308b4a564698ab9c93473fcavboxsync /* Test a (hopefully) valid user/password logon (given by parameters of this function). */
9ac9eda1e04d193f54339eaeffe1c8b2f8ea04b1vboxsync RTTESTI_CHECK_RC_RETV(RTProcCreateEx(g_szExecName, apszArgs, RTENV_DEFAULT, 0 /*fFlags*/, NULL,
4e3469ac31db1401d787d60312d2179bc09757b9vboxsync NULL, NULL, pszUser, pszPassword, &hProc), VINF_SUCCESS);
9ac9eda1e04d193f54339eaeffe1c8b2f8ea04b1vboxsync RTPROCSTATUS ProcStatus = { -1, RTPROCEXITREASON_ABEND };
9ac9eda1e04d193f54339eaeffe1c8b2f8ea04b1vboxsync RTTESTI_CHECK_RC(RTProcWait(hProc, RTPROCWAIT_FLAGS_BLOCK, &ProcStatus), VINF_SUCCESS);
9ac9eda1e04d193f54339eaeffe1c8b2f8ea04b1vboxsync
9ac9eda1e04d193f54339eaeffe1c8b2f8ea04b1vboxsync if (ProcStatus.enmReason != RTPROCEXITREASON_NORMAL || ProcStatus.iStatus != 0)
9ac9eda1e04d193f54339eaeffe1c8b2f8ea04b1vboxsync RTTestIFailed("enmReason=%d iStatus=%d", ProcStatus.enmReason, ProcStatus.iStatus);
9ac9eda1e04d193f54339eaeffe1c8b2f8ea04b1vboxsync}
468c2bcb36eb9a032f5dd0fcb34db10bd58e9996vboxsync
9ac9eda1e04d193f54339eaeffe1c8b2f8ea04b1vboxsync
4ee5a4cd660730c997785c6cbc12881a115079e8vboxsyncstatic int tstRTCreateProcEx4Child(int argc, char **argv)
4ee5a4cd660730c997785c6cbc12881a115079e8vboxsync{
230bd8589bba39933ac5ec21482d6186d675e604vboxsync int rc = RTR3InitExeNoArguments(0);
049743ebbd65da248764ca883df368f6cf6238cbvboxsync if (RT_FAILURE(rc))
4ee5a4cd660730c997785c6cbc12881a115079e8vboxsync return RTMsgInitFailure(rc);
4ee5a4cd660730c997785c6cbc12881a115079e8vboxsync
049743ebbd65da248764ca883df368f6cf6238cbvboxsync int cErrors = 0;
4ee5a4cd660730c997785c6cbc12881a115079e8vboxsync for (int i = 0; i < argc; i++)
4ee5a4cd660730c997785c6cbc12881a115079e8vboxsync if (strcmp(argv[i], g_apszArgs4[i]))
4ee5a4cd660730c997785c6cbc12881a115079e8vboxsync {
4ee5a4cd660730c997785c6cbc12881a115079e8vboxsync RTStrmPrintf(g_pStdErr,
4ee5a4cd660730c997785c6cbc12881a115079e8vboxsync "child4: argv[%2u]='%s'\n"
4ee5a4cd660730c997785c6cbc12881a115079e8vboxsync "child4: expected='%s'\n",
4ee5a4cd660730c997785c6cbc12881a115079e8vboxsync i, argv[i], g_apszArgs4[i]);
049743ebbd65da248764ca883df368f6cf6238cbvboxsync cErrors++;
4ee5a4cd660730c997785c6cbc12881a115079e8vboxsync }
049743ebbd65da248764ca883df368f6cf6238cbvboxsync
049743ebbd65da248764ca883df368f6cf6238cbvboxsync return cErrors == 0 ? RTEXITCODE_SUCCESS : RTEXITCODE_FAILURE;
4ee5a4cd660730c997785c6cbc12881a115079e8vboxsync}
4ee5a4cd660730c997785c6cbc12881a115079e8vboxsync
049743ebbd65da248764ca883df368f6cf6238cbvboxsyncstatic void tstRTCreateProcEx4(const char *pszAsUser, const char *pszPassword)
4ee5a4cd660730c997785c6cbc12881a115079e8vboxsync{
4ee5a4cd660730c997785c6cbc12881a115079e8vboxsync RTTestISub("Argument with spaces and stuff");
4ee5a4cd660730c997785c6cbc12881a115079e8vboxsync
4ee5a4cd660730c997785c6cbc12881a115079e8vboxsync RTPROCESS hProc;
4ee5a4cd660730c997785c6cbc12881a115079e8vboxsync RTTESTI_CHECK_RC_RETV(RTProcCreateEx(g_szExecName, g_apszArgs4, RTENV_DEFAULT, 0 /*fFlags*/, NULL,
049743ebbd65da248764ca883df368f6cf6238cbvboxsync NULL, NULL, pszAsUser, pszPassword, &hProc), VINF_SUCCESS);
4ee5a4cd660730c997785c6cbc12881a115079e8vboxsync RTPROCSTATUS ProcStatus = { -1, RTPROCEXITREASON_ABEND };
4ee5a4cd660730c997785c6cbc12881a115079e8vboxsync RTTESTI_CHECK_RC(RTProcWait(hProc, RTPROCWAIT_FLAGS_BLOCK, &ProcStatus), VINF_SUCCESS);
4ee5a4cd660730c997785c6cbc12881a115079e8vboxsync
4ee5a4cd660730c997785c6cbc12881a115079e8vboxsync if (ProcStatus.enmReason != RTPROCEXITREASON_NORMAL || ProcStatus.iStatus != 0)
4ee5a4cd660730c997785c6cbc12881a115079e8vboxsync RTTestIFailed("enmReason=%d iStatus=%d", ProcStatus.enmReason, ProcStatus.iStatus);
4ee5a4cd660730c997785c6cbc12881a115079e8vboxsync}
4ee5a4cd660730c997785c6cbc12881a115079e8vboxsync
4ee5a4cd660730c997785c6cbc12881a115079e8vboxsync
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsyncstatic int tstRTCreateProcEx3Child(void)
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync{
230bd8589bba39933ac5ec21482d6186d675e604vboxsync int rc = RTR3InitExeNoArguments(0);
049743ebbd65da248764ca883df368f6cf6238cbvboxsync if (RT_FAILURE(rc))
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync return RTMsgInitFailure(rc);
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTStrmPrintf(g_pStdOut, "w"); RTStrmFlush(g_pStdOut);
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTStrmPrintf(g_pStdErr, "o"); RTStrmFlush(g_pStdErr);
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTStrmPrintf(g_pStdOut, "r"); RTStrmFlush(g_pStdOut);
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTStrmPrintf(g_pStdErr, "k"); RTStrmFlush(g_pStdErr);
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTStrmPrintf(g_pStdOut, "s");
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync
049743ebbd65da248764ca883df368f6cf6238cbvboxsync return RTEXITCODE_SUCCESS;
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync}
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync
049743ebbd65da248764ca883df368f6cf6238cbvboxsyncstatic void tstRTCreateProcEx3(const char *pszAsUser, const char *pszPassword)
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync{
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTTestISub("Standard Out+Err");
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTPIPE hPipeR, hPipeW;
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTTESTI_CHECK_RC_RETV(RTPipeCreate(&hPipeR, &hPipeW, RTPIPE_C_INHERIT_WRITE), VINF_SUCCESS);
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync const char * apszArgs[3] =
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync {
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync "non-existing-non-executable-file",
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync "--testcase-child-3",
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync NULL
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync };
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTHANDLE Handle;
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync Handle.enmType = RTHANDLETYPE_PIPE;
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync Handle.u.hPipe = hPipeW;
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTPROCESS hProc;
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTTESTI_CHECK_RC_RETV(RTProcCreateEx(g_szExecName, apszArgs, RTENV_DEFAULT, 0 /*fFlags*/, NULL,
049743ebbd65da248764ca883df368f6cf6238cbvboxsync &Handle, &Handle, pszAsUser, pszPassword, &hProc), VINF_SUCCESS);
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTTESTI_CHECK_RC(RTPipeClose(hPipeW), VINF_SUCCESS);
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync char szOutput[_4K];
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync size_t offOutput = 0;
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync for (;;)
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync {
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync size_t cbLeft = sizeof(szOutput) - 1 - offOutput;
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTTESTI_CHECK(cbLeft > 0);
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync if (cbLeft == 0)
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync break;
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync size_t cbRead;
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync int rc = RTPipeReadBlocking(hPipeR, &szOutput[offOutput], cbLeft, &cbRead);
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync if (RT_FAILURE(rc))
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync {
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTTESTI_CHECK_RC(rc, VERR_BROKEN_PIPE);
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync break;
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync }
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync offOutput += cbRead;
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync }
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync szOutput[offOutput] = '\0';
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTTESTI_CHECK_RC(RTPipeClose(hPipeR), VINF_SUCCESS);
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTPROCSTATUS ProcStatus = { -1, RTPROCEXITREASON_ABEND };
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTTESTI_CHECK_RC(RTProcWait(hProc, RTPROCWAIT_FLAGS_BLOCK, &ProcStatus), VINF_SUCCESS);
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTThreadSleep(10);
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync if (ProcStatus.enmReason != RTPROCEXITREASON_NORMAL || ProcStatus.iStatus != 0)
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTTestIFailed("enmReason=%d iStatus=%d", ProcStatus.enmReason, ProcStatus.iStatus);
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync else if ( offOutput != sizeof("works") - 1
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync || strcmp(szOutput, "works"))
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTTestIFailed("wrong output: \"%s\" (len=%u)", szOutput, offOutput);
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync}
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync
4ee5a4cd660730c997785c6cbc12881a115079e8vboxsync
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsyncstatic int tstRTCreateProcEx2Child(void)
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync{
230bd8589bba39933ac5ec21482d6186d675e604vboxsync int rc = RTR3InitExeNoArguments(0);
049743ebbd65da248764ca883df368f6cf6238cbvboxsync if (RT_FAILURE(rc))
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync return RTMsgInitFailure(rc);
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTStrmPrintf(g_pStdErr, "howdy");
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTStrmPrintf(g_pStdOut, "ignore this output\n");
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync
049743ebbd65da248764ca883df368f6cf6238cbvboxsync return RTEXITCODE_SUCCESS;
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync}
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync
049743ebbd65da248764ca883df368f6cf6238cbvboxsyncstatic void tstRTCreateProcEx2(const char *pszAsUser, const char *pszPassword)
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync{
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTTestISub("Standard Err");
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTPIPE hPipeR, hPipeW;
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTTESTI_CHECK_RC_RETV(RTPipeCreate(&hPipeR, &hPipeW, RTPIPE_C_INHERIT_WRITE), VINF_SUCCESS);
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync const char * apszArgs[3] =
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync {
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync "non-existing-non-executable-file",
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync "--testcase-child-2",
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync NULL
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync };
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTHANDLE Handle;
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync Handle.enmType = RTHANDLETYPE_PIPE;
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync Handle.u.hPipe = hPipeW;
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTPROCESS hProc;
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTTESTI_CHECK_RC_RETV(RTProcCreateEx(g_szExecName, apszArgs, RTENV_DEFAULT, 0 /*fFlags*/, NULL,
049743ebbd65da248764ca883df368f6cf6238cbvboxsync NULL, &Handle, pszAsUser, pszPassword, &hProc), VINF_SUCCESS);
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTTESTI_CHECK_RC(RTPipeClose(hPipeW), VINF_SUCCESS);
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync char szOutput[_4K];
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync size_t offOutput = 0;
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync for (;;)
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync {
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync size_t cbLeft = sizeof(szOutput) - 1 - offOutput;
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTTESTI_CHECK(cbLeft > 0);
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync if (cbLeft == 0)
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync break;
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync size_t cbRead;
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync int rc = RTPipeReadBlocking(hPipeR, &szOutput[offOutput], cbLeft, &cbRead);
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync if (RT_FAILURE(rc))
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync {
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTTESTI_CHECK_RC(rc, VERR_BROKEN_PIPE);
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync break;
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync }
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync offOutput += cbRead;
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync }
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync szOutput[offOutput] = '\0';
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTTESTI_CHECK_RC(RTPipeClose(hPipeR), VINF_SUCCESS);
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTPROCSTATUS ProcStatus = { -1, RTPROCEXITREASON_ABEND };
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTTESTI_CHECK_RC(RTProcWait(hProc, RTPROCWAIT_FLAGS_BLOCK, &ProcStatus), VINF_SUCCESS);
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTThreadSleep(10);
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync if (ProcStatus.enmReason != RTPROCEXITREASON_NORMAL || ProcStatus.iStatus != 0)
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTTestIFailed("enmReason=%d iStatus=%d", ProcStatus.enmReason, ProcStatus.iStatus);
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync else if ( offOutput != sizeof("howdy") - 1
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync || strcmp(szOutput, "howdy"))
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTTestIFailed("wrong output: \"%s\" (len=%u)", szOutput, offOutput);
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync}
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsyncstatic int tstRTCreateProcEx1Child(void)
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync{
230bd8589bba39933ac5ec21482d6186d675e604vboxsync int rc = RTR3InitExeNoArguments(0);
049743ebbd65da248764ca883df368f6cf6238cbvboxsync if (RT_FAILURE(rc))
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync return RTMsgInitFailure(rc);
049743ebbd65da248764ca883df368f6cf6238cbvboxsync
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTPrintf("it works");
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTStrmPrintf(g_pStdErr, "ignore this output\n");
049743ebbd65da248764ca883df368f6cf6238cbvboxsync
049743ebbd65da248764ca883df368f6cf6238cbvboxsync return RTEXITCODE_SUCCESS;
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync}
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync
049743ebbd65da248764ca883df368f6cf6238cbvboxsyncstatic void tstRTCreateProcEx1(const char *pszAsUser, const char *pszPassword)
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync{
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTTestISub("Standard Out");
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTPIPE hPipeR, hPipeW;
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTTESTI_CHECK_RC_RETV(RTPipeCreate(&hPipeR, &hPipeW, RTPIPE_C_INHERIT_WRITE), VINF_SUCCESS);
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync const char * apszArgs[3] =
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync {
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync "non-existing-non-executable-file",
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync "--testcase-child-1",
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync NULL
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync };
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTHANDLE Handle;
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync Handle.enmType = RTHANDLETYPE_PIPE;
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync Handle.u.hPipe = hPipeW;
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTPROCESS hProc;
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTTESTI_CHECK_RC_RETV(RTProcCreateEx(g_szExecName, apszArgs, RTENV_DEFAULT, 0 /*fFlags*/, NULL,
049743ebbd65da248764ca883df368f6cf6238cbvboxsync &Handle, NULL, pszAsUser, pszPassword, &hProc), VINF_SUCCESS);
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTTESTI_CHECK_RC(RTPipeClose(hPipeW), VINF_SUCCESS);
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync char szOutput[_4K];
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync size_t offOutput = 0;
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync for (;;)
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync {
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync size_t cbLeft = sizeof(szOutput) - 1 - offOutput;
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTTESTI_CHECK(cbLeft > 0);
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync if (cbLeft == 0)
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync break;
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync size_t cbRead;
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync int rc = RTPipeReadBlocking(hPipeR, &szOutput[offOutput], cbLeft, &cbRead);
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync if (RT_FAILURE(rc))
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync {
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTTESTI_CHECK_RC(rc, VERR_BROKEN_PIPE);
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync break;
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync }
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync offOutput += cbRead;
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync }
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync szOutput[offOutput] = '\0';
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTTESTI_CHECK_RC(RTPipeClose(hPipeR), VINF_SUCCESS);
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTPROCSTATUS ProcStatus = { -1, RTPROCEXITREASON_ABEND };
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTTESTI_CHECK_RC(RTProcWait(hProc, RTPROCWAIT_FLAGS_BLOCK, &ProcStatus), VINF_SUCCESS);
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync if (ProcStatus.enmReason != RTPROCEXITREASON_NORMAL || ProcStatus.iStatus != 0)
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTTestIFailed("enmReason=%d iStatus=%d", ProcStatus.enmReason, ProcStatus.iStatus);
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync else if ( offOutput != sizeof("it works") - 1
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync || strcmp(szOutput, "it works"))
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTTestIFailed("wrong output: \"%s\" (len=%u)", szOutput, offOutput);
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync}
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsyncint main(int argc, char **argv)
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync{
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync if (argc == 2 && !strcmp(argv[1], "--testcase-child-1"))
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync return tstRTCreateProcEx1Child();
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync if (argc == 2 && !strcmp(argv[1], "--testcase-child-2"))
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync return tstRTCreateProcEx2Child();
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync if (argc == 2 && !strcmp(argv[1], "--testcase-child-3"))
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync return tstRTCreateProcEx3Child();
4ee5a4cd660730c997785c6cbc12881a115079e8vboxsync if (argc >= 5 && !strcmp(argv[1], "--testcase-child-4"))
4ee5a4cd660730c997785c6cbc12881a115079e8vboxsync return tstRTCreateProcEx4Child(argc, argv);
9ac9eda1e04d193f54339eaeffe1c8b2f8ea04b1vboxsync if (argc == 2 && !strcmp(argv[1], "--testcase-child-5"))
9ac9eda1e04d193f54339eaeffe1c8b2f8ea04b1vboxsync return tstRTCreateProcEx5Child(argc, argv);
4e3469ac31db1401d787d60312d2179bc09757b9vboxsync const char *pszAsUser = NULL;
4e3469ac31db1401d787d60312d2179bc09757b9vboxsync const char *pszPassword = NULL;
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync if (argc != 1)
4e3469ac31db1401d787d60312d2179bc09757b9vboxsync {
4e3469ac31db1401d787d60312d2179bc09757b9vboxsync if (argc != 4 || strcmp(argv[1], "--as-user"))
4e3469ac31db1401d787d60312d2179bc09757b9vboxsync return 99;
4e3469ac31db1401d787d60312d2179bc09757b9vboxsync pszAsUser = argv[2];
343a0f715a7abe21308b4a564698ab9c93473fcavboxsync pszPassword = argv[3];
4e3469ac31db1401d787d60312d2179bc09757b9vboxsync }
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTTEST hTest;
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync int rc = RTTestInitAndCreate("tstRTProcCreateEx", &hTest);
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync if (rc)
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync return rc;
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTTestBanner(hTest);
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync
a0cfaded2376888b45a6a207baa4e1dc0acf866dvboxsync if (!RTProcGetExecutablePath(g_szExecName, sizeof(g_szExecName)))
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync RTStrCopy(g_szExecName, sizeof(g_szExecName), argv[0]);
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync /*
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync * The tests.
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync */
049743ebbd65da248764ca883df368f6cf6238cbvboxsync tstRTCreateProcEx1(pszAsUser, pszPassword);
049743ebbd65da248764ca883df368f6cf6238cbvboxsync tstRTCreateProcEx2(pszAsUser, pszPassword);
049743ebbd65da248764ca883df368f6cf6238cbvboxsync tstRTCreateProcEx3(pszAsUser, pszPassword);
049743ebbd65da248764ca883df368f6cf6238cbvboxsync tstRTCreateProcEx4(pszAsUser, pszPassword);
4e3469ac31db1401d787d60312d2179bc09757b9vboxsync if (pszAsUser)
4e3469ac31db1401d787d60312d2179bc09757b9vboxsync tstRTCreateProcEx5(pszAsUser, pszPassword);
9ac9eda1e04d193f54339eaeffe1c8b2f8ea04b1vboxsync /** @todo Cover files, ++ */
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync /*
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync * Summary.
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync */
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync return RTTestSummaryAndDestroy(hTest);
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync}
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync