diff options
| author | Brad Fitzpatrick <bradfitz@golang.org> | 2017-03-21 22:16:16 +0000 |
|---|---|---|
| committer | Brad Fitzpatrick <bradfitz@golang.org> | 2017-03-21 22:37:27 +0000 |
| commit | 2730c17a863e0eeb7afa3589608eece8cc50e6f3 (patch) | |
| tree | 247cded80ca44d6438130feb60364f00df7054bc /src/syscall | |
| parent | ee80afe326bab0a4829bd39186c4f343ac680a40 (diff) | |
| download | go-2730c17a863e0eeb7afa3589608eece8cc50e6f3.tar.xz | |
syscall, os: fix FreeBSD 9 build
I broke FreeBSD 9 in https://golang.org/cl/38426 by using Pipe2.
We still want to support FreeBSD 9 for one last release (Go 1.9 will
be the last), and FreeBSD 9 doesn't have Pipe2.
So this still uses Pipe2, but falls back to Pipe on error.
Updates #18854
Updates #19072
Change-Id: I1de90fb83606c93fb84b4b86fba31e207a702835
Reviewed-on: https://go-review.googlesource.com/38430
Reviewed-by: Rob Pike <r@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'src/syscall')
| -rw-r--r-- | src/syscall/exec_freebsd.go | 18 | ||||
| -rw-r--r-- | src/syscall/syscall_freebsd.go | 9 | ||||
| -rw-r--r-- | src/syscall/zsyscall_freebsd_386.go | 12 | ||||
| -rw-r--r-- | src/syscall/zsyscall_freebsd_amd64.go | 12 | ||||
| -rw-r--r-- | src/syscall/zsyscall_freebsd_arm.go | 12 |
5 files changed, 61 insertions, 2 deletions
diff --git a/src/syscall/exec_freebsd.go b/src/syscall/exec_freebsd.go index 1654b4ba2a..4ed32c0614 100644 --- a/src/syscall/exec_freebsd.go +++ b/src/syscall/exec_freebsd.go @@ -5,5 +5,21 @@ package syscall func forkExecPipe(p []int) error { - return Pipe2(p, O_CLOEXEC) + err := Pipe2(p, O_CLOEXEC) + if err == nil { + return nil + } + + // FreeBSD 9 fallback. + // TODO: remove this for Go 1.10 per Issue 19072 + 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/syscall_freebsd.go b/src/syscall/syscall_freebsd.go index e4cc621f9a..64c881ad8e 100644 --- a/src/syscall/syscall_freebsd.go +++ b/src/syscall/syscall_freebsd.go @@ -66,8 +66,15 @@ 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) + if len(p) != 2 { + return EINVAL + } + var err error + p[0], p[1], err = pipe() + return err } //sysnb pipe2(p *[2]_C_int, flags int) (err error) diff --git a/src/syscall/zsyscall_freebsd_386.go b/src/syscall/zsyscall_freebsd_386.go index 8f3da43b64..63061b2794 100644 --- a/src/syscall/zsyscall_freebsd_386.go +++ b/src/syscall/zsyscall_freebsd_386.go @@ -261,6 +261,18 @@ 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) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func pipe2(p *[2]_C_int, flags int) (err error) { _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) if e1 != 0 { diff --git a/src/syscall/zsyscall_freebsd_amd64.go b/src/syscall/zsyscall_freebsd_amd64.go index 7a6d6a685a..8120980332 100644 --- a/src/syscall/zsyscall_freebsd_amd64.go +++ b/src/syscall/zsyscall_freebsd_amd64.go @@ -261,6 +261,18 @@ 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) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func pipe2(p *[2]_C_int, flags int) (err error) { _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) if e1 != 0 { diff --git a/src/syscall/zsyscall_freebsd_arm.go b/src/syscall/zsyscall_freebsd_arm.go index a9da768352..f6c44c793d 100644 --- a/src/syscall/zsyscall_freebsd_arm.go +++ b/src/syscall/zsyscall_freebsd_arm.go @@ -261,6 +261,18 @@ 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) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func pipe2(p *[2]_C_int, flags int) (err error) { _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) if e1 != 0 { |
