svn commit: r267994 - user/marcel/mkimg

Marcel Moolenaar marcel at FreeBSD.org
Sat Jun 28 04:10:47 UTC 2014


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);


More information about the svn-src-user mailing list