]> Cypherpunks repositories - gostls13.git/commitdiff
syscall, os: use pipe2 syscall on FreeBSD instead of pipe
authorBrad Fitzpatrick <bradfitz@golang.org>
Tue, 21 Mar 2017 17:23:08 +0000 (10:23 -0700)
committerBrad Fitzpatrick <bradfitz@golang.org>
Tue, 21 Mar 2017 20:01:23 +0000 (20:01 +0000)
The pipe2 syscall exists in all officially supported FreeBSD
versions: 10, 11 and future 12.
The pipe syscall no longer exists in 11 and 12. To build and
run Go on these versions, kernel needs COMPAT_FREEBSD10 option.

Based on Gleb Smirnoff's https://golang.org/cl/38422

Fixes #18854

Change-Id: I8e201ee1b15dca10427c3093b966025d160aaf61
Reviewed-on: https://go-review.googlesource.com/38426
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: Rob Pike <r@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/os/pipe_bsd.go
src/os/pipe_freebsd.go [new file with mode: 0644]
src/syscall/exec_bsd.go
src/syscall/exec_freebsd.go [new file with mode: 0644]
src/syscall/forkpipe_bsd.go [new file with mode: 0644]
src/syscall/syscall_freebsd.go
src/syscall/zsyscall_freebsd_386.go
src/syscall/zsyscall_freebsd_amd64.go
src/syscall/zsyscall_freebsd_arm.go

index 58cafcc999dd0b0e9e4048375b583396bf8df6d5..ffd201cf45d46ed0e36abc3bd50e27c192baa0e2 100644 (file)
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build darwin dragonfly freebsd nacl netbsd openbsd solaris
+// +build darwin dragonfly nacl netbsd openbsd solaris
 
 package os
 
diff --git a/src/os/pipe_freebsd.go b/src/os/pipe_freebsd.go
new file mode 100644 (file)
index 0000000..0672372
--- /dev/null
@@ -0,0 +1,20 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package os
+
+import "syscall"
+
+// Pipe returns a connected pair of Files; reads from r return bytes written to w.
+// It returns the files and an error, if any.
+func Pipe() (r *File, w *File, err error) {
+       var p [2]int
+
+       e := syscall.Pipe2(p[0:], syscall.O_CLOEXEC)
+       if e != nil {
+               return nil, nil, NewSyscallError("pipe", e)
+       }
+
+       return newFile(uintptr(p[0]), "|0", true), newFile(uintptr(p[1]), "|1", true), nil
+}
index 31a40995595314c6c65533b0b65aec5fd812e124..730b63d1e5696633816af8b5022c23794b0648b2 100644 (file)
@@ -256,17 +256,3 @@ childerror:
                RawSyscall(SYS_EXIT, 253, 0, 0)
        }
 }
-
-// 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
-}
diff --git a/src/syscall/exec_freebsd.go b/src/syscall/exec_freebsd.go
new file mode 100644 (file)
index 0000000..1654b4b
--- /dev/null
@@ -0,0 +1,9 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package syscall
+
+func forkExecPipe(p []int) error {
+       return Pipe2(p, O_CLOEXEC)
+}
diff --git a/src/syscall/forkpipe_bsd.go b/src/syscall/forkpipe_bsd.go
new file mode 100644 (file)
index 0000000..d418072
--- /dev/null
@@ -0,0 +1,20 @@
+// Copyright 2011 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build darwin dragonfly netbsd openbsd
+
+package syscall
+
+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
+}
index 4dc07fe3c8434b5a099a29da879af93c2198c174..e4cc621f9a247b6c0a70328b7df1cbdc426a3caf 100644 (file)
@@ -66,14 +66,21 @@ func direntNamlen(buf []byte) (uint64, bool) {
        return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen))
 }
 
-//sysnb pipe() (r int, w int, err error)
+func Pipe(p []int) error {
+       return Pipe2(p, 0)
+}
+
+//sysnb pipe2(p *[2]_C_int, flags int) (err error)
 
-func Pipe(p []int) (err error) {
+func Pipe2(p []int, flags int) error {
        if len(p) != 2 {
                return EINVAL
        }
-       p[0], p[1], err = pipe()
-       return
+       var pp [2]_C_int
+       err := pipe2(&pp, flags)
+       p[0] = int(pp[0])
+       p[1] = int(pp[1])
+       return err
 }
 
 func GetsockoptIPMreqn(fd, level, opt int) (*IPMreqn, error) {
index 5c22deb181bb42f53c62cb98d3688270bad6e5d0..8f3da43b6423112cac29675fc6c29121cadb8d0a 100644 (file)
@@ -261,10 +261,8 @@ func fcntl(fd int, cmd int, arg int) (val int, err error) {
 
 // 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 = errnoErr(e1)
        }
index eeabf57921f1d0eebf404c636fb211f1c03ff283..7a6d6a685a070130a831741a9bf4c120ae4990fb 100644 (file)
@@ -261,10 +261,8 @@ func fcntl(fd int, cmd int, arg int) (val int, err error) {
 
 // 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 = errnoErr(e1)
        }
index b7592f10688508c0da91a729d549a1100f8f08c7..a9da7683523dbe6a795f5e3c8a61bebb0c95c094 100644 (file)
@@ -261,10 +261,8 @@ func fcntl(fd int, cmd int, arg int) (val int, err error) {
 
 // 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 = errnoErr(e1)
        }