84 struct drr_begin *drrb = &thedrr.drr_u.drr_begin; |
84 struct drr_begin *drrb = &thedrr.drr_u.drr_begin; |
85 struct drr_end *drre = &thedrr.drr_u.drr_end; |
85 struct drr_end *drre = &thedrr.drr_u.drr_end; |
86 struct drr_object *drro = &thedrr.drr_u.drr_object; |
86 struct drr_object *drro = &thedrr.drr_u.drr_object; |
87 struct drr_freeobjects *drrfo = &thedrr.drr_u.drr_freeobjects; |
87 struct drr_freeobjects *drrfo = &thedrr.drr_u.drr_freeobjects; |
88 struct drr_write *drrw = &thedrr.drr_u.drr_write; |
88 struct drr_write *drrw = &thedrr.drr_u.drr_write; |
|
89 struct drr_write_byref *drrwbr = &thedrr.drr_u.drr_write_byref; |
89 struct drr_free *drrf = &thedrr.drr_u.drr_free; |
90 struct drr_free *drrf = &thedrr.drr_u.drr_free; |
90 char c; |
91 char c; |
91 boolean_t verbose = B_FALSE; |
92 boolean_t verbose = B_FALSE; |
92 boolean_t first = B_TRUE; |
93 boolean_t first = B_TRUE; |
93 int i, err; |
94 int i, err; |
170 |
171 |
171 switch (drr->drr_type) { |
172 switch (drr->drr_type) { |
172 case DRR_BEGIN: |
173 case DRR_BEGIN: |
173 if (do_byteswap) { |
174 if (do_byteswap) { |
174 drrb->drr_magic = BSWAP_64(drrb->drr_magic); |
175 drrb->drr_magic = BSWAP_64(drrb->drr_magic); |
175 drrb->drr_version = BSWAP_64(drrb->drr_version); |
176 drrb->drr_versioninfo = |
|
177 BSWAP_64(drrb->drr_versioninfo); |
176 drrb->drr_creation_time = |
178 drrb->drr_creation_time = |
177 BSWAP_64(drrb->drr_creation_time); |
179 BSWAP_64(drrb->drr_creation_time); |
178 drrb->drr_type = BSWAP_32(drrb->drr_type); |
180 drrb->drr_type = BSWAP_32(drrb->drr_type); |
179 drrb->drr_flags = BSWAP_32(drrb->drr_flags); |
181 drrb->drr_flags = BSWAP_32(drrb->drr_flags); |
180 drrb->drr_toguid = BSWAP_64(drrb->drr_toguid); |
182 drrb->drr_toguid = BSWAP_64(drrb->drr_toguid); |
181 drrb->drr_fromguid = |
183 drrb->drr_fromguid = |
182 BSWAP_64(drrb->drr_fromguid); |
184 BSWAP_64(drrb->drr_fromguid); |
183 } |
185 } |
184 |
186 |
185 (void) printf("BEGIN record\n"); |
187 (void) printf("BEGIN record\n"); |
186 (void) printf("\tversion = %llx\n", |
188 (void) printf("\thdrtype = %lld\n", |
187 (u_longlong_t)drrb->drr_version); |
189 DMU_GET_STREAM_HDRTYPE(drrb->drr_versioninfo)); |
|
190 (void) printf("\tfeatures = %llx\n", |
|
191 DMU_GET_FEATUREFLAGS(drrb->drr_versioninfo)); |
188 (void) printf("\tmagic = %llx\n", |
192 (void) printf("\tmagic = %llx\n", |
189 (u_longlong_t)drrb->drr_magic); |
193 (u_longlong_t)drrb->drr_magic); |
190 (void) printf("\tcreation_time = %llx\n", |
194 (void) printf("\tcreation_time = %llx\n", |
191 (u_longlong_t)drrb->drr_creation_time); |
195 (u_longlong_t)drrb->drr_creation_time); |
192 (void) printf("\ttype = %u\n", drrb->drr_type); |
196 (void) printf("\ttype = %u\n", drrb->drr_type); |
197 (u_longlong_t)drrb->drr_fromguid); |
201 (u_longlong_t)drrb->drr_fromguid); |
198 (void) printf("\ttoname = %s\n", drrb->drr_toname); |
202 (void) printf("\ttoname = %s\n", drrb->drr_toname); |
199 if (verbose) |
203 if (verbose) |
200 (void) printf("\n"); |
204 (void) printf("\n"); |
201 |
205 |
202 if (drrb->drr_version == 2 && |
206 if ((DMU_GET_STREAM_HDRTYPE(drrb->drr_versioninfo) == |
203 drr->drr_payloadlen != 0) { |
207 DMU_COMPOUNDSTREAM) && drr->drr_payloadlen != 0) { |
204 nvlist_t *nv; |
208 nvlist_t *nv; |
205 int sz = drr->drr_payloadlen; |
209 int sz = drr->drr_payloadlen; |
206 |
210 |
207 if (sz > 1<<20) { |
211 if (sz > 1<<20) { |
208 free(buf); |
212 free(buf); |
262 drro->drr_bonustype = |
266 drro->drr_bonustype = |
263 BSWAP_32(drro->drr_bonustype); |
267 BSWAP_32(drro->drr_bonustype); |
264 drro->drr_blksz = BSWAP_32(drro->drr_blksz); |
268 drro->drr_blksz = BSWAP_32(drro->drr_blksz); |
265 drro->drr_bonuslen = |
269 drro->drr_bonuslen = |
266 BSWAP_32(drro->drr_bonuslen); |
270 BSWAP_32(drro->drr_bonuslen); |
|
271 drro->drr_toguid = BSWAP_64(drro->drr_toguid); |
267 } |
272 } |
268 if (verbose) { |
273 if (verbose) { |
269 (void) printf("OBJECT object = %llu type = %u " |
274 (void) printf("OBJECT object = %llu type = %u " |
270 "bonustype = %u blksz = %u bonuslen = %u\n", |
275 "bonustype = %u blksz = %u bonuslen = %u\n", |
271 (u_longlong_t)drro->drr_object, |
276 (u_longlong_t)drro->drr_object, |
284 if (do_byteswap) { |
289 if (do_byteswap) { |
285 drrfo->drr_firstobj = |
290 drrfo->drr_firstobj = |
286 BSWAP_64(drrfo->drr_firstobj); |
291 BSWAP_64(drrfo->drr_firstobj); |
287 drrfo->drr_numobjs = |
292 drrfo->drr_numobjs = |
288 BSWAP_64(drrfo->drr_numobjs); |
293 BSWAP_64(drrfo->drr_numobjs); |
|
294 drrfo->drr_toguid = BSWAP_64(drrfo->drr_toguid); |
289 } |
295 } |
290 if (verbose) { |
296 if (verbose) { |
291 (void) printf("FREEOBJECTS firstobj = %llu " |
297 (void) printf("FREEOBJECTS firstobj = %llu " |
292 "numobjs = %llu\n", |
298 "numobjs = %llu\n", |
293 (u_longlong_t)drrfo->drr_firstobj, |
299 (u_longlong_t)drrfo->drr_firstobj, |
299 if (do_byteswap) { |
305 if (do_byteswap) { |
300 drrw->drr_object = BSWAP_64(drrw->drr_object); |
306 drrw->drr_object = BSWAP_64(drrw->drr_object); |
301 drrw->drr_type = BSWAP_32(drrw->drr_type); |
307 drrw->drr_type = BSWAP_32(drrw->drr_type); |
302 drrw->drr_offset = BSWAP_64(drrw->drr_offset); |
308 drrw->drr_offset = BSWAP_64(drrw->drr_offset); |
303 drrw->drr_length = BSWAP_64(drrw->drr_length); |
309 drrw->drr_length = BSWAP_64(drrw->drr_length); |
|
310 drrw->drr_toguid = BSWAP_64(drrw->drr_toguid); |
304 } |
311 } |
305 if (verbose) { |
312 if (verbose) { |
306 (void) printf("WRITE object = %llu type = %u " |
313 (void) printf("WRITE object = %llu type = %u " |
307 "offset = %llu length = %llu\n", |
314 "offset = %llu length = %llu\n", |
308 (u_longlong_t)drrw->drr_object, |
315 (u_longlong_t)drrw->drr_object, |
310 (u_longlong_t)drrw->drr_offset, |
317 (u_longlong_t)drrw->drr_offset, |
311 (u_longlong_t)drrw->drr_length); |
318 (u_longlong_t)drrw->drr_length); |
312 } |
319 } |
313 (void) ssread(buf, drrw->drr_length, &zc); |
320 (void) ssread(buf, drrw->drr_length, &zc); |
314 total_write_size += drrw->drr_length; |
321 total_write_size += drrw->drr_length; |
|
322 break; |
|
323 |
|
324 case DRR_WRITE_BYREF: |
|
325 if (do_byteswap) { |
|
326 drrwbr->drr_object = |
|
327 BSWAP_64(drrwbr->drr_object); |
|
328 drrwbr->drr_offset = |
|
329 BSWAP_64(drrwbr->drr_offset); |
|
330 drrwbr->drr_length = |
|
331 BSWAP_64(drrwbr->drr_length); |
|
332 drrwbr->drr_toguid = |
|
333 BSWAP_64(drrwbr->drr_toguid); |
|
334 drrwbr->drr_refguid = |
|
335 BSWAP_64(drrwbr->drr_refguid); |
|
336 drrwbr->drr_refobject = |
|
337 BSWAP_64(drrwbr->drr_refobject); |
|
338 drrwbr->drr_refoffset = |
|
339 BSWAP_64(drrwbr->drr_refoffset); |
|
340 } |
|
341 if (verbose) { |
|
342 (void) printf("WRITE_BYREF object = %llu " |
|
343 "offset = %llu length = %llu\n" |
|
344 "toguid = %llx refguid = %llx\n" |
|
345 "refobject = %llu refoffset = %llu\n", |
|
346 (u_longlong_t)drrwbr->drr_object, |
|
347 (u_longlong_t)drrwbr->drr_offset, |
|
348 (u_longlong_t)drrwbr->drr_length, |
|
349 (u_longlong_t)drrwbr->drr_toguid, |
|
350 (u_longlong_t)drrwbr->drr_refguid, |
|
351 (u_longlong_t)drrwbr->drr_refobject, |
|
352 (u_longlong_t)drrwbr->drr_refoffset); |
|
353 } |
315 break; |
354 break; |
316 |
355 |
317 case DRR_FREE: |
356 case DRR_FREE: |
318 if (do_byteswap) { |
357 if (do_byteswap) { |
319 drrf->drr_object = BSWAP_64(drrf->drr_object); |
358 drrf->drr_object = BSWAP_64(drrf->drr_object); |