[PATCH 1/7] libfile: introduce copy_file_2 for copying starting with offset

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



barebox already has a copy_file for copying files. Extend the API by a
copy_file_2 that takes a source offset into account.

This is useful for handling SoC-specific image formats which have a
fixed-size header, as copy_file_2 can now skip that header and create a
file with the full barebox image in one go.

Signed-off-by: Ahmad Fatoum <a.fatoum@xxxxxxxxxxxxxx>
---
 include/libfile.h |  1 +
 lib/libfile.c     | 25 +++++++++++++++++++------
 2 files changed, 20 insertions(+), 6 deletions(-)

diff --git a/include/libfile.h b/include/libfile.h
index f1d695187790..02269f4877e6 100644
--- a/include/libfile.h
+++ b/include/libfile.h
@@ -16,6 +16,7 @@ int write_file(const char *filename, const void *buf, size_t size);
 int write_file_flash(const char *filename, const void *buf, size_t size);
 
 int copy_file(const char *src, const char *dst, int verbose);
+int copy_file_2(const char *src, const char *dst, loff_t pos, int verbose);
 
 int copy_recursive(const char *src, const char *dst);
 
diff --git a/lib/libfile.c b/lib/libfile.c
index b42753c2b5ea..4bc980816a67 100644
--- a/lib/libfile.c
+++ b/lib/libfile.c
@@ -318,14 +318,15 @@ out_close:
 EXPORT_SYMBOL(write_file_flash);
 
 /**
- * copy_file - Copy a file
+ * copy_file_2 - Copy a file
  * @src:	The source filename
  * @dst:	The destination filename
+ * @pos:	source file position to start reading at
  * @verbose:	if true, show a progression bar
  *
  * Return: 0 for success or negative error code
  */
-int copy_file(const char *src, const char *dst, int verbose)
+int copy_file_2(const char *src, const char *dst, loff_t pos, int verbose)
 {
 	char *rw_buf = NULL;
 	int srcfd = 0, dstfd = 0;
@@ -337,11 +338,9 @@ int copy_file(const char *src, const char *dst, int verbose)
 
 	rw_buf = xmalloc(RW_BUF_SIZE);
 
-	srcfd = open(src, O_RDONLY);
-	if (srcfd < 0) {
-		printf("could not open %s: %s\n", src, errno_str());
+	srcfd = open_and_lseek(src, O_RDONLY, pos);
+	if (srcfd < 0)
 		goto out;
-	}
 
 	mode = O_WRONLY | O_CREAT;
 
@@ -403,6 +402,20 @@ out:
 
 	return ret ?: err1;
 }
+EXPORT_SYMBOL(copy_file_2);
+
+/**
+ * copy_file - Copy a file
+ * @src:	The source filename
+ * @dst:	The destination filename
+ * @verbose:	if true, show a progression bar
+ *
+ * Return: 0 for success or negative error code
+ */
+int copy_file(const char *src, const char *dst, int verbose)
+{
+	return copy_file_2(src, dst, 0, verbose);
+}
 EXPORT_SYMBOL(copy_file);
 
 int copy_recursive(const char *src, const char *dst)
-- 
2.23.0


_______________________________________________
barebox mailing list
barebox@xxxxxxxxxxxxxxxxxxx
http://lists.infradead.org/mailman/listinfo/barebox



[Index of Archives]     [Linux Embedded]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux