// Copyright 2020 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. package os import ( "internal/poll" "io" ) var pollCopyFileRange = poll.CopyFileRange func (f *File) readFrom(r io.Reader) (written int64, handled bool, err error) { // copy_file_range(2) does not support destinations opened with // O_APPEND, so don't even try. if f.appendMode { return 0, false, nil } remain := int64(1 << 62) lr, ok := r.(*io.LimitedReader) if ok { remain, r = lr.N, lr.R if remain <= 0 { return 0, true, nil } } src, ok := r.(*File) if !ok { return 0, false, nil } if src.checkValid("ReadFrom") != nil { // Avoid returning the error as we report handled as false, // leave further error handling as the responsibility of the caller. return 0, false, nil } written, handled, err = pollCopyFileRange(&f.pfd, &src.pfd, remain) if lr != nil { lr.N -= written } return written, handled, NewSyscallError("copy_file_range", err) }