df: implement -B n<suff> and -B <suff> formats of -B option
authorDenys Vlasenko <vda.linux@googlemail.com>
Mon, 12 Dec 2016 18:56:31 +0000 (19:56 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Mon, 12 Dec 2016 18:56:31 +0000 (19:56 +0100)
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
coreutils/df.c
include/libbb.h
libbb/xatonum.c
util-linux/fstrim.c

index fdcdae6752d5d7287aef138072775b4aea3dd128..79e4c4670af9dffbdde855ccbb81d84c607b8ffa 100644 (file)
@@ -129,8 +129,19 @@ int df_main(int argc UNUSED_PARAM, char **argv)
        if (opt & OPT_MEGA)
                df_disp_hr = 1024*1024;
 
-       if (opt & OPT_BSIZE)
-               df_disp_hr = xatoul_range(chp, 1, ULONG_MAX); /* disallow 0 */
+       if (opt & OPT_BSIZE) {
+               /* GNU coreutils 8.25 accepts "-BMiB" form too */
+               int i;
+               for (i = 0; kmg_i_suffixes[i].suffix[0]; i++) {
+                       if (strcmp(kmg_i_suffixes[i].suffix, chp) == 0) {
+                               df_disp_hr = kmg_i_suffixes[i].mult;
+                               goto got_it;
+                       }
+               }
+               /* Range used to disallow 0 */
+               df_disp_hr = xatoul_range_sfx(chp, 1, ULONG_MAX, kmg_i_suffixes);
+ got_it: ;
+       }
 
        /* From the manpage of df from coreutils-6.10:
         * Disk space is shown in 1K blocks by default, unless the environment
@@ -203,6 +214,11 @@ int df_main(int argc UNUSED_PARAM, char **argv)
                        bb_simple_perror_msg(mount_point);
                        goto set_error;
                }
+               /* Some uclibc versions were seen to lose f_frsize
+                * (kernel does return it, but then uclibc does not copy it)
+                */
+               if (s.f_frsize == 0)
+                       s.f_frsize = s.f_bsize;
 
                if ((s.f_blocks > 0) || !mount_table || (opt & OPT_ALL)) {
                        if (opt & OPT_INODE) {
index b1fec01577fb0608fffcbca00c772abe445e0364..abdc8c2b82174c9ac82c0b107d4bcca4ee021466 100644 (file)
@@ -923,6 +923,7 @@ extern const struct suffix_mult bkm_suffixes[];
 #define km_suffixes (bkm_suffixes + 1)
 extern const struct suffix_mult cwbkMG_suffixes[];
 #define kMG_suffixes (cwbkMG_suffixes + 3)
+extern const struct suffix_mult kmg_i_suffixes[];
 
 #include "xatonum.h"
 /* Specialized: */
index 9dd5c3e7e665dcf13cb1b72ceb01c09b7baf5e66..b63b7f54d4185b80dd2649240e86e29a3cf4dab9 100644 (file)
@@ -96,3 +96,22 @@ const struct suffix_mult cwbkMG_suffixes[] = {
        /* coreutils also understands TPEZY suffixes for tera- and so on, with B suffix for decimal */
        { "", 0 }
 };
+
+const struct suffix_mult kmg_i_suffixes[] = {
+       { "KiB", 1024 },
+       { "kiB", 1024 },
+       { "K", 1024 },
+       { "k", 1024 },
+       { "MiB", 1048576 },
+       { "miB", 1048576 },
+       { "M", 1048576 },
+       { "m", 1048576 },
+       { "GiB", 1073741824 },
+       { "giB", 1073741824 },
+       { "G", 1073741824 },
+       { "g", 1073741824 },
+       { "KB", 1000 },
+       { "MB", 1000000 },
+       { "GB", 1000000000 },
+       { "", 0 }
+};
index 51400ef0b0d228f4c8ef557c74545bddfdd2ed27..fc51878b6e26f98f6b0243987dea4cd92df7a123 100644 (file)
@@ -47,25 +47,6 @@ struct fstrim_range {
 #define FITRIM         _IOWR('X', 121, struct fstrim_range)
 #endif
 
-static const struct suffix_mult fstrim_sfx[] = {
-       { "KiB", 1024 },
-       { "kiB", 1024 },
-       { "K", 1024 },
-       { "k", 1024 },
-       { "MiB", 1048576 },
-       { "miB", 1048576 },
-       { "M", 1048576 },
-       { "m", 1048576 },
-       { "GiB", 1073741824 },
-       { "giB", 1073741824 },
-       { "G", 1073741824 },
-       { "g", 1073741824 },
-       { "KB", 1000 },
-       { "MB", 1000000 },
-       { "GB", 1000000000 },
-       { "", 0 }
-};
-
 int fstrim_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 int fstrim_main(int argc UNUSED_PARAM, char **argv)
 {
@@ -98,11 +79,11 @@ int fstrim_main(int argc UNUSED_PARAM, char **argv)
        range.len = ULLONG_MAX;
 
        if (opts & OPT_o)
-               range.start = xatoull_sfx(arg_o, fstrim_sfx);
+               range.start = xatoull_sfx(arg_o, kmg_i_suffixes);
        if (opts & OPT_l)
-               range.len = xatoull_sfx(arg_l, fstrim_sfx);
+               range.len = xatoull_sfx(arg_l, kmg_i_suffixes);
        if (opts & OPT_m)
-               range.minlen = xatoull_sfx(arg_m, fstrim_sfx);
+               range.minlen = xatoull_sfx(arg_m, kmg_i_suffixes);
 
        mp = argv[optind];
        if (find_block_device(mp)) {