diff options
author | Richard June | 2001-01-22 22:35:38 +0000 |
---|---|---|
committer | Richard June | 2001-01-22 22:35:38 +0000 |
commit | 6d0921cc0bb01b1d090285c487f8c1120dfa5d3a (patch) | |
tree | 97ed53aec9cbe3a3021804e9758abb3e04f05879 /coreutils | |
parent | 3b3f5c364a486dc2c081f0684a4315740f349be1 (diff) | |
download | busybox-6d0921cc0bb01b1d090285c487f8c1120dfa5d3a.zip busybox-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
Diffstat (limited to 'coreutils')
-rw-r--r-- | coreutils/df.c | 68 | ||||
-rw-r--r-- | coreutils/du.c | 26 | ||||
-rw-r--r-- | coreutils/ls.c | 31 |
3 files changed, 107 insertions, 18 deletions
diff --git a/coreutils/df.c b/coreutils/df.c index dc48490..aa04682 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 8628732..56a7a9a 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 fa3e542..754a6d4 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; } |