- pid = fork();
- switch (pid) {
- case -1:
- fclose(f);
- close(p[0]);
- close(p[1]);
- return NULL;
- case 0:
- if (dup2(p[1-op], 1-op) < 0) _exit(127);
- if (p[0] != 1-op) close(p[0]);
- if (p[1] != 1-op) close(p[1]);
- execl("/bin/sh", "sh", "-c", cmd, (char *)0);
- _exit(127);
+ __acquire_ptc();
+ pid = __vfork();
+
+ if (pid) {
+ __release_ptc();
+ __syscall(SYS_close, p[1-op]);
+ sigprocmask(SIG_BLOCK, SIGALL_SET, &old);
+ if (pid < 0) {
+ fclose(f);
+ return 0;
+ }
+ f->pipe_pid = pid;
+ return f;
+ }
+
+ /* See notes in system.c for why this is needed. */
+ for (i=1; i<=8*__SYSCALL_SSLEN; i++) {
+ struct sigaction sa;
+ __libc_sigaction(i, 0, &sa);
+ if (sa.sa_handler!=SIG_IGN && sa.sa_handler!=SIG_DFL) {
+ sa.sa_handler = SIG_DFL;
+ __libc_sigaction(i, &sa, 0);
+ }