diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2012-02-10 21:38:56 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2012-02-19 18:51:03 +0100 |
commit | 3ac63c6388cf022de7c1de15fe4933ac155e84d7 (patch) | |
tree | 735cbc92894c3b5dc73102abf63b84bcdd3fe25a | |
parent | abd21d1f67d092d845ef3be621f98121c9416ef9 (diff) | |
download | barebox-3ac63c6388cf022de7c1de15fe4933ac155e84d7.tar.gz barebox-3ac63c6388cf022de7c1de15fe4933ac155e84d7.tar.xz |
make uimages work on tftpfs
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r-- | common/uimage.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/common/uimage.c b/common/uimage.c index 28791b5413..4933c40583 100644 --- a/common/uimage.c +++ b/common/uimage.c @@ -94,6 +94,8 @@ size_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 @@ -106,13 +108,29 @@ struct uimage_handle *uimage_open(const char *filename) struct image_header *header; int i; int ret; + struct stat s; +again: fd = open(filename, O_RDONLY); if (fd < 0) { printf("could not open: %s\n", errno_str()); return NULL; } + /* + * Hack around tftp fs. We need lseek for uImage support, but + * this cannot be implemented in tftp fs, so we detect this + * by doing a test lseek and copy the file to ram if it fails + */ + if (IS_BUILTIN(CONFIG_FS_TFTP) && lseek(fd, 0, SEEK_SET)) { + 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; @@ -194,6 +212,8 @@ struct uimage_handle *uimage_open(const char *filename) err_out: close(fd); free(handle); + if (IS_BUILTIN(CONFIG_FS_TFTP) && !stat(uimage_tmp, &s)) + unlink(uimage_tmp); return NULL; } EXPORT_SYMBOL(uimage_open); @@ -203,9 +223,14 @@ EXPORT_SYMBOL(uimage_open); */ void uimage_close(struct uimage_handle *handle) { + struct stat s; + close(handle->fd); free(handle->name); free(handle); + + if (IS_BUILTIN(CONFIG_FS_TFTP) && !stat("/.uimage_tmp", &s)) + unlink("/.uimage_tmp"); } EXPORT_SYMBOL(uimage_close); |