- Option to resume interrupted send
This commit is contained in:
parent
a21bc233c2
commit
9901e4a20c
70
sendrecv.go
70
sendrecv.go
|
@ -21,30 +21,30 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
type SendFlags struct {
|
type SendFlags struct {
|
||||||
Verbose bool
|
Verbose bool // -v
|
||||||
Replicate bool
|
Replicate bool // -R
|
||||||
DoAll bool
|
DoAll bool // -I
|
||||||
FromOrigin bool
|
FromOrigin bool // -o
|
||||||
Dedup bool
|
Dedup bool // -D
|
||||||
Props bool
|
Props bool // -p
|
||||||
DryRun bool
|
DryRun bool // -n
|
||||||
Parsable bool
|
Parsable bool // -P
|
||||||
|
LargeBlock bool // -L
|
||||||
|
EmbedData bool // -e
|
||||||
|
Compress bool // -c
|
||||||
Progress bool
|
Progress bool
|
||||||
LargeBlock bool
|
|
||||||
EmbedData bool
|
|
||||||
Compress bool
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type RecvFlags struct {
|
type RecvFlags struct {
|
||||||
Verbose bool
|
Verbose bool // -v
|
||||||
IsPrefix bool
|
IsPrefix bool // -d
|
||||||
IsTail bool
|
IsTail bool // -e
|
||||||
DryRun bool
|
DryRun bool // -n
|
||||||
Force bool
|
Force bool // -r
|
||||||
|
Resumable bool // -s
|
||||||
|
NoMount bool // -u
|
||||||
CanmountOff bool
|
CanmountOff bool
|
||||||
Resumable bool
|
|
||||||
ByteSwap bool
|
ByteSwap bool
|
||||||
NoMount bool
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func to_boolean_t(a bool) C.boolean_t {
|
func to_boolean_t(a bool) C.boolean_t {
|
||||||
|
@ -170,6 +170,40 @@ func (d *Dataset) SendOne(FromName string, outf *os.File, flags *SendFlags) (err
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (d *Dataset) SendResume(outf *os.File, flags *SendFlags, receiveResumeToken string) (err error) {
|
||||||
|
if d.Type != DatasetTypeSnapshot {
|
||||||
|
err = fmt.Errorf("Unsupported method on filesystem or bookmark. Use func SendOne() for that purpose.")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var dpath string
|
||||||
|
var pd Dataset
|
||||||
|
|
||||||
|
cflags := to_sendflags_t(flags)
|
||||||
|
defer C.free(unsafe.Pointer(cflags))
|
||||||
|
if dpath, err = d.Path(); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
sendparams := strings.Split(dpath, "@")
|
||||||
|
parent := sendparams[0]
|
||||||
|
|
||||||
|
if pd, err = DatasetOpen(parent); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer pd.Close()
|
||||||
|
|
||||||
|
cReceiveResumeToken := C.CString(receiveResumeToken)
|
||||||
|
defer C.free(unsafe.Pointer(cReceiveResumeToken))
|
||||||
|
|
||||||
|
clerr := C.zfs_send_resume(C.libzfsHandle, cflags, C.int(outf.Fd()), cReceiveResumeToken)
|
||||||
|
if clerr != 0 {
|
||||||
|
err = LastError()
|
||||||
|
fmt.Println(err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func (d *Dataset) Send(outf *os.File, flags SendFlags) (err error) {
|
func (d *Dataset) Send(outf *os.File, flags SendFlags) (err error) {
|
||||||
if flags.Replicate {
|
if flags.Replicate {
|
||||||
flags.DoAll = true
|
flags.DoAll = true
|
||||||
|
|
Loading…
Reference in New Issue