]> git.tuebingen.mpg.de Git - adu.git/blobdiff - select.c
Header cleanup.
[adu.git] / select.c
index efe2c3c55a1ea18fb2629243ddf5b5c61aed6dca..515bbc4a5ecae2a26cfa3c4ffb4ce33e6b690c33 100644 (file)
--- a/select.c
+++ b/select.c
 #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
 
@@ -382,11 +389,62 @@ static int print_user_summary_line(struct user_info *ui, __a_unused void *data)
        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);
 }