aboutsummaryrefslogtreecommitdiff
path: root/packages/Python/lldbsuite/test/functionalities/exec/main.cpp
blob: 700c5dd94b285ee33bce5f56d904ac077ff65818 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
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;
}