copy.go 925 Bytes
Newer Older
1
package fuse
Han-Wen Nienhuys's avatar
Han-Wen Nienhuys committed
2

3 4 5 6
import (
	"os"
)

7 8
func CopyFile(srcFs, destFs FileSystem, srcFile, destFile string, context *Context) Status {
	src, code := srcFs.Open(srcFile, uint32(os.O_RDONLY), context)
9 10 11 12 13 14
	if !code.Ok() {
		return code
	}
	defer src.Release()
	defer src.Flush()

15
	attr, code := srcFs.GetAttr(srcFile, context)
16 17 18
	if !code.Ok() {
		return code
	}
Han-Wen Nienhuys's avatar
Han-Wen Nienhuys committed
19

20
	dst, code := destFs.Create(destFile, uint32(os.O_WRONLY | os.O_CREATE | os.O_TRUNC), attr.Mode, context)
21 22 23 24 25 26
	if !code.Ok() {
		return code
	}
	defer dst.Release()
	defer dst.Flush()

Han-Wen Nienhuys's avatar
Han-Wen Nienhuys committed
27
	buf := make([]byte, 128*(1<<10))
28
	off := int64(0)
29
	for {
30 31 32
		res := src.Read(buf, off)
		if !res.Ok() {
			return res.Status
33
		}
34
		res.Read(buf)
Han-Wen Nienhuys's avatar
Han-Wen Nienhuys committed
35

36
		if len(res.Data) == 0 {
Han-Wen Nienhuys's avatar
Han-Wen Nienhuys committed
37
			break
38
		}
39
		n, code := dst.Write(res.Data, off)
40 41 42
		if !code.Ok() {
			return code
		}
43
		if int(n) < len(res.Data) {
44 45
			return EIO
		}
46
		if len(res.Data) < len(buf) {
Han-Wen Nienhuys's avatar
Han-Wen Nienhuys committed
47
			break
48
		}
49
		off += int64(len(res.Data))
50 51 52
	}
	return OK
}