diff options
author | marcel <marcel@FreeBSD.org> | 2014-07-28 02:07:16 +0000 |
---|---|---|
committer | marcel <marcel@FreeBSD.org> | 2014-07-28 02:07:16 +0000 |
commit | 37a9f7be2fd32cf24c75d466cacac9ce83a3766b (patch) | |
tree | 66e64f422d8c9a6302c783fe4783cf8ee5e22044 /usr.bin/mkimg/image.c | |
parent | 920342975e733e6db05ffe8353ba9a3d29fffb23 (diff) | |
download | FreeBSD-src-37a9f7be2fd32cf24c75d466cacac9ce83a3766b.zip FreeBSD-src-37a9f7be2fd32cf24c75d466cacac9ce83a3766b.tar.gz |
MFC r268236,268264,268524,268646,268802,269021:
This brings VHD support to mkimg(1); both dynamic and fixed file formats.
Dynamic VHD and VMDK file images are now sparsely written, meaning that
"free" sectors do not occupy space.
Relnotes: yes
Diffstat (limited to 'usr.bin/mkimg/image.c')
-rw-r--r-- | usr.bin/mkimg/image.c | 69 |
1 files changed, 60 insertions, 9 deletions
diff --git a/usr.bin/mkimg/image.c b/usr.bin/mkimg/image.c index e8dc8fe..f448d98 100644 --- a/usr.bin/mkimg/image.c +++ b/usr.bin/mkimg/image.c @@ -94,21 +94,49 @@ image_copyin(lba_t blk, int fd, uint64_t *sizep) int image_copyout(int fd) { + int error; + + error = image_copyout_region(fd, 0, image_size); + if (!error) + error = image_copyout_done(fd); + return (error); +} + +int +image_copyout_done(int fd) +{ + off_t ofs; + int error; + + ofs = lseek(fd, 0L, SEEK_CUR); + if (ofs == -1) + return (0); + error = (ftruncate(fd, ofs) == -1) ? errno : 0; + return (error); +} + +int +image_copyout_region(int fd, lba_t blk, lba_t size) +{ char *buffer; off_t ofs; + size_t sz; ssize_t rdsz, wrsz; int error; ofs = lseek(fd, 0L, SEEK_CUR); - if (lseek(image_fd, 0, SEEK_SET) != 0) + blk *= secsz; + if (lseek(image_fd, blk, SEEK_SET) != blk) return (errno); buffer = malloc(BUFFER_SIZE); if (buffer == NULL) return (errno); error = 0; - while (1) { - rdsz = read(image_fd, buffer, BUFFER_SIZE); + size *= secsz; + while (size > 0) { + sz = (BUFFER_SIZE < size) ? BUFFER_SIZE : size; + rdsz = read(image_fd, buffer, sz); if (rdsz <= 0) { error = (rdsz < 0) ? errno : 0; break; @@ -120,17 +148,40 @@ image_copyout(int fd) error = errno; break; } + assert(wrsz == rdsz); + size -= rdsz; } free(buffer); - if (error) - return (error); - ofs = lseek(fd, 0L, SEEK_CUR); - if (ofs == -1) - return (errno); - error = (ftruncate(fd, ofs) == -1) ? errno : 0; return (error); } +int +image_data(lba_t blk, lba_t size) +{ + char *buffer, *p; + + blk *= secsz; + if (lseek(image_fd, blk, SEEK_SET) != blk) + return (1); + + size *= secsz; + buffer = malloc(size); + if (buffer == NULL) + return (1); + + if (read(image_fd, buffer, size) != (ssize_t)size) { + free(buffer); + return (1); + } + + p = buffer; + while (size > 0 && *p == '\0') + size--, p++; + + free(buffer); + return ((size == 0) ? 0 : 1); +} + lba_t image_get_size(void) { |