Revision e1da9b24 block/vmdk.c
b/block/vmdk.c | ||
---|---|---|
81 | 81 |
} VmdkExtent; |
82 | 82 |
|
83 | 83 |
typedef struct BDRVVmdkState { |
84 |
int desc_offset; |
|
84 | 85 |
uint32_t parent_cid; |
85 | 86 |
int num_extents; |
86 | 87 |
/* Extent array with num_extents entries, ascend ordered by address */ |
... | ... | |
175 | 176 |
uint32_t cid; |
176 | 177 |
const char *p_name, *cid_str; |
177 | 178 |
size_t cid_str_size; |
179 |
BDRVVmdkState *s = bs->opaque; |
|
178 | 180 |
|
179 |
/* the descriptor offset = 0x200 */ |
|
180 |
if (bdrv_pread(bs->file, 0x200, desc, DESC_SIZE) != DESC_SIZE) |
|
181 |
if (bdrv_pread(bs->file, s->desc_offset, desc, DESC_SIZE) != DESC_SIZE) { |
|
181 | 182 |
return 0; |
183 |
} |
|
182 | 184 |
|
183 | 185 |
if (parent) { |
184 | 186 |
cid_str = "parentCID"; |
... | ... | |
200 | 202 |
{ |
201 | 203 |
char desc[DESC_SIZE], tmp_desc[DESC_SIZE]; |
202 | 204 |
char *p_name, *tmp_str; |
205 |
BDRVVmdkState *s = bs->opaque; |
|
203 | 206 |
|
204 |
/* the descriptor offset = 0x200 */ |
|
205 |
if (bdrv_pread(bs->file, 0x200, desc, DESC_SIZE) != DESC_SIZE) |
|
206 |
return -1; |
|
207 |
memset(desc, 0, sizeof(desc)); |
|
208 |
if (bdrv_pread(bs->file, s->desc_offset, desc, DESC_SIZE) != DESC_SIZE) { |
|
209 |
return -EIO; |
|
210 |
} |
|
207 | 211 |
|
208 | 212 |
tmp_str = strstr(desc,"parentCID"); |
209 | 213 |
pstrcpy(tmp_desc, sizeof(tmp_desc), tmp_str); |
... | ... | |
213 | 217 |
pstrcat(desc, sizeof(desc), tmp_desc); |
214 | 218 |
} |
215 | 219 |
|
216 |
if (bdrv_pwrite_sync(bs->file, 0x200, desc, DESC_SIZE) < 0) |
|
217 |
return -1; |
|
220 |
if (bdrv_pwrite_sync(bs->file, s->desc_offset, desc, DESC_SIZE) < 0) { |
|
221 |
return -EIO; |
|
222 |
} |
|
218 | 223 |
return 0; |
219 | 224 |
} |
220 | 225 |
|
... | ... | |
402 | 407 |
{ |
403 | 408 |
char *p_name; |
404 | 409 |
char desc[DESC_SIZE]; |
410 |
BDRVVmdkState *s = bs->opaque; |
|
405 | 411 |
|
406 |
/* the descriptor offset = 0x200 */ |
|
407 |
if (bdrv_pread(bs->file, 0x200, desc, DESC_SIZE) != DESC_SIZE) |
|
412 |
if (bdrv_pread(bs->file, s->desc_offset, desc, DESC_SIZE) != DESC_SIZE) { |
|
408 | 413 |
return -1; |
414 |
} |
|
409 | 415 |
|
410 | 416 |
if ((p_name = strstr(desc,"parentFileNameHint")) != NULL) { |
411 | 417 |
char *end_name; |
... | ... | |
506 | 512 |
int ret; |
507 | 513 |
uint32_t magic; |
508 | 514 |
VMDK3Header header; |
515 |
BDRVVmdkState *s = bs->opaque; |
|
509 | 516 |
VmdkExtent *extent; |
510 | 517 |
|
518 |
s->desc_offset = 0x200; |
|
511 | 519 |
ret = bdrv_pread(bs->file, sizeof(magic), &header, sizeof(header)); |
512 | 520 |
if (ret < 0) { |
513 | 521 |
goto fail; |
... | ... | |
539 | 547 |
BDRVVmdkState *s = bs->opaque; |
540 | 548 |
VmdkExtent *extent; |
541 | 549 |
|
550 |
s->desc_offset = 0x200; |
|
542 | 551 |
ret = bdrv_pread(bs->file, sizeof(magic), &header, sizeof(header)); |
543 | 552 |
if (ret < 0) { |
544 | 553 |
goto fail; |
Also available in: Unified diff