Add HUMAN_READABLE define for -m and -h support in du, df, and ls
authorRichard June <rjune@bravegnuworld.com>
Mon, 22 Jan 2001 22:35:38 +0000 (22:35 -0000)
committerRichard June <rjune@bravegnuworld.com>
Mon, 22 Jan 2001 22:35:38 +0000 (22:35 -0000)
Add support for -k in du, df, and ls(no define, it's for compatibliity with the GNU utils as bb does -k by default)
Fix bug #1084

12 files changed:
Config.h
applets/usage.c
busybox.h
coreutils/df.c
coreutils/du.c
coreutils/ls.c
df.c
du.c
include/busybox.h
ls.c
usage.c
utility.c

index a2a2366a3333b6aecc662f6daef109d610e66192..cfdb52f31d693980e12617ccfda1be579c15cb73 100644 (file)
--- a/Config.h
+++ b/Config.h
 // have a really good reason for cleaning things up manually.
 //#define BB_FEATURE_CLEAN_UP
 //
+// Support for human readable output by ls, du, etc.(example 13k, 23M, 235G)
+#define BB_FEATURE_HUMAN_READABLE
+//
 // End of Features List
 //
 //
index 864891797c5dc245c904a3bf7c85c9c8005963a1..9ae2bb3ef6aeb4b68d607455bfb0cc8b95d20e55 100644 (file)
@@ -190,9 +190,22 @@ const char deallocvt_usage[] =
 
 #if defined BB_DF
 const char df_usage[] =
-       "df [filesystem ...]"
+       "df [-?"
+#ifdef BB_FEATURE_HUMAN_READABLE
+       "hm"
+#endif
+       "k] [filesystem ...]\n"
 #ifndef BB_FEATURE_TRIVIAL_HELP
        "\n\nPrint the filesystem space used and space available."
+       "Options:\n"
+       "\t-?\tshow usage information\n"
+#ifdef BB_FEATURE_HUMAN_READABLE
+       "\t-h\tprint sizes in human readable format (e.g., 1K 243M 2G )\n"
+       "\t-m\tprint sizes in megabytes\n"
+       "\t-k\tprint sizes in kilobytes(default)\n"
+#else
+       "\t-k\tprint sizes in kilobytes(compatability)\n"
+#endif
 #endif
        ;
 #endif
@@ -244,13 +257,25 @@ const char dpkg_deb_usage[] =
 
 #if defined BB_DU
 const char du_usage[] =
-       "du [OPTION]... [FILE]..."
+       "du [-?ls"
+#ifdef BB_FEATURE_HUMAN_READABLE
+       "hm"
+#endif
+       "k] [FILE]...\n"
 #ifndef BB_FEATURE_TRIVIAL_HELP
        "\n\nSummarizes disk space used for each FILE and/or directory.\n"
        "Disk space is printed in units of 1024 bytes.\n\n"
        "Options:\n"
+        "\t-?\tshow usage information\n"
        "\t-l\tcount sizes many times if hard linked\n"
        "\t-s\tdisplay only a total for each argument"
+#ifdef BB_FEATURE_HUMAN_READABLE
+       "\t-h\tprint sizes in human readable format (e.g., 1K 243M 2G )\n"
+       "\t-m\tprint sizes in megabytes\n"
+       "\t-k\tprint sizes in kilobytes(default)\n"
+#else
+       "\t-k\tprint sizes in kilobytes(compatability)\n"
+#endif
 #endif
        ;
 #endif
@@ -661,7 +686,10 @@ const char ls_usage[] =
 #ifdef BB_FEATURE_LS_SORTFILES
        "X"
 #endif
-       "] [filenames...]"
+#ifdef BB_FEATURE_HUMAN_READABLE
+       "h"
+#endif
+       "k] [filenames...]\n"
 #ifndef BB_FEATURE_TRIVIAL_HELP
        "\n\nList directory contents\n\n"
        "Options:\n"
@@ -716,6 +744,14 @@ const char ls_usage[] =
 #ifdef BB_FEATURE_LS_SORTFILES
        "\t-X\tsort the listing by extension\n"
 #endif
+
+#ifdef BB_FEATURE_HUMAN_READABLE
+       "\t-h\tprint sizes in human readable format (e.g., 1K 243M 2G )\n"
+       "\t-k\tprint sizes in kilobytes(default)\n"
+#else
+       "\t-k\tprint sizes in kilobytes(compatability)"
+#endif
+
 #endif /*  BB_FEATURE_TRIVIAL_HELP */
        ;
 #endif /* BB_LS */
index a89ac3694777ef488a6b350c54cbdf1fa9185bab..018c636cfdf10d2517ae17f2b6875401da5de120 100644 (file)
--- a/busybox.h
+++ b/busybox.h
@@ -259,4 +259,11 @@ extern int sysinfo (struct sysinfo* info);
 #define isclr(a,i)      (((a)[(i)/NBBY] & (1<<((i)%NBBY))) == 0)
 #endif
 
+#ifdef BB_FEATURE_HUMAN_READABLE
+char *format(unsigned long val, unsigned long hr);
+#define KILOBYTE 1024
+#define MEGABYTE (KILOBYTE*1024)
+#define GIGABYTE (MEGABYTE*1024)
+#endif
+
 #endif /* _BB_INTERNAL_H_ */
index dc4849049e3b7819cd5a458b11019d445611c2a8..aa04682a756ab853a6f6f2a9c6359b74da943bfe 100644 (file)
@@ -28,6 +28,9 @@
 #include <sys/vfs.h>
 
 extern const char mtab_file[]; /* Defined in utility.c */
+#ifdef BB_FEATURE_HUMAN_READABLE
+unsigned long disp_hr = KILOBYTE; 
+#endif
 
 static int df(char *device, const char *mountPoint)
 {
@@ -42,19 +45,32 @@ static int df(char *device, const char *mountPoint)
 
        if (s.f_blocks > 0) {
                blocks_used = s.f_blocks - s.f_bfree;
-               blocks_percent_used = (long)
-                       (blocks_used * 100.0 / (blocks_used + s.f_bavail) + 0.5);
+               if(0 == blocks_used)
+                       blocs_percent_used = 0;
+               else
+                       blocks_percent_used = (long)
+                         (blocks_used * 100.0 / (blocks_used + s.f_bavail) + 0.5);
                if (strcmp(device, "/dev/root") == 0) {
                        /* Adjusts device to be the real root device,
                         * or leaves device alone if it can't find it */
                        find_real_root_device_name( device);
                }
+#ifdef BB_FEATURE_HUMAN_READABLE
+               printf("%-20s %9s",
+                          device,
+                          format((s.f_blocks * s.f_bsize), disp_hr));
+               printf(" %9s", format((s.f_blocks - s.f_bfree) * s.f_bsize, disp_hr));
+               printf(" %9s %3ld%% %s\n",
+                          format(s.f_bavail * s.f_bsize, disp_hr),
+                          blocks_percent_used, mountPoint);
+#else
                printf("%-20s %9ld %9ld %9ld %3ld%% %s\n",
                           device,
                           (long) (s.f_blocks * (s.f_bsize / 1024.0)),
                           (long) ((s.f_blocks - s.f_bfree) * (s.f_bsize / 1024.0)),
                           (long) (s.f_bavail * (s.f_bsize / 1024.0)),
                           blocks_percent_used, mountPoint);
+#endif
 
        }
 
@@ -64,24 +80,46 @@ static int df(char *device, const char *mountPoint)
 extern int df_main(int argc, char **argv)
 {
        int status = EXIT_SUCCESS;
+       int opt = 0;
+       int i = 0;
+
+       while ((opt = getopt(argc, argv, "?"
+#ifdef BB_FEATURE_HUMAN_READABLE
+       "hm"
+#endif
+       "k"
+)) > 0)
+       {
+               switch (opt) {
+#ifdef BB_FEATURE_HUMAN_READABLE
+                       case 'h': disp_hr = 0;         break;
+                       case 'm': disp_hr = MEGABYTE;  break;
+                       case 'k': disp_hr = KILOBYTE;  break;
+#else
+                       case 'k': break;
+#endif
+                       case '?': goto print_df_usage; break;
+               }
+       }
 
        printf("%-20s %-14s %s %s %s %s\n", "Filesystem",
-                  "1k-blocks", "Used", "Available", "Use%", "Mounted on");
+#ifdef BB_FEATURE_HUMAN_READABLE
+                  (KILOBYTE == disp_hr) ? "1k-blocks" : "     Size",
+#else
+                  "1k-blocks",
+#endif
+              "Used", "Available", "Use%", "Mounted on");
 
-       if (argc > 1) {
-               struct mntent *mountEntry;
 
-               if (**(argv + 1) == '-') {
-                       usage(df_usage);
-               }
-               while (argc > 1) {
-                       if ((mountEntry = find_mount_point(argv[1], mtab_file)) == 0) {
-                               error_msg("%s: can't find mount point.\n", argv[1]);
+       if(optind < argc) {
+               struct mntent *mountEntry;
+               for(i = optind; i < argc; i++)
+               {
+                       if ((mountEntry = find_mount_point(argv[i], mtab_file)) == 0) {
+                               error_msg("%s: can't find mount point.\n", argv[i]);
                                status = EXIT_FAILURE;
                        } else if (!df(mountEntry->mnt_fsname, mountEntry->mnt_dir))
                                status = EXIT_FAILURE;
-                       argc--;
-                       argv++;
                }
        } else {
                FILE *mountTable;
@@ -101,6 +139,10 @@ extern int df_main(int argc, char **argv)
        }
 
        return status;
+
+print_df_usage:
+    usage(df_usage);
+    return(FALSE);
 }
 
 /*
index 8628732d8f1292a0159c4d7c6a913d0b9b8f45f0..56a7a9a0cf3cc868927c9940bad06adfdcfeccff 100644 (file)
 #include <stdio.h>
 #include <errno.h>
 
+#ifdef BB_FEATURE_HUMAN_READABLE
+unsigned long du_disp_hr = KILOBYTE;
+#endif
+
 typedef void (Display) (long, char *);
 
 static int du_depth = 0;
@@ -42,12 +46,17 @@ static Display *print;
 
 static void print_normal(long size, char *filename)
 {
+#ifdef BB_FEATURE_HUMAN_READABLE
+       printf("%s\t%s\n", format((size * KILOBYTE), du_disp_hr), filename);
+#else
        printf("%ld\t%s\n", size, filename);
+#endif
 }
 
 static void print_summary(long size, char *filename)
 {
        if (du_depth == 1) {
+printf("summary\n");
                print_normal(size, filename);
        }
 }
@@ -132,7 +141,11 @@ int du_main(int argc, char **argv)
        print = print_normal;
 
        /* parse argv[] */
-       while ((c = getopt(argc, argv, "sl")) != EOF) {
+       while ((c = getopt(argc, argv, "sl"
+#ifdef BB_FEATURE_HUMAN_READABLE
+"hm"
+#endif
+"k")) != EOF) {
                        switch (c) {
                        case 's':
                                        print = print_summary;
@@ -140,6 +153,13 @@ int du_main(int argc, char **argv)
                        case 'l':
                                        count_hardlinks = 1;
                                        break;
+#ifdef BB_FEATURE_HUMAN_READABLE
+                       case 'h': du_disp_hr = 0;        break;
+                       case 'm': du_disp_hr = MEGABYTE; break;
+                       case 'k': du_disp_hr = KILOBYTE; break;
+#else
+                       case 'k': break;
+#endif
                        default:
                                        usage(du_usage);
                        }
@@ -155,7 +175,7 @@ int du_main(int argc, char **argv)
                for (i=optind; i < argc; i++) {
                        if ((sum = du(argv[i])) == 0)
                                status = EXIT_FAILURE;
-                       if (is_directory(argv[i], FALSE, NULL)==FALSE) {
+                       if(is_directory(argv[i], FALSE, NULL)==FALSE) {
                                print_normal(sum, argv[i]);
                        }
                        reset_ino_dev_hashtable();
@@ -165,7 +185,7 @@ int du_main(int argc, char **argv)
        return status;
 }
 
-/* $Id: du.c,v 1.33 2001/01/18 02:57:08 kraai Exp $ */
+/* $Id: du.c,v 1.34 2001/01/22 22:35:38 rjune Exp $ */
 /*
 Local Variables:
 c-file-style: "linux"
index fa3e5424d831a90c22bcebd5e239fa23b5d4c3fc..754a6d450cf3e9f26d93fe520b38254364731b95 100644 (file)
@@ -176,6 +176,10 @@ static unsigned short tabstops = 8;
 
 static int status = EXIT_SUCCESS;
 
+#ifdef BB_FEATURE_HUMAN_READABLE
+unsigned long ls_disp_hr = KILOBYTE;
+#endif
+
 static int my_stat(struct dnode *cur)
 {
 #ifdef BB_FEATURE_LS_FOLLOWLINKS
@@ -583,10 +587,14 @@ int list_single(struct dnode *dn)
                                column += 8;
                                break;
                        case LIST_BLOCKS:
+#ifdef BB_FEATURE_HUMAN_READABLE
+                               fprintf(stdout, "%5s ", format(dn->dstat.st_size, ls_disp_hr));
+#else
 #if _FILE_OFFSET_BITS == 64
                                printf("%4lld ", dn->dstat.st_blocks>>1);
 #else
                                printf("%4ld ", dn->dstat.st_blocks>>1);
+#endif
 #endif
                                column += 5;
                                break;
@@ -622,10 +630,14 @@ int list_single(struct dnode *dn)
                                if (S_ISBLK(dn->dstat.st_mode) || S_ISCHR(dn->dstat.st_mode)) {
                                        printf("%4d, %3d ", (int)MAJOR(dn->dstat.st_rdev), (int)MINOR(dn->dstat.st_rdev));
                                } else {
+#ifdef BB_FEATURE_HUMAN_READABLE
+                                       fprintf(stdout, "%9s ", format(dn->dstat.st_size, ls_disp_hr));
+#else
 #if _FILE_OFFSET_BITS == 64
                                        printf("%9lld ", dn->dstat.st_size);
 #else
                                        printf("%9ld ", dn->dstat.st_size);
+#endif
 #endif
                                }
                                column += 10;
@@ -724,7 +736,10 @@ extern int ls_main(int argc, char **argv)
 #ifdef BB_FEATURE_LS_FOLLOWLINKS
 "L"
 #endif
-       )) > 0) {
+#ifdef BB_FEATURE_HUMAN_READABLE
+"h"
+#endif
+"k")) > 0) {
                switch (opt) {
                        case '1': style_fmt = STYLE_SINGLE; break;
                        case 'A': disp_opts |= DISP_HIDDEN; break;
@@ -733,7 +748,13 @@ extern int ls_main(int argc, char **argv)
                        case 'd': disp_opts |= DISP_NOLIST; break;
                        case 'g': /* ignore -- for ftp servers */ break;
                        case 'i': list_fmt |= LIST_INO; break;
-                       case 'l': style_fmt = STYLE_LONG; list_fmt |= LIST_LONG; break;
+                       case 'l':
+                               style_fmt = STYLE_LONG;
+                               list_fmt |= LIST_LONG;
+#ifdef BB_FEATURE_HUMAN_READABLE
+                               ls_disp_hr = 1;
+#endif
+                       break;
                        case 'n': list_fmt |= LIST_ID_NUMERIC; break;
                        case 's': list_fmt |= LIST_BLOCKS; break;
                        case 'x': disp_opts = DISP_ROWS; break;
@@ -776,6 +797,12 @@ extern int ls_main(int argc, char **argv)
 #ifdef BB_FEATURE_AUTOWIDTH
                        case 'T': tabstops= atoi(optarg); break;
                        case 'w': terminal_width= atoi(optarg); break;
+#endif
+#ifdef BB_FEATURE_HUMAN_READABLE
+                       case 'h': ls_disp_hr = 0; break;
+                       case 'k': ls_disp_hr = KILOBYTE; break;
+#else
+                       case 'k': break;
 #endif
                        default:
                                goto print_usage_message;
diff --git a/df.c b/df.c
index dc4849049e3b7819cd5a458b11019d445611c2a8..aa04682a756ab853a6f6f2a9c6359b74da943bfe 100644 (file)
--- a/df.c
+++ b/df.c
@@ -28,6 +28,9 @@
 #include <sys/vfs.h>
 
 extern const char mtab_file[]; /* Defined in utility.c */
+#ifdef BB_FEATURE_HUMAN_READABLE
+unsigned long disp_hr = KILOBYTE; 
+#endif
 
 static int df(char *device, const char *mountPoint)
 {
@@ -42,19 +45,32 @@ static int df(char *device, const char *mountPoint)
 
        if (s.f_blocks > 0) {
                blocks_used = s.f_blocks - s.f_bfree;
-               blocks_percent_used = (long)
-                       (blocks_used * 100.0 / (blocks_used + s.f_bavail) + 0.5);
+               if(0 == blocks_used)
+                       blocs_percent_used = 0;
+               else
+                       blocks_percent_used = (long)
+                         (blocks_used * 100.0 / (blocks_used + s.f_bavail) + 0.5);
                if (strcmp(device, "/dev/root") == 0) {
                        /* Adjusts device to be the real root device,
                         * or leaves device alone if it can't find it */
                        find_real_root_device_name( device);
                }
+#ifdef BB_FEATURE_HUMAN_READABLE
+               printf("%-20s %9s",
+                          device,
+                          format((s.f_blocks * s.f_bsize), disp_hr));
+               printf(" %9s", format((s.f_blocks - s.f_bfree) * s.f_bsize, disp_hr));
+               printf(" %9s %3ld%% %s\n",
+                          format(s.f_bavail * s.f_bsize, disp_hr),
+                          blocks_percent_used, mountPoint);
+#else
                printf("%-20s %9ld %9ld %9ld %3ld%% %s\n",
                           device,
                           (long) (s.f_blocks * (s.f_bsize / 1024.0)),
                           (long) ((s.f_blocks - s.f_bfree) * (s.f_bsize / 1024.0)),
                           (long) (s.f_bavail * (s.f_bsize / 1024.0)),
                           blocks_percent_used, mountPoint);
+#endif
 
        }
 
@@ -64,24 +80,46 @@ static int df(char *device, const char *mountPoint)
 extern int df_main(int argc, char **argv)
 {
        int status = EXIT_SUCCESS;
+       int opt = 0;
+       int i = 0;
+
+       while ((opt = getopt(argc, argv, "?"
+#ifdef BB_FEATURE_HUMAN_READABLE
+       "hm"
+#endif
+       "k"
+)) > 0)
+       {
+               switch (opt) {
+#ifdef BB_FEATURE_HUMAN_READABLE
+                       case 'h': disp_hr = 0;         break;
+                       case 'm': disp_hr = MEGABYTE;  break;
+                       case 'k': disp_hr = KILOBYTE;  break;
+#else
+                       case 'k': break;
+#endif
+                       case '?': goto print_df_usage; break;
+               }
+       }
 
        printf("%-20s %-14s %s %s %s %s\n", "Filesystem",
-                  "1k-blocks", "Used", "Available", "Use%", "Mounted on");
+#ifdef BB_FEATURE_HUMAN_READABLE
+                  (KILOBYTE == disp_hr) ? "1k-blocks" : "     Size",
+#else
+                  "1k-blocks",
+#endif
+              "Used", "Available", "Use%", "Mounted on");
 
-       if (argc > 1) {
-               struct mntent *mountEntry;
 
-               if (**(argv + 1) == '-') {
-                       usage(df_usage);
-               }
-               while (argc > 1) {
-                       if ((mountEntry = find_mount_point(argv[1], mtab_file)) == 0) {
-                               error_msg("%s: can't find mount point.\n", argv[1]);
+       if(optind < argc) {
+               struct mntent *mountEntry;
+               for(i = optind; i < argc; i++)
+               {
+                       if ((mountEntry = find_mount_point(argv[i], mtab_file)) == 0) {
+                               error_msg("%s: can't find mount point.\n", argv[i]);
                                status = EXIT_FAILURE;
                        } else if (!df(mountEntry->mnt_fsname, mountEntry->mnt_dir))
                                status = EXIT_FAILURE;
-                       argc--;
-                       argv++;
                }
        } else {
                FILE *mountTable;
@@ -101,6 +139,10 @@ extern int df_main(int argc, char **argv)
        }
 
        return status;
+
+print_df_usage:
+    usage(df_usage);
+    return(FALSE);
 }
 
 /*
diff --git a/du.c b/du.c
index 8628732d8f1292a0159c4d7c6a913d0b9b8f45f0..56a7a9a0cf3cc868927c9940bad06adfdcfeccff 100644 (file)
--- a/du.c
+++ b/du.c
 #include <stdio.h>
 #include <errno.h>
 
+#ifdef BB_FEATURE_HUMAN_READABLE
+unsigned long du_disp_hr = KILOBYTE;
+#endif
+
 typedef void (Display) (long, char *);
 
 static int du_depth = 0;
@@ -42,12 +46,17 @@ static Display *print;
 
 static void print_normal(long size, char *filename)
 {
+#ifdef BB_FEATURE_HUMAN_READABLE
+       printf("%s\t%s\n", format((size * KILOBYTE), du_disp_hr), filename);
+#else
        printf("%ld\t%s\n", size, filename);
+#endif
 }
 
 static void print_summary(long size, char *filename)
 {
        if (du_depth == 1) {
+printf("summary\n");
                print_normal(size, filename);
        }
 }
@@ -132,7 +141,11 @@ int du_main(int argc, char **argv)
        print = print_normal;
 
        /* parse argv[] */
-       while ((c = getopt(argc, argv, "sl")) != EOF) {
+       while ((c = getopt(argc, argv, "sl"
+#ifdef BB_FEATURE_HUMAN_READABLE
+"hm"
+#endif
+"k")) != EOF) {
                        switch (c) {
                        case 's':
                                        print = print_summary;
@@ -140,6 +153,13 @@ int du_main(int argc, char **argv)
                        case 'l':
                                        count_hardlinks = 1;
                                        break;
+#ifdef BB_FEATURE_HUMAN_READABLE
+                       case 'h': du_disp_hr = 0;        break;
+                       case 'm': du_disp_hr = MEGABYTE; break;
+                       case 'k': du_disp_hr = KILOBYTE; break;
+#else
+                       case 'k': break;
+#endif
                        default:
                                        usage(du_usage);
                        }
@@ -155,7 +175,7 @@ int du_main(int argc, char **argv)
                for (i=optind; i < argc; i++) {
                        if ((sum = du(argv[i])) == 0)
                                status = EXIT_FAILURE;
-                       if (is_directory(argv[i], FALSE, NULL)==FALSE) {
+                       if(is_directory(argv[i], FALSE, NULL)==FALSE) {
                                print_normal(sum, argv[i]);
                        }
                        reset_ino_dev_hashtable();
@@ -165,7 +185,7 @@ int du_main(int argc, char **argv)
        return status;
 }
 
-/* $Id: du.c,v 1.33 2001/01/18 02:57:08 kraai Exp $ */
+/* $Id: du.c,v 1.34 2001/01/22 22:35:38 rjune Exp $ */
 /*
 Local Variables:
 c-file-style: "linux"
index a89ac3694777ef488a6b350c54cbdf1fa9185bab..018c636cfdf10d2517ae17f2b6875401da5de120 100644 (file)
@@ -259,4 +259,11 @@ extern int sysinfo (struct sysinfo* info);
 #define isclr(a,i)      (((a)[(i)/NBBY] & (1<<((i)%NBBY))) == 0)
 #endif
 
+#ifdef BB_FEATURE_HUMAN_READABLE
+char *format(unsigned long val, unsigned long hr);
+#define KILOBYTE 1024
+#define MEGABYTE (KILOBYTE*1024)
+#define GIGABYTE (MEGABYTE*1024)
+#endif
+
 #endif /* _BB_INTERNAL_H_ */
diff --git a/ls.c b/ls.c
index fa3e5424d831a90c22bcebd5e239fa23b5d4c3fc..754a6d450cf3e9f26d93fe520b38254364731b95 100644 (file)
--- a/ls.c
+++ b/ls.c
@@ -176,6 +176,10 @@ static unsigned short tabstops = 8;
 
 static int status = EXIT_SUCCESS;
 
+#ifdef BB_FEATURE_HUMAN_READABLE
+unsigned long ls_disp_hr = KILOBYTE;
+#endif
+
 static int my_stat(struct dnode *cur)
 {
 #ifdef BB_FEATURE_LS_FOLLOWLINKS
@@ -583,10 +587,14 @@ int list_single(struct dnode *dn)
                                column += 8;
                                break;
                        case LIST_BLOCKS:
+#ifdef BB_FEATURE_HUMAN_READABLE
+                               fprintf(stdout, "%5s ", format(dn->dstat.st_size, ls_disp_hr));
+#else
 #if _FILE_OFFSET_BITS == 64
                                printf("%4lld ", dn->dstat.st_blocks>>1);
 #else
                                printf("%4ld ", dn->dstat.st_blocks>>1);
+#endif
 #endif
                                column += 5;
                                break;
@@ -622,10 +630,14 @@ int list_single(struct dnode *dn)
                                if (S_ISBLK(dn->dstat.st_mode) || S_ISCHR(dn->dstat.st_mode)) {
                                        printf("%4d, %3d ", (int)MAJOR(dn->dstat.st_rdev), (int)MINOR(dn->dstat.st_rdev));
                                } else {
+#ifdef BB_FEATURE_HUMAN_READABLE
+                                       fprintf(stdout, "%9s ", format(dn->dstat.st_size, ls_disp_hr));
+#else
 #if _FILE_OFFSET_BITS == 64
                                        printf("%9lld ", dn->dstat.st_size);
 #else
                                        printf("%9ld ", dn->dstat.st_size);
+#endif
 #endif
                                }
                                column += 10;
@@ -724,7 +736,10 @@ extern int ls_main(int argc, char **argv)
 #ifdef BB_FEATURE_LS_FOLLOWLINKS
 "L"
 #endif
-       )) > 0) {
+#ifdef BB_FEATURE_HUMAN_READABLE
+"h"
+#endif
+"k")) > 0) {
                switch (opt) {
                        case '1': style_fmt = STYLE_SINGLE; break;
                        case 'A': disp_opts |= DISP_HIDDEN; break;
@@ -733,7 +748,13 @@ extern int ls_main(int argc, char **argv)
                        case 'd': disp_opts |= DISP_NOLIST; break;
                        case 'g': /* ignore -- for ftp servers */ break;
                        case 'i': list_fmt |= LIST_INO; break;
-                       case 'l': style_fmt = STYLE_LONG; list_fmt |= LIST_LONG; break;
+                       case 'l':
+                               style_fmt = STYLE_LONG;
+                               list_fmt |= LIST_LONG;
+#ifdef BB_FEATURE_HUMAN_READABLE
+                               ls_disp_hr = 1;
+#endif
+                       break;
                        case 'n': list_fmt |= LIST_ID_NUMERIC; break;
                        case 's': list_fmt |= LIST_BLOCKS; break;
                        case 'x': disp_opts = DISP_ROWS; break;
@@ -776,6 +797,12 @@ extern int ls_main(int argc, char **argv)
 #ifdef BB_FEATURE_AUTOWIDTH
                        case 'T': tabstops= atoi(optarg); break;
                        case 'w': terminal_width= atoi(optarg); break;
+#endif
+#ifdef BB_FEATURE_HUMAN_READABLE
+                       case 'h': ls_disp_hr = 0; break;
+                       case 'k': ls_disp_hr = KILOBYTE; break;
+#else
+                       case 'k': break;
 #endif
                        default:
                                goto print_usage_message;
diff --git a/usage.c b/usage.c
index 864891797c5dc245c904a3bf7c85c9c8005963a1..9ae2bb3ef6aeb4b68d607455bfb0cc8b95d20e55 100644 (file)
--- a/usage.c
+++ b/usage.c
@@ -190,9 +190,22 @@ const char deallocvt_usage[] =
 
 #if defined BB_DF
 const char df_usage[] =
-       "df [filesystem ...]"
+       "df [-?"
+#ifdef BB_FEATURE_HUMAN_READABLE
+       "hm"
+#endif
+       "k] [filesystem ...]\n"
 #ifndef BB_FEATURE_TRIVIAL_HELP
        "\n\nPrint the filesystem space used and space available."
+       "Options:\n"
+       "\t-?\tshow usage information\n"
+#ifdef BB_FEATURE_HUMAN_READABLE
+       "\t-h\tprint sizes in human readable format (e.g., 1K 243M 2G )\n"
+       "\t-m\tprint sizes in megabytes\n"
+       "\t-k\tprint sizes in kilobytes(default)\n"
+#else
+       "\t-k\tprint sizes in kilobytes(compatability)\n"
+#endif
 #endif
        ;
 #endif
@@ -244,13 +257,25 @@ const char dpkg_deb_usage[] =
 
 #if defined BB_DU
 const char du_usage[] =
-       "du [OPTION]... [FILE]..."
+       "du [-?ls"
+#ifdef BB_FEATURE_HUMAN_READABLE
+       "hm"
+#endif
+       "k] [FILE]...\n"
 #ifndef BB_FEATURE_TRIVIAL_HELP
        "\n\nSummarizes disk space used for each FILE and/or directory.\n"
        "Disk space is printed in units of 1024 bytes.\n\n"
        "Options:\n"
+        "\t-?\tshow usage information\n"
        "\t-l\tcount sizes many times if hard linked\n"
        "\t-s\tdisplay only a total for each argument"
+#ifdef BB_FEATURE_HUMAN_READABLE
+       "\t-h\tprint sizes in human readable format (e.g., 1K 243M 2G )\n"
+       "\t-m\tprint sizes in megabytes\n"
+       "\t-k\tprint sizes in kilobytes(default)\n"
+#else
+       "\t-k\tprint sizes in kilobytes(compatability)\n"
+#endif
 #endif
        ;
 #endif
@@ -661,7 +686,10 @@ const char ls_usage[] =
 #ifdef BB_FEATURE_LS_SORTFILES
        "X"
 #endif
-       "] [filenames...]"
+#ifdef BB_FEATURE_HUMAN_READABLE
+       "h"
+#endif
+       "k] [filenames...]\n"
 #ifndef BB_FEATURE_TRIVIAL_HELP
        "\n\nList directory contents\n\n"
        "Options:\n"
@@ -716,6 +744,14 @@ const char ls_usage[] =
 #ifdef BB_FEATURE_LS_SORTFILES
        "\t-X\tsort the listing by extension\n"
 #endif
+
+#ifdef BB_FEATURE_HUMAN_READABLE
+       "\t-h\tprint sizes in human readable format (e.g., 1K 243M 2G )\n"
+       "\t-k\tprint sizes in kilobytes(default)\n"
+#else
+       "\t-k\tprint sizes in kilobytes(compatability)"
+#endif
+
 #endif /*  BB_FEATURE_TRIVIAL_HELP */
        ;
 #endif /* BB_LS */
index 9f524c3e2a505a52c5be3e74a066717c69fc5bb8..bff589a769d91e967768b7ffcd6d0869ea55ddcb 100644 (file)
--- a/utility.c
+++ b/utility.c
@@ -1770,6 +1770,27 @@ ssize_t safe_read(int fd, void *buf, size_t count)
 }
 #endif
 
+#ifdef BB_FEATURE_HUMAN_READABLE
+char *format(unsigned long val, unsigned long hr)
+{
+       static char str[10] = "\0";
+
+       if(val == 0)
+               return("0");
+       if(hr)
+               snprintf(str, 9, "%ld", val/hr);
+       else if(val >= GIGABYTE)
+               snprintf(str, 9, "%.1LfG", ((long double)(val)/GIGABYTE));
+       else if(val >= MEGABYTE)
+               snprintf(str, 9, "%.1LfM", ((long double)(val)/MEGABYTE));
+       else if(val >= KILOBYTE)
+               snprintf(str, 9, "%.1Lfk", ((long double)(val)/KILOBYTE));
+       else
+               snprintf(str, 9, "%ld", (val));
+       return(str);
+}
+#endif
+
 /* END CODE */
 /*
 Local Variables: