tstRTProcCreateEx.cpp revision cd899b2444ca69566bd04cfac96828714d3bd1b0
/* $Id$ */
/** @file
* IPRT Testcase - RTProcCreateEx.
*/
/*
* Copyright (C) 2010 Sun Microsystems, Inc.
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
* General Public License (GPL) as published by the Free Software
* Foundation, in version 2 as it comes in the "COPYING" file of the
* VirtualBox OSE distribution. VirtualBox OSE is distributed in the
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
*
* The contents of this file may alternatively be used under the terms
* of the Common Development and Distribution License Version 1.0
* (CDDL) only, as it comes in the "COPYING.CDDL" file of the
* VirtualBox OSE distribution, in which case the provisions of the
* CDDL are applicable instead of those of the GPL.
*
* You may elect to license modified versions of this file under the
* terms and conditions of either the GPL or the CDDL or both.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
* Clara, CA 95054 USA or visit http://www.sun.com if you need
* additional information or have any questions.
*/
/*******************************************************************************
* Header Files *
*******************************************************************************/
#include <iprt/initterm.h>
#ifdef RT_OS_WINDOWS
# define SECURITY_WIN32
# include <windows.h>
# include <Security.h>
#endif
/*******************************************************************************
* Global Variables *
*******************************************************************************/
static char g_szExecName[RTPATH_MAX];
static const char * const g_apszArgs4[] =
{
/* 0 */ "non existing non executable file",
/* 1 */ "--testcase-child-4",
/* 2 */ "a b",
/* 3 */ " cdef",
/* 4 */ "ghijkl ",
/* 5 */ "\"",
/* 6 */ "\\",
/* 7 */ "\\\"",
/* 8 */ "\\\"\\",
/* 9 */ "\\\\\"\\",
};
{
if (rc)
return RTMsgInitFailure(rc);
#ifdef RT_OS_WINDOWS
/** @todo Does not yet handle ERROR_MORE_DATA for user names longer than 32767. */
{
return VERR_AUTHENTICATION_FAILURE;
}
else
{
/* First try to figure out how much space for SID + domain name we need. */
NULL,
&cbSid,
NULL,
&cbDomain,
&sidUse);
if (!bRet)
{
if (dwErr != ERROR_INSUFFICIENT_BUFFER)
{
return VERR_AUTHENTICATION_FAILURE;
}
}
/* Now try getting the real SID + domain name. */
pSid,
&cbSid,
&cbDomain,
&sidUse))
{
return VERR_AUTHENTICATION_FAILURE;
}
}
#else
#endif
return rc;
}
static void tstRTCreateProcEx5(void)
{
RTTestISub("Impersonation (as user \"test\")");
const char * apszArgs[3] =
{
"test", /* user name */
"--testcase-child-5",
};
else
}
{
if (rc)
return RTMsgInitFailure(rc);
for (int i = 0; i < argc; i++)
{
"child4: argv[%2u]='%s'\n"
"child4: expected='%s'\n",
i, argv[i], g_apszArgs4[i]);
rc++;
}
return rc;
}
static void tstRTCreateProcEx4(void)
{
RTTestISub("Argument with spaces and stuff");
else
}
static int tstRTCreateProcEx3Child(void)
{
if (rc)
return RTMsgInitFailure(rc);
return 0;
}
static void tstRTCreateProcEx3(void)
{
RTTestISub("Standard Out+Err");
const char * apszArgs[3] =
{
"non-existing-non-executable-file",
"--testcase-child-3",
};
for (;;)
{
RTTESTI_CHECK(cbLeft > 0);
if (cbLeft == 0)
break;
if (RT_FAILURE(rc))
{
break;
}
}
RTThreadSleep(10);
else
}
static int tstRTCreateProcEx2Child(void)
{
if (rc)
return RTMsgInitFailure(rc);
return 0;
}
static void tstRTCreateProcEx2(void)
{
RTTestISub("Standard Err");
const char * apszArgs[3] =
{
"non-existing-non-executable-file",
"--testcase-child-2",
};
for (;;)
{
RTTESTI_CHECK(cbLeft > 0);
if (cbLeft == 0)
break;
if (RT_FAILURE(rc))
{
break;
}
}
RTThreadSleep(10);
else
}
static int tstRTCreateProcEx1Child(void)
{
if (rc)
return RTMsgInitFailure(rc);
RTPrintf("it works");
return 0;
}
static void tstRTCreateProcEx1(void)
{
RTTestISub("Standard Out");
const char * apszArgs[3] =
{
"non-existing-non-executable-file",
"--testcase-child-1",
};
for (;;)
{
RTTESTI_CHECK(cbLeft > 0);
if (cbLeft == 0)
break;
if (RT_FAILURE(rc))
{
break;
}
}
else
}
{
return tstRTCreateProcEx1Child();
return tstRTCreateProcEx2Child();
return tstRTCreateProcEx3Child();
if (argc != 1)
return 99;
if (rc)
return rc;
/*
* The tests.
*/
/** @todo Do not run tstRTCreateProcEx5 on NT4, may not work (?) */
/** @todo Cover files, ++ */
/*
* Summary.
*/
return RTTestSummaryAndDestroy(hTest);
}