--- src/syscall/syscall_freebsd.go.orig 2017-03-17 19:00:39.000000000 +0000 +++ src/syscall/syscall_freebsd.go 2017-03-17 19:00:39.000000000 +0000 @@ -82,13 +82,16 @@ return origlen - len(buf), count, names } -//sysnb pipe() (r int, w int, err error) +//sysnb pipe2(p *[2]_C_int, flags int) (err error) -func Pipe(p []int) (err error) { +func Pipe2(p []int, flags int) (err error) { if len(p) != 2 { return EINVAL } - p[0], p[1], err = pipe() + var pp [2]_C_int + err = pipe2(&pp, flags) + p[0] = int(pp[0]) + p[1] = int(pp[1]) return } --- src/syscall/exec_bsd.go.orig 2017-03-17 18:21:43.000000000 +0000 +++ src/syscall/exec_bsd.go 2017-03-17 18:21:43.000000000 +0000 @@ -233,15 +233,7 @@ } // Try to open a pipe with O_CLOEXEC set on both file descriptors. -func forkExecPipe(p []int) error { - err := Pipe(p) - if err != nil { - return err - } - _, err = fcntl(p[0], F_SETFD, FD_CLOEXEC) - if err != nil { - return err - } - _, err = fcntl(p[1], F_SETFD, FD_CLOEXEC) - return err +func forkExecPipe(p []int) (err error) { + err = Pipe2(p, O_CLOEXEC) + return } --- src/syscall/zsyscall_freebsd_amd64.go.orig 2017-03-17 19:01:09.000000000 +0000 +++ src/syscall/zsyscall_freebsd_amd64.go 2017-03-17 19:01:09.000000000 +0000 @@ -260,10 +260,8 @@ // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func pipe() (r int, w int, err error) { - r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) - r = int(r0) - w = int(r1) +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) if e1 != 0 { err = e1 } --- src/syscall/zsyscall_freebsd_arm.go.orig 2017-03-17 20:52:22.000000000 +0000 +++ src/syscall/zsyscall_freebsd_arm.go 2017-03-17 20:52:22.000000000 +0000 @@ -260,10 +260,8 @@ // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func pipe() (r int, w int, err error) { - r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) - r = int(r0) - w = int(r1) +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) if e1 != 0 { err = e1 } --- src/syscall/zsyscall_freebsd_386.go.orig 2017-03-17 20:53:05.000000000 +0000 +++ src/syscall/zsyscall_freebsd_386.go 2017-03-17 20:53:05.000000000 +0000 @@ -260,10 +260,8 @@ // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func pipe() (r int, w int, err error) { - r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) - r = int(r0) - w = int(r1) +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) if e1 != 0 { err = e1 } --- src/os/pipe_bsd.go.orig 2017-03-17 20:54:41.000000000 +0000 +++ src/os/pipe_bsd.go 2017-03-17 20:54:41.000000000 +0000 @@ -13,16 +13,10 @@ func Pipe() (r *File, w *File, err error) { var p [2]int - // See ../syscall/exec.go for description of lock. - syscall.ForkLock.RLock() - e := syscall.Pipe(p[0:]) + e := syscall.Pipe2(p[0:], syscall.O_CLOEXEC) if e != nil { - syscall.ForkLock.RUnlock() return nil, nil, NewSyscallError("pipe", e) } - syscall.CloseOnExec(p[0]) - syscall.CloseOnExec(p[1]) - syscall.ForkLock.RUnlock() return NewFile(uintptr(p[0]), "|0"), NewFile(uintptr(p[1]), "|1"), nil }