...

Source file src/net/sendfile_windows.go

     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.
     4	
     5	package net
     6	
     7	import (
     8		"internal/poll"
     9		"io"
    10		"os"
    11		"syscall"
    12	)
    13	
    14	// sendFile copies the contents of r to c using the TransmitFile
    15	// system call to minimize copies.
    16	//
    17	// if handled == true, sendFile returns the number of bytes copied and any
    18	// non-EOF error.
    19	//
    20	// if handled == false, sendFile performed no work.
    21	//
    22	// Note that sendfile for windows does not support >2GB file.
    23	func sendFile(fd *netFD, r io.Reader) (written int64, err error, handled bool) {
    24		var n int64 = 0 // by default, copy until EOF
    25	
    26		lr, ok := r.(*io.LimitedReader)
    27		if ok {
    28			n, r = lr.N, lr.R
    29			if n <= 0 {
    30				return 0, nil, true
    31			}
    32		}
    33		f, ok := r.(*os.File)
    34		if !ok {
    35			return 0, nil, false
    36		}
    37	
    38		done, err := poll.SendFile(&fd.pfd, syscall.Handle(f.Fd()), n)
    39	
    40		if err != nil {
    41			return 0, wrapSyscallError("transmitfile", err), false
    42		}
    43		if lr != nil {
    44			lr.N -= int64(done)
    45		}
    46		return int64(done), nil, true
    47	}
    48	

View as plain text