]> git.tuebingen.mpg.de Git - adu.git/blobdiff - select.c
Move --size-unit and --count-unit from adu.ggo to select.ggo.
[adu.git] / select.c
index 4c2f12cbc7ab7e6f7f69bfbd7809daf866f4959a..e0950739e029c2148efb2111ff809b9402ccf051 100644 (file)
--- a/select.c
+++ b/select.c
@@ -14,6 +14,7 @@
 #include "string.h"
 #include "error.h"
 #include "portable_io.h"
+#include "select.cmdline.h"
 
 /** Global dir count. */
 static uint64_t num_dirs;
@@ -76,6 +77,8 @@ static const uint64_t count_unit_divisors[] = {
 
 static const char size_unit_abbrevs[] = " BKMGT";
 static const char count_unit_abbrevs[] = "  kmgt";
+struct select_args_info select_conf;
+static struct uid_range *admissible_uids;
 
 static enum enum_size_unit format_size_value(enum enum_size_unit unit,
                uint64_t value, int print_unit, char *result)
@@ -181,8 +184,8 @@ static int user_stats_loop_function(struct osl_row *row, void *data)
                        goto err;
                files = *(uint64_t *)obj.data;
                if (usi->count && (usi->flags & USF_PRINT_FILES)) {
-                       format_count_value(conf.count_unit_arg, files,
-                               conf.count_unit_arg == count_unit_arg_h,
+                       format_count_value(select_conf.count_unit_arg, files,
+                               select_conf.count_unit_arg == count_unit_arg_h,
                                formated_value);
                        printf("\t%s%s", formated_value,
                                (usi->flags & (USF_PRINT_BYTES | USF_PRINT_DIRNAME))?
@@ -199,8 +202,8 @@ static int user_stats_loop_function(struct osl_row *row, void *data)
                        goto err;
                bytes = *(uint64_t *)obj.data;
                if (usi->count && (usi->flags & USF_PRINT_BYTES)) {
-                       format_size_value(conf.size_unit_arg, bytes,
-                               conf.size_unit_arg == size_unit_arg_h,
+                       format_size_value(select_conf.size_unit_arg, bytes,
+                               select_conf.size_unit_arg == size_unit_arg_h,
                                formated_value);
                        printf("%s%s%s",
                                (usi->flags & USF_PRINT_FILES)? "" : "\t",
@@ -255,8 +258,8 @@ static int global_stats_loop_function(struct osl_row *row, void *data)
                        goto err;
                files = *(uint64_t *)obj.data;
                if (gsi->count && (gsi->flags & GSF_PRINT_FILES)) {
-                       format_count_value(conf.count_unit_arg, files,
-                               conf.count_unit_arg == count_unit_arg_h,
+                       format_count_value(select_conf.count_unit_arg, files,
+                               select_conf.count_unit_arg == count_unit_arg_h,
                                formated_value);
                        printf("\t%s%s", formated_value,
                                (gsi->flags & (GSF_PRINT_BYTES | GSF_PRINT_DIRNAME))?
@@ -272,8 +275,8 @@ static int global_stats_loop_function(struct osl_row *row, void *data)
                        goto err;
                bytes = *(uint64_t *)obj.data;
                if (gsi->count && (gsi->flags & GSF_PRINT_BYTES)) {
-                       format_size_value(conf.size_unit_arg, bytes,
-                               conf.size_unit_arg == size_unit_arg_h,
+                       format_size_value(select_conf.size_unit_arg, bytes,
+                               select_conf.size_unit_arg == size_unit_arg_h,
                                formated_value);
                        printf("%s%s%s",
                                (gsi->flags & GSF_PRINT_FILES)? "" : "\t",
@@ -338,9 +341,9 @@ static void print_global_summary(void)
 
        if (conf.no_global_summary_given)
                return;
-       ud = format_count_value(conf.count_unit_arg, num_dirs, 0, d);
-       uf = format_count_value(conf.count_unit_arg, num_files, 0, f);
-       us = format_size_value(conf.size_unit_arg, num_bytes, 0, s);
+       ud = format_count_value(select_conf.count_unit_arg, num_dirs, 0, d);
+       uf = format_count_value(select_conf.count_unit_arg, num_files, 0, f);
+       us = format_size_value(select_conf.size_unit_arg, num_bytes, 0, s);
 
        if (!conf.no_headers_given)
                printf("Global summary "
@@ -358,14 +361,14 @@ static int print_user_summary_line(struct user_info *ui, __a_unused void *data)
                formated_file_count[FORMATED_VALUE_SIZE],
                formated_bytes[FORMATED_VALUE_SIZE ];
 
-       format_count_value(conf.count_unit_arg, ui->dirs,
-               conf.count_unit_arg == count_unit_arg_h,
+       format_count_value(select_conf.count_unit_arg, ui->dirs,
+               select_conf.count_unit_arg == count_unit_arg_h,
                formated_dir_count);
-       format_count_value(conf.count_unit_arg, ui->files,
-               conf.count_unit_arg == count_unit_arg_h,
+       format_count_value(select_conf.count_unit_arg, ui->files,
+               select_conf.count_unit_arg == count_unit_arg_h,
                formated_file_count);
-       format_size_value(conf.size_unit_arg, ui->bytes,
-               conf.size_unit_arg == size_unit_arg_h,
+       format_size_value(select_conf.size_unit_arg, ui->bytes,
+               select_conf.size_unit_arg == size_unit_arg_h,
                formated_bytes);
        printf("\t%s\t%u\t%s\t%s\t%s\n",
                ui->pw_name? ui->pw_name : "?",
@@ -448,7 +451,7 @@ static int print_user_list(struct user_info *ui, __a_unused void *data)
                || ula == user_list_arg_both);
 
        if (print_size_list) {
-               usi.count = conf.limit_arg;
+               usi.count = select_conf.limit_arg;
                usi.ui = ui;
                usi.flags = USF_PRINT_DIRNAME | USF_PRINT_BYTES | USF_COMPUTE_SUMMARY;
                if (!conf.no_headers_given)
@@ -466,7 +469,7 @@ static int print_user_list(struct user_info *ui, __a_unused void *data)
                        printf("%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.count = select_conf.limit_arg,
                usi.ui = ui;
                usi.flags = USF_PRINT_DIRNAME | USF_PRINT_FILES;
                ret = adu_loop_reverse(ui->table, UT_FILES, &usi, user_stats_loop_function,
@@ -476,7 +479,7 @@ static int print_user_list(struct user_info *ui, __a_unused void *data)
                printf("\n");
        }
        if (ula == user_list_arg_none && !conf.no_user_summary_given) {
-               usi.count = conf.limit_arg;
+               usi.count = select_conf.limit_arg;
                usi.ui = ui;
                usi.flags = USF_COMPUTE_SUMMARY;
                ret = adu_loop_reverse(ui->table, UT_FILES, &usi, user_stats_loop_function,
@@ -501,7 +504,7 @@ static int print_global_lists(void)
                || gla == global_list_arg_both);
 
        if (print_size_list) {
-               gsi.count = conf.limit_arg;
+               gsi.count = select_conf.limit_arg;
                gsi.flags = GSF_PRINT_DIRNAME | GSF_PRINT_BYTES | GSF_COMPUTE_SUMMARY;
                if (!conf.no_headers_given)
                        printf("By size%s:\n", size_unit_buf);
@@ -512,7 +515,7 @@ static int print_global_lists(void)
                printf("\n");
        }
        if (gla == global_list_arg_file_count || gla == global_list_arg_both) {
-               gsi.count = conf.limit_arg;
+               gsi.count = select_conf.limit_arg;
                gsi.flags = GSF_PRINT_DIRNAME | GSF_PRINT_FILES;
                if (!print_size_list)
                        gsi.flags |= GSF_COMPUTE_SUMMARY;
@@ -526,7 +529,7 @@ static int print_global_lists(void)
        }
        if (gla == global_list_arg_none && !conf.no_global_summary_given) {
                /* must compute summary */
-               gsi.count = conf.limit_arg;
+               gsi.count = select_conf.limit_arg;
                gsi.flags = GSF_COMPUTE_SUMMARY;
                ret = adu_loop_reverse(dir_table, DT_FILES, &gsi,
                        global_stats_loop_function, &gsi.ret, &gsi.osl_errno);
@@ -575,7 +578,7 @@ static int read_uid_file(void)
        create_hash_table(bits);
        for (n = 0; n < num_uids; n++) {
                uint32_t uid = read_u32(map + n * sizeof(uid));
-               ret = search_uid(uid, OPEN_USER_TABLE, NULL);
+               ret = search_uid(uid, admissible_uids, OPEN_USER_TABLE, NULL);
                if (ret < 0)
                        goto out;
        }
@@ -587,13 +590,29 @@ out:
 int com_select(void)
 {
        int ret;
+       struct select_cmdline_parser_params params = {
+               .override = 1,
+               .initialize = 1,
+               .check_required = 1,
+               .check_ambiguity = 1,
+               .print_errors = 1
+       };
+
+       if (conf.select_options_given) {
+               if (select_cmdline_parser_string_ext(conf.select_options_arg,
+                       &select_conf, "select", &params))
+                       return -E_SYNTAX;
+               ret = parse_uid_arg(select_conf.uid_arg, &admissible_uids);
+               if (ret < 0)
+                       return ret;
+       }
 
-       if (conf.count_unit_arg != count_unit_arg_h)
-               count_unit_buf[1] = count_unit_abbrevs[conf.count_unit_arg];
+       if (select_conf.count_unit_arg != count_unit_arg_h)
+               count_unit_buf[1] = count_unit_abbrevs[select_conf.count_unit_arg];
        else
                count_unit_buf[0] = '\0';
-       if (conf.size_unit_arg != size_unit_arg_h)
-               size_unit_buf[1] = size_unit_abbrevs[conf.size_unit_arg];
+       if (select_conf.size_unit_arg != size_unit_arg_h)
+               size_unit_buf[1] = size_unit_abbrevs[select_conf.size_unit_arg];
        else
                size_unit_buf[0] = '\0';