github.com/hanwen/go-fuse@v1.0.0/splice/copy.go (about) 1 // Copyright 2016 the Go-FUSE 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 splice 6 7 import ( 8 "io" 9 "os" 10 ) 11 12 func SpliceCopy(dst *os.File, src *os.File, p *Pair) (int64, error) { 13 total := int64(0) 14 15 for { 16 n, err := p.LoadFrom(src.Fd(), p.size) 17 if err != nil { 18 return total, err 19 } 20 if n == 0 { 21 break 22 } 23 m, err := p.WriteTo(dst.Fd(), n) 24 total += int64(m) 25 if err != nil { 26 return total, err 27 } 28 if m < n { 29 return total, err 30 } 31 if int(n) < p.size { 32 break 33 } 34 } 35 36 return total, nil 37 } 38 39 // Argument ordering follows io.Copy. 40 func CopyFile(dstName string, srcName string, mode int) error { 41 src, err := os.Open(srcName) 42 if err != nil { 43 return err 44 } 45 defer src.Close() 46 47 dst, err := os.OpenFile(dstName, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, os.FileMode(mode)) 48 if err != nil { 49 return err 50 } 51 defer dst.Close() 52 53 return CopyFds(dst, src) 54 } 55 56 func CopyFds(dst *os.File, src *os.File) (err error) { 57 p, err := splicePool.get() 58 if p != nil { 59 p.Grow(256 * 1024) 60 _, err := SpliceCopy(dst, src, p) 61 splicePool.done(p) 62 return err 63 } else { 64 _, err = io.Copy(dst, src) 65 } 66 if err == io.EOF { 67 err = nil 68 } 69 return err 70 }