diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2009-09-25 12:19:37 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2009-09-25 13:33:52 +0200 |
commit | a205b87fa241ebe165da059617007c9263f33d2e (patch) | |
tree | ad265642f07dea51b60208c93dc3b0ba22fe98b5 /lib | |
parent | de14570aea49fcd7a3e0071d37d0ef93a980c4fd (diff) | |
download | barebox-a205b87fa241ebe165da059617007c9263f33d2e.tar.gz barebox-a205b87fa241ebe165da059617007c9263f33d2e.tar.xz |
make copy_file() globally available
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Makefile | 2 | ||||
-rw-r--r-- | lib/copy_file.c | 58 |
2 files changed, 59 insertions, 1 deletions
diff --git a/lib/Makefile b/lib/Makefile index 4b1074d2a4..b5326906e1 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -27,4 +27,4 @@ obj-$(CONFIG_GLOB) += fnmatch.o obj-$(CONFIG_GENERIC_FIND_NEXT_BIT) += find_next_bit.o obj-y += glob.o obj-y += notifier.o - +obj-y += copy_file.o 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; +} + |