#include "error.h"
#include "portable_io.h"
+/** Global dir count. */
+static uint64_t num_dirs;
+/** Global files count. */
+static uint64_t num_files;
+/** Global bytes count. */
+static uint64_t num_bytes;
+
/** The decimal representation of an uint64_t never exceeds that size. */
#define FORMATED_VALUE_SIZE 25
return 1;
}
+static int name_comp(const void *a, const void *b)
+{
+ char *x = ((struct user_info *)a)->pw_name;
+ char *y = ((struct user_info *)b)->pw_name;
+
+ if (!x)
+ return 1;
+ if (!y)
+ return -1;
+ return strcmp(x, y);
+}
+
+static int uid_comp(const void *a, const void *b)
+{
+ return -NUM_COMPARE(((struct user_info *)a)->uid,
+ ((struct user_info *)b)->uid);
+}
+
+static int dir_count_comp(const void *a, const void *b)
+{
+ return NUM_COMPARE(((struct user_info *)a)->dirs,
+ ((struct user_info *)b)->dirs);
+}
+
+static int file_count_comp(const void *a, const void *b)
+{
+ return NUM_COMPARE(((struct user_info *)a)->files,
+ ((struct user_info *)b)->files);
+}
+
+static int size_comp(const void *a, const void *b)
+{
+ return NUM_COMPARE(((struct user_info *)a)->bytes,
+ ((struct user_info *)b)->bytes);
+}
+
+/*
+ * The comparators for sorting the user summary.
+ *
+ * This is an array of pointers to functions taking two constant void *
+ * pointers and returning an int.
+ */
+static int (*summary_comparators[])(const void *, const void *) = {
+ [user_summary_sort_arg_name] = name_comp,
+ [user_summary_sort_arg_uid] = uid_comp,
+ [user_summary_sort_arg_dir_count] = dir_count_comp,
+ [user_summary_sort_arg_file_count] = file_count_comp,
+ [user_summary_sort_arg_size] = size_comp,
+};
+
static void print_user_summary(void)
{
printf("User summary "
"(pw_name/uid/dirs%s/files%s/size%s):\n",
count_unit_buf, count_unit_buf, size_unit_buf);
+ sort_hash_table(summary_comparators[conf.user_summary_sort_arg]);
for_each_admissible_user(print_user_summary_line, NULL);
}