Revision 1640366c
b/block/vmdk.c | ||
---|---|---|
233 | 233 |
memset(&header, 0, sizeof(header)); |
234 | 234 |
memcpy(&header,&hdr[4], sizeof(header)); // skip the VMDK4_MAGIC |
235 | 235 |
|
236 |
ftruncate(snp_fd, header.grain_offset << 9); |
|
236 |
if (ftruncate(snp_fd, header.grain_offset << 9)) |
|
237 |
goto fail; |
|
237 | 238 |
/* the descriptor offset = 0x200 */ |
238 | 239 |
if (lseek(p_fd, 0x200, SEEK_SET) == -1) |
239 | 240 |
goto fail; |
... | ... | |
717 | 718 |
int64_t total_size = 0; |
718 | 719 |
const char *backing_file = NULL; |
719 | 720 |
int flags = 0; |
721 |
int ret; |
|
720 | 722 |
|
721 | 723 |
// Read out options |
722 | 724 |
while (options && options->name) { |
... | ... | |
773 | 775 |
header.check_bytes[3] = 0xa; |
774 | 776 |
|
775 | 777 |
/* write all the data */ |
776 |
write(fd, &magic, sizeof(magic)); |
|
777 |
write(fd, &header, sizeof(header)); |
|
778 |
ret = qemu_write_full(fd, &magic, sizeof(magic)); |
|
779 |
if (ret != sizeof(magic)) { |
|
780 |
ret = -1; |
|
781 |
goto exit; |
|
782 |
} |
|
783 |
ret = qemu_write_full(fd, &header, sizeof(header)); |
|
784 |
if (ret != sizeof(header)) { |
|
785 |
ret = -1; |
|
786 |
goto exit; |
|
787 |
} |
|
778 | 788 |
|
779 |
ftruncate(fd, header.grain_offset << 9); |
|
789 |
ret = ftruncate(fd, header.grain_offset << 9); |
|
790 |
if (ret < 0) { |
|
791 |
ret = -1; |
|
792 |
goto exit; |
|
793 |
} |
|
780 | 794 |
|
781 | 795 |
/* write grain directory */ |
782 | 796 |
lseek(fd, le64_to_cpu(header.rgd_offset) << 9, SEEK_SET); |
783 | 797 |
for (i = 0, tmp = header.rgd_offset + gd_size; |
784 |
i < gt_count; i++, tmp += gt_size) |
|
785 |
write(fd, &tmp, sizeof(tmp)); |
|
798 |
i < gt_count; i++, tmp += gt_size) { |
|
799 |
ret = qemu_write_full(fd, &tmp, sizeof(tmp)); |
|
800 |
if (ret != sizeof(tmp)) { |
|
801 |
ret = -1; |
|
802 |
goto exit; |
|
803 |
} |
|
804 |
} |
|
786 | 805 |
|
787 | 806 |
/* write backup grain directory */ |
788 | 807 |
lseek(fd, le64_to_cpu(header.gd_offset) << 9, SEEK_SET); |
789 | 808 |
for (i = 0, tmp = header.gd_offset + gd_size; |
790 |
i < gt_count; i++, tmp += gt_size) |
|
791 |
write(fd, &tmp, sizeof(tmp)); |
|
809 |
i < gt_count; i++, tmp += gt_size) { |
|
810 |
ret = qemu_write_full(fd, &tmp, sizeof(tmp)); |
|
811 |
if (ret != sizeof(tmp)) { |
|
812 |
ret = -1; |
|
813 |
goto exit; |
|
814 |
} |
|
815 |
} |
|
792 | 816 |
|
793 | 817 |
/* compose the descriptor */ |
794 | 818 |
real_filename = filename; |
... | ... | |
805 | 829 |
|
806 | 830 |
/* write the descriptor */ |
807 | 831 |
lseek(fd, le64_to_cpu(header.desc_offset) << 9, SEEK_SET); |
808 |
write(fd, desc, strlen(desc)); |
|
832 |
ret = qemu_write_full(fd, desc, strlen(desc)); |
|
833 |
if (ret != strlen(desc)) { |
|
834 |
ret = -1; |
|
835 |
goto exit; |
|
836 |
} |
|
809 | 837 |
|
838 |
ret = 0; |
|
839 |
exit: |
|
810 | 840 |
close(fd); |
811 |
return 0;
|
|
841 |
return ret;
|
|
812 | 842 |
} |
813 | 843 |
|
814 | 844 |
static void vmdk_close(BlockDriverState *bs) |
Also available in: Unified diff