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.
5 // +build dragonfly freebsd
11 // maxSendfileSize is the largest chunk size we ask the kernel to copy
13 const maxSendfileSize
int = 4 << 20
15 // SendFile wraps the sendfile system call.
16 func SendFile(dstFD
*FD
, src
int, pos
, remain
int64) (int64, error
) {
17 if err
:= dstFD
.writeLock(); err
!= nil {
20 defer dstFD
.writeUnlock()
21 dst
:= int(dstFD
.Sysfd
)
26 if int64(n
) > remain
{
30 n
, err1
:= syscall
.Sendfile(dst
, src
, &pos1
, n
)
36 if n
== 0 && err1
== nil {
39 if err1
== syscall
.EAGAIN
{
40 if err1
= dstFD
.pd
.waitWrite(dstFD
.isFile
); err1
== nil {
45 // This includes syscall.ENOSYS (no kernel
46 // support) and syscall.EINVAL (fd types which
47 // don't implement sendfile)