}
}
- status = kt_remove_preprocess_file_access(main, path, flag_operate);
+ status = kt_remove_preprocess_file_access(
+ main,
+ path,
+ flag_operate,
+ *flag_operate & kt_remove_flag_operate_follow_d
+ ? AT_EACCESS
+ : AT_EACCESS | AT_SYMLINK_NOFOLLOW
+ );
if (F_status_is_error(status)) {
*flag_operate |= kt_remove_flag_operate_remove_fail_d;
#endif // _di_kt_remove_preprocess_file_
#ifndef _di_kt_remove_preprocess_file_access_
- f_status_t kt_remove_preprocess_file_access(kt_remove_main_t * const main, const f_string_static_t path, uint64_t * const flag_operate) {
+ f_status_t kt_remove_preprocess_file_access(kt_remove_main_t * const main, const f_string_static_t path, uint64_t * const flag_operate, const int access_flags) {
if (!main || !flag_operate) {
kt_remove_print_error_file_status(&main->program.error, macro_kt_remove_f(kt_remove_preprocess_file_access), path, f_file_operation_process_s, fll_error_file_type_path_e, F_status_set_error(F_parameter));
if (!path.used) return F_data_not;
- f_status_t status = f_file_access(path, F_file_access_mode_read_d);
+ // -100 is the AT_CWD, @todo update FLL project and then this to provide a define for this.
+ const f_file_t cwd = macro_f_file_t_initialize_id(-100);
+
+ f_status_t status = f_file_access_at(cwd, path, F_file_access_mode_read_d, access_flags);
+
+ // Ignore file not found errors.
+ if (F_status_set_fine(status) == F_file_found_not) status = F_okay;
if (F_status_is_error_not(status)) {
if (status == F_false) {
*flag_operate |= kt_remove_flag_operate_unable_read_d;
}
- status = f_file_access(path, F_file_access_mode_write_d);
+ status = f_file_access_at(cwd, path, F_file_access_mode_write_d, access_flags);
+
+ // Ignore file not found errors.
+ if (F_status_set_fine(status) == F_file_found_not) status = F_okay;
}
if (F_status_is_error_not(status)) {
*flag_operate |= kt_remove_flag_operate_unable_write_d;
}
- status = f_file_access(path, F_file_access_mode_execute_d);
+ status = f_file_access_at(cwd, path, F_file_access_mode_execute_d, access_flags);
+
+ // Ignore file not found errors.
+ if (F_status_set_fine(status) == F_file_found_not) status = F_okay;
}
if (F_status_is_error_not(status)) {
if (status == F_false) {
*flag_operate |= kt_remove_flag_operate_unable_execute_d;
}
+ }
- if ((*flag_operate) & kt_remove_flag_operate_unable_rwx_d) {
- kt_remove_print_simulate_operate_file_access(&main->program.output, *flag_operate, path);
- }
-
- status = F_okay;
+ if ((*flag_operate) & kt_remove_flag_operate_unable_rwx_d) {
+ kt_remove_print_simulate_operate_file_access(&main->program.output, *flag_operate, path);
}
- else {
+
+ if (F_status_is_error(status)) {
status = F_status_set_error(F_parameter);
- kt_remove_print_error_file_status(&main->program.error, macro_kt_remove_f(f_file_access), path, f_file_operation_access_s, fll_error_file_type_path_e, status);
+ kt_remove_print_error_file_status(&main->program.error, macro_kt_remove_f(f_file_access_at), path, f_file_operation_access_s, fll_error_file_type_path_e, status);
+
+ return status;
}
- return status;
+ return F_okay;
}
#endif // _di_kt_remove_preprocess_file_access_
* The operate file specific flags from kt_remove_flag_operate_*_e.
*
* Must not be NULL.
+ * @param access_flags
+ * The access flags to use, such as AT_SYMLINK_NOFOLLOW.
*
* @return
* F_okay on success.
*
* F_no (with error bit) on failure (not returned when simulating).
* F_parameter (with error bit) if a parameter is invalid.
+ *
+ * Errors (with error bit) from: f_file_access_at().
+ *
+ * @see f_file_access_at()
*/
#ifndef _di_kt_remove_preprocess_file_access_
- extern f_status_t kt_remove_preprocess_file_access(kt_remove_main_t * const main, const f_string_static_t path, uint64_t * const flag_operate);
+ extern f_status_t kt_remove_preprocess_file_access(kt_remove_main_t * const main, const f_string_static_t path, uint64_t * const flag_operate, const int access_flags);
#endif // _di_kt_remove_preprocess_file_access_
/**