summaryrefslogtreecommitdiffstats
path: root/packages/Python/lldbsuite/test/functionalities/exec/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'packages/Python/lldbsuite/test/functionalities/exec/main.cpp')
-rw-r--r--packages/Python/lldbsuite/test/functionalities/exec/main.cpp94
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;
+}
OpenPOWER on IntegriCloud