projects
/
oweals
/
busybox.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix symlink removal problem noted by Erik Andersen.
[oweals/busybox.git]
/
du.c
diff --git
a/du.c
b/du.c
index e6b99a28b74f40bcb95102a81f4d50065408173d..3e4821a390010fa885d1a2937963f43eac2a025d 100644
(file)
--- a/
du.c
+++ b/
du.c
@@
-28,15
+28,13
@@
#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
+#include <string.h>
#include <errno.h>
#include "busybox.h"
#include <errno.h>
#include "busybox.h"
-#define BB_DECLARE_EXTERN
-#define bb_need_name_too_long
-#include "messages.c"
#ifdef BB_FEATURE_HUMAN_READABLE
#ifdef BB_FEATURE_HUMAN_READABLE
-
unsigned long du_
disp_hr = KILOBYTE;
+
static unsigned long
disp_hr = KILOBYTE;
#endif
typedef void (Display) (long, char *);
#endif
typedef void (Display) (long, char *);
@@
-48,8
+46,19
@@
static Display *print;
static void print_normal(long size, char *filename)
{
static void print_normal(long size, char *filename)
{
+ unsigned long base;
#ifdef BB_FEATURE_HUMAN_READABLE
#ifdef BB_FEATURE_HUMAN_READABLE
- printf("%s\t%s\n", format(size, du_disp_hr), filename);
+ 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
#else
printf("%ld\t%s\n", size, filename);
#endif
@@
-58,7
+67,6
@@
static void print_normal(long size, char *filename)
static void print_summary(long size, char *filename)
{
if (du_depth == 1) {
static void print_summary(long size, char *filename)
{
if (du_depth == 1) {
-printf("summary\n");
print_normal(size, filename);
}
}
print_normal(size, filename);
}
}
@@
-68,10
+76,10
@@
static long du(char *filename)
{
struct stat statbuf;
long sum;
{
struct stat statbuf;
long sum;
- int len;
if ((lstat(filename, &statbuf)) != 0) {
if ((lstat(filename, &statbuf)) != 0) {
- perror_msg_and_die("%s", filename);
+ perror_msg("%s", filename);
+ return 0;
}
du_depth++;
}
du_depth++;
@@
-86,6
+94,7
@@
static long du(char *filename)
if (S_ISDIR(statbuf.st_mode)) {
DIR *dir;
struct dirent *entry;
if (S_ISDIR(statbuf.st_mode)) {
DIR *dir;
struct dirent *entry;
+ char *newfile;
dir = opendir(filename);
if (!dir) {
dir = opendir(filename);
if (!dir) {
@@
-93,27
+102,20
@@
static long du(char *filename)
return 0;
}
return 0;
}
-
len = strlen(filename
);
- if (
filename[len - 1] == '/'
)
-
filename[--len]
= '\0';
+
newfile = last_char_is(filename, '/'
);
+ if (
newfile
)
+
*newfile
= '\0';
while ((entry = readdir(dir))) {
while ((entry = readdir(dir))) {
- char newfile[BUFSIZ + 1];
char *name = entry->d_name;
if ((strcmp(name, "..") == 0)
|| (strcmp(name, ".") == 0)) {
continue;
}
char *name = entry->d_name;
if ((strcmp(name, "..") == 0)
|| (strcmp(name, ".") == 0)) {
continue;
}
-
- if (len + strlen(name) + 1 > BUFSIZ) {
- error_msg(name_too_long);
- du_depth--;
- return 0;
- }
- sprintf(newfile, "%s/%s", filename, name);
-
+ newfile = concat_path_file(filename, name);
sum += du(newfile);
sum += du(newfile);
+ free(newfile);
}
closedir(dir);
print(sum, filename);
}
closedir(dir);
print(sum, filename);
@@
-156,8
+158,8
@@
int du_main(int argc, char **argv)
count_hardlinks = 1;
break;
#ifdef BB_FEATURE_HUMAN_READABLE
count_hardlinks = 1;
break;
#ifdef BB_FEATURE_HUMAN_READABLE
- case 'h': d
u_d
isp_hr = 0; break;
- case 'm': d
u_d
isp_hr = MEGABYTE; break;
+ case 'h': disp_hr = 0; break;
+ case 'm': disp_hr = MEGABYTE; break;
#endif
case 'k': break;
default:
#endif
case 'k': break;
default:
@@
-185,7
+187,7
@@
int du_main(int argc, char **argv)
return status;
}
return status;
}
-/* $Id: du.c,v 1.4
0 2001/03/07 03:53:40
andersen Exp $ */
+/* $Id: du.c,v 1.4
7 2001/05/07 22:49:43
andersen Exp $ */
/*
Local Variables:
c-file-style: "linux"
/*
Local Variables:
c-file-style: "linux"