]> git.sur5r.net Git - u-boot/commitdiff
pxe: support absolute paths
authorRob Herring <rob.herring@calxeda.com>
Wed, 28 Mar 2012 05:51:36 +0000 (05:51 +0000)
committerWolfgang Denk <wd@denx.de>
Thu, 21 Jun 2012 20:35:15 +0000 (22:35 +0200)
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>
common/cmd_pxe.c

index e05af0cee331927ba99d2dccd75f3211e2d5501b..8d2c1e8665e6a23137789dcaa7666eed6ff562e0 100644 (file)
@@ -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;