summaryrefslogtreecommitdiffstats
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
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>
-rw-r--r--include/libfile.h1
-rw-r--r--lib/libfile.c23
2 files changed, 24 insertions, 0 deletions
diff --git a/include/libfile.h b/include/libfile.h
index 350ddddf70..3c2fe1714d 100644
--- a/include/libfile.h
+++ b/include/libfile.h
@@ -5,6 +5,7 @@
int pwrite_full(int fd, const void *buf, size_t size, loff_t offset);
int write_full(int fd, const void *buf, size_t size);
int read_full(int fd, void *buf, size_t size);
+int copy_fd(int in, int out);
char *read_file_line(const char *fmt, ...);
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
*