From f3fb188582c4496c2d1df75f662924f9a0e9e39a Mon Sep 17 00:00:00 2001 From: Kevin Day Date: Thu, 10 Apr 2025 22:55:39 -0500 Subject: [PATCH] Progress: Continue working on completing the remove program. Add file type ignore flags to conditionally suppress printing types when not wanted during simulation. This is needed for the `rm` program when simulate is wrong. Prior to this change the `rm` program is showing all file types. --- .../kevux/tools/remove/main/common/define.h | 106 ++++++++++++--------- .../c/program/kevux/tools/remove/main/operate.c | 2 - .../c/program/kevux/tools/remove/main/preprocess.c | 20 ++-- .../c/program/kevux/tools/remove/main/preprocess.h | 4 +- sources/c/program/kevux/tools/remove/rm/rm.c | 2 +- 5 files changed, 77 insertions(+), 57 deletions(-) diff --git a/sources/c/program/kevux/tools/remove/main/common/define.h b/sources/c/program/kevux/tools/remove/main/common/define.h index 26efe62..e69a2c2 100644 --- a/sources/c/program/kevux/tools/remove/main/common/define.h +++ b/sources/c/program/kevux/tools/remove/main/common/define.h @@ -216,24 +216,31 @@ extern "C" { * - accessed: Remove by last accessed datetime. * - accessed_changed_updated: A helper flag representing accessed, changed, and updated flag bits being set. * - block: Remove by file type: block. + * - block_ignore: Ignore during simulate file type: block. * - changed: Remove by changed datetime. * - character: Remove by file type: character. + * - character_ignore: Ignore during simulate file type: character. * - copyright: Print copyright. * - different: Remove by user different from caller. * - directory: Remove by file type: directory. + * - directory_ignore: Ignore during simulate file type: directory. * - empty_all: Helper flag representing all empty flag bits. * - empty_only: Remove empty directories. * - empty_only_fail: Fail on empty directories. * - empty_not: Remove not empty directories. * - empty_not_fail: Fail on not empty directories. * - fifo: Remove by file type: FIFO. - * - file_types_except_directory: A helper flag representing all file types except for the directory type. + * - fifo_ignore: Ignore during simulate file type: FIFO. + * - file_types: A helper flag representing all file types flags. + * - file_types_except_directory: A helper flag representing all file types flags except for the directory type. + * - file_types_ignore: A helper flag representing all file types "ignore" flags. * - follow: Follow symbolic links for deleting the file being pointed to rather than the link itself (when not set the link itself is deleted). * - force: Forcibly delete. * - force_simulate: A helper flag representing force and simulate flag bits being set. * - group: Remove by GID. * - help: Print help. * - link: Remove by file type: link. + * - link_ignore: Ignore during simulate file type: link. * - mode: Remove by mode. * - option_type: Designates that type match options are specifically in use, overriding the default behavior (one should also set options_used when setting this). * - option_type_used: A helper flag representing option_type and option_used flag bits being set. @@ -245,15 +252,18 @@ extern "C" { * - prompt_once: Operate in interactive mode: prompting once if removing 3 or more files or when operating recursively. * - recurse: Recurse directories. * - regular: Remove by file type: regular. + * - regular_ignore: Ignore during simulate file type: regular. * - remember: Enable remembering paths already processed. * - root: Allow for deleting root directory (Dangerous!). * - same: Remove by same user as caller. * - simulate: Do not actually perform deletes, instead print messages (when silent, should still return 0 or 1). * - socket: Remove by file type: socket. + * - socket_ignore: Ignore during simulate file type: socket. * - tree: Remove directory tree (parent directories) (remove a/b/c, removes a/b/c, then a/b/, then a). * - updated: Remove by last updated datetime. * - user: Remove by UID. * - unknown: Remove by file type: unknown. + * - unknown_ignore: Ignore during simulate file type: unknown. * - utc: Process dates in UTC mode. * - version: Print version. * - version_copyright_help: A helper flag representing version, copyright, and help flag bits being set. @@ -261,49 +271,59 @@ extern "C" { #ifndef _di_kt_remove_main_flag_d_ #define kt_remove_main_flag_none_d 0x0 #define kt_remove_main_flag_accessed_d 0x1 - #define kt_remove_main_flag_accessed_changed_updated_d 0x100000005 + #define kt_remove_main_flag_accessed_changed_updated_d 0x8000000009 #define kt_remove_main_flag_block_d 0x2 - #define kt_remove_main_flag_changed_d 0x4 - #define kt_remove_main_flag_character_d 0x8 - #define kt_remove_main_flag_copyright_d 0x10 - #define kt_remove_main_flag_different_d 0x20 - #define kt_remove_main_flag_directory_d 0x40 - #define kt_remove_main_flag_empty_all_d 0x780 - #define kt_remove_main_flag_empty_only_d 0x80 - #define kt_remove_main_flag_empty_only_fail_d 0x100 - #define kt_remove_main_flag_empty_not_d 0x200 - #define kt_remove_main_flag_empty_not_fail_d 0x400 - #define kt_remove_main_flag_fifo_d 0x800 - #define kt_remove_main_flag_file_types_except_directory_d 0x44201080a - #define kt_remove_main_flag_follow_d 0x1000 - #define kt_remove_main_flag_force_d 0x2000 - #define kt_remove_main_flag_force_simulate_d 0x20002000 - #define kt_remove_main_flag_group_d 0x4000 - #define kt_remove_main_flag_help_d 0x8000 - #define kt_remove_main_flag_link_d 0x10000 - #define kt_remove_main_flag_mode_d 0x20000 - #define kt_remove_main_flag_option_type_d 0x40000 - #define kt_remove_main_flag_option_type_used_d 0xc0000 - #define kt_remove_main_flag_option_used_d 0x80000 - #define kt_remove_main_flag_prompt_all_d 0xf00000 - #define kt_remove_main_flag_prompt_each_d 0x100000 - #define kt_remove_main_flag_prompt_follow_d 0x200000 - #define kt_remove_main_flag_prompt_never_d 0x400000 - #define kt_remove_main_flag_prompt_once_d 0x800000 - #define kt_remove_main_flag_recurse_d 0x1000000 - #define kt_remove_main_flag_regular_d 0x2000000 - #define kt_remove_main_flag_remember_d 0x4000000 - #define kt_remove_main_flag_root_d 0x8000000 - #define kt_remove_main_flag_same_d 0x10000000 - #define kt_remove_main_flag_simulate_d 0x20000000 - #define kt_remove_main_flag_socket_d 0x40000000 - #define kt_remove_main_flag_tree_d 0x80000000 - #define kt_remove_main_flag_updated_d 0x100000000 - #define kt_remove_main_flag_user_d 0x200000000 - #define kt_remove_main_flag_unknown_d 0x400000000 - #define kt_remove_main_flag_utc_d 0x800000000 - #define kt_remove_main_flag_version_d 0x1000000000 - #define kt_remove_main_flag_version_copyright_help_d 0x1000008010 + #define kt_remove_main_flag_block_ignore_d 0x4 + #define kt_remove_main_flag_changed_d 0x8 + #define kt_remove_main_flag_character_d 0x10 + #define kt_remove_main_flag_character_ignore_d 0x20 + #define kt_remove_main_flag_copyright_d 0x40 + #define kt_remove_main_flag_different_d 0x80 + #define kt_remove_main_flag_directory_d 0x100 + #define kt_remove_main_flag_directory_ignore_d 0x200 + #define kt_remove_main_flag_empty_all_d 0x3c00 + #define kt_remove_main_flag_empty_only_d 0x400 + #define kt_remove_main_flag_empty_only_fail_d 0x800 + #define kt_remove_main_flag_empty_not_d 0x1000 + #define kt_remove_main_flag_empty_not_fail_d 0x2000 + #define kt_remove_main_flag_fifo_d 0x4000 + #define kt_remove_main_flag_fifo_ignore_d 0x8000 + #define kt_remove_main_flag_file_types_d 0x21040104112 + #define kt_remove_main_flag_file_types_except_directory_d 0x21040104012 + #define kt_remove_main_flag_file_types_ignore_d 0x42080208224 + #define kt_remove_main_flag_follow_d 0x10000 + #define kt_remove_main_flag_force_d 0x20000 + #define kt_remove_main_flag_force_simulate_d 0x800020000 + #define kt_remove_main_flag_group_d 0x40000 + #define kt_remove_main_flag_help_d 0x80000 + #define kt_remove_main_flag_link_d 0x100000 + #define kt_remove_main_flag_link_ignore_d 0x200000 + #define kt_remove_main_flag_mode_d 0x400000 + #define kt_remove_main_flag_option_type_d 0x800000 + #define kt_remove_main_flag_option_type_used_d 0x1800000 + #define kt_remove_main_flag_option_used_d 0x1000000 + #define kt_remove_main_flag_prompt_all_d 0x1e000000 + #define kt_remove_main_flag_prompt_each_d 0x2000000 + #define kt_remove_main_flag_prompt_follow_d 0x4000000 + #define kt_remove_main_flag_prompt_never_d 0x8000000 + #define kt_remove_main_flag_prompt_once_d 0x10000000 + #define kt_remove_main_flag_recurse_d 0x20000000 + #define kt_remove_main_flag_regular_d 0x40000000 + #define kt_remove_main_flag_regular_ignore_d 0x80000000 + #define kt_remove_main_flag_remember_d 0x100000000 + #define kt_remove_main_flag_root_d 0x200000000 + #define kt_remove_main_flag_same_d 0x400000000 + #define kt_remove_main_flag_simulate_d 0x800000000 + #define kt_remove_main_flag_socket_d 0x1000000000 + #define kt_remove_main_flag_socket_ignore_d 0x2000000000 + #define kt_remove_main_flag_tree_d 0x4000000000 + #define kt_remove_main_flag_updated_d 0x8000000000 + #define kt_remove_main_flag_user_d 0x10000000000 + #define kt_remove_main_flag_unknown_d 0x20000000000 + #define kt_remove_main_flag_unknown_ignore_d 0x40000000000 + #define kt_remove_main_flag_utc_d 0x80000000000 + #define kt_remove_main_flag_version_d 0x100000000000 + #define kt_remove_main_flag_version_copyright_help_d 0x100000080040 #endif // _di_kt_remove_main_flag_e_ /** diff --git a/sources/c/program/kevux/tools/remove/main/operate.c b/sources/c/program/kevux/tools/remove/main/operate.c index 658e321..337765d 100644 --- a/sources/c/program/kevux/tools/remove/main/operate.c +++ b/sources/c/program/kevux/tools/remove/main/operate.c @@ -56,8 +56,6 @@ extern "C" { if (F_status_is_error(main->setting.state.status)) return main->setting.state.status; if (flag_operate & kt_remove_flag_file_operate_processed_d) return F_no; - f_status_t status_remove = F_no; - if (flag_operate & kt_remove_flag_file_operate_missing_d) { if (!(main->setting.flag & kt_remove_main_flag_force_simulate_d)) { main->setting.state.status = F_status_set_error(F_file_found_not); diff --git a/sources/c/program/kevux/tools/remove/main/preprocess.c b/sources/c/program/kevux/tools/remove/main/preprocess.c index 4265642..492f17b 100644 --- a/sources/c/program/kevux/tools/remove/main/preprocess.c +++ b/sources/c/program/kevux/tools/remove/main/preprocess.c @@ -84,25 +84,25 @@ extern "C" { return flag_out; } - kt_remove_preprocess_file_type(main, path, macro_f_file_type_is_block(statistics.st_mode), f_file_type_name_block_s, kt_remove_main_flag_block_d, 0x1, &flag_out); + kt_remove_preprocess_file_type(main, path, macro_f_file_type_is_block(statistics.st_mode), f_file_type_name_block_s, kt_remove_main_flag_block_d, kt_remove_main_flag_block_ignore_d, 0x1, &flag_out); - kt_remove_preprocess_file_type(main, path, macro_f_file_type_is_character(statistics.st_mode), f_file_type_name_character_s, kt_remove_main_flag_character_d, 0x1, &flag_out); + kt_remove_preprocess_file_type(main, path, macro_f_file_type_is_character(statistics.st_mode), f_file_type_name_character_s, kt_remove_main_flag_character_d, kt_remove_main_flag_character_ignore_d, 0x1, &flag_out); - kt_remove_preprocess_file_type(main, path, macro_f_file_type_is_directory(statistics.st_mode), f_file_type_name_directory_s, kt_remove_main_flag_directory_d, 0x1, &flag_out); + kt_remove_preprocess_file_type(main, path, macro_f_file_type_is_directory(statistics.st_mode), f_file_type_name_directory_s, kt_remove_main_flag_directory_d, kt_remove_main_flag_directory_ignore_d, 0x1, &flag_out); if (macro_f_file_type_is_directory(statistics.st_mode)) { flag_out |= kt_remove_flag_file_operate_directory_d; } - kt_remove_preprocess_file_type(main, path, macro_f_file_type_is_fifo(statistics.st_mode), f_file_type_name_fifo_s, kt_remove_main_flag_fifo_d, 0x1, &flag_out); + kt_remove_preprocess_file_type(main, path, macro_f_file_type_is_fifo(statistics.st_mode), f_file_type_name_fifo_s, kt_remove_main_flag_fifo_d, kt_remove_main_flag_fifo_ignore_d, 0x1, &flag_out); - kt_remove_preprocess_file_type(main, path, macro_f_file_type_is_link(statistics.st_mode), f_file_type_name_link_s, kt_remove_main_flag_link_d, 0x1, &flag_out); + kt_remove_preprocess_file_type(main, path, macro_f_file_type_is_link(statistics.st_mode), f_file_type_name_link_s, kt_remove_main_flag_link_d, kt_remove_main_flag_link_ignore_d, 0x1, &flag_out); - kt_remove_preprocess_file_type(main, path, macro_f_file_type_is_regular(statistics.st_mode), f_file_type_name_regular_s, kt_remove_main_flag_regular_d, 0x3, &flag_out); + kt_remove_preprocess_file_type(main, path, macro_f_file_type_is_regular(statistics.st_mode), f_file_type_name_regular_s, kt_remove_main_flag_regular_d, kt_remove_main_flag_regular_ignore_d, 0x3, &flag_out); - kt_remove_preprocess_file_type(main, path, macro_f_file_type_is_socket(statistics.st_mode), f_file_type_name_socket_s, kt_remove_main_flag_socket_d, 0x1, &flag_out); + kt_remove_preprocess_file_type(main, path, macro_f_file_type_is_socket(statistics.st_mode), f_file_type_name_socket_s, kt_remove_main_flag_socket_d, kt_remove_main_flag_socket_ignore_d, 0x1, &flag_out); - kt_remove_preprocess_file_type(main, path, macro_f_file_type_is_unknown(statistics.st_mode), f_file_type_name_unknown_s, kt_remove_main_flag_unknown_d, 0x0, &flag_out); + kt_remove_preprocess_file_type(main, 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, 0x0, &flag_out); if (!(main->setting.flag & kt_remove_main_flag_simulate_d) && (flag_out & kt_remove_flag_file_operate_remove_fail_d)) return flag_out; @@ -586,7 +586,7 @@ extern "C" { #endif // _di_kt_remove_preprocess_file_dates_ #ifndef _di_kt_remove_preprocess_file_type_ - void kt_remove_preprocess_file_type(kt_remove_main_t * const main, const f_string_static_t path, const bool is, f_string_static_t name, const uint64_t type, const uint8_t code, uint32_t * const flag_out) { + void kt_remove_preprocess_file_type(kt_remove_main_t * const main, const f_string_static_t path, const bool is, f_string_static_t name, const uint64_t type, const uint64_t ignore, const uint8_t code, uint32_t * const flag_out) { if (!main || !flag_out) return; @@ -601,7 +601,7 @@ extern "C" { } } - if (is || (main->setting.flag & type)) { + if (is || (main->setting.flag & type) && !(main->setting.flag & ignore)) { kt_remove_print_simulate_operate_boolean(&main->program.output, name, is); } } diff --git a/sources/c/program/kevux/tools/remove/main/preprocess.h b/sources/c/program/kevux/tools/remove/main/preprocess.h index 3720c6b..cdf4161 100644 --- a/sources/c/program/kevux/tools/remove/main/preprocess.h +++ b/sources/c/program/kevux/tools/remove/main/preprocess.h @@ -91,6 +91,8 @@ extern "C" { * The name of the file type being tested. * @param type * A flag from the kt_remove_main_flag_*_d representing the file type. + * @param ignore + * A flag from the kt_remove_main_flag_*_ignore_d representing the file type ignore flag. * @param code * A code intended to be passed to kt_remove_print_error_file_is_a() as needed. * @param flag_out @@ -99,7 +101,7 @@ extern "C" { * Must not be NULL. */ #ifndef _di_kt_remove_preprocess_file_type_ - extern void kt_remove_preprocess_file_type(kt_remove_main_t * const main, const f_string_static_t path, const bool is, f_string_static_t name, const uint64_t type, const uint8_t code, uint32_t * const flag_out); + extern void kt_remove_preprocess_file_type(kt_remove_main_t * const main, const f_string_static_t path, const bool is, f_string_static_t name, const uint64_t type, const uint64_t ignore, const uint8_t code, uint32_t * const flag_out); #endif // _di_kt_remove_preprocess_file_type_ #ifdef __cplusplus diff --git a/sources/c/program/kevux/tools/remove/rm/rm.c b/sources/c/program/kevux/tools/remove/rm/rm.c index 3d62630..f1f8909 100644 --- a/sources/c/program/kevux/tools/remove/rm/rm.c +++ b/sources/c/program/kevux/tools/remove/rm/rm.c @@ -176,7 +176,7 @@ extern "C" { } // Make sure all non-directory files are deleted. - main->setting.flag |= kt_remove_main_flag_file_types_except_directory_d | kt_remove_main_flag_option_type_d| kt_remove_main_flag_option_used_d; + main->setting.flag |= kt_remove_main_flag_file_types_except_directory_d | kt_remove_main_flag_option_type_d | kt_remove_main_flag_option_used_d | kt_remove_main_flag_file_types_ignore_d; } #endif // _di_kt_remove_rm_setting_load_ -- 1.8.3.1