+ if (!usi->count && !summary)
+ return -E_LOOP_COMPLETE;
+ if (usi->count && (usi->flags & USF_PRINT_DIRNAME)) {
+ char *dirname;
+ ret = osl_get_object(usi->ui->table, row, UT_DIR_NUM, &obj);
+ if (ret < 0)
+ return ret;
+ ret = get_dir_name_by_number((uint64_t *)obj.data, &dirname);
+ if (ret < 0)
+ return ret;
+ printf("%s%s",
+ dirname,
+ (usi->flags & (USF_PRINT_FILES | USF_PRINT_BYTES))?
+ "\t" : "\n"
+ );
+ }
+ if (summary || (usi->count && (usi->flags & USF_PRINT_FILES))) {
+ uint64_t files;
+ ret = osl_get_object(usi->ui->table, row, UT_FILES, &obj);
+ if (ret < 0)
+ return ret;
+ files = *(uint64_t *)obj.data;
+ if (usi->count && (usi->flags & USF_PRINT_FILES)) {
+ format_size_value(conf.size_unit_arg, files,
+ formated_value);
+ printf("%s%s", formated_value,
+ (usi->flags & USF_PRINT_BYTES)? "\t" : "\n"
+ );
+ }
+ if (summary)
+ usi->ui->files += files;
+ }
+ if (summary || (usi->count && (usi->flags & USF_PRINT_BYTES))) {
+ uint64_t bytes;
+ ret = osl_get_object(usi->ui->table, row, UT_BYTES, &obj);
+ if (ret < 0)
+ return ret;
+ bytes = *(uint64_t *)obj.data;
+ if (usi->count && (usi->flags & USF_PRINT_BYTES)) {
+ format_size_value(conf.size_unit_arg, bytes,
+ formated_value);
+ printf("%s\n", formated_value);
+ }
+ if (summary) {
+ usi->ui->bytes += bytes;
+ usi->ui->dirs++;
+ }
+
+ }
+ if (usi->count > 0)
+ usi->count--;
+ return 1;
+}
+
+static void print_user_stats(void)
+{
+ struct user_info *ui;
+
+ FOR_EACH_USER(ui) {
+ struct user_stats_info usi = {
+ .count = conf.limit_arg,
+ .ui = ui
+ };
+ if (!ui_used(ui) || !ui_admissible(ui))
+ continue;
+ usi.flags = USF_PRINT_DIRNAME | USF_PRINT_BYTES | USF_COMPUTE_SUMMARY;
+ printf("************************************************ uid %u\n",
+ (unsigned) ui->uid);
+ printf("----------------- Largest dirs -------------------\n");
+ osl_rbtree_loop_reverse(ui->table, UT_BYTES, &usi,
+ user_stats_loop_function);
+ printf("---------- dirs containing most files ------------\n");
+ usi.count = conf.limit_arg,
+ usi.flags = USF_PRINT_DIRNAME | USF_PRINT_FILES;
+ osl_rbtree_loop_reverse(ui->table, UT_FILES, &usi,
+ user_stats_loop_function);
+ }
+}
+
+static int print_statistics(void)
+{
+ int ret;
+ struct global_stats_info gsi = {
+ .count = conf.limit_arg,
+ .flags = GSF_PRINT_DIRNAME | GSF_PRINT_BYTES | GSF_COMPUTE_SUMMARY
+ };
+
+ printf("----------------- Largest dirs -------------------\n");
+ ret = osl_rbtree_loop_reverse(dir_table, DT_BYTES, &gsi,
+ global_stats_loop_function);
+ if (ret < 0 && ret != -E_LOOP_COMPLETE)