diff options
Diffstat (limited to 'src/net/sendfile_windows.go')
-rw-r--r-- | src/net/sendfile_windows.go | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/src/net/sendfile_windows.go b/src/net/sendfile_windows.go new file mode 100644 index 0000000..59b1b0d --- /dev/null +++ b/src/net/sendfile_windows.go @@ -0,0 +1,47 @@ +// Copyright 2011 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 net + +import ( + "internal/poll" + "io" + "os" + "syscall" +) + +// sendFile copies the contents of r to c using the TransmitFile +// system call to minimize copies. +// +// if handled == true, sendFile returns the number of bytes copied and any +// non-EOF error. +// +// if handled == false, sendFile performed no work. +func sendFile(fd *netFD, r io.Reader) (written int64, err error, handled bool) { + var n int64 = 0 // by default, copy until EOF. + + lr, ok := r.(*io.LimitedReader) + if ok { + n, r = lr.N, lr.R + if n <= 0 { + return 0, nil, true + } + } + + f, ok := r.(*os.File) + if !ok { + return 0, nil, false + } + + written, err = poll.SendFile(&fd.pfd, syscall.Handle(f.Fd()), n) + if err != nil { + err = wrapSyscallError("transmitfile", err) + } + + // If any byte was copied, regardless of any error + // encountered mid-way, handled must be set to true. + handled = written > 0 + + return +} |