]> Cypherpunks repositories - gostls13.git/commitdiff
os: set File.appendMode in NewFile if file was opened with O_APPEND
authorTobias Klauser <tklauser@distanz.ch>
Wed, 17 May 2023 07:57:37 +0000 (09:57 +0200)
committerGopher Robot <gobot@golang.org>
Thu, 18 May 2023 09:16:07 +0000 (09:16 +0000)
To allow skipping the use of the copy_file_range syscall on Linux which
isn't supported for destination files opened with O_APPEND, see comment
in (*File).readFrom and
https://man7.org/linux/man-pages/man2/copy_file_range.2.html#ERRORS

Fixes #60181

Change-Id: Ie0b0050faab16858412928a3d1f96442619581eb
Reviewed-on: https://go-review.googlesource.com/c/go/+/494915
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Bryan Mills <bcmills@google.com>
Auto-Submit: Tobias Klauser <tobias.klauser@gmail.com>
Reviewed-by: Ian Lance Taylor <iant@google.com>
Run-TryBot: Tobias Klauser <tobias.klauser@gmail.com>

src/os/file_unix.go

index 3d3a8b2056b793bd7ddf3e1d9cbf3eb0ca584693..b8c27d8826a834dd9435916dccba9861b9c5e812 100644 (file)
@@ -106,7 +106,11 @@ func NewFile(fd uintptr, name string) *File {
        if nb, err := unix.IsNonblock(int(fd)); err == nil && nb {
                kind = kindNonBlock
        }
-       return newFile(fd, name, kind)
+       f := newFile(fd, name, kind)
+       if flags, err := unix.Fcntl(int(fd), syscall.F_GETFL, 0); err == nil {
+               f.appendMode = flags&syscall.O_APPEND != 0
+       }
+       return f
 }
 
 // newFileKind describes the kind of file to newFile.