this repo has no description
at fixPythonPipStalling 115 lines 3.3 kB view raw
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};