Make sure the content and object items cache is not cleared when using a control file or init file.
The rule needs to skip past both the rule prefix and the rule alias when processing the control file or init file.
Remove no longer used `_support_controller_initfile_` from the defines documentation
Add new parameter `-f`/`--file` for specifying the controlfile or initfile.
_libcap_legacy_only_ Disable functionality provided by later versions of libcap (2.43 and later).
_support_controller_controlfile_ Enable support for the controlfile by the controller program and library.
-_support_controller_initfile_ Enable support for the initfile by the init program (requires _support_controller_controlfile_).
_override_controller_default_engine_ Provide a custom scripting engine name string to execute (such as php).
_override_controller_path_pid_ Use this as the default custom directory path representing the location of the controller program pid.
data.program.parameters.used = controller_parameter_total_d;
data.program.environment = envp;
+ #ifdef _support_controller_controlfile_
+ data.program.parameters.array[controller_parameter_file_e].flag &= ~f_console_flag_disable_d;
+ #endif // _support_controller_controlfile_
+
if (f_pipe_input_exists()) {
data.program.pipe = fll_program_data_pipe_input_e;
}
controller_setting_load(arguments, &data);
#ifdef _support_controller_controlfile_
- if (f_file_exists(controller_controlfile_s, F_false) == F_true) {
+ if (f_file_exists(data.setting.path_controlfile, F_false) == F_true) {
data.setting.flag |= controller_main_flag_single_d;
}
#endif // _support_controller_controlfile_
data.program.parameters.used = controller_parameter_total_d;
data.program.environment = envp;
+ #ifdef _support_controller_controlfile_
+ data.program.parameters.array[controller_parameter_file_e].flag &= ~f_console_flag_disable_d;
+ #endif // _support_controller_controlfile_
+
if (f_pipe_input_exists()) {
data.program.pipe = fll_program_data_pipe_input_e;
}
controller_setting_load(arguments, &data);
#ifdef _support_controller_controlfile_
- if (f_file_exists(controller_controlfile_s, F_false) == F_true) {
+ if (f_file_exists(data.setting.path_controlfile, F_false) == F_true) {
data.setting.flag |= controller_main_flag_single_d;
}
#endif // _support_controller_controlfile_
for (index = 0; index < 4; ++index) {
- if (main->program.parameters.array[codes[index]].result & f_console_result_found_d) {
+ if (main->program.parameters.array[codes[index]].result & f_console_result_value_d) {
if (main->program.parameters.array[codes[index]].locations.used != main->program.parameters.array[codes[index]].values.used) {
main->setting.state.status = F_status_set_error(F_parameter);
continue;
}
}
- else if (main->program.parameters.array[codes[index]].result & f_console_result_value_d) {
+ else if (main->program.parameters.array[codes[index]].result & f_console_result_found_d) {
if (flags[index]) main->setting.flag |= flags[index];
}
} // for
else if (main->program.parameters.array[controller_parameter_uninterruptible_e].result & f_console_result_found_d) {
main->setting.flag &= ~controller_main_flag_interruptible_d;
}
+
+ #ifdef _support_controller_controlfile_
+ if (main->program.parameters.array[controller_parameter_file_e].result & f_console_result_value_d) {
+ index = main->program.parameters.array[controller_parameter_file_e].values.array[main->program.parameters.array[controller_parameter_file_e].values.used - 1];
+
+ main->setting.path_controlfile.used = 0;
+
+ main->setting.state.status = f_string_dynamic_append_nulless(args[index], &main->setting.path_controlfile);
+
+ if (F_status_is_error(main->setting.state.status)) {
+ controller_print_error(&main->program.error, F_status_debug_source_d);
+
+ return;
+ }
+ }
+ else if (main->program.parameters.array[controller_parameter_file_e].result & f_console_result_found_d) {
+ main->setting.state.status = F_status_set_error(F_parameter);
+
+ fll_program_print_error_parameter_missing_value(&main->program.error, f_console_symbol_long_normal_s, controller_long_file_s);
+
+ return;
+ }
+ else {
+ main->setting.path_controlfile.string = controller_controlfile_s.string;
+ main->setting.path_controlfile.used = controller_controlfile_s.used;
+ main->setting.path_controlfile.size = 0;
+ }
+ #endif // _support_controller_controlfile_
}
#endif // _di_controller_setting_load_
enum {
controller_parameter_cgroup_e = f_console_standard_parameter_last_e,
controller_parameter_daemon_e,
+ controller_parameter_file_e,
controller_parameter_interruptible_e,
controller_parameter_pid_e,
controller_parameter_settings_e,
\
macro_f_console_parameter_t_initialize_3(controller_short_cgroup_s, controller_long_cgroup_s, 1, f_console_flag_normal_d), \
macro_f_console_parameter_t_initialize_3(controller_short_daemon_s, controller_long_daemon_s, 0, f_console_flag_normal_d), \
+ macro_f_console_parameter_t_initialize_3(controller_short_file_s, controller_long_file_s, 1, f_console_flag_normal_d | f_console_flag_disable_d), \
macro_f_console_parameter_t_initialize_3(controller_short_interruptible_s, controller_long_interruptible_s, 0, f_console_flag_normal_d), \
macro_f_console_parameter_t_initialize_3(controller_short_pid_s, controller_long_pid_s, 1, f_console_flag_normal_d), \
macro_f_console_parameter_t_initialize_3(controller_short_settings_s, controller_long_settings_s, 1, f_console_flag_normal_d), \
#ifndef _di_controller_parameter_s_
const f_string_static_t controller_short_cgroup_s = macro_f_string_static_t_initialize_1(CONTROLLER_short_cgroup_s, 0, CONTROLLER_short_cgroup_s_length);
const f_string_static_t controller_short_daemon_s = macro_f_string_static_t_initialize_1(CONTROLLER_short_daemon_s, 0, CONTROLLER_short_daemon_s_length);
+ const f_string_static_t controller_short_file_s = macro_f_string_static_t_initialize_1(CONTROLLER_short_file_s, 0, CONTROLLER_short_file_s_length);
const f_string_static_t controller_short_interruptible_s = macro_f_string_static_t_initialize_1(CONTROLLER_short_interruptible_s, 0, CONTROLLER_short_interruptible_s_length);
const f_string_static_t controller_short_pid_s = macro_f_string_static_t_initialize_1(CONTROLLER_short_pid_s, 0, CONTROLLER_short_pid_s_length);
const f_string_static_t controller_short_settings_s = macro_f_string_static_t_initialize_1(CONTROLLER_short_settings_s, 0, CONTROLLER_short_settings_s_length);
const f_string_static_t controller_long_cgroup_s = macro_f_string_static_t_initialize_1(CONTROLLER_long_cgroup_s, 0, CONTROLLER_long_cgroup_s_length);
const f_string_static_t controller_long_daemon_s = macro_f_string_static_t_initialize_1(CONTROLLER_long_daemon_s, 0, CONTROLLER_long_daemon_s_length);
+ const f_string_static_t controller_long_file_s = macro_f_string_static_t_initialize_1(CONTROLLER_long_file_s, 0, CONTROLLER_long_file_s_length);
const f_string_static_t controller_long_interruptible_s = macro_f_string_static_t_initialize_1(CONTROLLER_long_interruptible_s, 0, CONTROLLER_long_interruptible_s_length);
const f_string_static_t controller_long_pid_s = macro_f_string_static_t_initialize_1(CONTROLLER_long_pid_s, 0, CONTROLLER_long_pid_s_length);
const f_string_static_t controller_long_settings_s = macro_f_string_static_t_initialize_1(CONTROLLER_long_settings_s, 0, CONTROLLER_long_settings_s_length);
#ifndef _di_controller_parameter_s_
#define CONTROLLER_short_cgroup_s "c"
#define CONTROLLER_short_daemon_s "d"
+ #define CONTROLLER_short_file_s "f"
#define CONTROLLER_short_interruptible_s "I"
#define CONTROLLER_short_pid_s "p"
#define CONTROLLER_short_settings_s "s"
#define CONTROLLER_long_cgroup_s "cgroup"
#define CONTROLLER_long_daemon_s "daemon"
+ #define CONTROLLER_long_file_s "file"
#define CONTROLLER_long_interruptible_s "interruptible"
#define CONTROLLER_long_pid_s "pid"
#define CONTROLLER_long_settings_s "settings"
#define CONTROLLER_short_cgroup_s_length 1
#define CONTROLLER_short_daemon_s_length 1
+ #define CONTROLLER_short_file_s_length 1
#define CONTROLLER_short_interruptible_s_length 1
#define CONTROLLER_short_pid_s_length 1
#define CONTROLLER_short_settings_s_length 1
#define CONTROLLER_long_cgroup_s_length 6
#define CONTROLLER_long_daemon_s_length 6
+ #define CONTROLLER_long_file_s_length 4
#define CONTROLLER_long_interruptible_s_length 13
#define CONTROLLER_long_pid_s_length 3
#define CONTROLLER_long_settings_s_length 8
extern const f_string_static_t controller_short_cgroup_s;
extern const f_string_static_t controller_short_daemon_s;
+ extern const f_string_static_t controller_short_file_s;
extern const f_string_static_t controller_short_interruptible_s;
extern const f_string_static_t controller_short_pid_s;
extern const f_string_static_t controller_short_settings_s;
extern const f_string_static_t controller_long_cgroup_s;
extern const f_string_static_t controller_long_daemon_s;
+ extern const f_string_static_t controller_long_file_s;
extern const f_string_static_t controller_long_init_s;
extern const f_string_static_t controller_long_interruptible_s;
extern const f_string_static_t controller_long_pid_s;
void controller_setting_delete(controller_setting_t * const setting) {
if (!setting) return;
+
+ f_memory_array_resize(0, sizeof(f_char_t), (void **) &setting->path_pid.string, &setting->path_pid.used, &setting->path_pid.size);
+ f_memory_array_resize(0, sizeof(f_char_t), (void **) &setting->path_setting.string, &setting->path_setting.used, &setting->path_setting.size);
+
+ #ifdef _support_controller_controlfile_
+ f_memory_array_resize(0, sizeof(f_char_t), (void **) &setting->path_controlfile.string, &setting->path_controlfile.used, &setting->path_controlfile.size);
+ #endif // _support_controller_controlfile_
}
#endif // _di_controller_setting_delete_
*
* - path_pid: The name of the program.
* - path_setting: The long name of the program.
+ *
+ * - path_controlfile: The path to the controlfile or initfile (if support is enabled).
*/
#ifndef _di_controller_setting_t_
typedef struct {
f_string_dynamic_t path_pid;
f_string_dynamic_t path_setting;
+
+ #ifdef _support_controller_controlfile_
+ f_string_dynamic_t path_controlfile;
+ #endif // _support_controller_controlfile_
} controller_setting_t;
- #define controller_setting_t_initialize \
- { \
- controller_main_flag_none_d, \
- f_state_t_initialize, \
- f_string_dynamic_t_initialize, \
- f_string_dynamic_t_initialize, \
- }
+ #ifdef _support_controller_controlfile_
+ #define controller_setting_t_initialize \
+ { \
+ controller_main_flag_none_d, \
+ f_state_t_initialize, \
+ f_string_dynamic_t_initialize, \
+ f_string_dynamic_t_initialize, \
+ f_string_dynamic_t_initialize, \
+ }
+ #else
+ #define controller_setting_t_initialize \
+ { \
+ controller_main_flag_none_d, \
+ f_state_t_initialize, \
+ f_string_dynamic_t_initialize, \
+ f_string_dynamic_t_initialize, \
+ }
+ #endif // _support_controller_controlfile_
#endif // _di_controller_setting_t_
/**
f_file_t file = f_file_t_initialize;
- f_status_t status = f_file_stream_open(controller_controlfile_s, f_string_empty_s, &file);
+ f_status_t status = f_file_stream_open(main->setting.path_controlfile, f_string_empty_s, &file);
if (F_status_is_error(status)) {
if (F_status_set_fine(status) == F_file_found_not) {
#ifndef _di_controller_print_message_help_standard_
f_status_t controller_print_message_help_standard(fl_print_t * const print) {
- if (!print) return F_status_set_error(F_output_not);
+ if (!print || !print->custom) return F_status_set_error(F_output_not);
+
+ controller_t * const main = (controller_t *) print->custom;
fll_program_print_help_header(print, controller_program_name_long_s, controller_program_version_s);
fll_program_print_help_option(print, controller_short_cgroup_s, controller_long_cgroup_s, f_console_symbol_short_normal_s, f_console_symbol_long_normal_s, " Specify a custom control group file path, such as '" F_control_group_path_system_prefix_s F_control_group_path_system_default_s "'.");
fll_program_print_help_option(print, controller_short_daemon_s, controller_long_daemon_s, f_console_symbol_short_normal_s, f_console_symbol_long_normal_s, " Run in daemon only mode (do not process the entry).");
+
+ if (!(main->program.parameters.array[controller_parameter_file_e].flag & f_console_flag_disable_d)) {
+ fl_print_format(" %Q%[%Q%]", print->to, f_console_symbol_short_normal_s, print->set->standout, controller_short_file_s, print->set->standout);
+ fl_print_format(", %Q%[%Q%] Specify a custom path to the %Q.%r", print->to, f_console_symbol_long_normal_s, print->set->standout, controller_long_file_s, print->set->standout, controller_controlfile_s, f_string_eol_s);
+ }
+
fll_program_print_help_option(print, controller_short_interruptible_s, controller_long_interruptible_s, f_console_symbol_short_normal_s, f_console_symbol_long_normal_s, " Designate that this program can be interrupted by a signal.");
fll_program_print_help_option(print, controller_short_pid_s, controller_long_pid_s, f_console_symbol_short_normal_s, f_console_symbol_long_normal_s, " Specify a custom pid file path, such as 'controller/run/default.pid'.");
fll_program_print_help_option(print, controller_short_settings_s, controller_long_settings_s, f_console_symbol_short_normal_s, f_console_symbol_long_normal_s, " Specify a custom settings path, such as 'controller/'.");
if (!main || !cache || !entry || !rule) return F_status_set_error(F_parameter);
uint8_t for_item = F_true;
+ f_number_unsigned_t i = 0;
+ f_number_unsigned_t j = 0;
rule->timeout_kill = entry->timeout_kill ? entry->timeout_kill : 0;
rule->timeout_start = entry->timeout_start ? entry->timeout_start : 0;
if (!(main->setting.flag & controller_main_flag_single_d)) {
cache->buffer_file.used = 0;
+ cache->content_items.used = 0;
+ cache->object_items.used = 0;
}
cache->buffer_item.used = 0;
cache->buffer_path.used = 0;
- cache->content_items.used = 0;
- cache->object_items.used = 0;
-
cache->action.name_action.used = 0;
cache->action.name_file.used = 0;
cache->action.name_item.used = 0;
{
- f_number_unsigned_t i = 0;
- f_number_unsigned_t j = 0;
f_number_unsigned_t k = 0;
f_number_unsigned_t l = 0;
controller_print_error_status(&main->program.error, F_status_debug_source_d, F_status_set_fine(state.status));
}
else {
- f_number_unsigned_t i = 0;
- f_number_unsigned_t j = 0;
-
f_range_t offset = f_range_t_initialize;
f_state_t state = f_state_t_initialize;
} // for
if (entry->status == F_equal_to_not) continue;
+
+ // Perform match on the alias.
+ for (j = 0; offset.start <= offset.stop && j < alias.used; ++offset.start) {
+
+ if (!cache->buffer_file.string[offset.start]) continue;
+
+ for (; j < alias.used && !alias.string[j]; ++j) {
+ // Do nothing.
+ } // for
+
+ if (cache->buffer_file.string[offset.start] != alias.string[j]) {
+ entry->status = F_equal_to_not;
+
+ break;
+ }
+
+ ++j;
+ } // for
+
+ if (entry->status == F_equal_to_not) continue;
+
+ // Perform match on the trailing slash.
+ for (j = 0; offset.start <= offset.stop && j < f_string_ascii_slash_forward_s.used; ++offset.start) {
+
+ if (!cache->buffer_file.string[offset.start]) continue;
+
+ if (cache->buffer_file.string[offset.start] != f_string_ascii_slash_forward_s.string[j]) {
+ entry->status = F_equal_to_not;
+
+ break;
+ }
+
+ ++j;
+ } // for
}
state.status = f_rip_dynamic_partial_nulless(cache->buffer_file, offset, &cache->action.name_item);