From 5b539f1d0fbcf002017e28a635f33495e1a75ab8 Mon Sep 17 00:00:00 2001 From: Kevin Day Date: Sun, 27 Apr 2025 18:33:59 -0500 Subject: [PATCH] Update: Set error state on kt_remove_flag_operate_remove_fail_d and toggle directory empty behavior. An error should be returned when the `kt_remove_flag_operate_remove_fail_d` is passed. This should only happen when not simulating. The directory empty behavior should utilize the flag `kt_remove_flag_operate_empty_d` to avoid checking the state value. --- sources/c/program/kevux/tools/remove/main/preprocess.c | 18 +++++++++++++----- sources/c/program/kevux/tools/remove/main/preprocess.h | 2 ++ tests/unit/remove/c/test-remove-file_type.c | 18 +++++++++--------- 3 files changed, 24 insertions(+), 14 deletions(-) diff --git a/sources/c/program/kevux/tools/remove/main/preprocess.c b/sources/c/program/kevux/tools/remove/main/preprocess.c index c091068..932300f 100644 --- a/sources/c/program/kevux/tools/remove/main/preprocess.c +++ b/sources/c/program/kevux/tools/remove/main/preprocess.c @@ -124,7 +124,11 @@ extern "C" { kt_remove_preprocess_file_type(main, kt_remove_flag_simulate_none_d, path, macro_f_file_type_is_unknown(statistics.st_mode), f_file_type_name_unknown_s, kt_remove_main_flag_unknown_d, kt_remove_main_flag_unknown_ignore_d, &flag_out); - if (!(main->setting.flag & kt_remove_main_flag_simulate_d) && (flag_out & kt_remove_flag_operate_remove_fail_d)) return flag_out; + if (!(main->setting.flag & kt_remove_main_flag_simulate_d) && (flag_out & kt_remove_flag_operate_remove_fail_d)) { + main->setting.state.status = F_status_set_error(F_no); + + return flag_out; + } if (main->setting.flag & kt_remove_main_flag_user_d) { for (i = 0; i < main->setting.users.used; ++i) { @@ -237,13 +241,15 @@ extern "C" { if (main->setting.state.status == F_true || main->setting.state.status == F_false) { if (main->setting.state.status == F_true) { flag_out |= kt_remove_flag_operate_empty_d; + } else { + flag_out &= ~kt_remove_flag_operate_empty_d; } kt_remove_print_simulate_operate_boolean(&main->program.output, flag_out, kt_remove_empty_s, main->setting.state.status); if (!(flag_out & kt_remove_flag_operate_remove_not_d)) { if (main->setting.flag & kt_remove_main_flag_empty_all_d) { - if (main->setting.state.status == F_true) { + if (flag_out & kt_remove_flag_operate_empty_d) { if (main->setting.flag & kt_remove_main_flag_empty_not_fail_d) { kt_remove_print_error_file_is_a(&main->program.error, path, kt_remove_empty_s, 0); @@ -253,7 +259,7 @@ extern "C" { flag_out |= kt_remove_flag_operate_remove_not_d; } } - else if (main->setting.state.status == F_false) { + else { if (main->setting.flag & kt_remove_main_flag_empty_only_fail_d) { kt_remove_print_error_file_is_a(&main->program.error, path, kt_remove_not_empty_s, 0); @@ -264,7 +270,7 @@ extern "C" { } } } - else if (main->setting.state.status == F_false) { + else if (!(flag_out & kt_remove_flag_operate_empty_d)) { if (!(main->setting.flag & kt_remove_main_flag_recurse_d)) { kt_remove_print_error_file_is_a(&main->program.error, path, kt_remove_not_empty_s, 0); @@ -342,7 +348,9 @@ extern "C" { } if (F_status_is_error_not(main->setting.state.status)) { - main->setting.state.status = F_okay; + main->setting.state.status = !(main->setting.flag & kt_remove_main_flag_simulate_d) && (flag_out & kt_remove_flag_operate_remove_fail_d) + ? F_status_set_error(F_no) + : F_okay; } return flag_out; diff --git a/sources/c/program/kevux/tools/remove/main/preprocess.h b/sources/c/program/kevux/tools/remove/main/preprocess.h index 2d254a7..9e2c7da 100644 --- a/sources/c/program/kevux/tools/remove/main/preprocess.h +++ b/sources/c/program/kevux/tools/remove/main/preprocess.h @@ -24,6 +24,8 @@ extern "C" { * F_okay on success. * F_data_not on success but file is an empty string. * + * F_no (with error bit) on failure (not returned when simulating). + * * Errors (with error bit) from: f_directory_empty(). * Errors (with error bit) from: f_file_exists(). * Errors (with error bit) from: f_file_is(). diff --git a/tests/unit/remove/c/test-remove-file_type.c b/tests/unit/remove/c/test-remove-file_type.c index 6f88be0..ee53b1d 100644 --- a/tests/unit/remove/c/test-remove-file_type.c +++ b/tests/unit/remove/c/test-remove-file_type.c @@ -56,18 +56,18 @@ void test__kt_remove__file_type__works(void **state) { will_return(__wrap_f_file_stat, &stats[i]); will_return(__wrap_f_file_stat, F_okay); - if (macro_f_file_type_is_directory(stats[i].st_mode)) { - will_return(__wrap_f_directory_empty, F_true); - - will_return(__wrap_fl_directory_do, 1); - will_return(__wrap_fl_directory_do, &target); - will_return(__wrap_fl_directory_do, &target); - will_return(__wrap_fl_directory_do, f_directory_recurse_do_flag_action_d | f_directory_recurse_do_flag_directory_d); - } - // Process file. if (i == type) { if (macro_f_file_type_is_directory(stats[i].st_mode)) { + will_return(__wrap_f_directory_empty, F_true); + + will_return(__wrap_fl_directory_do, 1); + will_return(__wrap_fl_directory_do, &target); + will_return(__wrap_fl_directory_do, &target); + will_return(__wrap_fl_directory_do, f_directory_recurse_do_flag_action_d | f_directory_recurse_do_flag_directory_d); + } + + if (macro_f_file_type_is_directory(stats[i].st_mode)) { // The pre-process gets called again before the final removal for directories. will_return(__wrap_f_file_exists, F_true); -- 1.8.3.1