X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=coreutils%2Fdu.c;h=b6ebaca7a067c0dceabe19e8bb17c0e053e6a792;hb=298854f02963bd8e43dfeb7224d88cfeb0c932cb;hp=02d1d97376a93c336f1a489a8e253605fe5b0840;hpb=27fdd081efa060edf7467c43d76071f1c960d228;p=oweals%2Fbusybox.git diff --git a/coreutils/du.c b/coreutils/du.c index 02d1d9737..b6ebaca7a 100644 --- a/coreutils/du.c +++ b/coreutils/du.c @@ -36,16 +36,6 @@ typedef void (Display) (long, char *); -typedef struct inode_type { - struct inode_type *next; - ino_t ino; -} INODETYPE; - -#define HASH_SIZE 311 /* Should be prime */ -#define hash_inode(i) ((i) % HASH_SIZE) - -static INODETYPE *inode_hash_list[HASH_SIZE]; - static const char du_usage[] = "du [OPTION]... [FILE]...\n\n" "Summarize disk space used for each FILE and/or directory.\n" @@ -71,45 +61,15 @@ static void print_summary(long size, char *filename) } } -/* Return 1 if inode is in inode hash list, else return 0 */ -static int is_in_list(const ino_t ino) -{ - INODETYPE *inode; - - inode = inode_hash_list[hash_inode(ino)]; - while (inode != NULL) { - if (inode->ino == ino) - return 1; - inode = inode->next; - } - - return 0; -} - -/* Add inode to inode hash list */ -static void add_inode(const ino_t ino) -{ - int i; - INODETYPE *inode; - - i = hash_inode(ino); - inode = malloc(sizeof(INODETYPE)); - if (inode == NULL) - fatalError("du: Not enough memory."); - - inode->ino = ino; - inode->next = inode_hash_list[i]; - inode_hash_list[i] = inode; -} - /* tiny recursive du */ static long du(char *filename) { struct stat statbuf; long sum; + int len; if ((lstat(filename, &statbuf)) != 0) { - fprintf(stdout, "du: %s: %s\n", filename, strerror(errno)); + printf("du: %s: %s\n", filename, strerror(errno)); return 0; } @@ -118,7 +78,9 @@ static long du(char *filename) /* Don't add in stuff pointed to by symbolic links */ if (S_ISLNK(statbuf.st_mode)) { - return 0; + sum = 0L; + if (du_depth == 1) + print(sum, filename); } if (S_ISDIR(statbuf.st_mode)) { DIR *dir; @@ -126,8 +88,14 @@ static long du(char *filename) dir = opendir(filename); if (!dir) { + du_depth--; return 0; } + + len = strlen(filename); + if (filename[len - 1] == '/') + filename[--len] = '\0'; + while ((entry = readdir(dir))) { char newfile[PATH_MAX + 1]; char *name = entry->d_name; @@ -137,8 +105,9 @@ static long du(char *filename) continue; } - if (strlen(filename) + strlen(name) + 1 > PATH_MAX) { + if (len + strlen(name) + 1 > PATH_MAX) { fprintf(stderr, name_too_long, "du"); + du_depth--; return 0; } sprintf(newfile, "%s/%s", filename, name); @@ -150,9 +119,14 @@ static long du(char *filename) } else if (statbuf.st_nlink > 1 && !count_hardlinks) { /* Add files with hard links only once */ - if (is_in_list(statbuf.st_ino)) - return 0; - add_inode(statbuf.st_ino); + if (is_in_ino_dev_hashtable(&statbuf, NULL)) { + sum = 0L; + if (du_depth == 1) + print(sum, filename); + } + else { + add_to_ino_dev_hashtable(&statbuf, NULL); + } } du_depth--; return sum; @@ -198,13 +172,21 @@ int du_main(int argc, char **argv) for (; i < argc; i++) { sum = du(argv[i]); - if ((sum) && (isDirectory(argv[i], FALSE, NULL))) { + if (sum && isDirectory(argv[i], FALSE, NULL)) { print_normal(sum, argv[i]); } + reset_ino_dev_hashtable(); } } exit(0); } -/* $Id: du.c,v 1.14 2000/02/19 18:16:49 erik Exp $ */ +/* $Id: du.c,v 1.16 2000/03/04 21:19:32 erik Exp $ */ +/* +Local Variables: +c-file-style: "linux" +c-basic-offset: 4 +tab-width: 4 +End: +*/