summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Olbrich <m.olbrich@pengutronix.de>2019-05-07 07:51:31 +0200
committerMichael Olbrich <m.olbrich@pengutronix.de>2019-05-07 12:40:41 +0200
commit9370489c3cd3e8587f77d4b78e8d067898315f03 (patch)
tree819f2b1d101b086c946c0cdeab97661f0a1fac9b
parent28152c298beb5796625bc5f1cceec7eda18e1d17 (diff)
downloadgenimage-9370489c3cd3e8587f77d4b78e8d067898315f03.tar.gz
genimage-9370489c3cd3e8587f77d4b78e8d067898315f03.tar.xz
util: add helper to extend images to a specified size
Signed-off-by: Michael Olbrich <m.olbrich@pengutronix.de>
-rw-r--r--genimage.h1
-rw-r--r--util.c43
2 files changed, 44 insertions, 0 deletions
diff --git a/genimage.h b/genimage.h
index e339d1d..4afe3b1 100644
--- a/genimage.h
+++ b/genimage.h
@@ -141,6 +141,7 @@ int pad_file(struct image *image, const char *infile,
size_t size, unsigned char fillpattern, enum pad_mode mode);
int insert_data(struct image *image, const char *data, const char *outfile,
size_t size, long offset);
+int extend_file(struct image *image, size_t size);
int reload_partitions(struct image *image);
unsigned long long cfg_getint_suffix(cfg_t *sec, const char *name);
diff --git a/util.c b/util.c
index 2b91a94..e80f1b5 100644
--- a/util.c
+++ b/util.c
@@ -468,6 +468,49 @@ err_out:
return ret;
}
+int extend_file(struct image *image, size_t size)
+{
+ const char *outfile = imageoutfile(image);
+ char buf = '\0';
+ int f;
+ off_t offset;
+ int ret = 0;
+
+ f = open_file(image, outfile, 0);
+ if (f < 0)
+ return f;
+
+ offset = lseek(f, 0, SEEK_END);
+ if (offset < 0) {
+ ret = -errno;
+ image_error(image, "seek: %s\n", strerror(errno));
+ goto out;
+ }
+ if ((size_t)offset > size) {
+ ret = -EINVAL;
+ image_error(image, "output file is larger than requested size\n");
+ goto out;
+ }
+ if ((size_t)offset == size)
+ goto out;
+
+ if (lseek(f, size - 1, SEEK_SET) < 0) {
+ ret = -errno;
+ image_error(image, "seek %s: %s\n", outfile, strerror(errno));
+ goto out;
+ }
+ ret = write(f, &buf, 1);
+ if (ret < 1) {
+ ret = -errno;
+ image_error(image, "write %s: %s\n", outfile, strerror(errno));
+ goto out;
+ }
+ ret = 0;
+out:
+ close(f);
+ return ret;
+}
+
int uuid_validate(const char *str)
{
int i;