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 0000000..700c5dd --- /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; +} |