From 6d0921cc0bb01b1d090285c487f8c1120dfa5d3a Mon Sep 17 00:00:00 2001 From: Richard June Date: Mon, 22 Jan 2001 22:35:38 +0000 Subject: [PATCH] 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 --- Config.h | 3 +++ applets/usage.c | 42 ++++++++++++++++++++++++++--- busybox.h | 7 +++++ coreutils/df.c | 68 ++++++++++++++++++++++++++++++++++++++--------- coreutils/du.c | 26 +++++++++++++++--- coreutils/ls.c | 31 +++++++++++++++++++-- df.c | 68 ++++++++++++++++++++++++++++++++++++++--------- du.c | 26 +++++++++++++++--- include/busybox.h | 7 +++++ ls.c | 31 +++++++++++++++++++-- usage.c | 42 ++++++++++++++++++++++++++--- utility.c | 21 +++++++++++++++ 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 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 #include +#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,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 dc4849049..aa04682a7 100644 --- a/df.c +++ b/df.c @@ -28,6 +28,9 @@ #include 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 #include +#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,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 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: -- 2.25.1