#include <config.h>#include <inttypes.h>#include <stdio.h>#include <getopt.h>#include <sys/types.h>#include <assert.h>#include "system.h"#include "error.h"#include "exclude.h"#include "human.h"#include "quote.h"#include "save-cwd.h"#include "savedir.h"#include "xstrtol.h"#include "en_tree.h"Include dependency graph for du.cpp:

Compounds | |
| struct | entry |
| struct | htab |
| struct | String |
| String class from orignal du. More... | |
Defines | |
| #define | PROGRAM_NAME "du" |
| #define | AUTHORS "Torbjorn Granlund, David MacKenzie, Larry McVoy, and Paul Eggert" |
| #define | INITIAL_HASH_MODULE 100 |
| #define | INITIAL_ENTRY_TAB_SIZE 70 |
| #define | INITIAL_PATH_SIZE 100 |
| #define | S_ISLNK(s) 0 |
Typedefs | |
| typedef String | String |
Enumerations | |
| enum | { EXCLUDE_OPTION = CHAR_MAX + 1, BLOCK_SIZE_OPTION, MAX_DEPTH_OPTION } |
Functions | |
| int | stat (const char *, struct stat *buf) |
| int | lstat (const char *, struct stat *buf) |
| void | usage (int status) |
| int | en_tree_init (en_tree *target) |
| en_tree * | en_tree_new () |
| en_tree * | en_tree_seek_end (en_tree *cur) |
| int | en_tree_add_child (en_tree *target, en_tree *child) |
| void | en_tree_rdestroy (en_tree *target) |
| int | en_tree_remove (en_tree *target) |
| int | en_tree_set (en_tree *target, uintmax_t n_blocks, const char *name) |
| int | print_size_p (uintmax_t size, uintmax_t max_blocks, const char *name) |
| int | en_tree_print (en_tree *target, uintmax_t max_blocks) |
| int | en_tree_swap_contents (en_tree *t1, en_tree *t2) |
| int | en_tree_swap_children (en_tree *t1, en_tree *t2) |
| int | en_tree_insert_after (en_tree *target, en_tree *after) |
| int | en_tree_insert_before (en_tree *target, en_tree *before) |
| int | en_tree_swap (en_tree *t1, en_tree *t2) |
| int | en_tree_sort (en_tree *target) |
| int | en_tree_sort_r (en_tree *target) |
| int | fmain (int argc, char **argv) |
Variables | |
| char * | program_name |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
00181 {
00182 EXCLUDE_OPTION = CHAR_MAX + 1,
00183 BLOCK_SIZE_OPTION,
00184 MAX_DEPTH_OPTION
00185 };
|
|
||||||||||||
|
|
|
||||||||||||
|
|
|
|
00217 {
00218 if (status != 0)
00219 fprintf (stderr, _("Try `%s --help' for more information.\n"),
00220 program_name);
00221 else
00222 {
00223 printf (_("Usage: %s [OPTION]... [FILE]...\n"), program_name);
00224 printf (_("\
00225 Summarize disk usage of each FILE, recursively for directories.\n\
00226 \n\
00227 -a, --all write counts for all files, not just directories\n\
00228 --block-size=SIZE use SIZE-byte blocks\n\
00229 -b, --bytes print size in bytes\n\
00230 -c, --total produce a grand total\n\
00231 -D, --dereference-args dereference PATHs when symbolic link\n\
00232 -h, --human-readable print sizes in human readable format (e.g., 1K 234M 2G)\n\
00233 -H, --si likewise, but use powers of 1000 not 1024\n\
00234 -k, --kilobytes like --block-size=1024\n\
00235 -l, --count-links count sizes many times if hard linked\n\
00236 -L, --dereference dereference all symbolic links\n\
00237 -m, --megabytes like --block-size=1048576\n\
00238 -S, --separate-dirs do not include size of subdirectories\n\
00239 -s, --summarize display only a total for each argument\n\
00240 -x, --one-file-system skip directories on different filesystems\n\
00241 -X FILE, --exclude-from=FILE Exclude files that match any pattern in FILE.\n\
00242 --exclude=PAT Exclude files that match PAT.\n\
00243 --max-depth=N print the total for a directory (or file, with --all)\n\
00244 only if it is N or fewer levels below the command\n\
00245 line argument; --max-depth=0 is the same as\n\
00246 --summarize\n\
00247 --help display this help and exit\n\
00248 --version output version information and exit\n\
00249 "));
00250 puts (_("\nReport bugs to <bug-fileutils@gnu.org>."));
00251 }
00252 exit (status);
00253 }
|
|
|
|
|
|
00332 {
00333 en_tree *new_tree;
00334 new_tree=(en_tree *) xmalloc(sizeof(en_tree));
00335 en_tree_init(new_tree);
00336 return new_tree;
00337 }
|
|
|
00342 {
00343 en_tree *current;
00344 for (current=cur; current->next!=NULL; current=current->next);
00345 return current;
00346 }
|
|
||||||||||||
|
00350 {
00351 if (target==NULL) return -1;
00352 if (target->child==NULL) target->child=child;
00353 else
00354 {
00355 en_tree *end;
00356 end=en_tree_seek_end(target->child);
00357 end->next=child;
00358 child->prev=end;
00359 }
00360 child->parent=target;
00361 return 0;
00362 }
|
|
|
00367 {
00368 en_tree *cur;
00369 for (cur=target->child; cur!=NULL; cur=cur->next)
00370 {
00371 en_tree_rdestroy(cur);
00372 }
00373 free(target->name);
00374 free(target);
00375 }
|
|
|
00380 {
00381 if (target==NULL) return -1;
00382
00383 // remove reference in the previous node
00384 if (target->prev!=NULL) target->prev->next=target->next;
00385
00386 // remove reference in the next node
00387 if (target->next!=NULL) target->next->prev=target->prev;
00388
00389 // remove reference in the parent node
00390 if (target->parent!=NULL && target->parent->child==target)
00391 target->parent->child=target->next;
00392 }
|
|
||||||||||||||||
|
|
|
||||||||||||||||
|
00424 {
00425 if (opt_percent_mode>0)
00426 {
00427 printf("%i%%\t", 100*size/max_blocks);
00428 printf("%s\n", name);
00429 }
00430 else print_size(size, name);
00431 }
|
|
||||||||||||
|
00436 {
00437 uintmax_t childtotal=(opt_percent_mode==2)?target->size:max_blocks;
00438
00439 if (opt_root_first)
00440 print_size_p(target->size, max_blocks, target->name);
00441
00442 if (!opt_siblings_first)
00443 if (target->child!=NULL) en_tree_print(en_tree_seek_end(target->child), childtotal);
00444 if (target->prev!=NULL) en_tree_print(target->prev, max_blocks);
00445 if (opt_siblings_first)
00446 if (target->child!=NULL) en_tree_print(en_tree_seek_end(target->child), childtotal);
00447
00448 if (!opt_root_first)
00449 print_size_p(target->size, max_blocks, target->name);
00450 }
|
|
||||||||||||
|
00455 {
00456 uintmax_t size;
00457 char *name;
00458
00459 size=t1->size;
00460 t1->size=t2->size;
00461 t2->size=size;
00462
00463 name=t1->name;
00464 t1->name=t2->name;
00465 t2->name=name;
00466 }
|
|
||||||||||||
|
|
|
||||||||||||
|
00486 {
00487 after->prev=target;
00488 after->next=target->next;
00489 after->parent=target->parent;
00490 target->next=after;
00491 if (after->next!=NULL) after->next->prev=after;
00492 }
|
|
||||||||||||
|
00495 {
00496 before->next=target;
00497 before->prev=target->prev;
00498 before->parent=target->parent;
00499 target->prev=before;
00500 if (before->prev!=NULL)
00501 before->prev->next=before;
00502
00503 if (before->parent!=NULL && before->parent->child==target)
00504 before->parent->child=before;
00505 }
|
|
||||||||||||
|
00508 {
00509 en_tree *first, *second, *prev, *next;
00510 if (t1->next==t2)
00511 {
00512 first=t2;
00513 second=t1;
00514 }
00515 else
00516 {
00517 first=t1;
00518 second=t2;
00519 }
00520 prev=second->prev;
00521 next=first->next;
00522 en_tree_remove(first);
00523 en_tree_insert_after(prev, first);
00524 en_tree_remove(second);
00525 en_tree_insert_before(next, second);
00526 }
|
|
|
00531 {
00532 en_tree *cur=target;
00533 if (target==NULL) return -1;
00534 while (target->next!=NULL)
00535 {
00536 if (target->next->size<target->size)
00537 {
00538 en_tree_swap_contents (target, target->next);
00539 en_tree_swap_children (target, target->next);
00540 //en_tree_swap(target, target->next);
00541 if (target->prev!=NULL) target=target->prev;
00542 }
00543 else target=target->next;
00544 }
00545 }
|
|
|
00550 {
00551 en_tree *cur;
00552 en_tree_sort(target);
00553 for (cur=target; cur!=NULL; cur=cur->next)
00554 {
00555 en_tree_sort(cur->child);
00556 }
00557 }
|
|
||||||||||||
|
00927 {
00928 int c;
00929 char *cwd_only[2];
00930 int max_depth_specified = 0;
00931
00932 /* If nonzero, display only a total for each argument. */
00933 int opt_summarize_only = 0;
00934
00935 cwd_only[0] = ".";
00936 cwd_only[1] = NULL;
00937
00938 program_name = argv[0];
00939 setlocale (LC_ALL, "");
00940 bindtextdomain (PACKAGE, LOCALEDIR);
00941 textdomain (PACKAGE);
00942
00943 atexit (close_stdout);
00944
00945 exclude = new_exclude ();
00946 xstat = lstat;
00947
00948 human_block_size (getenv ("DU_BLOCK_SIZE"), 0, &output_block_size);
00949
00950 while ((c = getopt_long (argc, argv, "abcfhgHklmpPrsxDLSX:", long_options, NULL))
00951 != -1)
00952 {
00953 long int tmp_long;
00954 switch (c)
00955 {
00956 case 0: /* Long option. */
00957 break;
00958
00959 case 'a':
00960 opt_all = 1;
00961 break;
00962
00963 case 'b':
00964 output_block_size = 1;
00965 break;
00966
00967 case 'c':
00968 print_totals = 1;
00969 break;
00970
00971 case 'f':
00972 opt_siblings_first = 1;
00973 break;
00974
00975 case 'g':
00976 output_block_size = 1024 * 1024 * 1024;
00977 break;
00978
00979 case 'h':
00980 output_block_size = -1024;
00981 break;
00982
00983 case 'H':
00984 output_block_size = -1000;
00985 break;
00986
00987 case 'k':
00988 output_block_size = 1024;
00989 break;
00990
00991 case MAX_DEPTH_OPTION: /* --max-depth=N */
00992 if (xstrtol (optarg, NULL, 0, &tmp_long, NULL) != LONGINT_OK
00993 || tmp_long < 0 || tmp_long > INT_MAX)
00994 error (1, 0, _("invalid maximum depth %s"), quote (optarg));
00995
00996 max_depth_specified = 1;
00997 max_depth = (int) tmp_long;
00998 break;
00999
01000 case 'm':
01001 output_block_size = 1024 * 1024;
01002 break;
01003
01004 case 'l':
01005 opt_count_all = 1;
01006 break;
01007
01008 case 'p':
01009 opt_percent_mode = 1;
01010 break;
01011
01012 case 'P':
01013 opt_percent_mode = 2;
01014 break;
01015
01016 case 'r':
01017 opt_root_first = 1;
01018 break;
01019
01020 case 's':
01021 opt_summarize_only = 1;
01022 break;
01023
01024 case 'x':
01025 opt_one_file_system = 1;
01026 break;
01027
01028 case 'D':
01029 opt_dereference_arguments = 1;
01030 break;
01031
01032 case 'L':
01033 xstat = stat;
01034 break;
01035
01036 case 'S':
01037 opt_separate_dirs = 1;
01038 break;
01039
01040 case 'X':
01041 if (add_exclude_file (add_exclude, exclude, optarg, '\n') != 0)
01042 error (1, errno, "%s", quote (optarg));
01043 break;
01044
01045 case EXCLUDE_OPTION:
01046 add_exclude (exclude, optarg);
01047 break;
01048
01049 case BLOCK_SIZE_OPTION:
01050 human_block_size (optarg, 1, &output_block_size);
01051 break;
01052
01053 case_GETOPT_HELP_CHAR;
01054
01055 case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
01056
01057 default:
01058 usage (1);
01059 }
01060 }
01061
01062 if (opt_all && opt_summarize_only)
01063 {
01064 error (0, 0, _("cannot both summarize and show all entries"));
01065 usage (1);
01066 }
01067
01068 if (opt_summarize_only && max_depth_specified && max_depth == 0)
01069 {
01070 error (0, 0,
01071 _("warning: summarizing is the same as using --max-depth=0"));
01072 }
01073
01074 if (opt_summarize_only && max_depth_specified && max_depth != 0)
01075 {
01076 error (0, 0,
01077 _("warning: summarizing conflicts with --max-depth=%d"),
01078 max_depth);
01079 usage (1);
01080 }
01081
01082 if (opt_summarize_only)
01083 max_depth = 0;
01084
01085 /* Initialize the hash structure for inode numbers. */
01086 hash_init (INITIAL_HASH_MODULE, INITIAL_ENTRY_TAB_SIZE);
01087
01088 str_init (&path, INITIAL_PATH_SIZE);
01089
01090 du_files (optind == argc ? cwd_only : argv + optind);
01091
01092 exit (exit_status);
01093 }
|
|
|
|
1.2.18