diff options
Diffstat (limited to 'packages/Python/lldbsuite/test/functionalities/exec/main.cpp')
| -rw-r--r-- | packages/Python/lldbsuite/test/functionalities/exec/main.cpp | 94 | 
1 files changed, 94 insertions, 0 deletions
| diff --git a/packages/Python/lldbsuite/test/functionalities/exec/main.cpp b/packages/Python/lldbsuite/test/functionalities/exec/main.cpp new file mode 100644 index 000000000000..700c5dd94b28 --- /dev/null +++ b/packages/Python/lldbsuite/test/functionalities/exec/main.cpp @@ -0,0 +1,94 @@ +#include <errno.h> +#include <mach/mach.h> +#include <signal.h> +#include <stdio.h> +#include <stdint.h> +#include <stdlib.h> +#include <spawn.h> +#include <unistd.h> + +static void +exit_with_errno (int err, const char *prefix) +{ +    if (err) +    { +        fprintf (stderr, +                 "%s%s", +                 prefix ? prefix : "", +                 strerror(err)); +        exit (err); +    } +} + +static pid_t +spawn_process (const char **argv, +               const char **envp, +               cpu_type_t cpu_type, +               int &err) +{ +    pid_t pid = 0; + +    const posix_spawn_file_actions_t *file_actions = NULL; +    posix_spawnattr_t attr; +    err = posix_spawnattr_init (&attr); +    if (err) +        return pid; + +    short flags = POSIX_SPAWN_SETEXEC | POSIX_SPAWN_SETSIGDEF | POSIX_SPAWN_SETSIGMASK; +    err = posix_spawnattr_setflags (&attr, flags); +    if (err == 0) +    { +        // Use the default signal masks +        sigset_t no_signals; +        sigset_t all_signals; +        sigemptyset (&no_signals); +        sigfillset (&all_signals); +        posix_spawnattr_setsigmask(&attr, &no_signals); +        posix_spawnattr_setsigdefault(&attr, &all_signals); + +        if (cpu_type != 0) +        { +            size_t ocount = 0; +            err = posix_spawnattr_setbinpref_np (&attr, 1, &cpu_type, &ocount); +        } + +        if (err == 0) +        { +            err = posix_spawn (&pid, +                               argv[0], +                               file_actions, +                               &attr, +                               (char * const *)argv, +                               (char * const *)envp); +        } +         +        posix_spawnattr_destroy(&attr); +    } +    return pid; +} + +int  +main (int argc, char const **argv) +{ +    printf ("pid %i: Pointer size is %zu.\n", getpid(), sizeof(void *)); +    int err = 0;    // Set breakpoint 1 here +#if defined (__x86_64__) +    if (sizeof(void *) == 8) +    { +        spawn_process (argv, NULL, CPU_TYPE_I386, err); +        if (err) +            exit_with_errno (err, "posix_spawn i386 error"); +    } +    else +    { +        spawn_process (argv, NULL, CPU_TYPE_X86_64, err); +        if (err) +            exit_with_errno (err, "posix_spawn x86_64 error"); +    } +#else +    spawn_process (argv, NULL, 0, err); +    if (err) +        exit_with_errno (err, "posix_spawn x86_64 error"); +#endif +    return 0; +} | 
