tstRTProcCreateEx.cpp revision 4e3469ac31db1401d787d60312d2179bc09757b9
a4544a5a0e622ef69e38641f87ab1b5685e05911Phill Cunnington/* $Id$ */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster/** @file
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * IPRT Testcase - RTProcCreateEx.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster/*
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Copyright (C) 2010 Sun Microsystems, Inc.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * This file is part of VirtualBox Open Source Edition (OSE), as
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * available from http://www.virtualbox.org. This file is free software;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * you can redistribute it and/or modify it under the terms of the GNU
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * General Public License (GPL) as published by the Free Software
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Foundation, in version 2 as it comes in the "COPYING" file of the
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * The contents of this file may alternatively be used under the terms
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * of the Common Development and Distribution License Version 1.0
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * VirtualBox OSE distribution, in which case the provisions of the
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * CDDL are applicable instead of those of the GPL.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * You may elect to license modified versions of this file under the
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * terms and conditions of either the GPL or the CDDL or both.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
ccf9d4a5c6453fa9f8b839baeee25147865fbb7dJames Phillpotts * Clara, CA 95054 USA or visit http://www.sun.com if you need
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * additional information or have any questions.
a4544a5a0e622ef69e38641f87ab1b5685e05911Phill Cunnington */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
ccf9d4a5c6453fa9f8b839baeee25147865fbb7dJames Phillpotts/*******************************************************************************
ccf9d4a5c6453fa9f8b839baeee25147865fbb7dJames Phillpotts* Header Files *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster*******************************************************************************/
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster#include <iprt/process.h>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster#include <iprt/assert.h>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster#include <iprt/env.h>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster#include <iprt/err.h>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster#include <iprt/initterm.h>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster#include <iprt/mem.h>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster#include <iprt/message.h>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster#include <iprt/param.h>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster#include <iprt/pipe.h>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster#include <iprt/string.h>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster#include <iprt/stream.h>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster#include <iprt/test.h>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster#include <iprt/thread.h>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster#ifdef RT_OS_WINDOWS
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster# define SECURITY_WIN32
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster# include <windows.h>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster# include <Security.h>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster#endif
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster/*******************************************************************************
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster* Global Variables *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster*******************************************************************************/
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterstatic char g_szExecName[RTPATH_MAX];
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterstatic const char * const g_apszArgs4[] =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster{
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /* 0 */ "non existing non executable file",
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /* 1 */ "--testcase-child-4",
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /* 2 */ "a b",
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /* 3 */ " cdef",
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /* 4 */ "ghijkl ",
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /* 5 */ "\"",
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /* 6 */ "\\",
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /* 7 */ "\\\"",
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /* 8 */ "\\\"\\",
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /* 9 */ "\\\\\"\\",
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster NULL
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster};
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterstatic int tstRTCreateProcEx5Child(int argc, char **argv)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster{
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster int rc = RTR3Init();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (rc)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return RTMsgInitFailure(rc);
8d3140b524c0e28c0a49dc7c7d481123ef3cfe11Chris Lee
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster#ifdef RT_OS_WINDOWS
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster char szUser[_1K];
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DWORD cbLen = sizeof(szUser);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /** @todo Does not yet handle ERROR_MORE_DATA for user names longer than 32767. */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (!GetUserNameEx(NameSamCompatible, szUser, &cbLen))
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTPrintf("GetUserNameEx failed with last error=%ld\n", GetLastError());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return VERR_AUTHENTICATION_FAILURE;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster else
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DWORD cbSid = 0;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DWORD cbDomain = 0;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SID_NAME_USE sidUse;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /* First try to figure out how much space for SID + domain name we need. */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster BOOL bRet = LookupAccountName(NULL /* current system*/,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster szUser,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster NULL,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster &cbSid,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster NULL,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster &cbDomain,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster &sidUse);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (!bRet)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DWORD dwErr = GetLastError();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (dwErr != ERROR_INSUFFICIENT_BUFFER)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTPrintf("LookupAccountName(1) failed with last error=%ld\n", dwErr);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return VERR_AUTHENTICATION_FAILURE;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /* Now try getting the real SID + domain name. */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SID *pSid = (SID *)RTMemAlloc(cbSid);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster AssertPtr(pSid);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster char *pszDomain = (char *)RTMemAlloc(cbDomain); /* Size in TCHAR! */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster AssertPtr(pszDomain);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (!LookupAccountName(NULL /* Current system */,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster szUser,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster pSid,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster &cbSid,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster pszDomain,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster &cbDomain,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster &sidUse))
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTPrintf("LookupAccountName(2) failed with last error=%ld\n", GetLastError());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return VERR_AUTHENTICATION_FAILURE;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTMemFree(pSid);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTMemFree(pszDomain);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster#else
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /** @todo Lookup UID/effective UID, maybe GID? */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster#endif
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return rc;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster}
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterstatic void tstRTCreateProcEx5(const char *pszUser, const char *pszPassword)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster{
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTestISubF("As user \"%s\" with password \"%s\"", pszUser, pszPassword);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster const char * apszArgs[3] =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "test", /* user name */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "--testcase-child-5",
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster NULL
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster };
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTPROCESS hProc;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTESTI_CHECK_RC_RETV(RTProcCreateEx(g_szExecName, apszArgs, RTENV_DEFAULT, 0 /*fFlags*/, NULL,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster NULL, NULL, pszUser, pszPassword, &hProc), VINF_SUCCESS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTPROCSTATUS ProcStatus = { -1, RTPROCEXITREASON_ABEND };
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTESTI_CHECK_RC(RTProcWait(hProc, RTPROCWAIT_FLAGS_BLOCK, &ProcStatus), VINF_SUCCESS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (ProcStatus.enmReason != RTPROCEXITREASON_NORMAL || ProcStatus.iStatus != 0)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTestIFailed("enmReason=%d iStatus=%d", ProcStatus.enmReason, ProcStatus.iStatus);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster else
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTestIPassed(NULL);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster}
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterstatic int tstRTCreateProcEx4Child(int argc, char **argv)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster{
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster int rc = RTR3Init();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (rc)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return RTMsgInitFailure(rc);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster for (int i = 0; i < argc; i++)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (strcmp(argv[i], g_apszArgs4[i]))
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTStrmPrintf(g_pStdErr,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "child4: argv[%2u]='%s'\n"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "child4: expected='%s'\n",
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster i, argv[i], g_apszArgs4[i]);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster rc++;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return rc;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster}
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterstatic void tstRTCreateProcEx4(void)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster{
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTestISub("Argument with spaces and stuff");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTPROCESS hProc;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTESTI_CHECK_RC_RETV(RTProcCreateEx(g_szExecName, g_apszArgs4, RTENV_DEFAULT, 0 /*fFlags*/, NULL,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster NULL, NULL, NULL, NULL, &hProc), VINF_SUCCESS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTPROCSTATUS ProcStatus = { -1, RTPROCEXITREASON_ABEND };
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTESTI_CHECK_RC(RTProcWait(hProc, RTPROCWAIT_FLAGS_BLOCK, &ProcStatus), VINF_SUCCESS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (ProcStatus.enmReason != RTPROCEXITREASON_NORMAL || ProcStatus.iStatus != 0)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTestIFailed("enmReason=%d iStatus=%d", ProcStatus.enmReason, ProcStatus.iStatus);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster else
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTestIPassed(NULL);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster}
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterstatic int tstRTCreateProcEx3Child(void)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster{
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster int rc = RTR3Init();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (rc)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return RTMsgInitFailure(rc);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTStrmPrintf(g_pStdOut, "w"); RTStrmFlush(g_pStdOut);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTStrmPrintf(g_pStdErr, "o"); RTStrmFlush(g_pStdErr);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTStrmPrintf(g_pStdOut, "r"); RTStrmFlush(g_pStdOut);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTStrmPrintf(g_pStdErr, "k"); RTStrmFlush(g_pStdErr);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTStrmPrintf(g_pStdOut, "s");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return 0;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster}
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterstatic void tstRTCreateProcEx3(void)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster{
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTestISub("Standard Out+Err");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTPIPE hPipeR, hPipeW;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTESTI_CHECK_RC_RETV(RTPipeCreate(&hPipeR, &hPipeW, RTPIPE_C_INHERIT_WRITE), VINF_SUCCESS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster const char * apszArgs[3] =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "non-existing-non-executable-file",
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "--testcase-child-3",
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster NULL
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster };
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTHANDLE Handle;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Handle.enmType = RTHANDLETYPE_PIPE;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Handle.u.hPipe = hPipeW;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTPROCESS hProc;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTESTI_CHECK_RC_RETV(RTProcCreateEx(g_szExecName, apszArgs, RTENV_DEFAULT, 0 /*fFlags*/, NULL,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster &Handle, &Handle, NULL, NULL, &hProc), VINF_SUCCESS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTESTI_CHECK_RC(RTPipeClose(hPipeW), VINF_SUCCESS);
ccf9d4a5c6453fa9f8b839baeee25147865fbb7dJames Phillpotts
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster char szOutput[_4K];
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster size_t offOutput = 0;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster for (;;)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster size_t cbLeft = sizeof(szOutput) - 1 - offOutput;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTESTI_CHECK(cbLeft > 0);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (cbLeft == 0)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster break;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster size_t cbRead;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster int rc = RTPipeReadBlocking(hPipeR, &szOutput[offOutput], cbLeft, &cbRead);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (RT_FAILURE(rc))
ccf9d4a5c6453fa9f8b839baeee25147865fbb7dJames Phillpotts {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTESTI_CHECK_RC(rc, VERR_BROKEN_PIPE);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster break;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster offOutput += cbRead;
ccf9d4a5c6453fa9f8b839baeee25147865fbb7dJames Phillpotts }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster szOutput[offOutput] = '\0';
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTESTI_CHECK_RC(RTPipeClose(hPipeR), VINF_SUCCESS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTPROCSTATUS ProcStatus = { -1, RTPROCEXITREASON_ABEND };
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTESTI_CHECK_RC(RTProcWait(hProc, RTPROCWAIT_FLAGS_BLOCK, &ProcStatus), VINF_SUCCESS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTThreadSleep(10);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (ProcStatus.enmReason != RTPROCEXITREASON_NORMAL || ProcStatus.iStatus != 0)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTestIFailed("enmReason=%d iStatus=%d", ProcStatus.enmReason, ProcStatus.iStatus);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster else if ( offOutput != sizeof("works") - 1
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster || strcmp(szOutput, "works"))
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTestIFailed("wrong output: \"%s\" (len=%u)", szOutput, offOutput);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster else
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTestIPassed(NULL);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster}
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterstatic int tstRTCreateProcEx2Child(void)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster{
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster int rc = RTR3Init();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (rc)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return RTMsgInitFailure(rc);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTStrmPrintf(g_pStdErr, "howdy");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTStrmPrintf(g_pStdOut, "ignore this output\n");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return 0;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster}
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterstatic void tstRTCreateProcEx2(void)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster{
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTestISub("Standard Err");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTPIPE hPipeR, hPipeW;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTESTI_CHECK_RC_RETV(RTPipeCreate(&hPipeR, &hPipeW, RTPIPE_C_INHERIT_WRITE), VINF_SUCCESS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster const char * apszArgs[3] =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "non-existing-non-executable-file",
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "--testcase-child-2",
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster NULL
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster };
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTHANDLE Handle;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Handle.enmType = RTHANDLETYPE_PIPE;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Handle.u.hPipe = hPipeW;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTPROCESS hProc;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTESTI_CHECK_RC_RETV(RTProcCreateEx(g_szExecName, apszArgs, RTENV_DEFAULT, 0 /*fFlags*/, NULL,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster NULL, &Handle, NULL, NULL, &hProc), VINF_SUCCESS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTESTI_CHECK_RC(RTPipeClose(hPipeW), VINF_SUCCESS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster char szOutput[_4K];
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster size_t offOutput = 0;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster for (;;)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster size_t cbLeft = sizeof(szOutput) - 1 - offOutput;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTESTI_CHECK(cbLeft > 0);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (cbLeft == 0)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster break;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster size_t cbRead;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster int rc = RTPipeReadBlocking(hPipeR, &szOutput[offOutput], cbLeft, &cbRead);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (RT_FAILURE(rc))
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTESTI_CHECK_RC(rc, VERR_BROKEN_PIPE);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster break;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster offOutput += cbRead;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster szOutput[offOutput] = '\0';
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTESTI_CHECK_RC(RTPipeClose(hPipeR), VINF_SUCCESS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTPROCSTATUS ProcStatus = { -1, RTPROCEXITREASON_ABEND };
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTESTI_CHECK_RC(RTProcWait(hProc, RTPROCWAIT_FLAGS_BLOCK, &ProcStatus), VINF_SUCCESS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTThreadSleep(10);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (ProcStatus.enmReason != RTPROCEXITREASON_NORMAL || ProcStatus.iStatus != 0)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTestIFailed("enmReason=%d iStatus=%d", ProcStatus.enmReason, ProcStatus.iStatus);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster else if ( offOutput != sizeof("howdy") - 1
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster || strcmp(szOutput, "howdy"))
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTestIFailed("wrong output: \"%s\" (len=%u)", szOutput, offOutput);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster else
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTestIPassed(NULL);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster}
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterstatic int tstRTCreateProcEx1Child(void)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster{
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster int rc = RTR3Init();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (rc)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return RTMsgInitFailure(rc);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTPrintf("it works");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTStrmPrintf(g_pStdErr, "ignore this output\n");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return 0;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster}
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterstatic void tstRTCreateProcEx1(void)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster{
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTestISub("Standard Out");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTPIPE hPipeR, hPipeW;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTESTI_CHECK_RC_RETV(RTPipeCreate(&hPipeR, &hPipeW, RTPIPE_C_INHERIT_WRITE), VINF_SUCCESS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster const char * apszArgs[3] =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "non-existing-non-executable-file",
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "--testcase-child-1",
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster NULL
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster };
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTHANDLE Handle;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Handle.enmType = RTHANDLETYPE_PIPE;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Handle.u.hPipe = hPipeW;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTPROCESS hProc;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTESTI_CHECK_RC_RETV(RTProcCreateEx(g_szExecName, apszArgs, RTENV_DEFAULT, 0 /*fFlags*/, NULL,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster &Handle, NULL, NULL, NULL, &hProc), VINF_SUCCESS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTESTI_CHECK_RC(RTPipeClose(hPipeW), VINF_SUCCESS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster char szOutput[_4K];
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster size_t offOutput = 0;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster for (;;)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster size_t cbLeft = sizeof(szOutput) - 1 - offOutput;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTESTI_CHECK(cbLeft > 0);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (cbLeft == 0)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster break;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster size_t cbRead;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster int rc = RTPipeReadBlocking(hPipeR, &szOutput[offOutput], cbLeft, &cbRead);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (RT_FAILURE(rc))
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTESTI_CHECK_RC(rc, VERR_BROKEN_PIPE);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster break;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster offOutput += cbRead;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster szOutput[offOutput] = '\0';
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTESTI_CHECK_RC(RTPipeClose(hPipeR), VINF_SUCCESS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTPROCSTATUS ProcStatus = { -1, RTPROCEXITREASON_ABEND };
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTESTI_CHECK_RC(RTProcWait(hProc, RTPROCWAIT_FLAGS_BLOCK, &ProcStatus), VINF_SUCCESS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (ProcStatus.enmReason != RTPROCEXITREASON_NORMAL || ProcStatus.iStatus != 0)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTestIFailed("enmReason=%d iStatus=%d", ProcStatus.enmReason, ProcStatus.iStatus);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster else if ( offOutput != sizeof("it works") - 1
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster || strcmp(szOutput, "it works"))
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTestIFailed("wrong output: \"%s\" (len=%u)", szOutput, offOutput);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster else
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTestIPassed(NULL);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster}
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterint main(int argc, char **argv)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster{
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (argc == 2 && !strcmp(argv[1], "--testcase-child-1"))
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return tstRTCreateProcEx1Child();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (argc == 2 && !strcmp(argv[1], "--testcase-child-2"))
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return tstRTCreateProcEx2Child();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (argc == 2 && !strcmp(argv[1], "--testcase-child-3"))
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return tstRTCreateProcEx3Child();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (argc >= 5 && !strcmp(argv[1], "--testcase-child-4"))
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return tstRTCreateProcEx4Child(argc, argv);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (argc == 2 && !strcmp(argv[1], "--testcase-child-5"))
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return tstRTCreateProcEx5Child(argc, argv);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster const char *pszAsUser = NULL;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster const char *pszPassword = NULL;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (argc != 1)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (argc != 4 || strcmp(argv[1], "--as-user"))
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return 99;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster pszAsUser = argv[2];
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster pszPassword = argv[4];
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTEST hTest;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster int rc = RTTestInitAndCreate("tstRTProcCreateEx", &hTest);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (rc)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return rc;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTestBanner(hTest);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (!RTProcGetExecutableName(g_szExecName, sizeof(g_szExecName)))
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTStrCopy(g_szExecName, sizeof(g_szExecName), argv[0]);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /*
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * The tests.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster tstRTCreateProcEx1();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster tstRTCreateProcEx2();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster tstRTCreateProcEx3();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster tstRTCreateProcEx4();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (pszAsUser)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /** @todo Do not run tstRTCreateProcEx5 on NT4, may not work (?) */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster tstRTCreateProcEx5(pszAsUser, pszPassword);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /** @todo Cover files, ++ */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /*
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Summary.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return RTTestSummaryAndDestroy(hTest);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster}
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster