From ee973155b2fd00dfe0ef6a3563c9623512f6632e Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Sat, 9 Mar 2019 02:10:22 +0000 Subject: [PATCH] re PR go/89447 (libgo largefile support is incomplete and inconsistent) PR go/89447 syscall, internal/syscall: adjust use of largefile functions Consistently call __go_openat for openat. Use fstatat64, creat64, sendfile64, and getdents64 where needed. Based on patch by Rainer Orth. Fixes https://gcc.gnu.org/PR89447 Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/166420 From-SVN: r269521 --- gcc/go/gofrontend/MERGE | 2 +- libgo/go/internal/syscall/unix/at.go | 5 +---- libgo/go/internal/syscall/unix/at_largefile.go | 14 ++++++++++++++ libgo/go/internal/syscall/unix/at_regfile.go | 18 ++++++++++++++++++ libgo/go/syscall/libcall_bsd.go | 2 -- libgo/go/syscall/libcall_bsd_largefile.go | 10 ++++++++++ libgo/go/syscall/libcall_bsd_regfile.go | 10 ++++++++++ libgo/go/syscall/libcall_posix.go | 3 --- libgo/go/syscall/libcall_posix_largefile.go | 3 +++ libgo/go/syscall/libcall_posix_regfile.go | 3 +++ libgo/go/syscall/libcall_solaris_largefile.go | 14 ++++++++++++++ ...l_solaris.go => libcall_solaris_regfile.go} | 2 ++ 12 files changed, 76 insertions(+), 10 deletions(-) create mode 100644 libgo/go/internal/syscall/unix/at_largefile.go create mode 100644 libgo/go/internal/syscall/unix/at_regfile.go create mode 100644 libgo/go/syscall/libcall_bsd_largefile.go create mode 100644 libgo/go/syscall/libcall_bsd_regfile.go create mode 100644 libgo/go/syscall/libcall_solaris_largefile.go rename libgo/go/syscall/{libcall_solaris.go => libcall_solaris_regfile.go} (90%) diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE index f1bbc376d8a..3c0ee14c64d 100644 --- a/gcc/go/gofrontend/MERGE +++ b/gcc/go/gofrontend/MERGE @@ -1,4 +1,4 @@ -959260238817af3205fb9907dd92319291e6a893 +3106ec19626d75d8275be16c86421132548fa13e The first line of this file holds the git revision number of the last merge done from the gofrontend repository. diff --git a/libgo/go/internal/syscall/unix/at.go b/libgo/go/internal/syscall/unix/at.go index b57b7918a89..a602d3ac5bf 100644 --- a/libgo/go/internal/syscall/unix/at.go +++ b/libgo/go/internal/syscall/unix/at.go @@ -13,12 +13,9 @@ import ( //extern unlinkat func unlinkat(int32, *byte, int32) int32 -//extern openat +//extern __go_openat func openat(int32, *byte, int32, syscall.Mode_t) int32 -//extern fstatat -func fstatat(int32, *byte, *syscall.Stat_t, int32) int32 - func Unlinkat(dirfd int, path string, flags int) error { var p *byte p, err := syscall.BytePtrFromString(path) diff --git a/libgo/go/internal/syscall/unix/at_largefile.go b/libgo/go/internal/syscall/unix/at_largefile.go new file mode 100644 index 00000000000..5318d234ae3 --- /dev/null +++ b/libgo/go/internal/syscall/unix/at_largefile.go @@ -0,0 +1,14 @@ +// Copyright 2019 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 aix hurd linux solaris,386 solaris,sparc + +package unix + +import ( + "syscall" +) + +//extern fstatat64 +func fstatat(int32, *byte, *syscall.Stat_t, int32) int32 diff --git a/libgo/go/internal/syscall/unix/at_regfile.go b/libgo/go/internal/syscall/unix/at_regfile.go new file mode 100644 index 00000000000..004c801a8ab --- /dev/null +++ b/libgo/go/internal/syscall/unix/at_regfile.go @@ -0,0 +1,18 @@ +// Copyright 2019 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 !aix +// +build !hurd +// +build !linux +// +build !solaris !386 +// +build !solaris !sparc + +package unix + +import ( + "syscall" +) + +//extern fstatat +func fstatat(int32, *byte, *syscall.Stat_t, int32) int32 diff --git a/libgo/go/syscall/libcall_bsd.go b/libgo/go/syscall/libcall_bsd.go index 9a4b2d65825..93f5710ba03 100644 --- a/libgo/go/syscall/libcall_bsd.go +++ b/libgo/go/syscall/libcall_bsd.go @@ -13,8 +13,6 @@ import ( "unsafe" ) -//sys sendfile(outfd int, infd int, offset *Offset_t, count int) (written int, err error) -//sendfile(outfd _C_int, infd _C_int, offset *Offset_t, count Size_t) Ssize_t func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { if race.Enabled { race.ReleaseMerge(unsafe.Pointer(&ioSync)) diff --git a/libgo/go/syscall/libcall_bsd_largefile.go b/libgo/go/syscall/libcall_bsd_largefile.go new file mode 100644 index 00000000000..c6a336cf782 --- /dev/null +++ b/libgo/go/syscall/libcall_bsd_largefile.go @@ -0,0 +1,10 @@ +// Copyright 2019 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 solaris,386 solaris,sparc + +package syscall + +//sys sendfile(outfd int, infd int, offset *Offset_t, count int) (written int, err error) +//sendfile64(outfd _C_int, infd _C_int, offset *Offset_t, count Size_t) Ssize_t diff --git a/libgo/go/syscall/libcall_bsd_regfile.go b/libgo/go/syscall/libcall_bsd_regfile.go new file mode 100644 index 00000000000..388c8a7d782 --- /dev/null +++ b/libgo/go/syscall/libcall_bsd_regfile.go @@ -0,0 +1,10 @@ +// Copyright 2019 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 dragonfly freebsd netbsd openbsd solaris,amd64 solaris,sparc64 + +package syscall + +//sys sendfile(outfd int, infd int, offset *Offset_t, count int) (written int, err error) +//sendfile(outfd _C_int, infd _C_int, offset *Offset_t, count Size_t) Ssize_t diff --git a/libgo/go/syscall/libcall_posix.go b/libgo/go/syscall/libcall_posix.go index d2fa0d9d433..31d6bf19f7d 100644 --- a/libgo/go/syscall/libcall_posix.go +++ b/libgo/go/syscall/libcall_posix.go @@ -184,9 +184,6 @@ func FDZero(set *FdSet) { //sys Close(fd int) (err error) //close(fd _C_int) _C_int -//sys Creat(path string, mode uint32) (fd int, err error) -//creat(path *byte, mode Mode_t) _C_int - //sysnb Dup(oldfd int) (fd int, err error) //dup(oldfd _C_int) _C_int diff --git a/libgo/go/syscall/libcall_posix_largefile.go b/libgo/go/syscall/libcall_posix_largefile.go index 57a7f5eb1e1..bf0f9fe50b6 100644 --- a/libgo/go/syscall/libcall_posix_largefile.go +++ b/libgo/go/syscall/libcall_posix_largefile.go @@ -8,6 +8,9 @@ package syscall +//sys Creat(path string, mode uint32) (fd int, err error) +//creat64(path *byte, mode Mode_t) _C_int + //sys Fstat(fd int, stat *Stat_t) (err error) //fstat64(fd _C_int, stat *Stat_t) _C_int diff --git a/libgo/go/syscall/libcall_posix_regfile.go b/libgo/go/syscall/libcall_posix_regfile.go index 5dc6eb606e8..8ff721341ba 100644 --- a/libgo/go/syscall/libcall_posix_regfile.go +++ b/libgo/go/syscall/libcall_posix_regfile.go @@ -13,6 +13,9 @@ package syscall +//sys Creat(path string, mode uint32) (fd int, err error) +//creat(path *byte, mode Mode_t) _C_int + //sys Fstat(fd int, stat *Stat_t) (err error) //fstat(fd _C_int, stat *Stat_t) _C_int diff --git a/libgo/go/syscall/libcall_solaris_largefile.go b/libgo/go/syscall/libcall_solaris_largefile.go new file mode 100644 index 00000000000..757b2293ce5 --- /dev/null +++ b/libgo/go/syscall/libcall_solaris_largefile.go @@ -0,0 +1,14 @@ +// Copyright 2019 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 solaris,386 solaris,sparc + +package syscall + +//sys Getdents(fd int, buf []byte) (n int, err error) +//getdents64(fd _C_int, buf *byte, nbyte Size_t) _C_int + +func ReadDirent(fd int, buf []byte) (n int, err error) { + return Getdents(fd, buf) +} diff --git a/libgo/go/syscall/libcall_solaris.go b/libgo/go/syscall/libcall_solaris_regfile.go similarity index 90% rename from libgo/go/syscall/libcall_solaris.go rename to libgo/go/syscall/libcall_solaris_regfile.go index a02661401a8..fa5dd8c65a8 100644 --- a/libgo/go/syscall/libcall_solaris.go +++ b/libgo/go/syscall/libcall_solaris_regfile.go @@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +// +build solaris,amd64 solaris,sparc64 + package syscall //sys Getdents(fd int, buf []byte) (n int, err error) -- 2.30.2