diff options
author | Rob Herring <rob.herring@calxeda.com> | 2012-03-28 05:51:36 +0000 |
---|---|---|
committer | Wolfgang Denk <wd@denx.de> | 2012-06-21 22:35:15 +0200 |
commit | 90ba7d7c444856ca8619ab63e6ed4ab1560f564d (patch) | |
tree | 44a9cf40c445d2bf439a270a6e3bdd139402078e /common | |
parent | beb9f6c6789edaf0ab20d4105b80299a92f6fdb9 (diff) | |
download | talos-obmc-uboot-90ba7d7c444856ca8619ab63e6ed4ab1560f564d.tar.gz talos-obmc-uboot-90ba7d7c444856ca8619ab63e6ed4ab1560f564d.zip |
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')
-rw-r--r-- | common/cmd_pxe.c | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/common/cmd_pxe.c b/common/cmd_pxe.c index e05af0cee3..8d2c1e8665 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; |