diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2018-01-22 11:17:16 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2018-01-25 08:43:16 +0100 |
commit | 0f31aec6dfbe756d900fcf20c5bf0368e56bf771 (patch) | |
tree | 3e4c2a88dbd82f8a5ac212648e8b1376dc51e07b /common | |
parent | 220e92bc20a74dd005ecf057d7de25e8db8b9b25 (diff) | |
download | barebox-0f31aec6dfbe756d900fcf20c5bf0368e56bf771.tar.gz barebox-0f31aec6dfbe756d900fcf20c5bf0368e56bf771.tar.xz |
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 <s.hauer@pengutronix.de>
Diffstat (limited to 'common')
-rw-r--r-- | common/uimage.c | 47 |
1 files changed, 22 insertions, 25 deletions
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); |