summaryrefslogtreecommitdiffstats
path: root/usr.bin/mkimg/image.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.bin/mkimg/image.c')
-rw-r--r--usr.bin/mkimg/image.c69
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)
{
OpenPOWER on IntegriCloud