- Unpack resume information from resume token to go structure ResumeToken
This commit is contained in:
parent
680fd3ef89
commit
d53f3530af
88
sendrecv.go
88
sendrecv.go
|
@ -51,6 +51,21 @@ type RecvFlags struct {
|
|||
ByteSwap bool
|
||||
}
|
||||
|
||||
// ResumeToken - informations extracted from resume token
|
||||
type ResumeToken struct {
|
||||
ToName string
|
||||
FromName string
|
||||
Object uint64
|
||||
Offset uint64
|
||||
ToGUID uint64
|
||||
FromGUID uint64
|
||||
Bytes uint64
|
||||
LargeBlock bool
|
||||
EmbedOk bool
|
||||
CompressOk bool
|
||||
RawOk bool
|
||||
}
|
||||
|
||||
func to_boolean_t(a bool) C.boolean_t {
|
||||
if a {
|
||||
return 1
|
||||
|
@ -282,3 +297,76 @@ func (d *Dataset) Receive(inf *os.File, flags RecvFlags) (err error) {
|
|||
}
|
||||
return
|
||||
}
|
||||
|
||||
// Unpack unpack resume token
|
||||
func (rt *ResumeToken) Unpack(token string) (err error) {
|
||||
ctoken := C.CString(token)
|
||||
defer C.free(unsafe.Pointer(ctoken))
|
||||
resume_nvl := C.zfs_send_resume_token_to_nvlist(C.libzfsHandle, ctoken)
|
||||
defer C.nvlist_free(resume_nvl)
|
||||
if resume_nvl == nil {
|
||||
err = fmt.Errorf("Failed to unpack resume token: %s", LastError().Error())
|
||||
return
|
||||
}
|
||||
if rt.ToName, err = rt.lookupString(resume_nvl, "toname"); err != nil {
|
||||
return
|
||||
}
|
||||
rt.FromName, _ = rt.lookupString(resume_nvl, "fromname")
|
||||
|
||||
if rt.Object, err = rt.lookupUnit64(resume_nvl, "object"); err != nil {
|
||||
return
|
||||
}
|
||||
if rt.Offset, err = rt.lookupUnit64(resume_nvl, "offset"); err != nil {
|
||||
return
|
||||
}
|
||||
if rt.Bytes, err = rt.lookupUnit64(resume_nvl, "bytes"); err != nil {
|
||||
return
|
||||
}
|
||||
if rt.ToGUID, err = rt.lookupUnit64(resume_nvl, "toguid"); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
rt.FromGUID, _ = rt.lookupUnit64(resume_nvl, "fromguid")
|
||||
|
||||
rt.LargeBlock = rt.exist(resume_nvl, "largeblockok")
|
||||
rt.EmbedOk = rt.exist(resume_nvl, "embedok")
|
||||
rt.CompressOk = rt.exist(resume_nvl, "compressok")
|
||||
rt.RawOk = rt.exist(resume_nvl, "rawok")
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func (rt *ResumeToken) lookupString(nvl *C.nvlist_t, key string) (val string, err error) {
|
||||
var cstr *C.char
|
||||
ckey := C.CString(key)
|
||||
defer C.free(unsafe.Pointer(ckey))
|
||||
defer C.free(unsafe.Pointer(cstr))
|
||||
rc := C.nvlist_lookup_string(nvl, ckey, &cstr)
|
||||
if rc != 0 {
|
||||
err = fmt.Errorf("resume token is corrupt")
|
||||
return
|
||||
}
|
||||
val = C.GoString(cstr)
|
||||
return
|
||||
}
|
||||
|
||||
func (rt *ResumeToken) lookupUnit64(nvl *C.nvlist_t, key string) (val uint64, err error) {
|
||||
var num C.uint64_t
|
||||
ckey := C.CString(key)
|
||||
defer C.free(unsafe.Pointer(ckey))
|
||||
rc := C.nvlist_lookup_uint64(nvl, ckey, &num)
|
||||
if rc != 0 {
|
||||
err = fmt.Errorf("resume token is corrupt")
|
||||
return
|
||||
}
|
||||
val = uint64(num)
|
||||
return
|
||||
}
|
||||
|
||||
func (rt *ResumeToken) exist(nvl *C.nvlist_t, key string) (val bool) {
|
||||
ckey := C.CString(key)
|
||||
defer C.free(unsafe.Pointer(ckey))
|
||||
rc := C.nvlist_exists(nvl, ckey)
|
||||
val = (rc != 0)
|
||||
return
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue