diff options
author | Simon Glass <sjg@chromium.org> | 2021-11-12 12:28:04 -0700 |
---|---|---|
committer | Simon Glass <sjg@chromium.org> | 2022-01-26 08:50:43 -0700 |
commit | e291a5c9a2acff16ba3b976198bba7da9828c9e9 (patch) | |
tree | c41e834a1be7d72454de82bcb7dc8dc8c7301609 /tools/fit_common.c | |
parent | 195f7893da9608931cfee63bc2f7a6aaa5169049 (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.c | 56 |
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; +} |