summaryrefslogtreecommitdiff
path: root/tools/fit_common.c
diff options
context:
space:
mode:
authorSimon Glass <sjg@chromium.org>2021-11-12 12:28:04 -0700
committerSimon Glass <sjg@chromium.org>2022-01-26 08:50:43 -0700
commite291a5c9a2acff16ba3b976198bba7da9828c9e9 (patch)
treec41e834a1be7d72454de82bcb7dc8dc8c7301609 /tools/fit_common.c
parent195f7893da9608931cfee63bc2f7a6aaa5169049 (diff)
tools: Move copyfile() into a common file
This function is useful in other places. Move it to a common file. Signed-off-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'tools/fit_common.c')
-rw-r--r--tools/fit_common.c56
1 files changed, 56 insertions, 0 deletions
diff --git a/tools/fit_common.c b/tools/fit_common.c
index 5c8920de547..4370de2f61c 100644
--- a/tools/fit_common.c
+++ b/tools/fit_common.c
@@ -119,3 +119,59 @@ err:
return -1;
}
+
+int copyfile(const char *src, const char *dst)
+{
+ int fd_src = -1, fd_dst = -1;
+ void *buf = NULL;
+ ssize_t size;
+ size_t count;
+ int ret = -1;
+
+ fd_src = open(src, O_RDONLY);
+ if (fd_src < 0) {
+ printf("Can't open file %s (%s)\n", src, strerror(errno));
+ goto out;
+ }
+
+ fd_dst = open(dst, O_WRONLY | O_CREAT, 0666);
+ if (fd_dst < 0) {
+ printf("Can't open file %s (%s)\n", dst, strerror(errno));
+ goto out;
+ }
+
+ buf = calloc(1, 512);
+ if (!buf) {
+ printf("Can't allocate buffer to copy file\n");
+ goto out;
+ }
+
+ while (1) {
+ size = read(fd_src, buf, 512);
+ if (size < 0) {
+ printf("Can't read file %s\n", src);
+ goto out;
+ }
+ if (!size)
+ break;
+
+ count = size;
+ size = write(fd_dst, buf, count);
+ if (size < 0) {
+ printf("Can't write file %s\n", dst);
+ goto out;
+ }
+ }
+
+ ret = 0;
+
+ out:
+ if (fd_src >= 0)
+ close(fd_src);
+ if (fd_dst >= 0)
+ close(fd_dst);
+ if (buf)
+ free(buf);
+
+ return ret;
+}