blob: 700c5dd94b285ee33bce5f56d904ac077ff65818 [file] [log] [blame]
#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;
}