+ ret = for_each_admissible_user(count_admissible_users, &usld);
+ if (ret < 0)
+ return ret;
+ if (usld.num_admissible_users == 0)
+ return 1;
+ usld.usis = adu_calloc(usld.num_admissible_users
+ * sizeof(struct user_summary_info));
+ usld.current = usld.usis;
+ ret = for_each_admissible_user(compute_user_summary, &usld);
+ if (ret < 0)
+ goto out;
+ switch (select_conf.user_summary_sort_arg) {
+ case user_summary_sort_arg_name:
+ comp = name_comp;
+ break;
+ case user_summary_sort_arg_uid:
+ comp = uid_comp;
+ break;
+ case user_summary_sort_arg_dir_count:
+ comp = dir_count_comp;
+ break;
+ case user_summary_sort_arg_file_count:
+ comp = file_count_comp;
+ break;
+ case user_summary_sort_arg_size:
+ comp = size_comp;
+ break;
+ default: /* this should never happen, but anyway */
+ comp = size_comp;
+ break;
+ }
+ qsort(usld.usis, usld.num_admissible_users,
+ sizeof(struct user_summary_info), comp);
+ for (i = 0; i < usld.num_admissible_users; i++) {
+ if (select_conf.limit_arg >= 0 && i > select_conf.limit_arg)
+ break;
+ ret = print_user_summary_line(usld.usis + i, usld.fi);
+ if (ret < 0)
+ goto out;
+ }
+ ret = output("%s", select_conf.trailer_arg);
+out:
+ free(usld.usis);
+ return ret;