From 0f31aec6dfbe756d900fcf20c5bf0368e56bf771 Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Mon, 22 Jan 2018 11:17:16 +0100 Subject: uimage: Use is_tftp_fs() and cache_file() to ease TFTP workaround We have helper functions now to ease file caching when a file is on TFTP. Use them. Signed-off-by: Sascha Hauer --- common/uimage.c | 47 ++++++++++++++++++++++------------------------- 1 file changed, 22 insertions(+), 25 deletions(-) (limited to 'common/uimage.c') diff --git a/common/uimage.c b/common/uimage.c index e857c11d37..3273bc1871 100644 --- a/common/uimage.c +++ b/common/uimage.c @@ -85,8 +85,6 @@ ssize_t uimage_get_size(struct uimage_handle *handle, unsigned int image_no) } EXPORT_SYMBOL(uimage_get_size); -static const char uimage_tmp[] = "/.uImage_tmp"; - /* * open a uimage. This will check the header contents and * return a handle to the uImage @@ -99,32 +97,27 @@ struct uimage_handle *uimage_open(const char *filename) struct image_header *header; int i; int ret; - struct stat s; + char *copy = NULL; + + if (is_tftp_fs(filename)) { + ret = cache_file(filename, ©); + if (ret) + return NULL; + filename = copy; + } -again: fd = open(filename, O_RDONLY); if (fd < 0) { printf("could not open: %s\n", errno_str()); + free(copy); return NULL; } - /* - * Hack around tftp fs. We need lseek for uImage support, but - * this cannot be implemented in tftp fs, so we detect this - * and copy the file to ram if it fails - */ - if (IS_BUILTIN(CONFIG_FS_TFTP) && !can_lseek_backward(fd)) { - close(fd); - ret = copy_file(filename, uimage_tmp, 0); - if (ret) - return NULL; - filename = uimage_tmp; - goto again; - } - handle = xzalloc(sizeof(struct uimage_handle)); header = &handle->header; + handle->copy = copy; + if (read(fd, header, sizeof(*header)) < 0) { printf("could not read: %s\n", errno_str()); goto err_out; @@ -204,9 +197,12 @@ err_out: close(fd); free(handle->name); + if (handle->copy) { + unlink(handle->copy); + free(handle->copy); + } free(handle); - if (IS_BUILTIN(CONFIG_FS_TFTP) && !stat(uimage_tmp, &s)) - unlink(uimage_tmp); + return NULL; } EXPORT_SYMBOL(uimage_open); @@ -216,14 +212,15 @@ EXPORT_SYMBOL(uimage_open); */ void uimage_close(struct uimage_handle *handle) { - struct stat s; - close(handle->fd); + + if (handle->copy) { + unlink(handle->copy); + free(handle->copy); + } + free(handle->name); free(handle); - - if (IS_BUILTIN(CONFIG_FS_TFTP) && !stat(uimage_tmp, &s)) - unlink(uimage_tmp); } EXPORT_SYMBOL(uimage_close); -- cgit v1.2.3