| FILE *popen(const char *cmd, const char *mode) |
| posix_spawn_file_actions_t fa; |
| } else if (*mode == 'w') { |
| if (pipe2(p, O_CLOEXEC)) return NULL; |
| __syscall(SYS_close, p[0]); |
| __syscall(SYS_close, p[1]); |
| if (!posix_spawn_file_actions_init(&fa)) { |
| for (FILE *l = *__ofl_lock(); l; l=l->next) |
| if (l->pipe_pid && posix_spawn_file_actions_addclose(&fa, l->fd)) |
| if (!posix_spawn_file_actions_adddup2(&fa, p[1-op], 1-op)) { |
| if (!(e = posix_spawn(&pid, "/bin/sh", &fa, 0, |
| (char *[]){ "sh", "-c", (char *)cmd, 0 }, __environ))) { |
| posix_spawn_file_actions_destroy(&fa); |
| fcntl(p[op], F_SETFD, 0); |
| __syscall(SYS_close, p[1-op]); |
| posix_spawn_file_actions_destroy(&fa); |
| __syscall(SYS_close, p[1-op]); |