this repo has no description
1/*
2 * This function needs to be in a separate C file rather than in bsd_trace.cpp
3 * because `sys/spawn_internal.h` uses some GNU C extensions that C++ doesn't seem to like.
4 */
5
6#define PRIVATE 1
7#include <sys/spawn_internal.h>
8#include <spawn_private.h>
9
10#include <darling/emulation/common/simple.h>
11#include "bsd_trace.h"
12
13#include "xtracelib.h"
14
15static struct {
16 unsigned short flag;
17 const char* name;
18} all_posix_spawn_attrs[] = {
19#define POSIX_SPAWN_ATTR_ENTRY(name) { name, #name }
20 POSIX_SPAWN_ATTR_ENTRY(POSIX_SPAWN_RESETIDS),
21 POSIX_SPAWN_ATTR_ENTRY(POSIX_SPAWN_SETPGROUP),
22 POSIX_SPAWN_ATTR_ENTRY(POSIX_SPAWN_SETSIGDEF),
23 POSIX_SPAWN_ATTR_ENTRY(POSIX_SPAWN_SETSIGMASK),
24 POSIX_SPAWN_ATTR_ENTRY(POSIX_SPAWN_SETEXEC),
25 POSIX_SPAWN_ATTR_ENTRY(POSIX_SPAWN_START_SUSPENDED),
26 POSIX_SPAWN_ATTR_ENTRY(_POSIX_SPAWN_DISABLE_ASLR),
27 POSIX_SPAWN_ATTR_ENTRY(_POSIX_SPAWN_NANO_ALLOCATOR),
28 POSIX_SPAWN_ATTR_ENTRY(POSIX_SPAWN_SETSID),
29 POSIX_SPAWN_ATTR_ENTRY(_POSIX_SPAWN_ALLOW_DATA_EXEC),
30 POSIX_SPAWN_ATTR_ENTRY(POSIX_SPAWN_CLOEXEC_DEFAULT),
31 POSIX_SPAWN_ATTR_ENTRY(_POSIX_SPAWN_HIGH_BITS_ASLR),
32 { 0, NULL },
33#undef POSIX_SPAWN_ATTR_ENTRY
34};
35
36void print_arg_posix_spawn_args(xtrace::String* log, void* arg) {
37 const struct _posix_spawn_args_desc* args = (const struct _posix_spawn_args_desc*)(arg);
38 bool is_first = true;
39
40 log->append("{ attributes = ");
41
42 if (args && args->attrp) {
43 for (size_t i = 0; all_posix_spawn_attrs[i].name != NULL; i++) {
44 if (args->attrp->psa_flags & all_posix_spawn_attrs[i].flag) {
45 if (is_first) {
46 is_first = false;
47 } else {
48 log->append("|");
49 }
50
51 log->append_format("%s", all_posix_spawn_attrs[i].name);
52 }
53 }
54 }
55
56 if (is_first) {
57 log->append("0");
58 }
59
60 log->append(", file_actions = {");
61
62 if (args && args->file_actions) {
63 for (size_t i = 0; i < args->file_actions->psfa_act_count; ++i) {
64 const struct _psfa_action* action = &args->file_actions->psfa_act_acts[i];
65
66 if (i != 0) {
67 log->append(", ");
68 }
69
70 switch (action->psfaa_type) {
71 case PSFA_OPEN:
72 log->append("open(");
73 xtrace_print_string_literal(log, action->psfaa_openargs.psfao_path);
74 log->append(", ");
75 print_open_flags(log, (void*)(intptr_t)(action->psfaa_openargs.psfao_oflag));
76 log->append_format(", 0%o) to %d", action->psfaa_openargs.psfao_mode, action->psfaa_filedes);
77 break;
78
79 case PSFA_CLOSE:
80 log->append_format("close(%d)", action->psfaa_filedes);
81 break;
82
83 case PSFA_DUP2:
84 log->append_format("dup2(%d, %d)", action->psfaa_filedes, action->psfaa_dup2args.psfad_newfiledes);
85 break;
86
87 case PSFA_INHERIT:
88 log->append_format("inherit(%d)", action->psfaa_filedes);
89 break;
90
91 case PSFA_FILEPORT_DUP2:
92 // NOTE: if we see this in the output, that's an issue;
93 // we don't have this implemented right now
94 log->append_format("dup2_fileport(port right %d, %d)", action->psfaa_fileport, action->psfaa_dup2args.psfad_newfiledes);
95 break;
96
97 case PSFA_CHDIR:
98 log->append("chdir(");
99 xtrace_print_string_literal(log, action->psfaa_chdirargs.psfac_path);
100 log->append(")");
101 break;
102
103 case PSFA_FCHDIR:
104 log->append_format("fchdir(%d)", action->psfaa_filedes);
105 break;
106
107 default:
108 log->append("???");
109 break;
110 }
111 }
112 }
113
114 log->append("} }");
115};