Date: Sat, 28 Jun 2014 04:10:46 +0000 (UTC) From: Marcel Moolenaar <marcel@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r267994 - user/marcel/mkimg Message-ID: <201406280410.s5S4AkIX004194@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: marcel Date: Sat Jun 28 04:10:46 2014 New Revision: 267994 URL: http://svnweb.freebsd.org/changeset/base/267994 Log: Add image_copyout_region(). It allows a format to write chunks of the image interleaved with metadata. Modified: user/marcel/mkimg/image.c user/marcel/mkimg/image.h Modified: user/marcel/mkimg/image.c ============================================================================== --- user/marcel/mkimg/image.c Sat Jun 28 03:59:04 2014 (r267993) +++ user/marcel/mkimg/image.c Sat Jun 28 04:10:46 2014 (r267994) @@ -94,21 +94,42 @@ image_copyin(lba_t blk, int fd, uint64_t int image_copyout(int fd) { + off_t ofs; + int error; + + error = image_copyout_region(fd, 0, image_size); + if (error) + return (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,14 +141,10 @@ 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); } Modified: user/marcel/mkimg/image.h ============================================================================== --- user/marcel/mkimg/image.h Sat Jun 28 03:59:04 2014 (r267993) +++ user/marcel/mkimg/image.h Sat Jun 28 04:10:46 2014 (r267994) @@ -33,6 +33,7 @@ typedef int64_t lba_t; int image_copyin(lba_t blk, int fd, uint64_t *sizep); int image_copyout(int fd); +int image_copyout_region(int fd, lba_t blk, lba_t size); lba_t image_get_size(void); int image_init(void); int image_set_size(lba_t blk);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201406280410.s5S4AkIX004194>