]> Cypherpunks repositories - gostls13.git/commitdiff
os: use syscall.Pipe2 on Linux
authorGeorg Reinke <guelfey@gmail.com>
Fri, 11 Jan 2013 16:30:25 +0000 (08:30 -0800)
committerIan Lance Taylor <iant@golang.org>
Fri, 11 Jan 2013 16:30:25 +0000 (08:30 -0800)
Update #2656

R=golang-dev, iant, minux.ma, bradfitz
CC=golang-dev
https://golang.org/cl/7065063

src/pkg/os/file_unix.go
src/pkg/os/pipe_bsd.go [new file with mode: 0644]
src/pkg/os/pipe_linux.go [new file with mode: 0644]

index 5a220f66a7653a2341c373ae9c4d54f2ad59946e..4f59c94cb9495d47d101fc4b941be7d0087d6919 100644 (file)
@@ -274,25 +274,6 @@ func basename(name string) string {
        return name
 }
 
-// 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
-
-       // 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"), NewFile(uintptr(p[1]), "|1"), nil
-}
-
 // TempDir returns the default directory to use for temporary files.
 func TempDir() string {
        dir := Getenv("TMPDIR")
diff --git a/src/pkg/os/pipe_bsd.go b/src/pkg/os/pipe_bsd.go
new file mode 100644 (file)
index 0000000..a2ce9a3
--- /dev/null
@@ -0,0 +1,28 @@
+// Copyright 2009 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 freebsd netbsd openbsd
+
+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
+
+       // 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"), NewFile(uintptr(p[1]), "|1"), nil
+}
diff --git a/src/pkg/os/pipe_linux.go b/src/pkg/os/pipe_linux.go
new file mode 100644 (file)
index 0000000..9bafad8
--- /dev/null
@@ -0,0 +1,33 @@
+// Copyright 2013 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)
+       // pipe2 was added in 2.6.27 and our minimum requirement is 2.6.23, so it
+       // might not be implemented.
+       if e == syscall.ENOSYS {
+               // 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()
+       } else if e != nil {
+               return nil, nil, NewSyscallError("pipe2", e)
+       }
+
+       return NewFile(uintptr(p[0]), "|0"), NewFile(uintptr(p[1]), "|1"), nil
+}