fs: fix number base behaviour change in fatload/ext*load
authorStephen Warren <swarren@nvidia.com>
Tue, 30 Oct 2012 12:04:19 +0000 (12:04 +0000)
committerTom Rini <trini@ti.com>
Sun, 4 Nov 2012 18:00:31 +0000 (11:00 -0700)
Commit 045fa1e "fs: add filesystem switch libary, implement ls and
fsload commands" unified the implementation of fatload and ext*load
with the new command fsload. However, this altered the interpretation
of command-line numbers from always being base-16, to requiring a "0x"
prefix for base-16 numbers. Enhance do_fsload() to allow commands to
specify which base to use.

Use base 0, thus requiring a "0x" prefix for the new fsload command.
This feels much cleaner than assuming base 16.

Use base 16 for the pre-existing fatload and ext*load to prevent a
change in behaviour.

Use base 16 exclusively for the loadaddr environment variable, since
that variable is interpreted in multiple places, so we don't want the
behaviour to change.

Update command help text to make it clear where numbers are assumed to
be hex, and where an explicit "0x" prefix is required.

Signed-off-by: Stephen Warren <swarren@nvidia.com>
Reviewed-by: Benoît Thébaudeau <benoit.thebaudeau@advansee.com>
common/cmd_ext2.c
common/cmd_ext4.c
common/cmd_fat.c
common/cmd_fs.c
fs/fs.c
include/fs.h

index 06d0234a47e27cbf9a1e4e24be972cdc873c7976..7f225987a0d838368c2b5e5f9066b043479484c5 100644 (file)
@@ -49,7 +49,7 @@ int do_ext2ls (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
  */
 int do_ext2load (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 {
-       return do_fsload(cmdtp, flag, argc, argv, FS_TYPE_EXT);
+       return do_fsload(cmdtp, flag, argc, argv, FS_TYPE_EXT, 16);
 }
 
 U_BOOT_CMD(
@@ -64,5 +64,6 @@ U_BOOT_CMD(
        "load binary file from a Ext2 filesystem",
        "<interface> <dev[:part]> [addr] [filename] [bytes]\n"
        "    - load binary file 'filename' from 'dev' on 'interface'\n"
-       "      to address 'addr' from ext2 filesystem"
+       "      to address 'addr' from ext2 filesystem.\n"
+       "      All numeric parameters are assumed to be hex."
 );
index b4a154ffebabf4b0a3fc2bb6290c2640098336d4..b50bd0ae9a034353b4b358981d6f128d3b8c8c72 100644 (file)
@@ -59,7 +59,7 @@
 int do_ext4_load(cmd_tbl_t *cmdtp, int flag, int argc,
                                                char *const argv[])
 {
-       return do_fsload(cmdtp, flag, argc, argv, FS_TYPE_EXT);
+       return do_fsload(cmdtp, flag, argc, argv, FS_TYPE_EXT, 16);
 }
 
 int do_ext4_ls(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
@@ -136,4 +136,5 @@ U_BOOT_CMD(ext4load, 6, 0, do_ext4_load,
           "load binary file from a Ext4 filesystem",
           "<interface> <dev[:part]> [addr] [filename] [bytes]\n"
           "    - load binary file 'filename' from 'dev' on 'interface'\n"
-          "      to address 'addr' from ext4 filesystem");
+          "      to address 'addr' from ext4 filesystem.\n"
+          "      All numeric parameters are assumed to be hex.");
index c865d6d8a2a3536e74a35b4812470a9f747fcff5..82804838d54b1442b52db998598e2e0d9c8797fd 100644 (file)
@@ -35,7 +35,7 @@
 
 int do_fat_fsload (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 {
-       return do_fsload(cmdtp, flag, argc, argv, FS_TYPE_FAT);
+       return do_fsload(cmdtp, flag, argc, argv, FS_TYPE_FAT, 16);
 }
 
 
@@ -48,7 +48,8 @@ U_BOOT_CMD(
        "      'pos' gives the file position to start loading from.\n"
        "      If 'pos' is omitted, 0 is used. 'pos' requires 'bytes'.\n"
        "      'bytes' gives the size to load. If 'bytes' is 0 or omitted,\n"
-       "      the load stops on end of file."
+       "      the load stops on end of file.\n"
+       "      All numeric parameters are assumed to be hex."
 );
 
 int do_fat_ls (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
index 296124b995ea9ec7bc8fa6d97422616ec7b27524..46fcef78eeb24ddcbc343aa678243cf88984d0f0 100644 (file)
@@ -22,7 +22,7 @@
 
 int do_fsload_wrapper(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 {
-       return do_fsload(cmdtp, flag, argc, argv, FS_TYPE_ANY);
+       return do_fsload(cmdtp, flag, argc, argv, FS_TYPE_ANY, 0);
 }
 
 U_BOOT_CMD(
@@ -34,7 +34,9 @@ U_BOOT_CMD(
        "      'bytes' gives the size to load in bytes.\n"
        "      If 'bytes' is 0 or omitted, the file is read until the end.\n"
        "      'pos' gives the file byte position to start reading from.\n"
-       "      If 'pos' is 0 or omitted, the file is read from the start."
+       "      If 'pos' is 0 or omitted, the file is read from the start.\n"
+       "      All numeric parameters are assumed to be decimal,\n"
+       "      unless specified otherwise using a leading \"0x\"."
 );
 
 int do_ls_wrapper(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
diff --git a/fs/fs.c b/fs/fs.c
index f570312610fb7684f97db031f64ddab25298e396..1553af59d3733e24faf7396906329cf991d677fa 100644 (file)
--- a/fs/fs.c
+++ b/fs/fs.c
@@ -248,7 +248,7 @@ int fs_read(const char *filename, ulong addr, int offset, int len)
 }
 
 int do_fsload(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],
-               int fstype)
+               int fstype, int cmdline_base)
 {
        unsigned long addr;
        const char *addr_str;
@@ -267,7 +267,7 @@ int do_fsload(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],
                return 1;
 
        if (argc >= 4) {
-               addr = simple_strtoul(argv[3], NULL, 0);
+               addr = simple_strtoul(argv[3], NULL, cmdline_base);
        } else {
                addr_str = getenv("loadaddr");
                if (addr_str != NULL)
@@ -285,11 +285,11 @@ int do_fsload(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],
                }
        }
        if (argc >= 6)
-               bytes = simple_strtoul(argv[5], NULL, 0);
+               bytes = simple_strtoul(argv[5], NULL, cmdline_base);
        else
                bytes = 0;
        if (argc >= 7)
-               pos = simple_strtoul(argv[6], NULL, 0);
+               pos = simple_strtoul(argv[6], NULL, cmdline_base);
        else
                pos = 0;
 
index f396d8492a512f4cb9fee2324b050d3babd949d3..c3ac7ccc0d9dbfd972443da200ef463a0a86c269 100644 (file)
@@ -58,7 +58,7 @@ int fs_read(const char *filename, ulong addr, int offset, int len);
  * to a specific filesystem type via the fstype parameter.
  */
 int do_fsload(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],
-               int fstype);
+               int fstype, int cmdline_base);
 int do_ls(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],
                int fstype);