summaryrefslogtreecommitdiff
path: root/common/cmd_pxe.c
diff options
context:
space:
mode:
authorRob Herring <rob.herring@calxeda.com>2012-03-28 05:51:36 +0000
committerWolfgang Denk <wd@denx.de>2012-06-21 22:35:15 +0200
commit90ba7d7c444856ca8619ab63e6ed4ab1560f564d (patch)
tree44a9cf40c445d2bf439a270a6e3bdd139402078e /common/cmd_pxe.c
parentbeb9f6c6789edaf0ab20d4105b80299a92f6fdb9 (diff)
downloadu-boot-imx-90ba7d7c444856ca8619ab63e6ed4ab1560f564d.zip
u-boot-imx-90ba7d7c444856ca8619ab63e6ed4ab1560f564d.tar.gz
u-boot-imx-90ba7d7c444856ca8619ab63e6ed4ab1560f564d.tar.bz2
pxe: support absolute paths
If the file path starts with a '/', then don't pre-pend the bootfile path. This fixes a problem with running 'pxe boot' multiple times where the bootfile path gets pre-pended to itself each time. Signed-off-by: Rob Herring <rob.herring@calxeda.com>
Diffstat (limited to 'common/cmd_pxe.c')
-rw-r--r--common/cmd_pxe.c23
1 files changed, 12 insertions, 11 deletions
diff --git a/common/cmd_pxe.c b/common/cmd_pxe.c
index e05af0c..8d2c1e8 100644
--- a/common/cmd_pxe.c
+++ b/common/cmd_pxe.c
@@ -96,24 +96,24 @@ static int format_mac_pxe(char *outbuf, size_t outbuf_len)
* in. If bootfile isn't defined in the environment, return NULL, which should
* be interpreted as "don't prepend anything to paths".
*/
-static int get_bootfile_path(char *bootfile_path, size_t bootfile_path_size)
+static int get_bootfile_path(const char *file_path, char *bootfile_path,
+ size_t bootfile_path_size)
{
char *bootfile, *last_slash;
- size_t path_len;
+ size_t path_len = 0;
+
+ if (file_path[0] == '/')
+ goto ret;
bootfile = from_env("bootfile");
- if (!bootfile) {
- bootfile_path[0] = '\0';
- return 1;
- }
+ if (!bootfile)
+ goto ret;
last_slash = strrchr(bootfile, '/');
- if (last_slash == NULL) {
- bootfile_path[0] = '\0';
- return 1;
- }
+ if (last_slash == NULL)
+ goto ret;
path_len = (last_slash - bootfile) + 1;
@@ -126,6 +126,7 @@ static int get_bootfile_path(char *bootfile_path, size_t bootfile_path_size)
strncpy(bootfile_path, bootfile, path_len);
+ ret:
bootfile_path[path_len] = '\0';
return 1;
@@ -147,7 +148,7 @@ static int get_relfile(char *file_path, void *file_addr)
char *tftp_argv[] = {"tftp", NULL, NULL, NULL};
int err;
- err = get_bootfile_path(relfile, sizeof(relfile));
+ err = get_bootfile_path(file_path, relfile, sizeof(relfile));
if (err < 0)
return err;