- DIR *dir;
- struct dirent *entry;
- int ret, cwd_fd, ret2;
- uint64_t dir_size = 0, dir_files = 0;
- uint32_t this_dir_num = num_dirs++;
-
- DEBUG_LOG("----------------- %u: %s\n", num_dirs, dirname);
- ret = para_opendir(dirname, &dir, &cwd_fd);
- if (ret < 0) {
- if (ret != -ERRNO_TO_ERROR(EACCES))
- return ret;
- WARNING_LOG("permission denied for %s\n", dirname);
- return 1;
- }
- while ((entry = readdir(dir))) {
- mode_t m;
- char *tmp;
- struct stat s;
- uint32_t uid;
- uint64_t size;
- struct user_info *ui;
-
- if (!strcmp(entry->d_name, "."))
- continue;
- if (!strcmp(entry->d_name, ".."))
- continue;
- if (lstat(entry->d_name, &s) == -1) {
- WARNING_LOG("lstat error for %s/%s\n", dirname,
- entry->d_name);
- continue;
- }
- m = s.st_mode;
- if (!S_ISREG(m) && !S_ISDIR(m))
- continue;
- if (S_ISDIR(m)) {
- tmp = make_message("%s/%s", dirname, entry->d_name);
- ret = scan_dir(tmp);
- free(tmp);
- if (ret < 0)
- goto out;
- continue;
- }
- /* regular file */
- size = s.st_size;
- dir_size += size;
- num_bytes += size;
- dir_files++;
- num_files++;
- uid = s.st_uid;
- ret = search_uid(uid, 1, &ui);
- if (ret < 0)
- goto out;
- ui->bytes += size;
- ui->files++;
- ret = update_user_row(ui->table, this_dir_num, &size);
- if (ret < 0)
- goto out;
- }
- ret = add_directory(dirname, this_dir_num, &dir_size, &dir_files);
-out:
- closedir(dir);
- ret2 = para_fchdir(cwd_fd);
- if (ret2 < 0 && ret >= 0)
- ret = ret2;
- close(cwd_fd);
- return ret;