aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard June <rjune@bravegnuworld.com>2001-01-22 22:35:38 +0000
committerRichard June <rjune@bravegnuworld.com>2001-01-22 22:35:38 +0000
commit6d0921cc0bb01b1d090285c487f8c1120dfa5d3a (patch)
tree97ed53aec9cbe3a3021804e9758abb3e04f05879
parent3b3f5c364a486dc2c081f0684a4315740f349be1 (diff)
downloadbusybox-6d0921cc0bb01b1d090285c487f8c1120dfa5d3a.tar.gz
Add HUMAN_READABLE define for -m and -h support in du, df, and ls
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
-rw-r--r--Config.h3
-rw-r--r--applets/usage.c42
-rw-r--r--busybox.h7
-rw-r--r--coreutils/df.c68
-rw-r--r--coreutils/du.c26
-rw-r--r--coreutils/ls.c31
-rw-r--r--df.c68
-rw-r--r--du.c26
-rw-r--r--include/busybox.h7
-rw-r--r--ls.c31
-rw-r--r--usage.c42
-rw-r--r--utility.c21
12 files changed, 330 insertions, 42 deletions
diff --git a/Config.h b/Config.h
index a2a2366a3..cfdb52f31 100644
--- a/Config.h
+++ b/Config.h
@@ -290,6 +290,9 @@
// 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
//
//
diff --git a/applets/usage.c b/applets/usage.c
index 864891797..9ae2bb3ef 100644
--- a/applets/usage.c
+++ b/applets/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 */
diff --git a/busybox.h b/busybox.h
index a89ac3694..018c636cf 100644
--- 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_ */
diff --git a/coreutils/df.c b/coreutils/df.c
index dc4849049..aa04682a7 100644
--- a/coreutils/df.c
+++ b/coreutils/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/coreutils/du.c b/coreutils/du.c
index 8628732d8..56a7a9a0c 100644
--- a/coreutils/du.c
+++ b/coreutils/du.c
@@ -33,6 +33,10 @@
#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"
diff --git a/coreutils/ls.c b/coreutils/ls.c
index fa3e5424d..754a6d450 100644
--- a/coreutils/ls.c
+++ b/coreutils/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,11 +587,15 @@ 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;
case LIST_MODEBITS:
@@ -622,11 +630,15 @@ 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;
break;
@@ -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;
@@ -777,6 +798,12 @@ extern int ls_main(int argc, char **argv)
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 dc4849049..aa04682a7 100644
--- 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 8628732d8..56a7a9a0c 100644
--- a/du.c
+++ b/du.c
@@ -33,6 +33,10 @@
#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"
diff --git a/include/busybox.h b/include/busybox.h
index a89ac3694..018c636cf 100644
--- a/include/busybox.h
+++ b/include/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_ */
diff --git a/ls.c b/ls.c
index fa3e5424d..754a6d450 100644
--- 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,11 +587,15 @@ 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;
case LIST_MODEBITS:
@@ -622,11 +630,15 @@ 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;
break;
@@ -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;
@@ -777,6 +798,12 @@ extern int ls_main(int argc, char **argv)
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 864891797..9ae2bb3ef 100644
--- 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 */
diff --git a/utility.c b/utility.c
index 9f524c3e2..bff589a76 100644
--- 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: