diff options
Diffstat (limited to 'test/API/driver/kwsys/testProcess.c')
-rw-r--r-- | test/API/driver/kwsys/testProcess.c | 728 |
1 files changed, 0 insertions, 728 deletions
diff --git a/test/API/driver/kwsys/testProcess.c b/test/API/driver/kwsys/testProcess.c deleted file mode 100644 index 39aaa23..0000000 --- a/test/API/driver/kwsys/testProcess.c +++ /dev/null @@ -1,728 +0,0 @@ -/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying - file Copyright.txt or https://cmake.org/licensing#kwsys for details. */ -#include "kwsysPrivate.h" -#include KWSYS_HEADER(Process.h) -#include KWSYS_HEADER(Encoding.h) - -/* Work-around CMake dependency scanning limitation. This must - duplicate the above list of headers. */ -#if 0 -# include "Encoding.h.in" -# include "Process.h.in" -#endif - -#include <assert.h> -#include <limits.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#if defined(_WIN32) -# include <windows.h> -#else -# include <signal.h> -# include <unistd.h> -#endif - -#if defined(__BORLANDC__) -# pragma warn - 8060 /* possibly incorrect assignment */ -#endif - -/* Platform-specific sleep functions. */ - -#if defined(__BEOS__) && !defined(__ZETA__) -/* BeOS 5 doesn't have usleep(), but it has snooze(), which is identical. */ -# include <be/kernel/OS.h> -static inline void testProcess_usleep(unsigned int usec) -{ - snooze(usec); -} -#elif defined(_WIN32) -/* Windows can only sleep in millisecond intervals. */ -static void testProcess_usleep(unsigned int usec) -{ - Sleep(usec / 1000); -} -#else -# define testProcess_usleep usleep -#endif - -#if defined(_WIN32) -static void testProcess_sleep(unsigned int sec) -{ - Sleep(sec * 1000); -} -#else -static void testProcess_sleep(unsigned int sec) -{ - sleep(sec); -} -#endif - -int runChild(const char* cmd[], int state, int exception, int value, int share, - int output, int delay, double timeout, int poll, int repeat, - int disown, int createNewGroup, unsigned int interruptDelay); - -static int test1(int argc, const char* argv[]) -{ - /* This is a very basic functional test of kwsysProcess. It is repeated - numerous times to verify that there are no resource leaks in kwsysProcess - that eventually lead to an error. Many versions of OS X will fail after - 256 leaked file handles, so 257 iterations seems to be a good test. On - the other hand, too many iterations will cause the test to time out - - especially if the test is instrumented with e.g. valgrind. - - If you have problems with this test timing out on your system, or want to - run more than 257 iterations, you can change the number of iterations by - setting the KWSYS_TEST_PROCESS_1_COUNT environment variable. */ - (void)argc; - (void)argv; - fprintf(stdout, "Output on stdout from test returning 0.\n"); - fprintf(stderr, "Output on stderr from test returning 0.\n"); - return 0; -} - -static int test2(int argc, const char* argv[]) -{ - (void)argc; - (void)argv; - fprintf(stdout, "Output on stdout from test returning 123.\n"); - fprintf(stderr, "Output on stderr from test returning 123.\n"); - return 123; -} - -static int test3(int argc, const char* argv[]) -{ - (void)argc; - (void)argv; - fprintf(stdout, "Output before sleep on stdout from timeout test.\n"); - fprintf(stderr, "Output before sleep on stderr from timeout test.\n"); - fflush(stdout); - fflush(stderr); - testProcess_sleep(15); - fprintf(stdout, "Output after sleep on stdout from timeout test.\n"); - fprintf(stderr, "Output after sleep on stderr from timeout test.\n"); - return 0; -} - -static int test4(int argc, const char* argv[]) -{ -#ifndef CRASH_USING_ABORT - /* Prepare a pointer to an invalid address. Don't use null, because - dereferencing null is undefined behaviour and compilers are free to - do whatever they want. ex: Clang will warn at compile time, or even - optimize away the write. We hope to 'outsmart' them by using - 'volatile' and a slightly larger address, based on a runtime value. */ - volatile int* invalidAddress = 0; - invalidAddress += argc ? 1 : 2; -#endif - -#if defined(_WIN32) - /* Avoid error diagnostic popups since we are crashing on purpose. */ - SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX); -#elif defined(__BEOS__) || defined(__HAIKU__) - /* Avoid error diagnostic popups since we are crashing on purpose. */ - disable_debugger(1); -#endif - (void)argc; - (void)argv; - fprintf(stdout, "Output before crash on stdout from crash test.\n"); - fprintf(stderr, "Output before crash on stderr from crash test.\n"); - fflush(stdout); - fflush(stderr); -#ifdef CRASH_USING_ABORT - abort(); -#else - assert(invalidAddress); /* Quiet Clang scan-build. */ - /* Provoke deliberate crash by writing to the invalid address. */ - *invalidAddress = 0; -#endif - fprintf(stdout, "Output after crash on stdout from crash test.\n"); - fprintf(stderr, "Output after crash on stderr from crash test.\n"); - return 0; -} - -static int test5(int argc, const char* argv[]) -{ - int r; - const char* cmd[4]; - (void)argc; - cmd[0] = argv[0]; - cmd[1] = "run"; - cmd[2] = "4"; - cmd[3] = 0; - fprintf(stdout, "Output on stdout before recursive test.\n"); - fprintf(stderr, "Output on stderr before recursive test.\n"); - fflush(stdout); - fflush(stderr); - r = runChild(cmd, kwsysProcess_State_Exception, -#ifdef CRASH_USING_ABORT - kwsysProcess_Exception_Other, -#else - kwsysProcess_Exception_Fault, -#endif - 1, 1, 1, 0, 15, 0, 1, 0, 0, 0); - fprintf(stdout, "Output on stdout after recursive test.\n"); - fprintf(stderr, "Output on stderr after recursive test.\n"); - fflush(stdout); - fflush(stderr); - return r; -} - -#define TEST6_SIZE (4096 * 2) -static void test6(int argc, const char* argv[]) -{ - int i; - char runaway[TEST6_SIZE + 1]; - (void)argc; - (void)argv; - for (i = 0; i < TEST6_SIZE; ++i) { - runaway[i] = '.'; - } - runaway[TEST6_SIZE] = '\n'; - - /* Generate huge amounts of output to test killing. */ - for (;;) { - fwrite(runaway, 1, TEST6_SIZE + 1, stdout); - fflush(stdout); - } -} - -/* Define MINPOLL to be one more than the number of times output is - written. Define MAXPOLL to be the largest number of times a loop - delaying 1/10th of a second should ever have to poll. */ -#define MINPOLL 5 -#define MAXPOLL 20 -static int test7(int argc, const char* argv[]) -{ - (void)argc; - (void)argv; - fprintf(stdout, "Output on stdout before sleep.\n"); - fprintf(stderr, "Output on stderr before sleep.\n"); - fflush(stdout); - fflush(stderr); - /* Sleep for 1 second. */ - testProcess_sleep(1); - fprintf(stdout, "Output on stdout after sleep.\n"); - fprintf(stderr, "Output on stderr after sleep.\n"); - fflush(stdout); - fflush(stderr); - return 0; -} - -static int test8(int argc, const char* argv[]) -{ - /* Create a disowned grandchild to test handling of processes - that exit before their children. */ - int r; - const char* cmd[4]; - (void)argc; - cmd[0] = argv[0]; - cmd[1] = "run"; - cmd[2] = "108"; - cmd[3] = 0; - fprintf(stdout, "Output on stdout before grandchild test.\n"); - fprintf(stderr, "Output on stderr before grandchild test.\n"); - fflush(stdout); - fflush(stderr); - r = runChild(cmd, kwsysProcess_State_Disowned, kwsysProcess_Exception_None, - 1, 1, 1, 0, 10, 0, 1, 1, 0, 0); - fprintf(stdout, "Output on stdout after grandchild test.\n"); - fprintf(stderr, "Output on stderr after grandchild test.\n"); - fflush(stdout); - fflush(stderr); - return r; -} - -static int test8_grandchild(int argc, const char* argv[]) -{ - (void)argc; - (void)argv; - fprintf(stdout, "Output on stdout from grandchild before sleep.\n"); - fprintf(stderr, "Output on stderr from grandchild before sleep.\n"); - fflush(stdout); - fflush(stderr); - /* TODO: Instead of closing pipes here leave them open to make sure - the grandparent can stop listening when the parent exits. This - part of the test cannot be enabled until the feature is - implemented. */ - fclose(stdout); - fclose(stderr); - testProcess_sleep(15); - return 0; -} - -static int test9(int argc, const char* argv[]) -{ - /* Test Ctrl+C behavior: the root test program will send a Ctrl+C to this - process. Here, we start a child process that sleeps for a long time - while ignoring signals. The test is successful if this process waits - for the child to return before exiting from the Ctrl+C handler. - - WARNING: This test will falsely pass if the share parameter of runChild - was set to 0 when invoking the test9 process. */ - int r; - const char* cmd[4]; - (void)argc; - cmd[0] = argv[0]; - cmd[1] = "run"; - cmd[2] = "109"; - cmd[3] = 0; - fprintf(stdout, "Output on stdout before grandchild test.\n"); - fprintf(stderr, "Output on stderr before grandchild test.\n"); - fflush(stdout); - fflush(stderr); - r = runChild(cmd, kwsysProcess_State_Exited, kwsysProcess_Exception_None, 0, - 1, 1, 0, 30, 0, 1, 0, 0, 0); - /* This sleep will avoid a race condition between this function exiting - normally and our Ctrl+C handler exiting abnormally after the process - exits. */ - testProcess_sleep(1); - fprintf(stdout, "Output on stdout after grandchild test.\n"); - fprintf(stderr, "Output on stderr after grandchild test.\n"); - fflush(stdout); - fflush(stderr); - return r; -} - -#if defined(_WIN32) -static BOOL WINAPI test9_grandchild_handler(DWORD dwCtrlType) -{ - /* Ignore all Ctrl+C/Break signals. We must use an actual handler function - instead of using SetConsoleCtrlHandler(NULL, TRUE) so that we can also - ignore Ctrl+Break in addition to Ctrl+C. */ - (void)dwCtrlType; - return TRUE; -} -#endif - -static int test9_grandchild(int argc, const char* argv[]) -{ - /* The grandchild just sleeps for a few seconds while ignoring signals. */ - (void)argc; - (void)argv; -#if defined(_WIN32) - if (!SetConsoleCtrlHandler(test9_grandchild_handler, TRUE)) { - return 1; - } -#else - struct sigaction sa; - memset(&sa, 0, sizeof(sa)); - sa.sa_handler = SIG_IGN; - sigemptyset(&sa.sa_mask); - if (sigaction(SIGINT, &sa, 0) < 0) { - return 1; - } -#endif - fprintf(stdout, "Output on stdout from grandchild before sleep.\n"); - fprintf(stderr, "Output on stderr from grandchild before sleep.\n"); - fflush(stdout); - fflush(stderr); - /* Sleep for 9 seconds. */ - testProcess_sleep(9); - fprintf(stdout, "Output on stdout from grandchild after sleep.\n"); - fprintf(stderr, "Output on stderr from grandchild after sleep.\n"); - fflush(stdout); - fflush(stderr); - return 0; -} - -static int test10(int argc, const char* argv[]) -{ - /* Test Ctrl+C behavior: the root test program will send a Ctrl+C to this - process. Here, we start a child process that sleeps for a long time and - processes signals normally. However, this grandchild is created in a new - process group - ensuring that Ctrl+C we receive is sent to our process - groups. We make sure it exits anyway. */ - int r; - const char* cmd[4]; - (void)argc; - cmd[0] = argv[0]; - cmd[1] = "run"; - cmd[2] = "110"; - cmd[3] = 0; - fprintf(stdout, "Output on stdout before grandchild test.\n"); - fprintf(stderr, "Output on stderr before grandchild test.\n"); - fflush(stdout); - fflush(stderr); - r = - runChild(cmd, kwsysProcess_State_Exception, - kwsysProcess_Exception_Interrupt, 0, 1, 1, 0, 30, 0, 1, 0, 1, 0); - fprintf(stdout, "Output on stdout after grandchild test.\n"); - fprintf(stderr, "Output on stderr after grandchild test.\n"); - fflush(stdout); - fflush(stderr); - return r; -} - -static int test10_grandchild(int argc, const char* argv[]) -{ - /* The grandchild just sleeps for a few seconds and handles signals. */ - (void)argc; - (void)argv; - fprintf(stdout, "Output on stdout from grandchild before sleep.\n"); - fprintf(stderr, "Output on stderr from grandchild before sleep.\n"); - fflush(stdout); - fflush(stderr); - /* Sleep for 6 seconds. */ - testProcess_sleep(6); - fprintf(stdout, "Output on stdout from grandchild after sleep.\n"); - fprintf(stderr, "Output on stderr from grandchild after sleep.\n"); - fflush(stdout); - fflush(stderr); - return 0; -} - -static int runChild2(kwsysProcess* kp, const char* cmd[], int state, - int exception, int value, int share, int output, - int delay, double timeout, int poll, int disown, - int createNewGroup, unsigned int interruptDelay) -{ - int result = 0; - char* data = 0; - int length = 0; - double userTimeout = 0; - double* pUserTimeout = 0; - kwsysProcess_SetCommand(kp, cmd); - if (timeout >= 0) { - kwsysProcess_SetTimeout(kp, timeout); - } - if (share) { - kwsysProcess_SetPipeShared(kp, kwsysProcess_Pipe_STDOUT, 1); - kwsysProcess_SetPipeShared(kp, kwsysProcess_Pipe_STDERR, 1); - } - if (disown) { - kwsysProcess_SetOption(kp, kwsysProcess_Option_Detach, 1); - } - if (createNewGroup) { - kwsysProcess_SetOption(kp, kwsysProcess_Option_CreateProcessGroup, 1); - } - kwsysProcess_Execute(kp); - - if (poll) { - pUserTimeout = &userTimeout; - } - - if (interruptDelay) { - testProcess_sleep(interruptDelay); - kwsysProcess_Interrupt(kp); - } - - if (!share && !disown) { - int p; - while ((p = kwsysProcess_WaitForData(kp, &data, &length, pUserTimeout))) { - if (output) { - if (poll && p == kwsysProcess_Pipe_Timeout) { - fprintf(stdout, "WaitForData timeout reached.\n"); - fflush(stdout); - - /* Count the number of times we polled without getting data. - If it is excessive then kill the child and fail. */ - if (++poll >= MAXPOLL) { - fprintf(stdout, "Poll count reached limit %d.\n", MAXPOLL); - kwsysProcess_Kill(kp); - } - } else { - fwrite(data, 1, (size_t)length, stdout); - fflush(stdout); - } - } - if (poll) { - /* Delay to avoid busy loop during polling. */ - testProcess_usleep(100000); - } - if (delay) { -/* Purposely sleeping only on Win32 to let pipe fill up. */ -#if defined(_WIN32) - testProcess_usleep(100000); -#endif - } - } - } - - if (disown) { - kwsysProcess_Disown(kp); - } else { - kwsysProcess_WaitForExit(kp, 0); - } - - switch (kwsysProcess_GetState(kp)) { - case kwsysProcess_State_Starting: - printf("No process has been executed.\n"); - break; - case kwsysProcess_State_Executing: - printf("The process is still executing.\n"); - break; - case kwsysProcess_State_Expired: - printf("Child was killed when timeout expired.\n"); - break; - case kwsysProcess_State_Exited: - printf("Child exited with value = %d\n", kwsysProcess_GetExitValue(kp)); - result = ((exception != kwsysProcess_GetExitException(kp)) || - (value != kwsysProcess_GetExitValue(kp))); - break; - case kwsysProcess_State_Killed: - printf("Child was killed by parent.\n"); - break; - case kwsysProcess_State_Exception: - printf("Child terminated abnormally: %s\n", - kwsysProcess_GetExceptionString(kp)); - result = ((exception != kwsysProcess_GetExitException(kp)) || - (value != kwsysProcess_GetExitValue(kp))); - break; - case kwsysProcess_State_Disowned: - printf("Child was disowned.\n"); - break; - case kwsysProcess_State_Error: - printf("Error in administrating child process: [%s]\n", - kwsysProcess_GetErrorString(kp)); - break; - } - - if (result) { - if (exception != kwsysProcess_GetExitException(kp)) { - fprintf(stderr, - "Mismatch in exit exception. " - "Should have been %d, was %d.\n", - exception, kwsysProcess_GetExitException(kp)); - } - if (value != kwsysProcess_GetExitValue(kp)) { - fprintf(stderr, - "Mismatch in exit value. " - "Should have been %d, was %d.\n", - value, kwsysProcess_GetExitValue(kp)); - } - } - - if (kwsysProcess_GetState(kp) != state) { - fprintf(stderr, - "Mismatch in state. " - "Should have been %d, was %d.\n", - state, kwsysProcess_GetState(kp)); - result = 1; - } - - /* We should have polled more times than there were data if polling - was enabled. */ - if (poll && poll < MINPOLL) { - fprintf(stderr, "Poll count is %d, which is less than %d.\n", poll, - MINPOLL); - result = 1; - } - - return result; -} - -/** - * Runs a child process and blocks until it returns. Arguments as follows: - * - * cmd = Command line to run. - * state = Expected return value of kwsysProcess_GetState after exit. - * exception = Expected return value of kwsysProcess_GetExitException. - * value = Expected return value of kwsysProcess_GetExitValue. - * share = Whether to share stdout/stderr child pipes with our pipes - * by way of kwsysProcess_SetPipeShared. If false, new pipes - * are created. - * output = If !share && !disown, whether to write the child's stdout - * and stderr output to our stdout. - * delay = If !share && !disown, adds an additional short delay to - * the pipe loop to allow the pipes to fill up; Windows only. - * timeout = Non-zero to sets a timeout in seconds via - * kwsysProcess_SetTimeout. - * poll = If !share && !disown, we count the number of 0.1 second - * intervals where the child pipes had no new data. We fail - * if not in the bounds of MINPOLL/MAXPOLL. - * repeat = Number of times to run the process. - * disown = If set, the process is disowned. - * createNewGroup = If set, the process is created in a new process group. - * interruptDelay = If non-zero, number of seconds to delay before - * interrupting the process. Note that this delay will occur - * BEFORE any reading/polling of pipes occurs and before any - * detachment occurs. - */ -int runChild(const char* cmd[], int state, int exception, int value, int share, - int output, int delay, double timeout, int poll, int repeat, - int disown, int createNewGroup, unsigned int interruptDelay) -{ - int result = 1; - kwsysProcess* kp = kwsysProcess_New(); - if (!kp) { - fprintf(stderr, "kwsysProcess_New returned NULL!\n"); - return 1; - } - while (repeat-- > 0) { - result = runChild2(kp, cmd, state, exception, value, share, output, delay, - timeout, poll, disown, createNewGroup, interruptDelay); - if (result) { - break; - } - } - kwsysProcess_Delete(kp); - return result; -} - -int main(int argc, const char* argv[]) -{ - int n = 0; - -#ifdef _WIN32 - int i; - char new_args[10][_MAX_PATH]; - LPWSTR* w_av = CommandLineToArgvW(GetCommandLineW(), &argc); - for (i = 0; i < argc; i++) { - kwsysEncoding_wcstombs(new_args[i], w_av[i], _MAX_PATH); - argv[i] = new_args[i]; - } - LocalFree(w_av); -#endif - -#if 0 - { - HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE); - DuplicateHandle(GetCurrentProcess(), out, - GetCurrentProcess(), &out, 0, FALSE, - DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE); - SetStdHandle(STD_OUTPUT_HANDLE, out); - } - { - HANDLE out = GetStdHandle(STD_ERROR_HANDLE); - DuplicateHandle(GetCurrentProcess(), out, - GetCurrentProcess(), &out, 0, FALSE, - DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE); - SetStdHandle(STD_ERROR_HANDLE, out); - } -#endif - if (argc == 2) { - n = atoi(argv[1]); - } else if (argc == 3 && strcmp(argv[1], "run") == 0) { - n = atoi(argv[2]); - } - /* Check arguments. */ - if (((n >= 1 && n <= 10) || n == 108 || n == 109 || n == 110) && argc == 3) { - /* This is the child process for a requested test number. */ - switch (n) { - case 1: - return test1(argc, argv); - case 2: - return test2(argc, argv); - case 3: - return test3(argc, argv); - case 4: - return test4(argc, argv); - case 5: - return test5(argc, argv); - case 6: - test6(argc, argv); - return 0; - case 7: - return test7(argc, argv); - case 8: - return test8(argc, argv); - case 9: - return test9(argc, argv); - case 10: - return test10(argc, argv); - case 108: - return test8_grandchild(argc, argv); - case 109: - return test9_grandchild(argc, argv); - case 110: - return test10_grandchild(argc, argv); - } - fprintf(stderr, "Invalid test number %d.\n", n); - return 1; - } else if (n >= 1 && n <= 10) { - /* This is the parent process for a requested test number. */ - int states[10] = { - kwsysProcess_State_Exited, kwsysProcess_State_Exited, - kwsysProcess_State_Expired, kwsysProcess_State_Exception, - kwsysProcess_State_Exited, kwsysProcess_State_Expired, - kwsysProcess_State_Exited, kwsysProcess_State_Exited, - kwsysProcess_State_Expired, /* Ctrl+C handler test */ - kwsysProcess_State_Exception /* Process group test */ - }; - int exceptions[10] = { - kwsysProcess_Exception_None, kwsysProcess_Exception_None, - kwsysProcess_Exception_None, -#ifdef CRASH_USING_ABORT - kwsysProcess_Exception_Other, -#else - kwsysProcess_Exception_Fault, -#endif - kwsysProcess_Exception_None, kwsysProcess_Exception_None, - kwsysProcess_Exception_None, kwsysProcess_Exception_None, - kwsysProcess_Exception_None, kwsysProcess_Exception_Interrupt - }; - int values[10] = { 0, 123, 1, 1, 0, 0, 0, 0, 1, 1 }; - int shares[10] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1 }; - int outputs[10] = { 1, 1, 1, 1, 1, 0, 1, 1, 1, 1 }; - int delays[10] = { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 }; - double timeouts[10] = { 10, 10, 10, 30, 30, 10, -1, 10, 6, 4 }; - int polls[10] = { 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 }; - int repeat[10] = { 257, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - int createNewGroups[10] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1 }; - unsigned int interruptDelays[10] = { 0, 0, 0, 0, 0, 0, 0, 0, 3, 2 }; - int r; - const char* cmd[4]; -#ifdef _WIN32 - char* argv0 = 0; -#endif - char* test1IterationsStr = getenv("KWSYS_TEST_PROCESS_1_COUNT"); - if (test1IterationsStr) { - long int test1Iterations = strtol(test1IterationsStr, 0, 10); - if (test1Iterations > 10 && test1Iterations != LONG_MAX) { - repeat[0] = (int)test1Iterations; - } - } -#ifdef _WIN32 - if (n == 0 && (argv0 = strdup(argv[0]))) { - /* Try converting to forward slashes to see if it works. */ - char* c; - for (c = argv0; *c; ++c) { - if (*c == '\\') { - *c = '/'; - } - } - cmd[0] = argv0; - } else { - cmd[0] = argv[0]; - } -#else - cmd[0] = argv[0]; -#endif - cmd[1] = "run"; - cmd[2] = argv[1]; - cmd[3] = 0; - fprintf(stdout, "Output on stdout before test %d.\n", n); - fprintf(stderr, "Output on stderr before test %d.\n", n); - fflush(stdout); - fflush(stderr); - r = runChild(cmd, states[n - 1], exceptions[n - 1], values[n - 1], - shares[n - 1], outputs[n - 1], delays[n - 1], timeouts[n - 1], - polls[n - 1], repeat[n - 1], 0, createNewGroups[n - 1], - interruptDelays[n - 1]); - fprintf(stdout, "Output on stdout after test %d.\n", n); - fprintf(stderr, "Output on stderr after test %d.\n", n); - fflush(stdout); - fflush(stderr); -#if defined(_WIN32) - free(argv0); -#endif - return r; - } else if (argc > 2 && strcmp(argv[1], "0") == 0) { - /* This is the special debugging test to run a given command - line. */ - const char** cmd = argv + 2; - int state = kwsysProcess_State_Exited; - int exception = kwsysProcess_Exception_None; - int value = 0; - double timeout = 0; - int r = - runChild(cmd, state, exception, value, 0, 1, 0, timeout, 0, 1, 0, 0, 0); - return r; - } else { - /* Improper usage. */ - fprintf(stdout, "Usage: %s <test number>\n", argv[0]); - return 1; - } -} |