ports/lang/go14/files/patch-pipe2
Gleb Smirnoff 141e3d8b59 Add two patches to lang/go14.
- patch-syscall

  Use SYSCALL assembly instead of INT 0x80 for syscalls on amd64.
  Using INT 0x80 as syscall gate on amd64 is an accidential and
  undocumented feature of COMPAT_FREEBSD32. It allows to use 64-bit
  ABI, but run syscalls through i386 gate.
  Go used this "feature" to workaround a bug in FreeBSD 8, which is no
  longer relevant.
  The patch is exact e9ce76b0eca8fa95dddb90b0a72aadab58de2ffc from go
  repo.
  Now lang/go14 doesn't need COMPAT_FREEBSD32 to build and run.

- patch-pipe2

  The pipe2 syscall is present in all supported versions of FreeBSD,
  but pipe was removed from FreeBSD 11. With the patch go14 can be
  built and run on a system without COMPAT_FREEBSD10.

Reviewed by:	jlaffaye
2017-03-21 16:38:33 +00:00

108 lines
3.2 KiB
Text

--- src/syscall/syscall_freebsd.go.orig 2017-03-17 19:00:39.000000000 +0000
+++ src/syscall/syscall_freebsd.go 2017-03-17 19:00:39.000000000 +0000
@@ -82,13 +82,16 @@
return origlen - len(buf), count, names
}
-//sysnb pipe() (r int, w int, err error)
+//sysnb pipe2(p *[2]_C_int, flags int) (err error)
-func Pipe(p []int) (err error) {
+func Pipe2(p []int, flags int) (err error) {
if len(p) != 2 {
return EINVAL
}
- p[0], p[1], err = pipe()
+ var pp [2]_C_int
+ err = pipe2(&pp, flags)
+ p[0] = int(pp[0])
+ p[1] = int(pp[1])
return
}
--- src/syscall/exec_bsd.go.orig 2017-03-17 18:21:43.000000000 +0000
+++ src/syscall/exec_bsd.go 2017-03-17 18:21:43.000000000 +0000
@@ -233,15 +233,7 @@
}
// 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
+func forkExecPipe(p []int) (err error) {
+ err = Pipe2(p, O_CLOEXEC)
+ return
}
--- src/syscall/zsyscall_freebsd_amd64.go.orig 2017-03-17 19:01:09.000000000 +0000
+++ src/syscall/zsyscall_freebsd_amd64.go 2017-03-17 19:01:09.000000000 +0000
@@ -260,10 +260,8 @@
// 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)
+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
}
--- src/syscall/zsyscall_freebsd_arm.go.orig 2017-03-17 20:52:22.000000000 +0000
+++ src/syscall/zsyscall_freebsd_arm.go 2017-03-17 20:52:22.000000000 +0000
@@ -260,10 +260,8 @@
// 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)
+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
}
--- src/syscall/zsyscall_freebsd_386.go.orig 2017-03-17 20:53:05.000000000 +0000
+++ src/syscall/zsyscall_freebsd_386.go 2017-03-17 20:53:05.000000000 +0000
@@ -260,10 +260,8 @@
// 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)
+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
}
--- src/os/pipe_bsd.go.orig 2017-03-17 20:54:41.000000000 +0000
+++ src/os/pipe_bsd.go 2017-03-17 20:54:41.000000000 +0000
@@ -13,16 +13,10 @@
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:])
+ e := syscall.Pipe2(p[0:], syscall.O_CLOEXEC)
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
}