X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=coreutils%2Fdu.c;h=3f7621b3de2ac1972cb8502bd183a0e7b64fa526;hb=6aabfd5e30087bb0ffdb6404aa6d650014de2dc0;hp=b1ca954366159d6b6738fae05761b8428cd853a5;hpb=d537a95fdbc0b4a5f38edea8593b4c085fdd7fcb;p=oweals%2Fbusybox.git diff --git a/coreutils/du.c b/coreutils/du.c index b1ca95436..3f7621b3d 100644 --- a/coreutils/du.c +++ b/coreutils/du.c @@ -3,7 +3,7 @@ * Mini du implementation for busybox * * - * Copyright (C) 1999,2000 by Lineo, inc. + * Copyright (C) 1999,2000,2001 by Lineo, inc. * Written by John Beppu * * This program is free software; you can redistribute it and/or modify @@ -22,29 +22,22 @@ * */ -#include "internal.h" -#define BB_DECLARE_EXTERN -#define bb_need_name_too_long -#include "messages.c" - #include #include #include #include +#include +#include +#include #include +#include "busybox.h" -typedef void (Display) (long, char *); -static const char du_usage[] = - "du [OPTION]... [FILE]...\n" -#ifndef BB_FEATURE_TRIVIAL_HELP - "\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-l\tcount sizes many times if hard linked\n" - "\t-s\tdisplay only a total for each argument\n" +#ifdef BB_FEATURE_HUMAN_READABLE +static unsigned long disp_hr = KILOBYTE; #endif - ; + +typedef void (Display) (long, char *); static int du_depth = 0; static int count_hardlinks = 0; @@ -53,12 +46,28 @@ static Display *print; static void print_normal(long size, char *filename) { - fprintf(stdout, "%ld\t%s\n", size, filename); + unsigned long base; +#ifdef BB_FEATURE_HUMAN_READABLE + switch (disp_hr) { + case MEGABYTE: + base = KILOBYTE; + break; + case KILOBYTE: + base = 1; + break; + default: + base = 0; + } + printf("%s\t%s\n", make_human_readable_str(size, base), 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); } } @@ -71,7 +80,7 @@ static long du(char *filename) int len; if ((lstat(filename, &statbuf)) != 0) { - printf("du: %s: %s\n", filename, strerror(errno)); + perror_msg("%s", filename); return 0; } @@ -99,22 +108,16 @@ static long du(char *filename) filename[--len] = '\0'; while ((entry = readdir(dir))) { - char newfile[BUFSIZ + 1]; + char *newfile; char *name = entry->d_name; if ((strcmp(name, "..") == 0) || (strcmp(name, ".") == 0)) { continue; } - - if (len + strlen(name) + 1 > BUFSIZ) { - errorMsg(name_too_long); - du_depth--; - return 0; - } - sprintf(newfile, "%s/%s", filename, name); - + newfile = concat_path_file(filename, name); sum += du(newfile); + free(newfile); } closedir(dir); print(sum, filename); @@ -136,55 +139,57 @@ static long du(char *filename) int du_main(int argc, char **argv) { + int status = EXIT_SUCCESS; int i; - char opt; + int c; /* default behaviour */ print = print_normal; /* parse argv[] */ - for (i = 1; i < argc; i++) { - if (argv[i][0] == '-') { - opt = argv[i][1]; - switch (opt) { + while ((c = getopt(argc, argv, "sl" +#ifdef BB_FEATURE_HUMAN_READABLE +"hm" +#endif +"k")) != EOF) { + switch (c) { case 's': - print = print_summary; - break; + print = print_summary; + break; case 'l': - count_hardlinks = 1; - break; - case 'h': - case '-': - usage(du_usage); - break; + count_hardlinks = 1; + break; +#ifdef BB_FEATURE_HUMAN_READABLE + case 'h': disp_hr = 0; break; + case 'm': disp_hr = MEGABYTE; break; +#endif + case 'k': break; default: - errorMsg("invalid option -- %c\n", opt); - usage(du_usage); + show_usage(); } - } else { - break; - } } /* go through remaining args (if any) */ - if (i >= argc) { - du("."); + if (optind >= argc) { + if (du(".") == 0) + status = EXIT_FAILURE; } else { long sum; - for (; i < argc; i++) { - sum = du(argv[i]); - if (sum && isDirectory(argv[i], FALSE, NULL)) { + for (i=optind; i < argc; i++) { + if ((sum = du(argv[i])) == 0) + status = EXIT_FAILURE; + if(is_directory(argv[i], FALSE, NULL)==FALSE) { print_normal(sum, argv[i]); } reset_ino_dev_hashtable(); } } - return(0); + return status; } -/* $Id: du.c,v 1.21 2000/07/14 01:51:25 kraai Exp $ */ +/* $Id: du.c,v 1.45 2001/04/25 05:39:18 andersen Exp $ */ /* Local Variables: c-file-style: "linux"