diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2018-01-22 11:17:59 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2018-01-25 08:43:16 +0100 |
commit | 4c3ea0d3355a965b58116f289a6b1214cc66a739 (patch) | |
tree | a1f358757782d4857d2a54711199ff036bfdbe52 /fs/uimagefs.c | |
parent | 0f31aec6dfbe756d900fcf20c5bf0368e56bf771 (diff) | |
download | barebox-4c3ea0d3355a965b58116f289a6b1214cc66a739.tar.gz barebox-4c3ea0d3355a965b58116f289a6b1214cc66a739.tar.xz |
fs/uimagefs: 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 'fs/uimagefs.c')
-rw-r--r-- | fs/uimagefs.c | 37 |
1 files changed, 13 insertions, 24 deletions
diff --git a/fs/uimagefs.c b/fs/uimagefs.c index c0c5750c2c..c120944a46 100644 --- a/fs/uimagefs.c +++ b/fs/uimagefs.c @@ -196,7 +196,6 @@ static void uimagefs_remove(struct device_d *dev) { struct uimagefs_handle *priv = dev->priv; struct uimagefs_handle_data *d, *tmp; - struct stat s; list_for_each_entry_safe(d, tmp, &priv->list, list) { free(d->name); @@ -204,10 +203,11 @@ static void uimagefs_remove(struct device_d *dev) free(d); } - if (IS_BUILTIN(CONFIG_FS_TFTP) && !stat(priv->tmp, &s)) - unlink(priv->tmp); + if (priv->copy) { + unlink(priv->copy); + free(priv->copy); + } - free(priv->tmp); free(priv); } @@ -363,28 +363,21 @@ static int __uimage_open(struct uimagefs_handle *priv) int ret; size_t offset = 0; size_t data_offset = 0; + const char *filename = priv->filename; + + if (is_tftp_fs(filename)) { + ret = cache_file(filename, &priv->copy); + if (ret) + return ret; + filename = priv->copy; + } -again: - fd = open(priv->filename, O_RDONLY); + fd = open(filename, O_RDONLY); if (fd < 0) { printf("could not open: %s\n", errno_str()); return fd; } - /* - * 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(priv->filename, priv->tmp, 0); - if (ret) - return ret; - priv->filename = priv->tmp; - goto again; - } - header = &priv->header; ret = read(fd, header, sizeof(*header)); @@ -514,10 +507,6 @@ static int uimagefs_probe(struct device_d *dev) priv->filename = fsdev->backingstore; dev_dbg(dev, "mount: %s\n", fsdev->backingstore); - if (IS_BUILTIN(CONFIG_FS_TFTP)) - priv->tmp = basprintf("/.uImage_tmp_%08x", - crc32(0, fsdev->path, strlen(fsdev->path))); - ret = __uimage_open(priv); if (ret) goto err; |