]> Cypherpunks repositories - gostls13.git/commitdiff
net: use same sendFile for freebsd/dragonfly and solaris
authorTobias Klauser <tklauser@distanz.ch>
Thu, 5 Apr 2018 10:20:12 +0000 (12:20 +0200)
committerTobias Klauser <tobias.klauser@gmail.com>
Fri, 6 Apr 2018 14:48:05 +0000 (14:48 +0000)
FreeBSD/Dragonfly and Solaris have identical implementations of
sendFile. Keep one and adjust the comments accordingly.

Change-Id: I77b0f88a4816dd6e40f5cb33919c44606401ac6b
Reviewed-on: https://go-review.googlesource.com/104915
Run-TryBot: Tobias Klauser <tobias.klauser@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
src/net/sendfile_solaris.go [deleted file]
src/net/sendfile_unix_alt.go [moved from src/net/sendfile_bsd.go with 90% similarity]

diff --git a/src/net/sendfile_solaris.go b/src/net/sendfile_solaris.go
deleted file mode 100644 (file)
index 63ca9d4..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2015 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"
-)
-
-// sendFile copies the contents of r to c using the sendfile
-// 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(c *netFD, r io.Reader) (written int64, err error, handled bool) {
-       // Solaris uses 0 as the "until EOF" value. If you pass in more bytes than the
-       // file contains, it will loop back to the beginning ad nauseam until it's sent
-       // exactly the number of bytes told to. As such, we need to know exactly how many
-       // bytes to send.
-       var remain int64 = 0
-
-       lr, ok := r.(*io.LimitedReader)
-       if ok {
-               remain, r = lr.N, lr.R
-               if remain <= 0 {
-                       return 0, nil, true
-               }
-       }
-       f, ok := r.(*os.File)
-       if !ok {
-               return 0, nil, false
-       }
-
-       if remain == 0 {
-               fi, err := f.Stat()
-               if err != nil {
-                       return 0, err, false
-               }
-
-               remain = fi.Size()
-       }
-
-       // The other quirk with Solaris's sendfile implementation is that it doesn't
-       // use the current position of the file -- if you pass it offset 0, it starts
-       // from offset 0. There's no way to tell it "start from current position", so
-       // we have to manage that explicitly.
-       pos, err := f.Seek(0, io.SeekCurrent)
-       if err != nil {
-               return 0, err, false
-       }
-
-       written, err = poll.SendFile(&c.pfd, int(f.Fd()), pos, remain)
-
-       if lr != nil {
-               lr.N = remain - written
-       }
-       return written, wrapSyscallError("sendfile", err), written > 0
-}
similarity index 90%
rename from src/net/sendfile_bsd.go
rename to src/net/sendfile_unix_alt.go
index 7a2b48c6cfa46774f4e7295914b901645efc4903..97aeebbed2139dcb684e3ee3536125675547de22 100644 (file)
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build dragonfly freebsd
+// +build dragonfly freebsd solaris
 
 package net
 
@@ -20,7 +20,7 @@ import (
 //
 // if handled == false, sendFile performed no work.
 func sendFile(c *netFD, r io.Reader) (written int64, err error, handled bool) {
-       // FreeBSD and DragonFly use 0 as the "until EOF" value.
+       // FreeBSD, DragonFly and Solaris use 0 as the "until EOF" value.
        // If you pass in more bytes than the file contains, it will
        // loop back to the beginning ad nauseam until it's sent
        // exactly the number of bytes told to. As such, we need to
@@ -48,7 +48,7 @@ func sendFile(c *netFD, r io.Reader) (written int64, err error, handled bool) {
                remain = fi.Size()
        }
 
-       // The other quirk with FreeBSD/DragonFly's sendfile
+       // The other quirk with FreeBSD/DragonFly/Solaris's sendfile
        // implementation is that it doesn't use the current position
        // of the file -- if you pass it offset 0, it starts from
        // offset 0. There's no way to tell it "start from current