Changeset 1770 in MondoRescue for branches/stable/mindi-busybox/coreutils/du.c
- Timestamp:
- Nov 6, 2007, 11:01:53 AM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/stable/mindi-busybox/coreutils/du.c
r821 r1770 24 24 */ 25 25 26 #include <stdlib.h> 27 #include <limits.h> 28 #include <unistd.h> 29 #include <dirent.h> 30 #include <sys/stat.h> 31 #include "busybox.h" 32 33 #ifdef CONFIG_FEATURE_HUMAN_READABLE 34 # ifdef CONFIG_FEATURE_DU_DEFAULT_BLOCKSIZE_1K 35 static unsigned long disp_hr = KILOBYTE; 26 #include "libbb.h" 27 28 #if ENABLE_FEATURE_HUMAN_READABLE 29 # if ENABLE_FEATURE_DU_DEFAULT_BLOCKSIZE_1K 30 static unsigned long disp_hr = 1024; 36 31 # else 37 32 static unsigned long disp_hr = 512; 38 33 # endif 39 #elif defined CONFIG_FEATURE_DU_DEFAULT_BLOCKSIZE_1K40 static unsigned intdisp_k = 1;41 #else 42 static unsigned intdisp_k; /* bss inits to 0 */34 #elif ENABLE_FEATURE_DU_DEFAULT_BLOCKSIZE_1K 35 static unsigned disp_k = 1; 36 #else 37 static unsigned disp_k; /* bss inits to 0 */ 43 38 #endif 44 39 … … 46 41 static nlink_t count_hardlinks = 1; 47 42 48 static int status 49 #if EXIT_SUCCESS == 0 50 = EXIT_SUCCESS 51 #endif 52 ; 43 static int status; 53 44 static int print_files; 54 45 static int slink_depth; … … 58 49 59 50 60 static void print(long size, c har *filename)51 static void print(long size, const char *const filename) 61 52 { 62 53 /* TODO - May not want to defer error checking here. */ 63 #if def CONFIG_FEATURE_HUMAN_READABLE64 bb_printf("%s\t%s\n", make_human_readable_str(size, 512, disp_hr),65 54 #if ENABLE_FEATURE_HUMAN_READABLE 55 printf("%s\t%s\n", make_human_readable_str(size, 512, disp_hr), 56 filename); 66 57 #else 67 58 if (disp_k) { … … 69 60 size >>= 1; 70 61 } 71 bb_printf("%ld\t%s\n", size, filename);62 printf("%ld\t%s\n", size, filename); 72 63 #endif 73 64 } 74 65 75 66 /* tiny recursive du */ 76 static long du(c har *filename)67 static long du(const char *const filename) 77 68 { 78 69 struct stat statbuf; 79 70 long sum; 80 71 81 if ( (lstat(filename, &statbuf)) != 0) {72 if (lstat(filename, &statbuf) != 0) { 82 73 bb_perror_msg("%s", filename); 83 74 status = EXIT_FAILURE; … … 97 88 if (S_ISLNK(statbuf.st_mode)) { 98 89 if (slink_depth > du_depth) { /* -H or -L */ 99 if ( (stat(filename, &statbuf)) != 0) {90 if (stat(filename, &statbuf) != 0) { 100 91 bb_perror_msg("%s", filename); 101 92 status = EXIT_FAILURE; … … 111 102 if (statbuf.st_nlink > count_hardlinks) { 112 103 /* Add files/directories with links only once */ 113 if (is_in_ino_dev_hashtable(&statbuf , NULL)) {104 if (is_in_ino_dev_hashtable(&statbuf)) { 114 105 return 0; 115 106 } … … 122 113 char *newfile; 123 114 124 dir = bb_opendir(filename);115 dir = warn_opendir(filename); 125 116 if (!dir) { 126 117 status = EXIT_FAILURE; … … 136 127 137 128 newfile = concat_subpath_file(filename, name); 138 if (newfile == NULL)129 if (newfile == NULL) 139 130 continue; 140 131 ++du_depth; … … 153 144 } 154 145 146 int du_main(int argc, char **argv); 155 147 int du_main(int argc, char **argv) 156 148 { … … 159 151 int print_final_total; 160 152 char *smax_print_depth; 161 unsigned longopt;162 163 #if def CONFIG_FEATURE_DU_DEFUALT_BLOCKSIZE_1K153 unsigned opt; 154 155 #if ENABLE_FEATURE_DU_DEFAULT_BLOCKSIZE_1K 164 156 if (getenv("POSIXLY_CORRECT")) { /* TODO - a new libbb function? */ 165 #if def CONFIG_FEATURE_HUMAN_READABLE157 #if ENABLE_FEATURE_HUMAN_READABLE 166 158 disp_hr = 512; 167 159 #else … … 171 163 #endif 172 164 173 /* Note: SUSv3 specifies that -a and -s options can 165 /* Note: SUSv3 specifies that -a and -s options cannot be used together 174 166 * in strictly conforming applications. However, it also says that some 175 167 * du implementations may produce output when -a and -s are used together. … … 177 169 * ignore -a. This is consistent with -s being equivalent to -d 0. 178 170 */ 179 #if def CONFIG_FEATURE_HUMAN_READABLE180 bb_opt_complementally = "h-km:k-hm:m-hk:H-L:L-H:s-d:d-s";181 opt = bb_getopt_ulflags(argc,argv, "aHkLsx" "d:" "lc" "hm", &smax_print_depth);182 if ((opt & (1 << 9))) {171 #if ENABLE_FEATURE_HUMAN_READABLE 172 opt_complementary = "h-km:k-hm:m-hk:H-L:L-H:s-d:d-s"; 173 opt = getopt32(argv, "aHkLsx" "d:" "lc" "hm", &smax_print_depth); 174 if (opt & (1 << 9)) { 183 175 /* -h opt */ 184 176 disp_hr = 0; 185 177 } 186 if ((opt & (1 << 10))) {178 if (opt & (1 << 10)) { 187 179 /* -m opt */ 188 disp_hr = MEGABYTE;189 } 190 if ((opt & (1 << 2))) {180 disp_hr = 1024*1024; 181 } 182 if (opt & (1 << 2)) { 191 183 /* -k opt */ 192 disp_hr = KILOBYTE;193 } 194 #else 195 bb_opt_complementally = "H-L:L-H:s-d:d-s";196 opt = bb_getopt_ulflags(argc,argv, "aHkLsx" "d:" "lc", &smax_print_depth);197 #if ! defined CONFIG_FEATURE_DU_DEFAULT_BLOCKSIZE_1K198 if ((opt & (1 << 2))) {184 disp_hr = 1024; 185 } 186 #else 187 opt_complementary = "H-L:L-H:s-d:d-s"; 188 opt = getopt32(argv, "aHkLsx" "d:" "lc", &smax_print_depth); 189 #if !ENABLE_FEATURE_DU_DEFAULT_BLOCKSIZE_1K 190 if (opt & (1 << 2)) { 199 191 /* -k opt */ 200 201 } 202 #endif 203 #endif 204 if ((opt & (1 << 0))) {192 disp_k = 1; 193 } 194 #endif 195 #endif 196 if (opt & (1 << 0)) { 205 197 /* -a opt */ 206 198 print_files = INT_MAX; 207 199 } 208 if ((opt & (1 << 1))) {200 if (opt & (1 << 1)) { 209 201 /* -H opt */ 210 202 slink_depth = 1; 211 203 } 212 if ((opt & (1 << 3))) {204 if (opt & (1 << 3)) { 213 205 /* -L opt */ 214 215 } 216 if ((opt & (1 << 4))) {206 slink_depth = INT_MAX; 207 } 208 if (opt & (1 << 4)) { 217 209 /* -s opt */ 218 219 210 max_print_depth = 0; 211 } 220 212 one_file_system = opt & (1 << 5); /* -x opt */ 221 if ((opt & (1 << 6))) {213 if (opt & (1 << 6)) { 222 214 /* -d opt */ 223 max_print_depth = bb_xgetularg10_bnd(smax_print_depth, 0, INT_MAX);224 } 225 if ((opt & (1 << 7))) {215 max_print_depth = xatoi_u(smax_print_depth); 216 } 217 if (opt & (1 << 7)) { 226 218 /* -l opt */ 227 count_hardlinks = INT_MAX;219 count_hardlinks = MAXINT(nlink_t); 228 220 } 229 221 print_final_total = opt & (1 << 8); /* -c opt */ … … 232 224 argv += optind; 233 225 if (optind >= argc) { 234 *--argv = ".";226 *--argv = (char*)"."; 235 227 if (slink_depth == 1) { 236 228 slink_depth = 0; … … 244 236 slink_depth = slink_depth_save; 245 237 } while (*++argv); 246 #ifdef CONFIG_FEATURE_CLEAN_UP 247 reset_ino_dev_hashtable(); 248 #endif 249 238 if (ENABLE_FEATURE_CLEAN_UP) 239 reset_ino_dev_hashtable(); 250 240 if (print_final_total) { 251 241 print(total, "total"); 252 242 } 253 243 254 bb_fflush_stdout_and_exit(status);244 fflush_stdout_and_exit(status); 255 245 }
Note:
See TracChangeset
for help on using the changeset viewer.