- 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
|
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 {
|
func to_boolean_t(a bool) C.boolean_t {
|
||||||
if a {
|
if a {
|
||||||
return 1
|
return 1
|
||||||
|
@ -282,3 +297,76 @@ func (d *Dataset) Receive(inf *os.File, flags RecvFlags) (err error) {
|
||||||
}
|
}
|
||||||
return
|
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