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  }