- sprintf(newfile, "%s/%s", filename, name);
- sum += du(newfile);
+ /* Don't add in stuff pointed to by symbolic links */
+ if (S_ISLNK(statbuf.st_mode)) {
+ sum = 0L;
+ if (du_depth == 1)
+ print(sum, filename);
+ }
+ if (S_ISDIR(statbuf.st_mode)) {
+ DIR *dir;
+ struct dirent *entry;
+
+ 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;
+
+ if ((strcmp(name, "..") == 0)
+ || (strcmp(name, ".") == 0)) {
+ continue;
+ }
+
+ if (len + strlen(name) + 1 > PATH_MAX) {
+ fprintf(stderr, name_too_long, "du");
+ du_depth--;
+ return 0;
+ }
+ sprintf(newfile, "%s/%s", filename, name);
+
+ sum += du(newfile);
+ }
+ closedir(dir);
+ print(sum, filename);