1 // Copyright 2011 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
13 // sendFile copies the contents of r to c using the TransmitFile
14 // system call to minimize copies.
16 // if handled == true, sendFile returns the number of bytes copied and any
19 // if handled == false, sendFile performed no work.
21 // Note that sendfile for windows does not suppport >2GB file.
22 func sendFile(fd
*netFD
, r io
.Reader
) (written
int64, err error
, handled
bool) {
23 var n
int64 = 0 // by default, copy until EOF
25 lr
, ok
:= r
.(*io
.LimitedReader
)
37 if err
:= fd
.writeLock(); err
!= nil {
40 defer fd
.writeUnlock()
44 o
.handle
= syscall
.Handle(f
.Fd())
45 done
, err
:= wsrv
.ExecIO(o
, "TransmitFile", func(o
*operation
) error
{
46 return syscall
.TransmitFile(o
.fd
.sysfd
, o
.handle
, o
.qty
, 0, &o
.o
, nil, syscall
.TF_WRITE_BEHIND
)
54 return int64(done
), nil, true