diff options
Diffstat (limited to 'lib/copy_file.c')
-rw-r--r-- | lib/copy_file.c | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/lib/copy_file.c b/lib/copy_file.c new file mode 100644 index 0000000000..0ff0435f11 --- /dev/null +++ b/lib/copy_file.c @@ -0,0 +1,58 @@ +#include <common.h> +#include <fs.h> +#include <fcntl.h> +#include <errno.h> +#include <malloc.h> +#define RW_BUF_SIZE (ulong)4096 + +/** + * @param[in] src FIXME + * @param[out] dst FIXME + */ +int copy_file(const char *src, const char *dst) +{ + char *rw_buf = NULL; + int srcfd = 0, dstfd = 0; + int r, w; + int ret = 1; + + rw_buf = xmalloc(RW_BUF_SIZE); + + srcfd = open(src, O_RDONLY); + if (srcfd < 0) { + printf("could not open %s: %s\n", src, errno_str()); + goto out; + } + + dstfd = open(dst, O_WRONLY | O_CREAT); + if (dstfd < 0) { + printf("could not open %s: %s\n", dst, errno_str()); + goto out; + } + + while(1) { + r = read(srcfd, rw_buf, RW_BUF_SIZE); + if (r < 0) { + perror("read"); + goto out; + } + if (!r) + break; + w = write(dstfd, rw_buf, r); + if (w < 0) { + perror("write"); + goto out; + } + } + + ret = 0; +out: + free(rw_buf); + if (srcfd > 0) + close(srcfd); + if (dstfd > 0) + close(dstfd); + + return ret; +} + |