-size_sum_t file_or_dir_size(const char *name) {
- DIR *dir;
- struct dirent *dir_e;
- struct stat dummy;
- size_sum_t result;
- char subname[BUFFER_SIZE];
-
- result = 0;
-
- if(lstat(name, &dummy) != 0) {
- printf("Can not stat %s: %s\n", name, strerror(errno));
- exit(EXIT_FAILURE);
- }
-
- if(S_ISLNK(dummy.st_mode)) {
- return 0;
- }
-
- dir = opendir(name);
-
- if(dir) {
- while((dir_e = readdir(dir))) {
- if(!ignore_entry(dir_e->d_name)) {
- snprintf(subname, BUFFER_SIZE, "%s/%s", name, dir_e->d_name);
- result += file_or_dir_size(subname);
- }
- }
- closedir(dir);
- } else {
- if(S_ISREG(dummy.st_mode)) {
- result += dummy.st_size;
- }
- }
-
- return result;
-}
-