]> Cypherpunks.ru repositories - gostls13.git/commitdiff
syscall, os: fix FreeBSD 9 build
authorBrad Fitzpatrick <bradfitz@golang.org>
Tue, 21 Mar 2017 22:16:16 +0000 (22:16 +0000)
committerBrad Fitzpatrick <bradfitz@golang.org>
Tue, 21 Mar 2017 22:37:27 +0000 (22:37 +0000)
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>

src/os/pipe_freebsd.go
src/syscall/exec_freebsd.go
src/syscall/syscall_freebsd.go
src/syscall/zsyscall_freebsd_386.go
src/syscall/zsyscall_freebsd_amd64.go
src/syscall/zsyscall_freebsd_arm.go

index 06723729f19012ec578afd45750ee2134ae6770d..ea6622cd260de1c4811774b8560ff957ccda283a 100644 (file)
@@ -13,7 +13,21 @@ func Pipe() (r *File, w *File, err error) {
 
        e := syscall.Pipe2(p[0:], syscall.O_CLOEXEC)
        if e != nil {
-               return nil, nil, NewSyscallError("pipe", e)
+               // Fallback support for FreeBSD 9, which lacks Pipe2.
+               //
+               // TODO: remove this for Go 1.10 when FreeBSD 9
+               // is removed (Issue 19072).
+
+               // See ../syscall/exec.go for description of lock.
+               syscall.ForkLock.RLock()
+               e := syscall.Pipe(p[0:])
+               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", true), newFile(uintptr(p[1]), "|1", true), nil
index 1654b4ba2a64b7db9e49cd38982af59653701ecc..4ed32c0614fb7d719bf700d3fa97c492b71e9bf8 100644 (file)
@@ -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
 }
index e4cc621f9a247b6c0a70328b7df1cbdc426a3caf..64c881ad8e9aca630d292f4081cc163da0287d07 100644 (file)
@@ -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)
index 8f3da43b6423112cac29675fc6c29121cadb8d0a..63061b27946cafe0fd8c4ba7a1b020548fbce938 100644 (file)
@@ -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 {
index 7a6d6a685a070130a831741a9bf4c120ae4990fb..8120980332865da0ee3936986154df94abcfe8aa 100644 (file)
@@ -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 {
index a9da7683523dbe6a795f5e3c8a61bebb0c95c094..f6c44c793d625c1e0ba9938244442ed632c6e799 100644 (file)
@@ -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 {