From e8e29180ff5864b319bc2075950ef6e6f458e8b3 Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Wed, 13 Jan 2021 18:56:56 +0100 Subject: [PATCH] unix: fix Pipe2 on dragonfly Also move TestPipe2 into a separate file, enabling it for all platforms where Pipe2 is available. Change-Id: I9c554a53fc9d7610aaa732c0ceba864963fad542 Reviewed-on: https://go-review.googlesource.com/c/sys/+/283598 Trust: Tobias Klauser Reviewed-by: Ian Lance Taylor Run-TryBot: Tobias Klauser --- unix/pipe2_test.go | 55 ++++++++++++++++++++++++++++++++ unix/syscall_dragonfly.go | 9 ++---- unix/syscall_solaris_test.go | 42 ------------------------ unix/zsyscall_dragonfly_amd64.go | 6 ++-- 4 files changed, 62 insertions(+), 50 deletions(-) create mode 100644 unix/pipe2_test.go diff --git a/unix/pipe2_test.go b/unix/pipe2_test.go new file mode 100644 index 00000000..3e1c01fe --- /dev/null +++ b/unix/pipe2_test.go @@ -0,0 +1,55 @@ +// Copyright 2021 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 dragonfly freebsd linux openbsd solaris + +package unix_test + +import ( + "testing" + + "golang.org/x/sys/unix" +) + +func TestPipe2(t *testing.T) { + const s = "hello" + var pipes [2]int + err := unix.Pipe2(pipes[:], 0) + if err != nil { + t.Fatalf("pipe2: %v", err) + } + r := pipes[0] + w := pipes[1] + go func() { + n, err := unix.Write(w, []byte(s)) + if err != nil { + t.Errorf("bad write: %v", err) + return + } + if n != len(s) { + t.Errorf("bad write count: %d", n) + return + } + err = unix.Close(w) + if err != nil { + t.Errorf("bad close: %v", err) + return + } + }() + var buf [10 + len(s)]byte + n, err := unix.Read(r, buf[:]) + if err != nil { + t.Fatalf("bad read: %v", err) + } + if n != len(s) { + t.Fatalf("bad read count: %d", n) + } + if string(buf[:n]) != s { + t.Fatalf("bad contents: %s", string(buf[:n])) + } + err = unix.Close(r) + if err != nil { + t.Fatalf("bad close: %v", err) + } +} diff --git a/unix/syscall_dragonfly.go b/unix/syscall_dragonfly.go index 7629878b..474141b6 100644 --- a/unix/syscall_dragonfly.go +++ b/unix/syscall_dragonfly.go @@ -105,16 +105,13 @@ func Pipe(p []int) (err error) { return } -//sysnb pipe2(p *[2]_C_int, flags int) (err error) +//sysnb pipe2(flags int) (r int, w int, err error) -func Pipe2(p []int, flags int) 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]) + p[0], p[1], err = pipe2(flags) return err } diff --git a/unix/syscall_solaris_test.go b/unix/syscall_solaris_test.go index f4d73a85..7734e124 100644 --- a/unix/syscall_solaris_test.go +++ b/unix/syscall_solaris_test.go @@ -13,48 +13,6 @@ import ( "golang.org/x/sys/unix" ) -func TestPipe2(t *testing.T) { - const s = "hello" - var pipes [2]int - err := unix.Pipe2(pipes[:], 0) - if err != nil { - t.Fatalf("pipe2: %v", err) - } - r := pipes[0] - w := pipes[1] - go func() { - n, err := unix.Write(w, []byte(s)) - if err != nil { - t.Errorf("bad write: %v", err) - return - } - if n != len(s) { - t.Errorf("bad write count: %d", n) - return - } - err = unix.Close(w) - if err != nil { - t.Errorf("bad close: %v", err) - return - } - }() - var buf [10 + len(s)]byte - n, err := unix.Read(r, buf[:]) - if err != nil { - t.Fatalf("bad read: %v", err) - } - if n != len(s) { - t.Fatalf("bad read count: %d", n) - } - if string(buf[:n]) != s { - t.Fatalf("bad contents: %s", string(buf[:n])) - } - err = unix.Close(r) - if err != nil { - t.Fatalf("bad close: %v", err) - } -} - func TestStatvfs(t *testing.T) { if err := unix.Statvfs("", nil); err == nil { t.Fatal(`Statvfs("") expected failure`) diff --git a/unix/zsyscall_dragonfly_amd64.go b/unix/zsyscall_dragonfly_amd64.go index 1aaccd36..104f77d5 100644 --- a/unix/zsyscall_dragonfly_amd64.go +++ b/unix/zsyscall_dragonfly_amd64.go @@ -362,8 +362,10 @@ func pipe() (r int, w 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) +func pipe2(flags int) (r int, w int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE2, uintptr(flags), 0, 0) + r = int(r0) + w = int(r1) if e1 != 0 { err = errnoErr(e1) }