summaryrefslogtreecommitdiffstats
path: root/lib/libfile.c
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2021-06-23 06:33:58 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2021-06-23 08:43:00 +0200
commit20643843847c12c2a3689ee7be28f351132a20e0 (patch)
tree7ce3d4bec8f1d1e1fb68eaa529b2953dfbdd8483 /lib/libfile.c
parent9c80942b4b116d54907a51ef168a9f26254e4460 (diff)
downloadbarebox-20643843847c12c2a3689ee7be28f351132a20e0.tar.gz
barebox-20643843847c12c2a3689ee7be28f351132a20e0.tar.xz
libfile: Add copy_fd()
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de> Link: https://lore.barebox.org/20210623043359.18391-3-s.hauer@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'lib/libfile.c')
-rw-r--r--lib/libfile.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/lib/libfile.c b/lib/libfile.c
index 4ab8db11ad..40b1d8bb27 100644
--- a/lib/libfile.c
+++ b/lib/libfile.c
@@ -100,6 +100,29 @@ int read_full(int fd, void *buf, size_t size)
}
EXPORT_SYMBOL(read_full);
+int copy_fd(int in, int out)
+{
+ int bs = 4096, ret;
+ void *buf = malloc(bs);
+
+ if (!buf)
+ return -ENOMEM;
+
+ while (1) {
+ ret = read(in, buf, bs);
+ if (ret <= 0)
+ break;
+
+ ret = write_full(out, buf, ret);
+ if (ret < 0)
+ break;
+ }
+
+ free(buf);
+
+ return ret;
+}
+
/*
* read_file_line - read a line from a file
*