- 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