diff options
author | Michael Olbrich <m.olbrich@pengutronix.de> | 2019-05-07 07:51:31 +0200 |
---|---|---|
committer | Michael Olbrich <m.olbrich@pengutronix.de> | 2019-05-07 12:40:41 +0200 |
commit | 9370489c3cd3e8587f77d4b78e8d067898315f03 (patch) | |
tree | 819f2b1d101b086c946c0cdeab97661f0a1fac9b | |
parent | 28152c298beb5796625bc5f1cceec7eda18e1d17 (diff) | |
download | genimage-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.h | 1 | ||||
-rw-r--r-- | util.c | 43 |
2 files changed, 44 insertions, 0 deletions
@@ -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); @@ -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; |