Changeset 2725 in MondoRescue for branches/2.2.9/mindi-busybox/coreutils/df.c


Ignore:
Timestamp:
Feb 25, 2011, 9:26:54 PM (13 years ago)
Author:
Bruno Cornec
Message:
  • Update mindi-busybox to 1.18.3 to avoid problems with the tar command which is now failing on recent versions with busybox 1.7.3
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2.2.9/mindi-busybox/coreutils/df.c

    r1765 r2725  
    66 * based on original code by (I think) Bruce Perens <bruce@pixar.com>.
    77 *
    8  * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
     8 * Licensed under GPLv2 or later, see file LICENSE in this source tree.
    99 */
    1010
    11 /* BB_AUDIT SUSv3 _NOT_ compliant -- options -P and -t missing.  Also blocksize. */
     11/* BB_AUDIT SUSv3 _NOT_ compliant -- option -t missing. */
    1212/* http://www.opengroup.org/onlinepubs/007904975/utilities/df.html */
    1313
     
    1717 * on output.  Output stats on 0-sized filesystems if specifically listed on
    1818 * the command line.  Properly round *-blocks, Used, and Available quantities.
     19 *
     20 * Aug 28, 2008      Bernhard Reutner-Fischer
     21 *
     22 * Implement -P and -B; better coreutils compat; cleanup
    1923 */
    2024
     
    2226#include <sys/vfs.h>
    2327#include "libbb.h"
     28#include "unicode.h"
    2429
    2530#if !ENABLE_FEATURE_HUMAN_READABLE
     
    3035#endif
    3136
    32 int df_main(int argc, char **argv);
    33 int df_main(int argc, char **argv)
     37int df_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
     38int df_main(int argc UNUSED_PARAM, char **argv)
    3439{
    3540    unsigned long blocks_used;
    3641    unsigned blocks_percent_used;
    37 #if ENABLE_FEATURE_HUMAN_READABLE
    38     unsigned df_disp_hr = 1024;
    39 #endif
     42    unsigned long df_disp_hr = 1024;
    4043    int status = EXIT_SUCCESS;
    4144    unsigned opt;
     
    4346    struct mntent *mount_entry;
    4447    struct statfs s;
    45     /* default display is kilobytes */
    46     const char *disp_units_hdr = "1k-blocks";
    47 
    48 #if ENABLE_FEATURE_HUMAN_READABLE
    49     opt_complementary = "h-km:k-hm:m-hk";
    50     opt = getopt32(argv, "hmk");
    51     if (opt & 1) {
     48
     49    enum {
     50        OPT_KILO  = (1 << 0),
     51        OPT_POSIX = (1 << 1),
     52        OPT_ALL   = (1 << 2) * ENABLE_FEATURE_DF_FANCY,
     53        OPT_INODE = (1 << 3) * ENABLE_FEATURE_DF_FANCY,
     54        OPT_BSIZE = (1 << 4) * ENABLE_FEATURE_DF_FANCY,
     55        OPT_HUMAN = (1 << (2 + 3*ENABLE_FEATURE_DF_FANCY)) * ENABLE_FEATURE_HUMAN_READABLE,
     56        OPT_MEGA  = (1 << (3 + 3*ENABLE_FEATURE_DF_FANCY)) * ENABLE_FEATURE_HUMAN_READABLE,
     57    };
     58    const char *disp_units_hdr = NULL;
     59    char *chp;
     60
     61    init_unicode();
     62
     63#if ENABLE_FEATURE_HUMAN_READABLE && ENABLE_FEATURE_DF_FANCY
     64    opt_complementary = "k-mB:m-Bk:B-km";
     65#elif ENABLE_FEATURE_HUMAN_READABLE
     66    opt_complementary = "k-m:m-k";
     67#endif
     68    opt = getopt32(argv, "kP"
     69            IF_FEATURE_DF_FANCY("aiB:")
     70            IF_FEATURE_HUMAN_READABLE("hm")
     71            IF_FEATURE_DF_FANCY(, &chp));
     72    if (opt & OPT_MEGA)
     73        df_disp_hr = 1024*1024;
     74
     75    if (opt & OPT_BSIZE)
     76        df_disp_hr = xatoul_range(chp, 1, ULONG_MAX); /* disallow 0 */
     77
     78    /* From the manpage of df from coreutils-6.10:
     79       Disk space is shown in 1K blocks by default, unless the environment
     80       variable POSIXLY_CORRECT is set, in which case 512-byte blocks are used.
     81    */
     82    if (getenv("POSIXLY_CORRECT")) /* TODO - a new libbb function? */
     83        df_disp_hr = 512;
     84
     85    if (opt & OPT_HUMAN) {
    5286        df_disp_hr = 0;
    5387        disp_units_hdr = "     Size";
    5488    }
    55     if (opt & 2) {
    56         df_disp_hr = 1024*1024;
    57         disp_units_hdr = "1M-blocks";
    58     }
     89    if (opt & OPT_INODE)
     90        disp_units_hdr = "   Inodes";
     91
     92    if (disp_units_hdr == NULL) {
     93#if ENABLE_FEATURE_HUMAN_READABLE
     94        disp_units_hdr = xasprintf("%s-blocks",
     95            /* print df_disp_hr, show no fractionals,
     96             * use suffixes if OPT_POSIX is set in opt */
     97            make_human_readable_str(df_disp_hr, 0, !!(opt & OPT_POSIX))
     98        );
    5999#else
    60     opt = getopt32(argv, "k");
    61 #endif
    62 
    63     printf("Filesystem%11s%-15sUsed Available Use%% Mounted on\n",
    64               "", disp_units_hdr);
     100        disp_units_hdr = xasprintf("%lu-blocks", df_disp_hr);
     101#endif
     102    }
     103    printf("Filesystem           %-15sUsed Available %s Mounted on\n",
     104            disp_units_hdr, (opt & OPT_POSIX) ? "Capacity" : "Use%");
    65105
    66106    mount_table = NULL;
    67107    argv += optind;
    68     if (optind >= argc) {
     108    if (!argv[0]) {
    69109        mount_table = setmntent(bb_path_mtab_file, "r");
    70         if (!mount_table) {
     110        if (!mount_table)
    71111            bb_perror_msg_and_die(bb_path_mtab_file);
    72         }
    73112    }
    74113
     
    85124        } else {
    86125            mount_point = *argv++;
    87             if (!mount_point) {
     126            if (!mount_point)
    88127                break;
    89             }
    90             mount_entry = find_mount_point(mount_point, bb_path_mtab_file);
     128            mount_entry = find_mount_point(mount_point, 1);
    91129            if (!mount_entry) {
    92130                bb_error_msg("%s: can't find mount point", mount_point);
    93  SET_ERROR:
     131 set_error:
    94132                status = EXIT_FAILURE;
    95133                continue;
     
    101139
    102140        if (statfs(mount_point, &s) != 0) {
    103             bb_perror_msg("%s", mount_point);
    104             goto SET_ERROR;
     141            bb_simple_perror_msg(mount_point);
     142            goto set_error;
    105143        }
    106144
    107         if ((s.f_blocks > 0) || !mount_table){
     145        if ((s.f_blocks > 0) || !mount_table || (opt & OPT_ALL)) {
     146            if (opt & OPT_INODE) {
     147                s.f_blocks = s.f_files;
     148                s.f_bavail = s.f_bfree = s.f_ffree;
     149                s.f_bsize = 1;
     150
     151                if (df_disp_hr)
     152                    df_disp_hr = 1;
     153            }
    108154            blocks_used = s.f_blocks - s.f_bfree;
    109155            blocks_percent_used = 0;
     
    114160            }
    115161
    116             if (strcmp(device, "rootfs") == 0) {
     162            /* GNU coreutils 6.10 skips certain mounts, try to be compatible.  */
     163            if (strcmp(device, "rootfs") == 0)
    117164                continue;
    118             } else if (strcmp(device, "/dev/root") == 0) {
     165
     166#ifdef WHY_WE_DO_IT_FOR_DEV_ROOT_ONLY
     167            if (strcmp(device, "/dev/root") == 0) {
    119168                /* Adjusts device to be the real root device,
    120                 * or leaves device alone if it can't find it */
     169                 * or leaves device alone if it can't find it */
    121170                device = find_block_device("/");
    122171                if (!device) {
    123                     goto SET_ERROR;
     172                    goto set_error;
    124173                }
    125174            }
    126 
     175#endif
     176
     177#if ENABLE_UNICODE_SUPPORT
     178            {
     179                uni_stat_t uni_stat;
     180                char *uni_dev = unicode_conv_to_printable(&uni_stat, device);
     181                if (uni_stat.unicode_width > 20) {
     182                    printf("%s\n%20s", uni_dev, "");
     183                } else {
     184                    printf("%s%*s", uni_dev, 20 - (int)uni_stat.unicode_width, "");
     185                }
     186                free(uni_dev);
     187            }
     188#else
    127189            if (printf("\n%-20s" + 1, device) > 20)
    128190                    printf("\n%-20s", "");
     191#endif
     192
    129193#if ENABLE_FEATURE_HUMAN_READABLE
    130194            printf(" %9s ",
     195                /* f_blocks x f_bsize / df_disp_hr, show one fractional,
     196                 * use suffixes if df_disp_hr == 0 */
    131197                make_human_readable_str(s.f_blocks, s.f_bsize, df_disp_hr));
    132198
    133199            printf(" %9s " + 1,
     200                /* EXPR x f_bsize / df_disp_hr, show one fractional,
     201                 * use suffixes if df_disp_hr == 0 */
    134202                make_human_readable_str((s.f_blocks - s.f_bfree),
    135203                        s.f_bsize, df_disp_hr));
    136204
    137205            printf("%9s %3u%% %s\n",
    138                     make_human_readable_str(s.f_bavail, s.f_bsize, df_disp_hr),
    139                     blocks_percent_used, mount_point);
     206                /* f_bavail x f_bsize / df_disp_hr, show one fractional,
     207                 * use suffixes if df_disp_hr == 0 */
     208                make_human_readable_str(s.f_bavail, s.f_bsize, df_disp_hr),
     209                blocks_percent_used, mount_point);
    140210#else
    141211            printf(" %9lu %9lu %9lu %3u%% %s\n",
    142                     kscale(s.f_blocks, s.f_bsize),
    143                     kscale(s.f_blocks-s.f_bfree, s.f_bsize),
    144                     kscale(s.f_bavail, s.f_bsize),
    145                     blocks_percent_used, mount_point);
     212                kscale(s.f_blocks, s.f_bsize),
     213                kscale(s.f_blocks - s.f_bfree, s.f_bsize),
     214                kscale(s.f_bavail, s.f_bsize),
     215                blocks_percent_used, mount_point);
    146216#endif
    147217        }
    148218    }
    149219
    150     fflush_stdout_and_exit(status);
     220    return status;
    151221}
Note: See TracChangeset for help on using the changeset viewer.