- printf("\n%s (uid %u), by file count%s:\n",
- ui->pw_name? ui->pw_name : "?", (unsigned)ui->uid,
- count_unit_buf);
- usi.count = conf.limit_arg,
- usi.flags = USF_PRINT_DIRNAME | USF_PRINT_FILES;
- ret = adu_loop_reverse(ui->table, UT_FILES, &usi, user_stats_loop_function,
- &usi.ret, &usi.osl_errno);
+ }
+ int ret = for_each_admissible_user(compute_user_summary, fi);
+ if (ret < 0)
+ return ret;
+ sort_hash_table(summary_comparators[select_conf.user_summary_sort_arg]);
+ return for_each_admissible_user(print_user_summary_line, fi);
+}
+
+static int user_list_loop_function(struct osl_row *row, void *data)
+{
+ struct user_list_info *uli = data;
+ union atom_value values[] = {
+ [ula_pw_name] = {.string_value = uli->ui->pw_name?
+ uli->ui->pw_name : "?"},
+ [ula_uid] = {.num_value = (long long unsigned)uli->ui->uid},
+ [ula_files] = {.num_value = 0ULL},
+ [ula_size] = {.num_value = 0ULL},
+ [ula_dirname] = {.string_value = NULL}
+ };
+ uint64_t num;
+ int ret;
+ char *dirname, *buf;
+
+ check_signals();
+ ret = -E_LOOP_COMPLETE;
+ if (!uli->count)
+ goto err;
+
+ ret = get_num_user_files(row, uli->ui, &num);
+ if (ret < 0)
+ goto err;
+ values[ula_files].num_value = num;
+
+ ret = get_num_user_bytes(row, uli->ui, &num);
+ if (ret < 0)
+ goto err;
+ values[ula_size].num_value = num;
+
+ ret = get_dir_name_of_user_row(row, uli->ui, &dirname);
+ if (ret < 0)
+ goto err;
+ values[ula_dirname].string_value = dirname;
+
+ buf = format_items(uli->fi, values);
+ free(dirname);
+ ret = output("%s", buf);
+ free(buf);
+ if (ret < 0)
+ goto err;
+ uli->count--;
+ return ret;
+err:
+ uli->ret = ret;
+ uli->osl_errno = (ret == -E_OSL)? osl_errno : 0;
+ return ret;
+}
+
+static int print_user_list(struct user_info *ui, void *data)
+{
+ struct format_info *fi = data;
+ int ret;
+ enum user_table_columns sort_column = UT_BYTES;
+ struct user_list_info uli = {
+ .ui = ui,
+ .fi = fi,
+ .count = select_conf.limit_arg
+ };
+
+ if (select_conf.list_sort_arg == list_sort_arg_file_count)
+ sort_column = UT_FILES;
+
+ if (!select_conf.no_headers_given) {
+ ret = output("%s (uid %u)\n",
+ ui->pw_name? ui->pw_name : "?", (unsigned)ui->uid);