summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2018-01-22 11:13:27 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2018-01-25 08:29:52 +0100
commite660e511ae29b914cfc47413f5ac1107c2da0693 (patch)
tree56d3303e0d46d603f585b3c97ba85e36b3826952
parent94e561b3648a2c921a6c8faa6c79201c78f8ecfe (diff)
downloadbarebox-e660e511ae29b914cfc47413f5ac1107c2da0693.tar.gz
barebox-e660e511ae29b914cfc47413f5ac1107c2da0693.tar.xz
libfile: implement a function to cache a file
Due to the nature of TFTP which can't lseek and due to the silliness of our filesystem implementation which can't cache accesses we have to manually cache files on TFTP filesystems sometimes. Make it easier for them by providing a cache_file() function which copies the file from TFTP to RAM. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r--include/libfile.h2
-rw-r--r--lib/libfile.c30
2 files changed, 31 insertions, 1 deletions
diff --git a/include/libfile.h b/include/libfile.h
index 6dbb81a241..beec7cff79 100644
--- a/include/libfile.h
+++ b/include/libfile.h
@@ -28,4 +28,6 @@ int unlink_recursive(const char *path, char **failedpath);
char *make_temp(const char *template);
+int cache_file(const char *path, char **newpath);
+
#endif /* __LIBFILE_H */
diff --git a/lib/libfile.c b/lib/libfile.c
index 79054eb5ac..6dce5cbfee 100644
--- a/lib/libfile.c
+++ b/lib/libfile.c
@@ -496,7 +496,7 @@ int open_and_lseek(const char *filename, int mode, loff_t pos)
* create a unique filename.
*
* Return: This function returns a filename which can be used as a temporary
- * file lateron. The returned filename must be freed by the caller.
+ * file later on. The returned filename must be freed by the caller.
*/
char *make_temp(const char *template)
{
@@ -512,3 +512,31 @@ char *make_temp(const char *template)
return name;
}
+
+/**
+ * cache_file - Cache a file in /tmp
+ * @path: The file to cache
+ * @newpath: The return path where the file is copied to
+ *
+ * This function copies a given file to /tmp and returns its name in @newpath.
+ * @newpath is dynamically allocated and must be freed by the caller.
+ *
+ * Return: 0 for success, negative error code otherwise.
+ */
+int cache_file(const char *path, char **newpath)
+{
+ char *npath;
+ int ret;
+
+ npath = make_temp("filecache");
+
+ ret = copy_file(path, npath, 0);
+ if (ret) {
+ free(npath);
+ return ret;
+ }
+
+ *newpath = npath;
+
+ return 0;
+}