]> Cypherpunks repositories - gostls13.git/commitdiff
syscall: implement Pipe2 on Linux and use it in ForkExec
authorGeorg Reinke <guelfey@gmail.com>
Fri, 11 Jan 2013 01:04:55 +0000 (17:04 -0800)
committerIan Lance Taylor <iant@golang.org>
Fri, 11 Jan 2013 01:04:55 +0000 (17:04 -0800)
Fixes #2656.

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

src/pkg/syscall/exec_bsd.go
src/pkg/syscall/exec_linux.go
src/pkg/syscall/exec_unix.go
src/pkg/syscall/syscall_linux.go
src/pkg/syscall/zsyscall_linux_386.go
src/pkg/syscall/zsyscall_linux_amd64.go
src/pkg/syscall/zsyscall_linux_arm.go

index 9c3af5ec955bd1a5958712bf502ea6792ffdcf31..318cbc060c099bfa730ff4d3d4c34359b937acc6 100644 (file)
@@ -221,3 +221,17 @@ childerror:
        // and this shuts up the compiler.
        panic("unreached")
 }
+
+// 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
+}
index adb6a06ba8d0bf6d98cd12e8656affc50d63959e..a8dc672b8c908dfbfa3df241dfe0e3659395892b 100644 (file)
@@ -233,3 +233,20 @@ childerror:
        // and this shuts up the compiler.
        panic("unreached")
 }
+
+// Try to open a pipe with O_CLOEXEC set on both file descriptors.
+func forkExecPipe(p []int) (err error) {
+       err = Pipe2(p, O_CLOEXEC)
+       // pipe2 was added in 2.6.27 and our minimum requirement is 2.6.23, so it
+       // might not be implemented.
+       if err == ENOSYS {
+               if err = Pipe(p); err != nil {
+                       return
+               }
+               if _, err = fcntl(p[0], F_SETFD, FD_CLOEXEC); err != nil {
+                       return
+               }
+               _, err = fcntl(p[1], F_SETFD, FD_CLOEXEC)
+       }
+       return
+}
index dd892a9abe05e12a01d2bfd580deb3e12c5946bf..01b76c1068252397502682d918930d3e3dddb4d4 100644 (file)
@@ -183,13 +183,7 @@ func forkExec(argv0 string, argv []string, attr *ProcAttr) (pid int, err error)
        ForkLock.Lock()
 
        // Allocate child status pipe close on exec.
-       if err = Pipe(p[0:]); err != nil {
-               goto error
-       }
-       if _, err = fcntl(p[0], F_SETFD, FD_CLOEXEC); err != nil {
-               goto error
-       }
-       if _, err = fcntl(p[1], F_SETFD, FD_CLOEXEC); err != nil {
+       if err = forkExecPipe(p[:]); err != nil {
                goto error
        }
 
index 61c64b5f8a5ffd88de0dc10a0ffca965e0d35fdd..f44fb48fa78d97885cc7737366f44b715db2cb92 100644 (file)
@@ -39,6 +39,18 @@ func Pipe(p []int) (err error) {
        return
 }
 
+//sysnb pipe2(p *[2]_C_int, flags int) (err error)
+func Pipe2(p []int, flags int) (err error) {
+       if len(p) != 2 {
+               return EINVAL
+       }
+       var pp [2]_C_int
+       err = pipe2(&pp, flags)
+       p[0] = int(pp[0])
+       p[1] = int(pp[1])
+       return
+}
+
 //sys  utimes(path string, times *[2]Timeval) (err error)
 func Utimes(path string, tv []Timeval) (err error) {
        if len(tv) != 2 {
index f1be0b3f85705c438c0030076a8103ceb8b15659..3f0470c988d1946309286dc63a35b4cf90310b30 100644 (file)
@@ -49,6 +49,16 @@ func pipe(p *[2]_C_int) (err error) {
 
 // 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 {
+               err = e1
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func utimes(path string, times *[2]Timeval) (err error) {
        var _p0 *byte
        _p0, err = BytePtrFromString(path)
index 11179648da0538bf9a274e2b2075500c8517dae7..3cdc1873b8988df5ce94a076a8baa95a7169b7db 100644 (file)
@@ -49,6 +49,16 @@ func pipe(p *[2]_C_int) (err error) {
 
 // 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 {
+               err = e1
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func utimes(path string, times *[2]Timeval) (err error) {
        var _p0 *byte
        _p0, err = BytePtrFromString(path)
index 2966bb60d6b0840f8c7176a4a6dd789442f1904e..db17d968230ad992f92ab3429e272119442b810d 100644 (file)
@@ -49,6 +49,16 @@ func pipe(p *[2]_C_int) (err error) {
 
 // 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 {
+               err = e1
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func utimes(path string, times *[2]Timeval) (err error) {
        var _p0 *byte
        _p0, err = BytePtrFromString(path)