forked from OSchip/llvm-project
95 lines
2.3 KiB
C++
95 lines
2.3 KiB
C++
#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;
|
|
}
|