]> Kevux Git Server - fll/commitdiff
Progress: Continue refactoring firewall from 0.6.x to 0.7.x/0.8.x.
authorKevin Day <kevin@kevux.org>
Fri, 16 Feb 2024 05:56:20 +0000 (23:56 -0600)
committerKevin Day <kevin@kevux.org>
Fri, 16 Feb 2024 05:56:20 +0000 (23:56 -0600)
This gets the programming compiling.
There still remains some code to change.
The runtime needs to be tested.
I expect that there are things wrong given how much I jumped around while migrating this.

26 files changed:
level_3/firewall/c/main/common.c
level_3/firewall/c/main/common/enumeration.h
level_3/firewall/c/main/common/print.c
level_3/firewall/c/main/common/print.h
level_3/firewall/c/main/common/string.c
level_3/firewall/c/main/common/string.h
level_3/firewall/c/main/common/type.c
level_3/firewall/c/main/common/type.h
level_3/firewall/c/main/firewall.h
level_3/firewall/c/main/operate.c
level_3/firewall/c/main/operate.h
level_3/firewall/c/main/operate/buffer.c
level_3/firewall/c/main/operate/buffer.h
level_3/firewall/c/main/operate/create.c
level_3/firewall/c/main/operate/create.h
level_3/firewall/c/main/operate/default.c
level_3/firewall/c/main/operate/delete.c
level_3/firewall/c/main/operate/load.c [deleted file]
level_3/firewall/c/main/operate/load.h [deleted file]
level_3/firewall/c/main/operate/process.c
level_3/firewall/c/main/print/debug.c
level_3/firewall/c/main/print/debug.h
level_3/firewall/c/main/print/error.c
level_3/firewall/c/main/print/error.h
level_3/firewall/c/main/print/message.c
level_3/firewall/data/build/settings

index 4d28f176d58214dd7f2e369ebbc2687a67564c81..00e3fe4e04ff38b1663e407ff0b0acd969906c23 100644 (file)
@@ -83,6 +83,7 @@ extern "C" {
     }
 
     f_number_unsigned_t at = 0;
+    f_number_unsigned_t index = 0;
 
     if (main->program.parameters.array[firewall_parameter_operation_start_e].result & f_console_result_found_e) {
       main->setting.flag &= ~firewall_main_flag_operation_lock_e;
@@ -153,24 +154,26 @@ extern "C" {
     }
 
     if (main->setting.flag & firewall_main_flag_operation_show_e) {
-      if (main->parameters.remaining.used) {
+      if (main->program.parameters.remaining.used) {
         main->setting.flag &= ~firewall_main_flag_operation_show_filter_nat_mangle_e;
 
-        for (at = 0; at < main->parameters.remaining.used; ++at) {
+        for (at = 0; at < main->program.parameters.remaining.used; ++at) {
 
           if (firewall_signal_check(main)) return;
 
-          if (f_compare_dynamic(firewall_show_nat_s, data.argv[main->program.parameters.remaining.array[at]]) == F_equal_to) {
+          index = main->program.parameters.remaining.array[at];
+
+          if (f_compare_dynamic(firewall_show_nat_s, main->program.parameters.arguments.array[index]) == F_equal_to) {
             main->setting.flag |= firewall_main_flag_operation_show_nat_e;
           }
-          else if (f_compare_dynamic(firewall_show_mangle_s, data.argv[main->program.parameters.remaining.array[at]]) == F_equal_to) {
+          else if (f_compare_dynamic(firewall_show_mangle_s, main->program.parameters.arguments.array[index]) == F_equal_to) {
             main->setting.flag |= firewall_main_flag_operation_show_mangle_e;
           }
-          else if (f_compare_dynamic(firewall_show_fillter_s, data.argv[main->program.parameters.remaining.array[at]]) == F_equal_to) {
+          else if (f_compare_dynamic(firewall_show_filter_s, main->program.parameters.arguments.array[index]) == F_equal_to) {
             main->setting.flag |= firewall_main_flag_operation_show_filter_e;
           }
           else {
-            firewall_print_warning_show_option_unknown(&main->warning, data.argv[main->program.parameters.remaining.array[at]]);
+            firewall_print_warning_show_option_unknown(&main->program.warning, main->program.parameters.arguments.array[index]);
           }
         } // for
       }
@@ -178,6 +181,24 @@ extern "C" {
         main->setting.flag |= firewall_main_flag_operation_show_filter_nat_mangle_e;
       }
     }
+    else {
+      // @todo
+
+      // Example:
+      /*
+      for (f_number_unsigned_t number = 0; index < main->program.parameters.remaining.used; ++index) {
+
+        if (control_signal_check(main)) return;
+
+        number = main->program.parameters.remaining.array[index];
+
+        // Statically allocate the inner strings.
+        main->setting.actions.array[main->setting.actions.used].string = main->program.parameters.arguments.array[number].string;
+        main->setting.actions.array[main->setting.actions.used].used = main->program.parameters.arguments.array[number].used;
+        main->setting.actions.array[main->setting.actions.used++].size = 0;
+      } // for
+      */
+    }
   }
 #endif // _di_firewall_setting_load_
 
index 986d30c939e9a8deaa166f921fbc45678c2edc03..fbcf19344b55d35f56f80a36db73a5e78d4ef9ea 100644 (file)
@@ -91,6 +91,7 @@ extern "C" {
  *
  * firewall_chain_*_e:
  *   - none:        The chain is none.
+ *   - custom:      The chain is custom.
  *   - forward:     The chain is forward.
  *   - input:       The chain is input.
  *   - output:      The chain is output.
@@ -100,6 +101,7 @@ extern "C" {
 #ifndef _di_firewall_action_e_
   enum {
     firewall_chain_none_e,
+    firewall_chain_custom_e,
     firewall_chain_forward_e,
     firewall_chain_input_e,
     firewall_chain_output_e,
@@ -189,22 +191,22 @@ extern "C" {
  */
 #ifndef _di_firewall_parameter_e_
   enum {
-    fake_parameter_operation_lock_e = f_console_standard_parameter_last_e,
-    fake_parameter_operation_restart_e,
-    fake_parameter_operation_show_e,
-    fake_parameter_operation_start_e,
-    fake_parameter_operation_stop_e,
+    firewall_parameter_operation_lock_e = f_console_standard_parameter_last_e,
+    firewall_parameter_operation_restart_e,
+    firewall_parameter_operation_show_e,
+    firewall_parameter_operation_start_e,
+    firewall_parameter_operation_stop_e,
   }; // enum
 
   #define firewall_console_parameter_t_initialize \
     { \
       macro_fll_program_console_parameter_standard_initialize, \
       \
-      macro_f_console_parameter_t_initialize_6(fake_other_operation_lock_s,    0, f_console_flag_simple_e), \
-      macro_f_console_parameter_t_initialize_6(fake_other_operation_restart_s, 0, f_console_flag_simple_e), \
-      macro_f_console_parameter_t_initialize_6(fake_other_operation_show_s,    0, f_console_flag_simple_e), \
-      macro_f_console_parameter_t_initialize_6(fake_other_operation_start_s,   0, f_console_flag_simple_e), \
-      macro_f_console_parameter_t_initialize_6(fake_other_operation_stop_s,    0, f_console_flag_simple_e), \
+      macro_f_console_parameter_t_initialize_6(firewall_operation_lock_s,    0, f_console_flag_simple_e), \
+      macro_f_console_parameter_t_initialize_6(firewall_operation_restart_s, 0, f_console_flag_simple_e), \
+      macro_f_console_parameter_t_initialize_6(firewall_operation_show_s,    0, f_console_flag_simple_e), \
+      macro_f_console_parameter_t_initialize_6(firewall_operation_start_s,   0, f_console_flag_simple_e), \
+      macro_f_console_parameter_t_initialize_6(firewall_operation_stop_s,    0, f_console_flag_simple_e), \
     }
 
   #define firewall_parameter_total_d (f_console_parameter_state_type_total_d + 5)
index b50759837d7d70b5d8e3554d567b672543d12b7b..1844ea83edefa9fdd3c100fc0dedc3f09efaeacf 100644 (file)
@@ -15,6 +15,9 @@ extern "C" {
     "f_memory_array_increase_by",
     "f_string_dynamic_append",
     "f_string_dynamic_partial_append",
+    "f_string_dynamic_partial_append_nulless",
+    "f_string_dynamic_terminate_after",
+    "f_thread_create",
     "firewall_operate_process_rules",
     "fll_execute_program",
     "fll_fss_basic_read",
index b57d6f0818b402eebe7d466b9525682044af5399..c450697eaffd2b88eb3ba1f686550c6392bcb8b3 100644 (file)
@@ -48,7 +48,10 @@ extern "C" {
     firewall_f_f_memory_array_increase_by_e,
     firewall_f_f_string_dynamic_append_e,
     firewall_f_f_string_dynamic_partial_append_e,
-    firewall_f_firewall_operate_process_rules_perform_e,
+    firewall_f_f_string_dynamic_partial_append_nulless_e,
+    firewall_f_f_string_dynamic_terminate_after_e,
+    firewall_f_f_thread_create_e,
+    firewall_f_firewall_operate_process_rules_e,
     firewall_f_fll_execute_program_e,
     firewall_f_fll_fss_basic_read_e,
     firewall_f_fll_fss_basic_list_read_e,
index a71c4034acb6a42ee6bfcb5645fbca2f9d35537a..afb34403ea9fbb3d40b46ec5ec5ee2613a636f5b 100644 (file)
@@ -93,14 +93,6 @@ extern "C" {
   const f_string_static_t firewall_tool_ipset_s = macro_f_string_static_t_initialize_1(FIREWALL_tool_ipset_s, 0, FIREWALL_tool_ipset_s_length);
 #endif // _di_firewall_s_
 
-#ifndef _di_firewall_operation_s_
-  const f_string_static_t firewall_operation_start_s = macro_f_string_static_t_initialize_1(FIREWALL_operation_start_s, 0, FIREWALL_operation_start_s_length);
-  const f_string_static_t firewall_operation_stop_s = macro_f_string_static_t_initialize_1(FIREWALL_operation_stop_s, 0, FIREWALL_operation_stop_s_length);
-  const f_string_static_t firewall_operation_restart_s = macro_f_string_static_t_initialize_1(FIREWALL_operation_restart_s, 0, FIREWALL_operation_restart_s_length);
-  const f_string_static_t firewall_operation_lock_s = macro_f_string_static_t_initialize_1(FIREWALL_operation_lock_s, 0, FIREWALL_operation_lock_s_length);
-  const f_string_static_t firewall_operation_show_s = macro_f_string_static_t_initialize_1(FIREWALL_operation_show_s, 0, FIREWALL_operation_show_s_length);
-#endif // _di_firewall_operation_s_
-
 #ifndef _di_firewall_path_s_
   const f_string_static_t firewall_file_first_s = macro_f_string_static_t_initialize_1(FIREWALL_file_first_s, 0, FIREWALL_file_first_s_length);
   const f_string_static_t firewall_file_last_s = macro_f_string_static_t_initialize_1(FIREWALL_file_last_s, 0, FIREWALL_file_last_s_length);
@@ -111,15 +103,15 @@ extern "C" {
   const f_string_static_t firewall_network_devices_s = macro_f_string_static_t_initialize_1(FIREWALL_network_devices_s, 0, FIREWALL_network_devices_s_length);
 #endif // _di_firewall_path_s_
 
-#ifndef _di_firewall_show_s_
-  const f_string_static_t firewall_show_filter_s = macro_f_string_static_t_initialize_1(FIREWALL_show_filter_s, 0, FIREWALL_show_filter_s_length);
-  const f_string_static_t firewall_show_mangle_s = macro_f_string_static_t_initialize_1(FIREWALL_show_mangle_s, 0, FIREWALL_show_mangle_s_length);
-  const f_string_static_t firewall_show_nat_s = macro_f_string_static_t_initialize_1(FIREWALL_show_nat_s, 0, FIREWALL_show_nat_s_length);
+#ifndef _di_firewall_print_show_s_
+  const f_string_static_t firewall_print_show_filter_s = macro_f_string_static_t_initialize_1(FIREWALL_print_show_filter_s, 0, FIREWALL_print_show_filter_s_length);
+  const f_string_static_t firewall_print_show_mangle_s = macro_f_string_static_t_initialize_1(FIREWALL_print_show_mangle_s, 0, FIREWALL_print_show_mangle_s_length);
+  const f_string_static_t firewall_print_show_nat_s = macro_f_string_static_t_initialize_1(FIREWALL_print_show_nat_s, 0, FIREWALL_print_show_nat_s_length);
 
-  const f_string_static_t firewall_show_bars_26_s = macro_f_string_static_t_initialize_1(FIREWALL_show_bars_26_s, 0, FIREWALL_show_bars_26_s_length);
-  const f_string_static_t firewall_show_bars_27_s = macro_f_string_static_t_initialize_1(FIREWALL_show_bars_27_s, 0, FIREWALL_show_bars_27_s_length);
-  const f_string_static_t firewall_show_bars_28_s = macro_f_string_static_t_initialize_1(FIREWALL_show_bars_28_s, 0, FIREWALL_show_bars_28_s_length);
-#endif // _di_firewall_show_s_
+  const f_string_static_t firewall_print_show_bars_26_s = macro_f_string_static_t_initialize_1(FIREWALL_print_show_bars_26_s, 0, FIREWALL_print_show_bars_26_s_length);
+  const f_string_static_t firewall_print_show_bars_27_s = macro_f_string_static_t_initialize_1(FIREWALL_print_show_bars_27_s, 0, FIREWALL_print_show_bars_27_s_length);
+  const f_string_static_t firewall_print_show_bars_28_s = macro_f_string_static_t_initialize_1(FIREWALL_print_show_bars_28_s, 0, FIREWALL_print_show_bars_28_s_length);
+#endif // _di_firewall_print_show_s_
 
 #ifdef __cplusplus
 } // extern "C"
index e9c3df3ace6bf6095d15304825cbeca6eb0833e2..32760bb208d0fa2d17e5f9eb5c8de59ab0663218 100644 (file)
@@ -349,33 +349,33 @@ extern "C" {
 #endif // _di_firewall_path_s_
 
 /**
- * The show option related strings.
+ * The show option related strings for printing to the screen.
  */
-#ifndef _di_firewall_show_s_
-  #define FIREWALL_show_filter_s "FILTER"
-  #define FIREWALL_show_mangle_s "MANGLE"
-  #define FIREWALL_show_nat_s    "NAT"
-
-  #define FIREWALL_show_bars_26_s "=========================="
-  #define FIREWALL_show_bars_27_s "============================"
-  #define FIREWALL_show_bars_28_s "============================"
-
-  #define FIREWALL_show_filter_s_length 6
-  #define FIREWALL_show_mangle_s_length 6
-  #define FIREWALL_show_nat_s_length    3
-
-  #define FIREWALL_show_bars_26_s_length 26
-  #define FIREWALL_show_bars_27_s_length 27
-  #define FIREWALL_show_bars_28_s_length 28
-
-  extern const f_string_static_t firewall_show_filter_s;
-  extern const f_string_static_t firewall_show_mangle_s;
-  extern const f_string_static_t firewall_show_nat_s;
-
-  extern const f_string_static_t firewall_show_bars_26_s;
-  extern const f_string_static_t firewall_show_bars_27_s;
-  extern const f_string_static_t firewall_show_bars_28_s;
-#endif // _di_firewall_show_s_
+#ifndef _di_firewall_print_show_s_
+  #define FIREWALL_print_show_filter_s "FILTER"
+  #define FIREWALL_print_show_mangle_s "MANGLE"
+  #define FIREWALL_print_show_nat_s    "NAT"
+
+  #define FIREWALL_print_show_bars_26_s "=========================="
+  #define FIREWALL_print_show_bars_27_s "============================"
+  #define FIREWALL_print_show_bars_28_s "============================"
+
+  #define FIREWALL_print_show_filter_s_length 6
+  #define FIREWALL_print_show_mangle_s_length 6
+  #define FIREWALL_print_show_nat_s_length    3
+
+  #define FIREWALL_print_show_bars_26_s_length 26
+  #define FIREWALL_print_show_bars_27_s_length 27
+  #define FIREWALL_print_show_bars_28_s_length 28
+
+  extern const f_string_static_t firewall_print_show_filter_s;
+  extern const f_string_static_t firewall_print_show_mangle_s;
+  extern const f_string_static_t firewall_print_show_nat_s;
+
+  extern const f_string_static_t firewall_print_show_bars_26_s;
+  extern const f_string_static_t firewall_print_show_bars_27_s;
+  extern const f_string_static_t firewall_print_show_bars_28_s;
+#endif // _di_firewall_print_show_s_
 
 #ifdef __cplusplus
 } // extern "C"
index 0a6da2b4120ab94c162fb5269282db1dcc165980..eec7d79b5d2389d6ea261435d1baa07051b9a239 100644 (file)
@@ -14,14 +14,15 @@ extern "C" {
     f_memory_array_resize(0, sizeof(f_char_t), (void **) &cache->buffer.string, &cache->buffer.used, &cache->buffer.size);
     f_memory_array_resize(0, sizeof(f_char_t), (void **) &cache->device.string, &cache->device.used, &cache->device.size);
     f_memory_array_resize(0, sizeof(f_char_t), (void **) &cache->ip_list.string, &cache->ip_list.used, &cache->ip_list.size);
-    f_memory_array_resize(0, sizeof(f_char_t), (void **) &cache->local_buffer.string, &cache->local_buffer.used, &cache->local_buffer.size);
     f_memory_array_resize(0, sizeof(f_char_t), (void **) &cache->path_file.string, &cache->path_file.used, &cache->path_file.size);
     f_memory_array_resize(0, sizeof(f_char_t), (void **) &cache->path_file_specific.string, &cache->path_file_specific.used, &cache->path_file_specific.size);
     f_memory_array_resize(0, sizeof(f_char_t), (void **) &cache->protocol.string, &cache->protocol.used, &cache->protocol.size);
 
     f_memory_arrays_resize(0, sizeof(f_string_dynamic_t), (void **) &cache->arguments.array, &cache->arguments.used, &cache->arguments.size, &f_string_dynamics_delete_callback);
 
-    f_memory_array_resize(0, sizeof(f_range_t), (void **) &cache->basic_objects.string, &cache->basic_objects.used, &cache->basic_objects.size);
+    f_memory_array_resize(0, sizeof(f_number_unsigned_t), (void **) &cache->delimits.array, &cache->delimits.used, &cache->delimits.size);
+
+    f_memory_array_resize(0, sizeof(f_range_t), (void **) &cache->basic_objects.array, &cache->basic_objects.used, &cache->basic_objects.size);
     f_memory_arrays_resize(0, sizeof(f_ranges_t), (void **) &cache->basic_contents.array, &cache->basic_contents.used, &cache->basic_contents.size, &f_rangess_delete_callback);
   }
 #endif // _di_firewall_cache_delete_
@@ -32,10 +33,12 @@ extern "C" {
     if (!data) return;
 
     f_memory_array_resize(0, sizeof(f_char_t), (void **) &data->buffer.string, &data->buffer.used, &data->buffer.size);
-    f_memory_array_resize(0, sizeof(f_number_unsigned_t), (void **) &data->chain_ids.string, &data->chain_ids.used, &data->chain_ids.size);
-    f_memory_array_resize(0, sizeof(f_number_unsigned_t), (void **) &data->delimits.string, &data->delimits.used, &data->delimits.size);
-    f_memory_array_resize(0, sizeof(f_range_t), (void **) &data->chain_objects.string, &data->chain_objects.used, &data->chain_objects.size);
-    f_memory_array_resize(0, sizeof(f_range_t), (void **) &data->rule_objects.string, &data->rule_objects.used, &data->rule_objects.size);
+
+    f_memory_array_resize(0, sizeof(f_number_unsigned_t), (void **) &data->chain_ids.array, &data->chain_ids.used, &data->chain_ids.size);
+
+    f_memory_array_resize(0, sizeof(f_range_t), (void **) &data->comments.array, &data->comments.used, &data->comments.size);
+    f_memory_array_resize(0, sizeof(f_range_t), (void **) &data->chain_objects.array, &data->chain_objects.used, &data->chain_objects.size);
+    f_memory_array_resize(0, sizeof(f_range_t), (void **) &data->rule_objects.array, &data->rule_objects.used, &data->rule_objects.size);
 
     f_memory_arrays_resize(0, sizeof(f_ranges_t), (void **) &data->chain_contents.array, &data->chain_contents.used, &data->chain_contents.size, &f_rangess_delete_callback);
     f_memory_arrays_resize(0, sizeof(f_ranges_t), (void **) &data->rule_contents.array, &data->rule_contents.used, &data->rule_contents.size, &f_rangess_delete_callback);
index a300a8d71db731179a87bdd87ac92fe8284e7714..209d725154e52c6c6ce504fa61e155cf3e018224 100644 (file)
@@ -22,31 +22,33 @@ extern "C" {
  * Properties:
  *   - file: The file structure.
  *
- *   - buffer:             A generic string buffer.
- *   - device:             The device string.
- *   - ip_list:            The ip_list string.
- *   - local_buffer:       The protocol string.
- *   - path_file:          The protocol string.
- *   - path_file_specific: The protocol string.
- *   - protocol:           The protocol string.
- *   - arguments:          The array of strings.
+ *   - buffer:             A buffer used when proessing the basic objects and contents cache.
+ *   - device:             The device.
+ *   - ip_list:            The ip list.
+ *   - path_file:          The path to a file.
+ *   - path_file_specific: The specific path to a file.
+ *   - protocol:           The protocol.
+ *   - arguments:          The arguments array.
+ *
+ *   - delimits: The delimits array used when loading FSS data.
  *
  *   - basic_objects:  The FSS Basic Objects.
  *   - basic_contents: The FSS Basic Contents.
  */
 #ifndef _di_firewall_cache_t_
   typedef struct {
-    f_file_t file = f_file_t_initialize;
+    f_file_t file;
 
     f_string_dynamic_t buffer;
     f_string_dynamic_t device;
     f_string_dynamic_t ip_list;
-    f_string_dynamic_t local_buffer;
     f_string_dynamic_t path_file;
     f_string_dynamic_t path_file_specific;
     f_string_dynamic_t protocol;
     f_string_dynamics_t arguments;
 
+    f_number_unsigneds_t delimits;
+
     f_ranges_t basic_objects;
     f_rangess_t basic_contents;
   } firewall_cache_t;
@@ -60,8 +62,8 @@ extern "C" {
       f_string_dynamic_t_initialize, \
       f_string_dynamic_t_initialize, \
       f_string_dynamic_t_initialize, \
-      f_string_dynamic_t_initialize, \
       f_string_dynamics_t_initialize, \
+      f_number_unsigneds_t_initialize, \
       f_ranges_t_initialize, \
       f_rangess_t_initialize, \
     }
@@ -81,10 +83,9 @@ extern "C" {
  *   - stop:   The stop position.
  *   - range:  A range used during operation processing.
  *
- *   - buffer: The buffer used for during processing.
+ *   - buffer: The entire set of chains and rules to operate on.
  *
  *   - chain_ids: The list of chain IDs.
- *   - delimits: The delimits array used when loading FSS data.
  *
  *   - chain_objects:  The list of chain Objects.
  *   - rule_objects:   The list of rule Objects.
@@ -103,11 +104,11 @@ extern "C" {
     f_number_unsigned_t stop;
     f_range_t range;
 
-    f_number_unsigneds_t chain_ids;
-    f_number_unsigneds_t delimits;
-
     f_string_dynamic_t buffer;
 
+    f_number_unsigneds_t chain_ids;
+
+    f_ranges_t comments;
     f_ranges_t chain_objects;
     f_ranges_t rule_objects;
     f_rangess_t chain_contents;
@@ -124,9 +125,9 @@ extern "C" {
       0, \
       0, \
       f_range_t_initialize, \
-      f_number_unsigneds_t_initialize, \
-      f_number_unsigneds_t_initialize, \
       f_string_dynamic_t_initialize, \
+      f_number_unsigneds_t_initialize, \
+      f_ranges_t_initialize, \
       f_ranges_t_initialize, \
       f_ranges_t_initialize, \
       f_rangess_t_initialize, \
@@ -205,7 +206,7 @@ extern "C" {
  *   This does not alter main.setting.state.status.
  */
 #ifndef _di_firewall_cache_delete_
-  extern void firewall_data_delete(firewall_cache_t * const cache);
+  extern void firewall_cache_delete(firewall_cache_t * const cache);
 #endif // _di_firewall_cache_delete_
 
 /**
index 13ac460968c04c8c16bd47e6338e0542638b6755..fe51fbf631a20d61afdda144b7dc786d16a8a855 100644 (file)
 
 // FLL-2 includes.
 #include <fll/level_2/error.h>
+#include <fll/level_2/execute.h>
 #include <fll/level_2/fss.h>
+#include <fll/level_2/fss/basic.h>
+#include <fll/level_2/fss/basic_list.h>
+#include <fll/level_2/fss/extended.h>
 #include <fll/level_2/print.h>
 #include <fll/level_2/program.h>
 
 #include <program/firewall/main/print/error.h>
 #include <program/firewall/main/print/message.h>
 #include <program/firewall/main/print/warning.h>
+#include <program/firewall/main/operate.h>
 #include <program/firewall/main/operate/buffer.h>
 #include <program/firewall/main/operate/create.h>
 #include <program/firewall/main/operate/default.h>
 #include <program/firewall/main/operate/delete.h>
-#include <program/firewall/main/operate/load.h>
 #include <program/firewall/main/operate/process.h>
 #include <program/firewall/main/signal.h>
 #include <program/firewall/main/thread.h>
index d541f1fff82e6ea3ed1bf80df2e74e93fc286611..62c478af7267065ff1b5259390389a5251618fcb 100644 (file)
@@ -17,14 +17,14 @@ extern "C" {
       return;
     }
 
-    main->setting.state.status = f_directory_list(firewall_network_devices_s, 0, alphasort, &main->data.devices);
+    main->setting.state.status = f_directory_list(firewall_network_devices_s, 0, alphasort, &main->setting.devices);
 
     if (F_status_is_error(main->setting.state.status)) {
       if (F_status_set_fine(main->setting.state.status) == F_data_not) {
         firewall_print_error_network_device_none(&main->program.error);
       }
       else if (F_status_set_fine(main->setting.state.status) == F_failure) {
-        firewall_print_error_directory_read(&main->program.error, firewall_network_devices_s);
+        firewall_print_error_file(&main->program.error, macro_firewall_f(f_directory_list), firewall_network_devices_s, f_file_operation_read_s, fll_error_file_type_directory_e);
       }
       else {
         firewall_print_error(&main->program.error, macro_firewall_f(f_console_parameter_process));
@@ -37,18 +37,18 @@ extern "C" {
     f_string_static_t buffer = f_string_static_t_initialize;
 
     // Remove "lo" (loopback) from the device listing.
-    for (; i < main->data.devices.used; ++i) {
+    for (; i < main->setting.devices.used; ++i) {
 
       if (firewall_signal_check(main)) return;
 
-      if (f_compare_dynamic(firewall_device_loop_s, main->data.devices.array[i]) == F_equal_to) {
-        buffer = main->data.devices.array[i];
+      if (f_compare_dynamic(firewall_device_loop_s, main->setting.devices.array[i]) == F_equal_to) {
+        buffer = main->setting.devices.array[i];
 
-        for (--main->data.devices.used; i < main->data.devices.used; ++i) {
-          main->data.devices.array[i] = main->data.devices.array[i + 1];
+        for (--main->setting.devices.used; i < main->setting.devices.used; ++i) {
+          main->setting.devices.array[i] = main->setting.devices.array[i + 1];
         } // for
 
-        main->data.devices.array[main->data.devices.used] = buffer;
+        main->setting.devices.array[main->setting.devices.used] = buffer;
       }
     } // for
 
@@ -62,7 +62,7 @@ extern "C" {
       memcpy(path_file_other, firewall_network_path_s.string, sizeof(f_char_t) * firewall_network_path_s.used);
       memcpy(path_file_other + firewall_network_path_s.used, firewall_file_other_s.string, sizeof(f_char_t) * firewall_file_other_s.used);
 
-      firewall_operate_buffer_rules(&main, buffer, F_false);
+      firewall_operate_buffer_chain(main, buffer, F_false);
       if (F_status_is_error(main->setting.state.status) || main->setting.state.status == F_child) return;
 
       for (i = 0; i < main->data.chain_objects.used; ++i) {
@@ -92,12 +92,14 @@ extern "C" {
           main->data.range.start = main->data.chain_contents.array[main->data.lock].array[0].start;
           main->data.range.stop = main->data.chain_contents.array[main->data.lock].array[0].stop;
 
-          firewall_operate_load_rules(main);
+          firewall_operate_buffer_rules(main);
+
+          firewall_operate_rules(main);
         }
         else {
           main->setting.state.status = F_status_set_error(F_data);
 
-          firewall_print_error_operation_files_missing(&main->error, firewall_operation_lock_s, path_file_other);
+          firewall_print_error_operation_files_missing(&main->program.error, firewall_operation_lock_s, buffer);
         }
 
         return;
@@ -109,20 +111,23 @@ extern "C" {
 
           firewall_operate_default_lock(main);
 
-          if (F_status_is_error(status) || status == F_child) return;
+          if (F_status_is_error(main->setting.state.status) || main->setting.state.status == F_child) return;
 
           main->data.chain = main->data.stop;
           main->data.is = firewall_data_is_global_e | firewall_data_is_stop_e;
           main->data.range.start = main->data.chain_contents.array[main->data.stop].array[0].start;
           main->data.range.stop = main->data.chain_contents.array[main->data.stop].array[0].stop;
 
-          firewall_operate_load_rules(&main);
+          firewall_operate_buffer_rules(main);
+
+          firewall_operate_rules(main);
+
           if (F_status_is_error(main->setting.state.status) || (main->data.has & firewall_main_flag_operation_stop_e) || main->setting.state.status == F_child) return;
         }
         else {
           main->setting.state.status = F_status_set_error(F_data);
 
-          firewall_print_error_operation_files_missing(&main->error, firewall_operation_stop_s, path_file_other);
+          firewall_print_error_operation_files_missing(&main->program.error, firewall_operation_stop_s, buffer);
 
           return;
         }
@@ -133,13 +138,13 @@ extern "C" {
       buffer.used = firewall_network_path_s.used + firewall_file_first_s.used;
 
       f_char_t path_file_first[buffer.used + 1];
-      buffer.string = path_file_first_string;
+      buffer.string = path_file_first;
       path_file_first[buffer.used] = 0;
 
       memcpy(path_file_first, firewall_network_path_s.string, sizeof(f_char_t) * firewall_network_path_s.used);
       memcpy(path_file_first + firewall_network_path_s.used, firewall_file_first_s.string, sizeof(f_char_t) * firewall_file_first_s.used);
 
-      firewall_operate_buffer_rules(main, buffer, F_false);
+      firewall_operate_buffer_chain(main, buffer, F_false);
 
       if (main->setting.flag & firewall_main_flag_operation_start_e) {
         firewall_operate_delete_chains(main);
@@ -151,18 +156,19 @@ extern "C" {
 
       main->data.is = firewall_data_is_global_e;
 
-      firewall_operate_load_chains(main);
+      firewall_operate_chains(main);
+
       if (F_status_is_error(main->setting.state.status) || main->setting.state.status == F_child || (main->setting.flag & firewall_main_flag_operation_stop_e)) return;
 
       {
-        for (f_number_unsigned_t j = 0; j < main->data.devices.used; ++j) {
+        for (f_number_unsigned_t j = 0; j < main->setting.devices.used; ++j) {
 
           if (firewall_signal_check(main)) return;
 
-          main->data.path_file.used = 0;
-          local.device = j;
+          main->cache.path_file.used = 0;
+          main->data.device = j;
 
-          main->setting.state.status = f_memory_array_increase_by(firewall_network_path_s.used + data.devices.array[j].used + firewall_file_suffix_s.used + 1, sizeof(f_char_t), (void **) &main->data.path_file.string, &main->data.path_file.used, &main->data.path_file.size);
+          main->setting.state.status = f_memory_array_increase_by(firewall_network_path_s.used + main->setting.devices.array[j].used + firewall_file_suffix_s.used + 1, sizeof(f_char_t), (void **) &main->cache.path_file.string, &main->cache.path_file.used, &main->cache.path_file.size);
 
           if (F_status_is_error(main->setting.state.status)) {
             firewall_print_error(&main->program.error, macro_firewall_f(f_memory_array_increase_by));
@@ -170,14 +176,14 @@ extern "C" {
             return;
           }
 
-          main->setting.state.status = f_string_dynamic_append(firewall_network_path_s, &main->data.path_file);
+          main->setting.state.status = f_string_dynamic_append(firewall_network_path_s, &main->cache.path_file);
 
           if (F_status_is_error_not(main->setting.state.status)) {
-            main->setting.state.status = f_string_dynamic_append(data.devices.array[j], &main->data.path_file);
+            main->setting.state.status = f_string_dynamic_append(main->setting.devices.array[j], &main->cache.path_file);
           }
 
           if (F_status_is_error_not(main->setting.state.status)) {
-            main->setting.state.status = f_string_dynamic_append(firewall_file_suffix_s, &main->data.path_file);
+            main->setting.state.status = f_string_dynamic_append(firewall_file_suffix_s, &main->cache.path_file);
           }
 
           if (F_status_is_error(main->setting.state.status)) {
@@ -186,22 +192,22 @@ extern "C" {
             return;
           }
 
-          firewall_operate_buffer_rules(main, main->data.path_file, F_true);
+          firewall_operate_buffer_chain(main, main->cache.path_file, F_true);
 
           firewall_operate_create_custom_chains(main);
 
           main->data.is = 0;
 
-          firewall_operate_load_chains(main);
+          firewall_operate_chains(main);
           if (F_status_is_error(main->setting.state.status) || main->setting.state.status == F_child || (main->setting.flag & firewall_main_flag_operation_stop_e)) return;
         } // for
 
-        main->data.path_file.used = 0;
+        main->cache.path_file.used = 0;
 
-        main->setting.state.status = f_string_dynamic_append(firewall_network_path_s, &main->data.path_file);
+        main->setting.state.status = f_string_dynamic_append(firewall_network_path_s, &main->cache.path_file);
 
         if (F_status_is_error_not(main->setting.state.status)) {
-          main->setting.state.status = f_string_dynamic_append(firewall_file_last_s, &main->data.path_file);
+          main->setting.state.status = f_string_dynamic_append(firewall_file_last_s, &main->cache.path_file);
         }
 
         if (F_status_is_error(main->setting.state.status)) {
@@ -210,13 +216,13 @@ extern "C" {
           return;
         }
 
-        firewall_operate_buffer_rules(main, main->data.path_file, F_false);
+        firewall_operate_buffer_chain(main, main->cache.path_file, F_false);
 
         firewall_operate_create_custom_chains(main);
 
         main->data.is = firewall_data_is_global_e;
 
-        firewall_operate_load_chains(main);
+        firewall_operate_chains(main);
         if (F_status_is_error(main->setting.state.status) || main->setting.state.status == F_child) return;
       }
     }
@@ -225,6 +231,54 @@ extern "C" {
   }
 #endif // _di_firewall_operate_
 
+#ifndef _di_firewall_operate_chains_
+  void firewall_operate_chains(firewall_main_t * const main) {
+
+    if (!main || F_status_is_error_not(main->setting.state.status) && main->setting.state.status == F_child) return;
+
+    for (f_number_unsigned_t i = 0; i < main->data.chain_contents.used; ++i) {
+
+      main->data.range = main->data.chain_contents.array[i].array[0];
+
+      if ((main->data.has & firewall_data_has_main_e) && i == main->data.main) {
+        main->data.is |= firewall_data_is_main_e;
+      }
+      else {
+        main->data.is &= ~firewall_data_is_main_e;
+      }
+
+      main->data.chain = i;
+
+      firewall_operate_buffer_rules(main);
+
+      firewall_operate_rules(main);
+
+      if (F_status_is_error(main->setting.state.status) || (main->setting.flag & firewall_main_flag_operation_stop_e) || main->setting.state.status == F_child) return;
+    } // for
+
+    main->setting.state.status = F_okay;
+  }
+#endif // _di_firewall_operate_chains_
+
+#ifndef _di_firewall_operate_rules_
+  void firewall_operate_rules(firewall_main_t * const main) {
+
+    if (!main || F_status_is_error_not(main->setting.state.status) && main->setting.state.status == F_child) return;
+
+    firewall_operate_process_rules(main);
+
+    if (F_status_is_error(main->setting.state.status)) {
+      if (F_status_set_fine(main->setting.state.status) != F_failure) {
+        firewall_print_error_unhandled(&main->program.error, macro_firewall_f(firewall_operate_process_rules), f_string_empty_s);
+      }
+
+      return;
+    }
+
+    main->setting.state.status = F_okay;
+  }
+#endif // _di_firewall_operate_rules_
+
 #ifndef _di_firewall_operate_show_
   void firewall_operate_show(firewall_main_t * const main) {
 
@@ -260,7 +314,7 @@ extern "C" {
       firewall_show_parameter_list_s,
     };
 
-    const f_string_static_t show_arrays[][] = {
+    f_string_static_t * const show_arrays[] = {
       show_nats,
       show_mangles,
       show_filters,
@@ -273,21 +327,21 @@ extern "C" {
     };
 
     const f_string_static_t show_lefts[] = {
-      firewall_show_bars_27_s,
-      firewall_show_bars_26_s,
-      firewall_show_bars_26_s,
+      firewall_print_show_bars_27_s,
+      firewall_print_show_bars_26_s,
+      firewall_print_show_bars_26_s,
     };
 
     const f_string_static_t show_headers[] = {
-      firewall_show_nat_s,
-      firewall_show_mangle_s,
-      firewall_show_filter_s,
+      firewall_print_show_nat_s,
+      firewall_print_show_mangle_s,
+      firewall_print_show_filter_s,
     };
 
     const f_string_static_t show_rights[] = {
-      firewall_show_bars_28_s,
-      firewall_show_bars_26_s,
-      firewall_show_bars_26_s,
+      firewall_print_show_bars_28_s,
+      firewall_print_show_bars_26_s,
+      firewall_print_show_bars_26_s,
     };
 
     const uint16_t show_flags[] = {
@@ -303,21 +357,21 @@ extern "C" {
       parameters.array = show_arrays[i];
       parameters.used = show_lengths[i];
 
-      firewall_print_message_show_header(&main->output, show_lefts[i], show_headers[i], show_rights[i]);
+      firewall_print_message_show_header(&main->program.output, show_lefts[i], show_headers[i], show_rights[i]);
 
-      main->setting.status = fll_execute_program(firewall_tool_iptables_s, parameters, 0, 0, (void *) &return_code);
+      main->setting.state.status = fll_execute_program(firewall_tool_iptables_s, parameters, 0, 0, (void *) &return_code);
 
-      if (status == F_child) {
-        main->child = return_code;
+      if (main->setting.state.status == F_child) {
+        main->program.child = return_code;
 
         return;
       }
 
-      fll_print_dynamic_raw(f_string_eol_s, main->output.to);
-      f_file_stream_flush(main->output.to);
+      fll_print_dynamic_raw(f_string_eol_s, main->program.output.to);
+      f_file_stream_flush(main->program.output.to);
 
-      if (F_status_is_error(main->setting.status)) {
-        firewall_print_error_operation(&main->error, firewall_tool_iptables_s, parameters);
+      if (F_status_is_error(main->setting.state.status)) {
+        firewall_print_error_operation(&main->program.error, firewall_tool_iptables_s, parameters);
 
         return;
       }
index 331b44072c53e90f24f1fb47414b123623fa7eac..81b6109dd54f57462c0e7bac6cc5c5e330e891a6 100644 (file)
@@ -30,21 +30,21 @@ extern "C" {
  *
  *     Errors (with error bit) from: f_directory_list()
  *     Errors (with error bit) from: f_memory_array_increase_by()
- *     Errors (with error bit) from: firewall_operate_buffer_rules()
+ *     Errors (with error bit) from: firewall_operate_buffer_chain()
  *     Errors (with error bit) from: firewall_operate_create_custom_chains()
  *     Errors (with error bit) from: firewall_operate_default_lock()
  *     Errors (with error bit) from: firewall_operate_delete_chains()
- *     Errors (with error bit) from: firewall_operate_load_rules()
+ *     Errors (with error bit) from: firewall_operate_rules()
  *     Errors (with error bit) from: firewall_operate_process_rules()
  *     Errors (with error bit) from: firewall_operate_show()
  *
  * @see f_directory_list()
  * @see f_memory_array_increase_by()
- * @see firewall_operate_buffer_rules()
+ * @see firewall_operate_buffer_chain()
  * @see firewall_operate_create_custom_chains()
  * @see firewall_operate_default_lock()
  * @see firewall_operate_delete_chains()
- * @see firewall_operate_load_rules()
+ * @see firewall_operate_rules()
  * @see firewall_operate_process_rules()
  * @see firewall_operate_show()
  */
@@ -53,6 +53,29 @@ extern "C" {
 #endif // _di_firewall_operate_
 
 /**
+ * Load and operate the each of the Content chains.
+ *
+ * @param main
+ *   The main program and setting data.
+ *
+ *   This alters:
+ *     - main.data.is.
+ *     - main.data.range.
+ *
+ *   This alters main.setting.state.status:
+ *     F_okay on success.
+ *
+ *     F_interrupt (with error bit) on interrupt signal received.
+ *
+ *     Errors (with error bit) from: firewall_operate_rules()
+ *
+ * @see firewall_operate_rules()
+ */
+#ifndef _di_firewall_operate_chains_
+  extern void firewall_operate_chains(firewall_main_t * const main);
+#endif // _di_firewall_operate_chains_
+
+/**
  * Perform the firewall show operation.
  *
  * @param main
@@ -74,6 +97,29 @@ extern "C" {
   extern void firewall_operate_show(firewall_main_t * const main);
 #endif // _di_firewall_operate_show_
 
+/**
+ * Operate the rules.
+ *
+ * @param main
+ *   The main program and setting data.
+ *
+ *   This alters main.setting.state.status:
+ *     F_okay on success.
+ *
+ *     F_interrupt (with error bit) on interrupt signal received.
+ *
+ *     Errors (with error bit) from: f_fss_apply_delimit()
+ *     Errors (with error bit) from: firewall_operate_process_rules()
+ *     Errors (with error bit) from: fll_fss_extended_read()
+ *
+ * @see f_fss_apply_delimit()
+ * @see firewall_operate_process_rules()
+ * @see fll_fss_extended_read()
+ */
+#ifndef _di_firewall_operate_rules_
+  extern void firewall_operate_rules(firewall_main_t * const main);
+#endif // _di_firewall_operate_rules_
+
 #ifdef __cplusplus
 } // extern "C"
 #endif
index 1befc0deef45b0c67595ae2f6dc7361e3b5e9e6e..c15fed20877bb4af749ff81a2e2ada3b5aba49b3 100644 (file)
@@ -4,18 +4,21 @@
 extern "C" {
 #endif
 
-#ifndef _di_firewall_operate_buffer_rules_
-  void firewall_operate_buffer_rules(firewall_main_t * const main, const f_string_static_t file, const bool optional) {
+#ifndef _di_firewall_operate_buffer_chain_
+  void firewall_operate_buffer_chain(firewall_main_t * const main, const f_string_static_t file, const bool optional) {
 
     if (!main || F_status_is_error_not(main->setting.state.status) && main->setting.state.status == F_child) return;
 
     main->data.buffer.used = 0;
+    main->data.chain_contents.used = 0;
+    main->data.chain_objects.used = 0;
+    main->cache.delimits.used = 0;
 
     main->setting.state.status = f_file_open(file, 0, &main->cache.file);
 
     if (F_status_is_error(main->setting.state.status)) {
       if (!optional || optional && F_status_set_fine(main->setting.state.status) != F_file_found_not && F_status_set_fine(main->setting.state.status) != F_file_open && F_status_set_fine(main->setting.state.status) != F_file_descriptor) {
-        firewall_print_error_file(&main->program.error, macro_firewall_f(f_file_open), f_file_operation_open_s, fll_error_file_type_file_e);
+        firewall_print_error_file(&main->program.error, macro_firewall_f(f_file_open), file, f_file_operation_open_s, fll_error_file_type_file_e);
 
         return;
       }
@@ -27,7 +30,7 @@ extern "C" {
     f_file_stream_close(&main->cache.file);
 
     if (F_status_is_error(main->setting.state.status)) {
-      firewall_print_error_file(&main->program.error, macro_firewall_f(f_file_read), f_file_operation_read_s, fll_error_file_type_file_e);
+      firewall_print_error_file(&main->program.error, macro_firewall_f(f_file_read), file, f_file_operation_read_s, fll_error_file_type_file_e);
 
       return;
     }
@@ -36,21 +39,20 @@ extern "C" {
       main->data.range.start = 0;
       main->data.range.stop = main->data.buffer.used - 1;
 
-// @fixme bufferchain_objects, etc..
-      main->setting.state.status = fll_fss_basic_list_read(main->data.buffer, main->setting.state, &main->data.range, &main->data.bufferchain_objects, &main->data.bufferchain_contents, &main->data.delimits, 0, &main->data.comments);
+      fll_fss_basic_list_read(main->data.buffer, &main->data.range, &main->data.chain_objects, &main->data.chain_contents, &main->cache.delimits, 0, &main->data.comments, &main->setting.state);
 
       if (F_status_is_error(main->setting.state.status)) {
         if (F_status_set_fine(main->setting.state.status) == F_data_not_eos || F_status_set_fine(main->setting.state.status) == F_data_not || F_status_set_fine(main->setting.state.status) == F_data_not_stop) {
           firewall_print_error_file_empty(&main->program.error, file);
         }
         else {
-          firewall_print_error_file(&main->program.error, macro_firewall_f(fll_fss_basic_list_read), f_file_operation_process_s, fll_error_file_type_file_e);
+          firewall_print_error_file(&main->program.error, macro_firewall_f(fll_fss_basic_list_read), file, f_file_operation_process_s, fll_error_file_type_file_e);
         }
 
         return;
       }
       else {
-        main->setting.state.status = f_fss_apply_delimit(state, main->data.delimits, &main->data.buffer);
+        f_fss_apply_delimit(main->cache.delimits, &main->data.buffer, &main->setting.state);
 
         if (F_status_is_error(main->setting.state.status)) {
           firewall_print_error(&main->program.error, macro_firewall_f(f_fss_apply_delimit));
@@ -62,6 +64,35 @@ extern "C" {
 
     main->setting.state.status = F_okay;
   }
+#endif // _di_firewall_operate_buffer_chain_
+
+#ifndef _di_firewall_operate_buffer_rules_
+  void firewall_operate_buffer_rules(firewall_main_t * const main) {
+
+    if (!main || F_status_is_error_not(main->setting.state.status) && main->setting.state.status == F_child) return;
+
+    main->cache.delimits.used = 0;
+    main->data.rule_contents.used = 0;
+    main->data.rule_objects.used = 0;
+
+    fll_fss_extended_read(main->data.buffer, &main->data.range, &main->data.rule_objects, &main->data.rule_contents, 0, 0, &main->cache.delimits, 0, &main->setting.state);
+
+    if (F_status_is_error(main->setting.state.status)) {
+      firewall_print_error(&main->program.error, macro_firewall_f(fll_fss_extended_read));
+
+      return;
+    }
+
+    f_fss_apply_delimit(main->cache.delimits, &main->data.buffer, &main->setting.state);
+
+    if (F_status_is_error(main->setting.state.status)) {
+      firewall_print_error(&main->program.error, macro_firewall_f(f_fss_apply_delimit));
+
+      return;
+    }
+
+    main->setting.state.status = F_okay;
+  }
 #endif // _di_firewall_operate_buffer_rules_
 
 #ifdef __cplusplus
index 4a43f623537e08420412fe3b63a351c7b83dbf23..3a2a1a861c1b235ac7544698c33d4e1d7e8573f1 100644 (file)
@@ -17,11 +17,20 @@ extern "C" {
 #endif
 
 /**
- * Buffer firewall rules.
+ * Buffer firewall chain.
+ *
+ * The rules being processed are selected from main.data.range within main.data.buffer.
+ * Delimits are applied to the main.data.buffer on success.
  *
  * @param main
  *   The main program and setting data.
  *
+ *   This alters:
+ *     - main.cache.delimits.
+ *     - main.data.buffer.
+ *     - main.data.chain_contents.
+ *     - main.data.chain_objects.
+ *
  *   This alters main.setting.state.status:
  *     F_okay on success.
  *     F_child on child process exiting.
@@ -43,8 +52,40 @@ extern "C" {
  * @see f_fss_apply_delimit()
  * @see fll_fss_basic_list_read()
  */
+#ifndef _di_firewall_operate_buffer_chain_
+  extern void firewall_operate_buffer_chain(firewall_main_t * const main, const f_string_static_t file, const bool optional);
+#endif // _di_firewall_operate_buffer_chain_
+
+/**
+ * Buffer firewall rules.
+ *
+ * The rules being processed are selected from main.data.range within main.data.buffer.
+ * Delimits are applied to the main.data.buffer on success.
+ *
+ * @param main
+ *   The main program and setting data.
+ *
+ *   This alters:
+ *     - main.cache.delimits.
+ *     - main.data.buffer.
+ *     - main.data.rule_contents.
+ *     - main.data.rule_objects.
+ *
+ *   This alters main.setting.state.status:
+ *     F_okay on success.
+ *
+ *     F_interrupt (with error bit) on interrupt signal received.
+ *
+ *     Errors (with error bit) from: f_fss_apply_delimit()
+ *     Errors (with error bit) from: firewall_operate_process_rules()
+ *     Errors (with error bit) from: fll_fss_extended_read()
+ *
+ * @see f_fss_apply_delimit()
+ * @see firewall_operate_process_rules()
+ * @see fll_fss_extended_read()
+ */
 #ifndef _di_firewall_operate_buffer_rules_
-  extern void firewall_operate_buffer_rules(firewall_main_t * const main, const f_string_static_t file, const bool optional);
+  extern void firewall_operate_buffer_rules(firewall_main_t * const main);
 #endif // _di_firewall_operate_buffer_rules_
 
 #ifdef __cplusplus
index d7d563705302dba90d49c0a3b7ae700e42123200..918605348e2a781a038932e12e3cd49e4117d6d0 100644 (file)
@@ -19,13 +19,13 @@ extern "C" {
 
     f_string_static_t tool = firewall_tool_iptables_s;
 
-    main->cache.chain_ids.used = 0;
+    main->data.chain_ids.used = 0;
     main->cache.arguments.used = 0;
 
     main->setting.state.status = f_memory_array_increase_by(2, sizeof(f_string_dynamic_t), (void **) &main->cache.arguments.array, &main->cache.arguments.used, &main->cache.arguments.size);
 
     if (F_status_is_error_not(main->setting.state.status)) {
-      main->setting.state.status = f_memory_array_increase_by(main->cache.chain_objects.used, sizeof(f_number_unsigned_t), (void **) &main->cache.chain_ids.array, &main->cache.chain_ids.used, &main->cache.chain_ids.size);
+      main->setting.state.status = f_memory_array_increase_by(main->data.chain_objects.used, sizeof(f_number_unsigned_t), (void **) &main->data.chain_ids.array, &main->data.chain_ids.used, &main->data.chain_ids.size);
     }
 
     if (F_status_is_error(main->setting.state.status)) {
@@ -34,10 +34,10 @@ extern "C" {
       return;
     }
 
-    main->cache.chain_ids.used = main->cache.chain_objects.used;
-    memset(main->cache.chain_ids.array, 0, sizeof(f_number_unsigned_t) * main->cache.chain_ids.used);
+    main->data.chain_ids.used = main->data.chain_objects.used;
+    memset(main->data.chain_ids.array, 0, sizeof(f_number_unsigned_t) * main->data.chain_ids.used);
 
-    main->setting.state.status = f_string_dynamic_append(firewall_chain_create_command_s, &main->cache.arguments.array[0]);
+    main->setting.state.status = f_string_dynamic_append(firewall_chain_create_operation_s, &main->cache.arguments.array[0]);
 
     if (F_status_is_error(main->setting.state.status)) {
       firewall_print_error(&main->program.error, macro_firewall_f(f_string_dynamic_append));
@@ -56,7 +56,7 @@ extern "C" {
     main->cache.arguments.used = 2;
     main->data.has = 0;
 
-    for (; i < main->cache.chain_objects.used; ++i) {
+    for (; i < main->data.chain_objects.used; ++i) {
 
       if (firewall_signal_check(main)) return;
 
@@ -64,37 +64,37 @@ extern "C" {
       j = 0;
 
       // Skip globally reserved chain name: main.
-      if (f_compare_dynamic_partial_string(firewall_group_main_s.string, main->cache.buffer, firewall_group_main_s.used, main->cache.chain_objects.array[i]) == F_equal_to) {
+      if (f_compare_dynamic_partial_string(firewall_group_main_s.string, main->data.buffer, firewall_group_main_s.used, main->data.chain_objects.array[i]) == F_equal_to) {
         new_chain = F_false;
         main->data.has |= firewall_data_has_main_e;
         main->data.main = i;
       }
 
       // Skip globally reserved chain name: stop.
-      if (f_compare_dynamic_partial_string(firewall_group_stop_s.string, main->cache.buffer, firewall_group_stop_s.used, main->cache.chain_objects.array[i]) == F_equal_to) {
+      if (f_compare_dynamic_partial_string(firewall_group_stop_s.string, main->data.buffer, firewall_group_stop_s.used, main->data.chain_objects.array[i]) == F_equal_to) {
         new_chain = F_false;
         main->data.has |= firewall_data_has_stop_e;
         main->data.stop = i;
       }
 
       // Skip globally reserved chain name: lock.
-      if (f_compare_dynamic_partial_string(firewall_group_lock_s.string, main->cache.buffer, firewall_group_lock_s.used, main->cache.chain_objects.array[i]) == F_equal_to) {
+      if (f_compare_dynamic_partial_string(firewall_group_lock_s.string, main->data.buffer, firewall_group_lock_s.used, main->data.chain_objects.array[i]) == F_equal_to) {
         new_chain = F_false;
         main->data.has |= firewall_data_has_lock_e;
         main->data.lock = i;
       }
 
       // Skip globally reserved chain name: none.
-      if (f_compare_dynamic_partial_string(firewall_chain_none_s.string, main->cache.buffer, firewall_chain_none_s.used, main->cache.chain_objects.array[i]) == F_equal_to) {
+      if (f_compare_dynamic_partial_string(firewall_chain_none_s.string, main->data.buffer, firewall_chain_none_s.used, main->data.chain_objects.array[i]) == F_equal_to) {
         new_chain = F_false;
       }
 
       if (new_chain) {
-        for (; j < main->data.chains.used; ++j) {
+        for (; j < main->setting.chains.used; ++j) {
 
-          if (f_compare_dynamic_partial_string(main->data.chains.array[j].string, main->cache.buffer, main->data.chains.array[j].used, main->cache.chain_objects.array[i]) == F_equal_to) {
+          if (f_compare_dynamic_partial_string(main->setting.chains.array[j].string, main->data.buffer, main->setting.chains.array[j].used, main->data.chain_objects.array[i]) == F_equal_to) {
             new_chain = F_false;
-            main->cache.chain_ids.array[i] = j;
+            main->data.chain_ids.array[i] = j;
 
             break;
           }
@@ -102,7 +102,7 @@ extern "C" {
       }
 
       if (new_chain) {
-        main->setting.state.status = f_memory_array_increase(firewall_default_allocation_step_d, sizeof(f_string_dynamic_t), (void **) &main->data.chains.array, &main->data.chains.used, &main->data.chains.size);
+        main->setting.state.status = f_memory_array_increase(firewall_allocation_small_d, sizeof(f_string_dynamic_t), (void **) &main->setting.chains.array, &main->setting.chains.used, &main->setting.chains.size);
 
         if (F_status_is_error(main->setting.state.status)) {
           firewall_print_error(&main->program.error, macro_firewall_f(f_memory_array_increase));
@@ -111,14 +111,14 @@ extern "C" {
         }
 
         create_chain = F_true;
-        length = (main->data.chain_objects.array[i].stop - main->data.chain_objects.array[i].start) + 1;
+        length = (main->data.chain_objects.array[i].start > main->data.chain_objects.array[i].stop) ? 0 : (main->data.chain_objects.array[i].stop - main->data.chain_objects.array[i].start) + 1;
 
         main->cache.arguments.array[1].used = 0;
 
         main->setting.state.status = f_memory_array_increase_by(length + 1, sizeof(f_char_t), (void **) &main->cache.arguments.array[1].string, &main->cache.arguments.array[1].used, &main->cache.arguments.array[1].size);
 
         if (F_status_is_error_not(main->setting.state.status)) {
-          main->setting.state.status = f_memory_array_increase_by(length + 1, sizeof(f_char_t), (void **) &main->data.chains.array[main->data.chains.used].string, &main->data.chains.array[main->data.chains.used].used, &main->data.chains.array[main->data.chains.used].size);
+          main->setting.state.status = f_memory_array_increase_by(length + 1, sizeof(f_char_t), (void **) &main->setting.chains.array[main->setting.chains.used].string, &main->setting.chains.array[main->setting.chains.used].used, &main->setting.chains.array[main->setting.chains.used].size);
         }
 
         if (F_status_is_error(main->setting.state.status)) {
@@ -127,20 +127,31 @@ extern "C" {
           return;
         }
 
-        main->data.chains.array[main->data.chains.used].used = 0;
-        main->data.chain_ids.array[i] = main->data.chains.used;
+        f_string_dynamic_partial_append_nulless(main->data.buffer, main->data.chain_objects.array[i], &main->cache.arguments.array[1]);
 
-        // Copy the string character by character, ignoring placeholders.
-        for (j = main->data.chain_objects.array[i].start; j <= main->data.chain_objects.array[i].stop; ++j) {
+        if (F_status_is_error_not(main->setting.state.status)) {
+          f_string_dynamic_partial_append_nulless(main->data.buffer, main->data.chain_objects.array[i], &main->setting.chains.array[main->setting.chains.used]);
+        }
 
-          if (main->data.buffer.string[j] == f_fss_placeholder_s.string[0]) continue;
+        if (F_status_is_error(main->setting.state.status)) {
+          firewall_print_error(&main->program.error, macro_firewall_f(f_string_dynamic_partial_append_nulless));
 
-          main->data.chains.array[main->data.chains.used].string[main->data.chains.array[main->data.chains.used].used++] = main->data.buffer.string[j];
-          main->cache.arguments.array[1].string[main->cache.arguments.array[1].used++] = main->data.buffer.string[j];
-        } // for
+          return;
+        }
+
+        f_string_dynamic_terminate_after(&main->cache.arguments.array[1]);
+
+        if (F_status_is_error_not(main->setting.state.status)) {
+          f_string_dynamic_terminate_after(&main->setting.chains.array[main->setting.chains.used]);
+        }
+
+        if (F_status_is_error(main->setting.state.status)) {
+          firewall_print_error(&main->program.error, macro_firewall_f(f_string_dynamic_terminate_after));
+
+          return;
+        }
 
-        main->cache.arguments.array[1].string[main->cache.arguments.array[1].used] = 0;
-        main->data.chains.array[main->data.chains.used].string[main->data.chains.array[main->data.chains.used].used] = 0;
+        main->data.chain_ids.array[i] = main->setting.chains.used;
 
         if (f_compare_dynamic(main->cache.arguments.array[1], firewall_chain_forward_s) == F_equal_to) {
           create_chain = F_false;
@@ -159,14 +170,14 @@ extern "C" {
         }
 
         if (create_chain) {
-          firewall_print_debug_tool(main->program->warning, firewall_tool_iptables_s, main->cache.arguments);
+          firewall_print_debug_tool(&main->program.warning, firewall_tool_iptables_s, main->cache.arguments);
 
           tool = firewall_tool_iptables_s;
 
           main->setting.state.status = fll_execute_program(firewall_tool_iptables_s, main->cache.arguments, 0, 0, (void *) &return_code);
 
           if (main->setting.state.status == F_child) {
-            main->program->child = return_code;
+            main->program.child = return_code;
 
             return;
           }
@@ -176,13 +187,13 @@ extern "C" {
           if (F_status_is_error_not(main->setting.state.status) && main->setting.state.status != F_child) {
             tool = firewall_tool_ip6tables_s;
 
-            firewall_print_debug_tool(main->program->warning, firewall_tool_ip6tables_s, main->cache.arguments);
+            firewall_print_debug_tool(&main->program.warning, firewall_tool_ip6tables_s, main->cache.arguments);
 
             main->setting.state.status = fll_execute_program(firewall_tool_ip6tables_s, main->cache.arguments, 0, 0, (void *) &return_code);
           }
 
           if (main->setting.state.status == F_child) {
-            main->program->child = return_code;
+            main->program.child = return_code;
 
             return;
           }
@@ -191,7 +202,7 @@ extern "C" {
 
           if (F_status_is_error(main->setting.state.status)) {
             if (F_status_set_fine(main->setting.state.status) == F_failure) {
-              firewall_print_error_operation(main->program->error, tool, main->cache.arguments);
+              firewall_print_error_operation(&main->program.error, tool, main->cache.arguments);
             }
             else {
               firewall_print_error(&main->program.error, macro_firewall_f(fll_execute_program));
@@ -201,7 +212,7 @@ extern "C" {
           }
         }
 
-        ++main->data.chains.used;
+        ++main->setting.chains.used;
       }
     } // for
 
index 4fedb4dce6fef111c7217473eec26e1f38972114..0718c4607175dc453076ede3096d7f8fd498d6ca 100644 (file)
@@ -45,7 +45,7 @@ extern "C" {
  */
 #ifndef _di_firewall_operate_create_custom_chains_
   extern void firewall_operate_create_custom_chains(firewall_main_t * const main);
-#endif / _di_firewall_operate_create_custom_chains_
+#endif // _di_firewall_operate_create_custom_chains_
 
 #ifdef __cplusplus
 } // extern "C"
index 0d46c9682538913ad5588e185046b5ddd76ef701..c9e0f2f5d42875a469f324378f9fcc83e3235111 100644 (file)
@@ -17,7 +17,7 @@ extern "C" {
 
     f_string_static_t argument_array[arguments.used];
     arguments.array = argument_array;
-    arguments.array[0] = firewall_action_policy_command_s;
+    arguments.array[0] = firewall_action_policy_operation_s;
     arguments.array[2] = firewall_chain_drop_s;
 
     int return_code = 0;
@@ -30,14 +30,14 @@ extern "C" {
 
       for (j = 0; j < 2; ++j) {
 
-        firewall_print_debug_tool(data->main->warning, tools[j], arguments);
+        firewall_print_debug_tool(&main->program.warning, tools[j], arguments);
 
         return_code = 0;
 
         main->setting.state.status = fll_execute_program(tools[j], arguments, 0, 0, (void *) &return_code);
 
         if (main->setting.state.status == F_child) {
-          data->main->child = return_code;
+          main->program.child = return_code;
 
           return;
         }
@@ -46,7 +46,7 @@ extern "C" {
 
         if (F_status_is_error(main->setting.state.status)) {
           if (F_status_set_fine(main->setting.state.status) == F_failure) {
-            firewall_print_error_operation(main->program->error, tools[j], arguments);
+            firewall_print_error_operation(&main->program.error, tools[j], arguments);
           }
           else {
             firewall_print_error(&main->program.error, macro_firewall_f(fll_execute_program));
index 03670e0be1e25419d504a2ae6b2221e776bb3c6a..c198d1c70a33d2d22d2cf1e2fd5073c4f6e66cff 100644 (file)
@@ -10,14 +10,14 @@ extern "C" {
     if (!main || F_status_is_error_not(main->setting.state.status) && main->setting.state.status == F_child) return;
 
     const f_string_static_t tools[2] = { firewall_tool_iptables_s, firewall_tool_ip6tables_s };
-    const f_string_static_t command[2] = { firewall_chain_flush_command_s, firewall_chain_delete_command_s };
+    const f_string_static_t command[2] = { firewall_chain_flush_operation_s, firewall_chain_delete_operation_s };
 
     f_string_statics_t arguments = f_string_statics_t_initialize;
     arguments.used = 1;
 
     f_string_static_t argument_array[arguments.used];
     arguments.array = argument_array;
-    argument_array[0] = firewall_chain_flush_command_s;
+    argument_array[0] = firewall_chain_flush_operation_s;
 
     int return_code = 0;
     uint8_t i = 0;
@@ -33,19 +33,19 @@ extern "C" {
 
         return_code = 0;
 
-        firewall_print_debug_tool(data->main->warning, tools[j], arguments);
+        firewall_print_debug_tool(&main->program.warning, tools[j], arguments);
 
         main->setting.state.status = fll_execute_program(tools[j], arguments, 0, 0, (void *) &return_code);
 
         if (main->setting.state.status == F_child) {
-          data->main->child = return_code;
+          main->program.child = return_code;
 
           return;
         }
 
         if (F_status_is_error(main->setting.state.status)) {
           if (F_status_set_fine(main->setting.state.status) == F_failure) {
-            firewall_print_error_operation(main->program->error, tools[j], arguments);
+            firewall_print_error_operation(&main->program.error, tools[j], arguments);
           }
           else {
             firewall_print_error(&main->program.error, macro_firewall_f(fll_execute_program));
diff --git a/level_3/firewall/c/main/operate/load.c b/level_3/firewall/c/main/operate/load.c
deleted file mode 100644 (file)
index 0a7ebda..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-#include "../firewall.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifndef _di_firewall_operate_load_chains_
-  void firewall_operate_load_chains(firewall_main_t * const main) {
-
-    if (!main || F_status_is_error_not(main->setting.state.status) && main->setting.state.status == F_child) return;
-
-    for (i = 0; i < local.chain_contents.used; ++i) {
-
-      main->data.range = local.chain_contents.array[i].array[0];
-
-      if ((main->data.has & firewall_data_has_main_e) && i == main->data.main) {
-        main->data.is |= firewall_data_is_main_e;
-      }
-      else {
-        main->data.is &= ~firewall_data_is_main_e;
-      }
-
-      main->data.chain = i;
-
-      firewall_operate_load_rules(main);
-      if (F_status_is_error(main->setting.state.status) || (main->setting.flag & firewall_main_flag_operation_stop_e) || main->setting.state.status == F_child) return;
-    } // for
-
-    main->setting.state.status = F_okay;
-  }
-#endif // _di_firewall_operate_load_chains_
-
-#ifndef _di_firewall_operate_load_rules_
-  void firewall_operate_load_rules(firewall_main_t * const main) {
-
-    if (!main || F_status_is_error_not(main->setting.state.status) && main->setting.state.status == F_child) return;
-
-    main->data.buffer.used = 0;
-    main->data.delimits.used = 0;
-    main->data.rule_objects.used = 0;
-    main->data.rule_contents.used = 0;
-
-// @fixme the data.rule_objects and rule_contents may be in use by a caller function (specifically in operate.c via firewall_operate_buffer_rules()).
-    main->setting.state.status = fll_fss_extended_read(main->data.buffer, main->setting.state, main->data.range, &main->data.rule_objects, &main->data.rule_contents, 0, 0, &main->data.delimits, 0);
-
-    if (F_status_is_error(main->setting.state.status)) {
-      firewall_print_error(&main->program.error, macro_firewall_f(fll_fss_extended_read));
-
-      return;
-    }
-
-    main->setting.state.status = f_fss_apply_delimit(main->setting.state, main->data.delimits, &main->data.buffer);
-
-    if (F_status_is_error(main->setting.state.status)) {
-      firewall_print_error(&main->program.error, macro_firewall_f(f_fss_apply_delimit));
-
-      return;
-    }
-
-    firewall_operate_process_rules(main);
-
-    if (F_status_is_error(main->setting.state.status)) {
-      if (F_status_set_fine(main->setting.state.status) != F_failure) {
-        firewall_print_error_unhandled(&main->error, macro_firewall_f(firewall_operate_process_rules));
-      }
-
-      return;
-    }
-
-    main->setting.state.status = F_okay;
-  }
-#endif // _di_firewall_operate_load_rules_
-
-#ifdef __cplusplus
-} // extern "C"
-#endif
diff --git a/level_3/firewall/c/main/operate/load.h b/level_3/firewall/c/main/operate/load.h
deleted file mode 100644 (file)
index 0a030ae..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-/**
- * FLL - Level 3
- *
- * Project: Firewall
- * API Version: 0.7
- * Licenses: lgpl-2.1-or-later
- *
- * Provides the load functionality.
- *
- * This is auto-included and should not need to be explicitly included.
- */
-#ifndef _firewall_operate_load_h
-#define _firewall_operate_load_h
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * Load and process the Content chains.
- *
- * @param main
- *   The main program and setting data.
- *
- *   This alters:
- *     - main.data.is.
- *     - main.data.range.
- *
- *   This alters main.setting.state.status:
- *     F_okay on success.
- *
- *     F_interrupt (with error bit) on interrupt signal received.
- *
- *     Errors (with error bit) from: firewall_operate_load_rules()
- *
- * @see firewall_operate_load_rules()
- */
-#ifndef _di_firewall_operate_load_chains_
-  extern void firewall_operate_load_chains(firewall_main_t * const main);
-#endif // _di_firewall_operate_load_chains_
-
-/**
- * Load and process the rules.
- *
- * @param main
- *   The main program and setting data.
- *
- *   This alters:
- *     - main.data.buffer.
- *     - main.data.delimits.
- *     - main.data.rule_objects.
- *     - main.data.rule_contents.
- *
- *   This alters main.setting.state.status:
- *     F_okay on success.
- *
- *     F_interrupt (with error bit) on interrupt signal received.
- *
- *     Errors (with error bit) from: f_fss_apply_delimit()
- *     Errors (with error bit) from: firewall_operate_process_rules()
- *     Errors (with error bit) from: fll_fss_extended_read()
- *
- * @see f_fss_apply_delimit()
- * @see firewall_operate_process_rules()
- * @see fll_fss_extended_read()
- */
-#ifndef _di_firewall_operate_load_rules_
-  extern void firewall_operate_load_rules(firewall_main_t * const main);
-#endif // _di_firewall_operate_load_rules_
-
-#ifdef __cplusplus
-} // extern "C"
-#endif
-
-#endif // _firewall_operate_load_h
index d0f5378d81aac76b0ad8643406b3999b4658b690..9496f5a7d13e560142ca9ac4b8a025887e5ab8fe 100644 (file)
@@ -24,14 +24,14 @@ extern "C" {
     f_number_unsigned_t repeat = 2;
 
     f_string_static_t tool = firewall_tool_iptables_s;
-    f_ranges_t * const rule_objects = &data->main.rule_objects;
-    f_rangess_t * const rule_contents = data->main.rule_contents;
+    f_ranges_t * const rule_objects = &main->data.rule_objects;
+    f_rangess_t * const rule_contents = &main->data.rule_contents;
 
     if (!(main->data.is & firewall_data_is_global_e)) {
-      if (data->devices.array[data->main.device].used) {
+      if (main->setting.devices.array[main->data.device].used) {
         main->cache.device.used = 0;
 
-        main->setting.state.status = f_string_dynamic_append(data->devices.array[data->main.device], &main->cache.device);
+        main->setting.state.status = f_string_dynamic_append(main->setting.devices.array[main->data.device], &main->cache.device);
         if (F_status_is_error(main->setting.state.status)) return;
       }
     }
@@ -52,7 +52,7 @@ extern "C" {
       main->cache.ip_list.used = 0;
 
       // Process chain rule.
-      if (f_compare_dynamic_partial_string(firewall_chain_s.string, data->main.buffer, firewall_chain_s.used, rule_objects->array[i]) == F_equal_to) {
+      if (f_compare_dynamic_partial_string(firewall_chain_s.string, main->data.buffer, firewall_chain_s.used, rule_objects->array[i]) == F_equal_to) {
         if (chain == firewall_chain_custom_e) {
 
           // Custom chains can only apply to themselves, so silently ignore chain commands specified within a custom chain.
@@ -64,22 +64,22 @@ extern "C" {
         if (rule_contents->array[i].used != 1) {
           valid = F_false;
         }
-        else if (f_compare_dynamic_partial_string(firewall_chain_input_s.string, data->main.buffer, firewall_chain_input_s.used, rule_contents->array[i].array[0]) == F_equal_to) {
+        else if (f_compare_dynamic_partial_string(firewall_chain_input_s.string, main->data.buffer, firewall_chain_input_s.used, rule_contents->array[i].array[0]) == F_equal_to) {
           chain = firewall_chain_input_e;
         }
-        else if (f_compare_dynamic_partial_string(firewall_chain_output_s.string, data->main.buffer, firewall_chain_output_s.used, rule_contents->array[i].array[0]) == F_equal_to) {
+        else if (f_compare_dynamic_partial_string(firewall_chain_output_s.string, main->data.buffer, firewall_chain_output_s.used, rule_contents->array[i].array[0]) == F_equal_to) {
           chain = firewall_chain_output_e;
         }
-        else if (f_compare_dynamic_partial_string(firewall_chain_forward_s.string, data->main.buffer, firewall_chain_forward_s.used, rule_contents->array[i].array[0]) == F_equal_to) {
+        else if (f_compare_dynamic_partial_string(firewall_chain_forward_s.string, main->data.buffer, firewall_chain_forward_s.used, rule_contents->array[i].array[0]) == F_equal_to) {
           chain = firewall_chain_forward_e;
         }
-        else if (f_compare_dynamic_partial_string(firewall_chain_postrouting_s.string, data->main.buffer, firewall_chain_postrouting_s.used, rule_contents->array[i].array[0]) == F_equal_to) {
+        else if (f_compare_dynamic_partial_string(firewall_chain_postrouting_s.string, main->data.buffer, firewall_chain_postrouting_s.used, rule_contents->array[i].array[0]) == F_equal_to) {
           chain = firewall_chain_postrouting_e;
         }
-        else if (f_compare_dynamic_partial_string(firewall_chain_prerouting_s.string, data->main.buffer, firewall_chain_prerouting_s.used, rule_contents->array[i].array[0]) == F_equal_to) {
+        else if (f_compare_dynamic_partial_string(firewall_chain_prerouting_s.string, main->data.buffer, firewall_chain_prerouting_s.used, rule_contents->array[i].array[0]) == F_equal_to) {
           chain = firewall_chain_prerouting_e;
         }
-        else if (f_compare_dynamic_partial_string(firewall_chain_none_s.string, data->main.buffer, firewall_chain_none_s.used, rule_contents->array[i].array[0]) == F_equal_to) {
+        else if (f_compare_dynamic_partial_string(firewall_chain_none_s.string, main->data.buffer, firewall_chain_none_s.used, rule_contents->array[i].array[0]) == F_equal_to) {
           chain = firewall_chain_none_e;
         }
         else {
@@ -90,17 +90,17 @@ extern "C" {
       }
 
       // Process direction rule
-      else if (f_compare_dynamic_partial_string(firewall_direction_s.string, data->main.buffer, firewall_direction_s.used, rule_objects->array[i]) == F_equal_to) {
+      else if (f_compare_dynamic_partial_string(firewall_direction_s.string, main->data.buffer, firewall_direction_s.used, rule_objects->array[i]) == F_equal_to) {
         if (rule_contents->array[i].used != 1) {
           valid = F_false;
         }
-        else if (f_compare_dynamic_partial_string(firewall_direction_input_s.string, data->main.buffer, firewall_direction_input_s.used, rule_contents->array[i].array[0]) == F_equal_to) {
+        else if (f_compare_dynamic_partial_string(firewall_direction_input_s.string, main->data.buffer, firewall_direction_input_s.used, rule_contents->array[i].array[0]) == F_equal_to) {
           direction = firewall_direction_input_e;
         }
-        else if (f_compare_dynamic_partial_string(firewall_direction_output_s.string, data->main.buffer, firewall_direction_output_s.used, rule_contents->array[i].array[0]) == F_equal_to) {
+        else if (f_compare_dynamic_partial_string(firewall_direction_output_s.string, main->data.buffer, firewall_direction_output_s.used, rule_contents->array[i].array[0]) == F_equal_to) {
           direction = firewall_direction_output_e;
         }
-        else if (f_compare_dynamic_partial_string(firewall_direction_none_s.string, data->main.buffer, firewall_direction_none_s.used, rule_contents->array[i].array[0]) == F_equal_to) {
+        else if (f_compare_dynamic_partial_string(firewall_direction_none_s.string, main->data.buffer, firewall_direction_none_s.used, rule_contents->array[i].array[0]) == F_equal_to) {
           direction = firewall_direction_none_e;
         }
         else {
@@ -113,18 +113,18 @@ extern "C" {
       }
 
       // Process device rule.
-      else if (f_compare_dynamic_partial_string(firewall_device_s.string, data->main.buffer, firewall_device_s.used, rule_objects->array[i]) == F_equal_to) {
+      else if (f_compare_dynamic_partial_string(firewall_device_s.string, main->data.buffer, firewall_device_s.used, rule_objects->array[i]) == F_equal_to) {
         if (rule_contents->array[i].used != 1) {
           valid = F_false;
         }
-        else if (f_compare_dynamic_partial_string(firewall_device_all_s.string, data->main.buffer, firewall_device_all_s.used, rule_contents->array[i].array[0]) == F_equal_to) {
+        else if (f_compare_dynamic_partial_string(firewall_device_all_s.string, main->data.buffer, firewall_device_all_s.used, rule_contents->array[i].array[0]) == F_equal_to) {
           main->cache.device.used = 0;
 
           continue;
         }
-        else if (f_compare_dynamic_partial_string(firewall_device_this_s.string, data->main.buffer, firewall_device_this_s.used, rule_contents->array[i].array[0]) == F_equal_to) {
-          if (data->devices.array[data->main.device].used) {
-            main->setting.state.status = f_string_dynamic_append(data->devices.array[data->main.device], &main->cache.device);
+        else if (f_compare_dynamic_partial_string(firewall_device_this_s.string, main->data.buffer, firewall_device_this_s.used, rule_contents->array[i].array[0]) == F_equal_to) {
+          if (main->setting.devices.array[main->data.device].used) {
+            main->setting.state.status = f_string_dynamic_append(main->setting.devices.array[main->data.device], &main->cache.device);
           }
           else {
             main->cache.device.used = 0;
@@ -138,7 +138,7 @@ extern "C" {
         if (valid) {
           main->cache.device.used = 0;
 
-          main->setting.state.status = f_string_dynamic_partial_append(data->main.buffer, rule_contents->array[i].array[0], &main->cache.device);
+          main->setting.state.status = f_string_dynamic_partial_append(main->data.buffer, rule_contents->array[i].array[0], &main->cache.device);
           if (F_status_is_error(main->setting.state.status)) return;
 
           continue;
@@ -146,20 +146,20 @@ extern "C" {
       }
 
       // Process action rule.
-      else if (f_compare_dynamic_partial_string(firewall_action_s.string, data->main.buffer, firewall_action_s.used, rule_objects->array[i]) == F_equal_to) {
+      else if (f_compare_dynamic_partial_string(firewall_action_s.string, main->data.buffer, firewall_action_s.used, rule_objects->array[i]) == F_equal_to) {
         if (rule_contents->array[i].used != 1) {
           valid = F_false;
         }
-        else if (f_compare_dynamic_partial_string(firewall_action_append_s.string, data->main.buffer, firewall_action_append_s.used, rule_contents->array[i].array[0]) == F_equal_to) {
+        else if (f_compare_dynamic_partial_string(firewall_action_append_s.string, main->data.buffer, firewall_action_append_s.used, rule_contents->array[i].array[0]) == F_equal_to) {
           action = firewall_action_append_e;
         }
-        else if (f_compare_dynamic_partial_string(firewall_action_insert_s.string, data->main.buffer, firewall_action_insert_s.used, rule_contents->array[i].array[0]) == F_equal_to) {
+        else if (f_compare_dynamic_partial_string(firewall_action_insert_s.string, main->data.buffer, firewall_action_insert_s.used, rule_contents->array[i].array[0]) == F_equal_to) {
           action = firewall_action_insert_e;
         }
-        else if (f_compare_dynamic_partial_string(firewall_action_policy_s.string, data->main.buffer, firewall_action_policy_s.used, rule_contents->array[i].array[0]) == F_equal_to) {
+        else if (f_compare_dynamic_partial_string(firewall_action_policy_s.string, main->data.buffer, firewall_action_policy_s.used, rule_contents->array[i].array[0]) == F_equal_to) {
           action = firewall_action_policy_e;
         }
-        else if (f_compare_dynamic_partial_string(firewall_action_none_s.string, data->main.buffer, firewall_action_none_s.used, rule_contents->array[i].array[0]) == F_equal_to) {
+        else if (f_compare_dynamic_partial_string(firewall_action_none_s.string, main->data.buffer, firewall_action_none_s.used, rule_contents->array[i].array[0]) == F_equal_to) {
           action = firewall_action_none_e;
         }
         else {
@@ -170,31 +170,31 @@ extern "C" {
       }
 
       // Process ip_list rule.
-      else if (f_compare_dynamic_partial_string(firewall_ip_list.string, data->main.buffer, firewall_ip_list.used, rule_objects->array[i]) == F_equal_to) {
+      else if (f_compare_dynamic_partial_string(firewall_ip_list.string, main->data.buffer, firewall_ip_list.used, rule_objects->array[i]) == F_equal_to) {
         is_ip_list = F_true;
 
-        if (f_compare_dynamic_partial_string(firewall_ip_list_source_s.string, data->main.buffer, firewall_ip_list_source_s.used, rule_contents->array[i].array[0]) == F_equal_to) {
+        if (f_compare_dynamic_partial_string(firewall_ip_list_source_s.string, main->data.buffer, firewall_ip_list_source_s.used, rule_contents->array[i].array[0]) == F_equal_to) {
           ip_list_direction = F_false;
         }
-        else if (f_compare_dynamic_partial_string(firewall_ip_list_destination_s.string, data->main.buffer, firewall_ip_list_destination_s.used, rule_contents->array[i].array[0]) == F_equal_to) {
+        else if (f_compare_dynamic_partial_string(firewall_ip_list_destination_s.string, main->data.buffer, firewall_ip_list_destination_s.used, rule_contents->array[i].array[0]) == F_equal_to) {
           ip_list_direction = F_true;
         }
         else {
           valid = F_false;
         }
       }
-      else if (f_compare_dynamic_partial_string(firewall_protocol_s.string, data->main.buffer, firewall_protocol_s.used, rule_objects->array[i]) == F_equal_to) {
+      else if (f_compare_dynamic_partial_string(firewall_protocol_s.string, main->data.buffer, firewall_protocol_s.used, rule_objects->array[i]) == F_equal_to) {
         if (rule_contents->array[i].used != 1) {
           valid = F_false;
         }
         else {
-          if (f_compare_dynamic_partial_string(firewall_protocol_none_s.string, data->main.buffer, firewall_protocol_none_s.used, rule_contents->array[i].array[0]) == F_equal_to) {
+          if (f_compare_dynamic_partial_string(firewall_protocol_none_s.string, main->data.buffer, firewall_protocol_none_s.used, rule_contents->array[i].array[0]) == F_equal_to) {
             use_protocol = F_false;
           }
           else if (rule_contents->array[i].array[0].start <= rule_contents->array[i].array[0].stop) {
             main->cache.protocol.used = 0;
 
-            main->setting.state.status = f_string_dynamic_partial_append(data->main.buffer, rule_contents->array[i].array[0], &main->cache.protocol);
+            main->setting.state.status = f_string_dynamic_partial_append(main->data.buffer, rule_contents->array[i].array[0], &main->cache.protocol);
             if (F_status_is_error(main->setting.state.status)) return;
 
             use_protocol = F_true;
@@ -208,20 +208,20 @@ extern "C" {
       }
 
       // Process tool rule.
-      else if (f_compare_dynamic_partial_string(firewall_tool_s.string, data->main.buffer, firewall_tool_s.used, rule_objects->array[i]) == F_equal_to) {
+      else if (f_compare_dynamic_partial_string(firewall_tool_s.string, main->data.buffer, firewall_tool_s.used, rule_objects->array[i]) == F_equal_to) {
         if (rule_contents->array[i].used != 1) {
           valid = F_false;
         }
         else {
-          if (f_compare_dynamic_partial_string(firewall_tool_iptables_s.string, data->main.buffer, firewall_tool_iptables_s.used, rule_contents->array[i].array[0]) == F_equal_to) {
+          if (f_compare_dynamic_partial_string(firewall_tool_iptables_s.string, main->data.buffer, firewall_tool_iptables_s.used, rule_contents->array[i].array[0]) == F_equal_to) {
             tool = firewall_tool_iptables_s;
             repeat = 1;
           }
-          else if (f_compare_dynamic_partial_string(firewall_tool_ip6tables_s.string, data->main.buffer, firewall_tool_ip6tables_s.used, rule_contents->array[i].array[0]) == F_equal_to) {
+          else if (f_compare_dynamic_partial_string(firewall_tool_ip6tables_s.string, main->data.buffer, firewall_tool_ip6tables_s.used, rule_contents->array[i].array[0]) == F_equal_to) {
             tool = firewall_tool_ip6tables_s;
             repeat = 1;
           }
-          else if (f_compare_dynamic_partial_string(firewall_tool_ip46tables_s.string, data->main.buffer, firewall_tool_ip46tables_s.used, rule_contents->array[i].array[0]) == F_equal_to) {
+          else if (f_compare_dynamic_partial_string(firewall_tool_ip46tables_s.string, main->data.buffer, firewall_tool_ip46tables_s.used, rule_contents->array[i].array[0]) == F_equal_to) {
             tool = firewall_tool_iptables_s;
             repeat = 2;
           }
@@ -234,7 +234,7 @@ extern "C" {
       }
 
       // If the remaining rule does not match as firewall_rule_s, then it is an invalid rule.
-      else if (f_compare_dynamic_partial_string(firewall_rule_s.string, data->main.buffer, firewall_rule_s.used, rule_objects->array[i]) == F_equal_to) {
+      else if (f_compare_dynamic_partial_string(firewall_rule_s.string, main->data.buffer, firewall_rule_s.used, rule_objects->array[i]) == F_equal_to) {
         firewall_print_warning_object_invalid_missing_line(&main->program.warning, i, main->data.buffer, main->data.rule_objects.array[i]);
 
         continue;
@@ -253,7 +253,7 @@ extern "C" {
         // First add the program name.
         main->cache.arguments.used = 0;
 
-        main->setting.state.status = f_memory_array_increase(firewall_default_allocation_step_d, sizeof(f_string_dynamic_t), (void **) &main->cache.arguments.array, &main->cache.arguments.used, &main->cache.arguments.size);
+        main->setting.state.status = f_memory_array_increase(firewall_allocation_small_d, sizeof(f_string_dynamic_t), (void **) &main->cache.arguments.array, &main->cache.arguments.used, &main->cache.arguments.size);
         if (F_status_is_error(main->setting.state.status)) return;
 
         if (tool.string == firewall_tool_ip46tables_s.string) {
@@ -262,19 +262,19 @@ extern "C" {
 
         // Process the action when a non-none chain is specified.
         if (chain != firewall_chain_none_e && action != firewall_action_none_e) {
-          main->setting.state.status = f_memory_array_increase(firewall_default_allocation_step_d, sizeof(f_string_dynamic_t), (void **) &arguments.array, &arguments.used, &arguments.size);
+          main->setting.state.status = f_memory_array_increase(firewall_allocation_small_d, sizeof(f_string_dynamic_t), (void **) &main->cache.arguments.array, &main->cache.arguments.used, &main->cache.arguments.size);
           if (F_status_is_error(main->setting.state.status)) return;
 
           main->cache.arguments.array[main->cache.arguments.used].used = 0;
 
           if (action == firewall_action_append_e) {
-            main->setting.state.status = f_string_dynamic_append(firewall_action_append_command_s, &main->cache.arguments.array[main->cache.arguments.used]);
+            main->setting.state.status = f_string_dynamic_append(firewall_action_append_operation_s, &main->cache.arguments.array[main->cache.arguments.used]);
           }
           else if (action == firewall_action_insert_e) {
-            main->setting.state.status = f_string_dynamic_append(firewall_action_insert_command_s, &main->cache.arguments.array[main->cache.arguments.used]);
+            main->setting.state.status = f_string_dynamic_append(firewall_action_insert_operation_s, &main->cache.arguments.array[main->cache.arguments.used]);
           }
           else if (action == firewall_action_policy_e) {
-            main->setting.state.status = f_string_dynamic_append(firewall_action_policy_command_s, &main->cache.arguments.array[main->cache.arguments.used]);
+            main->setting.state.status = f_string_dynamic_append(firewall_action_policy_operation_s, &main->cache.arguments.array[main->cache.arguments.used]);
           }
 
           if (F_status_is_error(main->setting.state.status)) return;
@@ -282,7 +282,7 @@ extern "C" {
           if (action == firewall_action_append_e || action == firewall_action_insert_e || action == firewall_action_policy_e) {
             ++main->cache.arguments.used;
 
-            main->setting.state.status = f_memory_array_increase(firewall_default_allocation_step_d, sizeof(f_string_dynamic_t), (void **) &main->cache.arguments.array, &main->cache.arguments.used, &main->cache.arguments.size);
+            main->setting.state.status = f_memory_array_increase(firewall_allocation_small_d, sizeof(f_string_dynamic_t), (void **) &main->cache.arguments.array, &main->cache.arguments.used, &main->cache.arguments.size);
             if (F_status_is_error(main->setting.state.status)) return;
 
             main->cache.arguments.array[main->cache.arguments.used].used = 0;
@@ -290,7 +290,7 @@ extern "C" {
 
             // Process the chain, which is required by the action.
             if (chain == firewall_chain_custom_e) {
-              main->setting.state.status = f_string_dynamic_append(data->chains.array[data->main.chain_ids.array[main->data.chain]], &main->cache.arguments.array[main->cache.arguments.used]);
+              main->setting.state.status = f_string_dynamic_append(main->setting.chains.array[main->data.chain_ids.array[main->data.chain]], &main->cache.arguments.array[main->cache.arguments.used]);
             }
             else if (chain == firewall_chain_forward_e) {
               main->setting.state.status = f_string_dynamic_append(firewall_chain_forward_s, &main->cache.arguments.array[main->cache.arguments.used]);
@@ -320,21 +320,21 @@ extern "C" {
         }
 
         // Add the device if and only if a non-none direction is specified.
-        if (device.used && (direction == firewall_direction_input_e || direction == firewall_direction_output_e)) {
-          if (f_compare_dynamic_partial_string(firewall_device_all_s.string, data->main.buffer, firewall_device_all_s.used, rule_contents->array[i].array[0]) == F_equal_to_not) {
-            main->setting.state.status = f_memory_array_increase(firewall_default_allocation_step_d, sizeof(f_string_dynamic_t), (void **) &main->cache.arguments.array, &main->cache.arguments.used, &main->cache.arguments.size);
+        if (main->cache.device.used && (direction == firewall_direction_input_e || direction == firewall_direction_output_e)) {
+          if (f_compare_dynamic_partial_string(firewall_device_all_s.string, main->data.buffer, firewall_device_all_s.used, rule_contents->array[i].array[0]) == F_equal_to_not) {
+            main->setting.state.status = f_memory_array_increase(firewall_allocation_small_d, sizeof(f_string_dynamic_t), (void **) &main->cache.arguments.array, &main->cache.arguments.used, &main->cache.arguments.size);
             if (F_status_is_error(main->setting.state.status)) return;
 
             main->cache.arguments.array[main->cache.arguments.used].used = 0;
 
             if (direction == firewall_direction_input_e) {
-              main->setting.state.status = f_string_dynamic_append(firewall_device_input_command_s, &main->cache.arguments.array[main->cache.arguments.used]);
+              main->setting.state.status = f_string_dynamic_append(firewall_device_input_operation_s, &main->cache.arguments.array[main->cache.arguments.used]);
               if (F_status_is_error(main->setting.state.status)) return;
 
               ++main->cache.arguments.used;
             }
             else if (direction == firewall_direction_output_e) {
-              main->setting.state.status = f_string_dynamic_append(firewall_device_output_command_s, &main->cache.arguments.array[main->cache.arguments.used]);
+              main->setting.state.status = f_string_dynamic_append(firewall_device_output_operation_s, &main->cache.arguments.array[main->cache.arguments.used]);
               if (F_status_is_error(main->setting.state.status)) return;
 
               ++main->cache.arguments.used;
@@ -343,7 +343,7 @@ extern "C" {
 
           // Add the device.
           if (main->cache.device.used) {
-            main->setting.state.status = f_memory_array_increase(firewall_default_allocation_step_d, sizeof(f_string_dynamic_t), (void **) &main->cache.arguments.array, &main->cache.arguments.used, &main->cache.arguments.size);
+            main->setting.state.status = f_memory_array_increase(firewall_allocation_small_d, sizeof(f_string_dynamic_t), (void **) &main->cache.arguments.array, &main->cache.arguments.used, &main->cache.arguments.size);
             if (F_status_is_error(main->setting.state.status)) return;
 
             main->cache.arguments.array[main->cache.arguments.used].used = 0;
@@ -356,18 +356,18 @@ extern "C" {
         }
 
         if (use_protocol) {
-          main->setting.state.status = f_memory_array_increase(firewall_default_allocation_step_d, sizeof(f_string_dynamic_t), (void **) &main->cache.arguments.array, &main->cache.arguments.used, &main->cache.arguments.size);
+          main->setting.state.status = f_memory_array_increase(firewall_allocation_small_d, sizeof(f_string_dynamic_t), (void **) &main->cache.arguments.array, &main->cache.arguments.used, &main->cache.arguments.size);
           if (F_status_is_error(main->setting.state.status)) return;
 
           main->cache.arguments.array[main->cache.arguments.used].used = 0;
 
-          main->setting.state.status = f_string_dynamic_append(firewall_protocol_command_s, &main->cache.arguments.array[main->cache.arguments.used]);
+          main->setting.state.status = f_string_dynamic_append(firewall_protocol_operation_s, &main->cache.arguments.array[main->cache.arguments.used]);
           if (F_status_is_error(main->setting.state.status)) return;
 
           ++main->cache.arguments.used;
 
           if (main->cache.protocol.used) {
-            main->setting.state.status = f_memory_array_increase(firewall_default_allocation_step_d, sizeof(f_string_dynamic_t), (void **) &main->cache.arguments.array, &main->cache.arguments.used, &main->cache.arguments.size);
+            main->setting.state.status = f_memory_array_increase(firewall_allocation_small_d, sizeof(f_string_dynamic_t), (void **) &main->cache.arguments.array, &main->cache.arguments.used, &main->cache.arguments.size);
             if (F_status_is_error(main->setting.state.status)) return;
 
             main->cache.arguments.array[main->cache.arguments.used].used = 0;
@@ -389,9 +389,9 @@ extern "C" {
             ++j;
 
             if (rule_contents->array[i].array[j].start <= rule_contents->array[i].array[j].stop) {
-              ip_list.used = 0;
+              main->cache.ip_list.used = 0;
 
-              main->setting.state.status = f_string_dynamic_partial_append(data->main.buffer, rule_contents->array[i].array[j], &ip_list);
+              main->setting.state.status = f_string_dynamic_partial_append(main->data.buffer, rule_contents->array[i].array[j], &main->cache.ip_list);
 
               if (F_status_is_error(main->setting.state.status)) {
 
@@ -414,7 +414,7 @@ extern "C" {
             if (rule_contents->array[i].array[j].start <= rule_contents->array[i].array[j].stop) {
               main->cache.arguments.array[main->cache.arguments.used].used = 0;
 
-              main->setting.state.status = f_string_dynamic_partial_append(data->main.buffer, rule_contents->array[i].array[j], &main->cache.arguments.array[main->cache.arguments.used]);
+              main->setting.state.status = f_string_dynamic_partial_append(main->data.buffer, rule_contents->array[i].array[j], &main->cache.arguments.array[main->cache.arguments.used]);
               if (F_status_is_error(main->setting.state.status)) return;
 
               ++main->cache.arguments.used;
@@ -430,15 +430,16 @@ extern "C" {
         // Now execute the generated commands.
         if (main->cache.arguments.used > 1) {
           if (is_ip_list) {
-            data->cache.path_file_specific.used = 0;
-            data->cache.local_buffer.used = 0;
-            data->cache.basic_objects.used = 0;
-            data->cache.basic_contents.used = 0;
+            main->cache.basic_objects.used = 0;
+            main->cache.basic_contents.used = 0;
+            main->cache.buffer.used = 0;
+            main->cache.delimits.used = 0;
+            main->cache.path_file_specific.used = 0;
 
-            main->setting.state.status = f_string_dynamic_append(firewall_network_path_s, &data->cache.path_file_specific);
+            main->setting.state.status = f_string_dynamic_append(firewall_network_path_s, &main->cache.path_file_specific);
 
             if (F_status_is_error_not(main->setting.state.status)) {
-              main->setting.state.status = f_string_dynamic_append(main->cache.ip_list, &data->cache.path_file_specific);
+              main->setting.state.status = f_string_dynamic_append(main->cache.ip_list, &main->cache.path_file_specific);
             }
 
             if (F_status_is_error(main->setting.state.status)) {
@@ -447,44 +448,51 @@ extern "C" {
               return;
             }
 
-            main->setting.state.status = f_file_open(data->cache.path_file_specific, 0, &data->cache.file);
+            main->setting.state.status = f_file_open(main->cache.path_file_specific, 0, &main->cache.file);
 
             if (F_status_is_error(main->setting.state.status)) {
-              firewall_print_error_file(&main->program.error, macro_firewall_f(f_file_open), data->cache.path_file_specific, f_file_operation_open_s, fll_error_file_type_file_e);
+              firewall_print_error_file(&main->program.error, macro_firewall_f(f_file_open), main->cache.path_file_specific, f_file_operation_open_s, fll_error_file_type_file_e);
 
-              f_file_stream_close(&data->cache.file);
+              f_file_stream_close(&main->cache.file);
 
               return;
             }
 
-            main->setting.state.status = f_file_read(data->cache.file, &data->cache.local_buffer);
+            main->setting.state.status = f_file_read(main->cache.file, &main->cache.buffer);
 
-            f_file_stream_close(&data->cache.file);
+            f_file_stream_close(&main->cache.file);
 
             if (F_status_is_error(main->setting.state.status)) {
-              firewall_print_error_file(&main->program.error, macro_firewall_f(f_file_read), data->cache.path_file_specific, f_file_operation_read_s, fll_error_file_type_file_e);
+              firewall_print_error_file(&main->program.error, macro_firewall_f(f_file_read), main->cache.path_file_specific, f_file_operation_read_s, fll_error_file_type_file_e);
 
               return;
             }
 
-            main->data.delimits.used = 0;
-            main->data.range.start = 0;
-            main->data.range.stop = data->cache.local_buffer.used - 1;
+            main->cache.delimits.used = 0;
 
-            main->setting.state.status = fll_fss_basic_read(data->cache.local_buffer, main->setting.state.status, &input, &data->cache.basic_objects, &data->cache.basic_contents, 0, &main->data.delimits, 0);
+            if (main->cache.buffer.used) {
+              main->data.range.start = 0;
+              main->data.range.stop = main->cache.buffer.used - 1;
+            }
+            else {
+              main->data.range.start = 1;
+              main->data.range.stop = 0;
+            }
+
+            fll_fss_basic_read(main->cache.buffer, &main->data.range, &main->cache.basic_objects, &main->cache.basic_contents, 0, &main->cache.delimits, 0, &main->setting.state);
 
             if (F_status_is_error(main->setting.state.status)) {
               if (F_status_set_fine(main->setting.state.status) == F_data_not_eos || F_status_set_fine(main->setting.state.status) == F_data_not || F_status_set_fine(main->setting.state.status) == F_data_not_stop) {
                 // Empty files are to be silently ignored.
               }
               else {
-                firewall_print_error_file(&main->program.error, macro_firewall_f(fll_fss_basic_read), data->cache.path_file_specific, f_file_operation_read_s, fll_error_file_type_file_e);
+                firewall_print_error_file(&main->program.error, macro_firewall_f(fll_fss_basic_read), main->cache.path_file_specific, f_file_operation_read_s, fll_error_file_type_file_e);
 
                 return;
               }
             }
 
-            main->setting.state.status = f_fss_apply_delimit(main->setting.state, main->data.delimits, &data->cache.local_buffer);
+            f_fss_apply_delimit(main->cache.delimits, &main->cache.buffer, &main->setting.state);
 
             if (F_status_is_error(main->setting.state.status)) {
               firewall_print_error(&main->program.error, macro_firewall_f(f_fss_apply_delimit));
@@ -512,13 +520,13 @@ extern "C" {
               ++main->cache.arguments.used;
 
               // The ip_list file contains objects and no content, all objects are what matter an nothing else.
-              for (at = 0; at < data->cache.basic_objects.used; ++at) {
+              for (at = 0; at < main->cache.basic_objects.used; ++at) {
 
                 if (firewall_signal_check(main)) return;
 
                 main->cache.arguments.array[main->cache.arguments.used].used = 0;
 
-                main->setting.state.status = f_string_dynamic_partial_append(data->cache.local_buffer, data->cache.basic_objects.array[at], &main->cache.arguments.array[main->cache.arguments.used]);
+                main->setting.state.status = f_string_dynamic_partial_append(main->cache.buffer, main->cache.basic_objects.array[at], &main->cache.arguments.array[main->cache.arguments.used]);
 
                 if (F_status_is_error(main->setting.state.status)) {
                   firewall_print_error(&main->program.error, macro_firewall_f(f_string_dynamic_partial_append));
@@ -528,12 +536,12 @@ extern "C" {
 
                 ++main->cache.arguments.used;
 
-                firewall_print_debug_tool(data->main->warning, tool, main->cache.arguments);
+                firewall_print_debug_tool(&main->program.warning, tool, main->cache.arguments);
 
                 main->setting.state.status = fll_execute_program(tool, main->cache.arguments, 0, 0, (void *) &return_code);
 
                 if (main->setting.state.status == F_child) {
-                  data->main->child = return_code;
+                  main->program.child = return_code;
 
                   return;
                 }
@@ -543,7 +551,7 @@ extern "C" {
 
                 if (F_status_is_error(main->setting.state.status)) {
                   if (F_status_set_fine(main->setting.state.status) == F_failure) {
-                    firewall_print_error_operation(main->program->error, tool, main->cache.arguments);
+                    firewall_print_error_operation(&main->program.error, tool, main->cache.arguments);
                   }
                   else {
                     firewall_print_error(&main->program.error, macro_firewall_f(fll_execute_program));
@@ -560,19 +568,19 @@ extern "C" {
             if (F_status_set_fine(main->setting.state.status) == F_failure || F_status_set_fine(main->setting.state.status) == F_parameter) return;
           }
           else {
-            firewall_print_debug_tool(data->main->warning, tool, main->cache.arguments);
+            firewall_print_debug_tool(&main->program.warning, tool, main->cache.arguments);
 
             main->setting.state.status = fll_execute_program(tool, main->cache.arguments, 0, 0, (void *) &return_code);
 
             if (main->setting.state.status == F_child) {
-              data->main->child = return_code;
+              main->program.child = return_code;
 
               return;
             }
 
             if (F_status_is_error(main->setting.state.status)) {
               if (F_status_set_fine(main->setting.state.status) == F_failure) {
-                firewall_print_error_operation(main->program->error, tool, main->cache.arguments);
+                firewall_print_error_operation(&main->program.error, tool, main->cache.arguments);
               }
               else {
                 firewall_print_error(&main->program.error, macro_firewall_f(fll_execute_program));
index d310f21defaa371229182d23b6d43f242661446c..c3804860140796902beb7e9917416696cb7131fc 100644 (file)
@@ -5,21 +5,24 @@ extern "C" {
 #endif
 
 #ifndef _di_firewall_print_debug_tool_
-  void firewall_print_debug_tool(const fl_print_t output, const f_string_static_t tool, const f_string_statics_t arguments) {
+  f_status_t firewall_print_debug_tool(fl_print_t * const print, const f_string_static_t tool, const f_string_statics_t arguments) {
 
-    if (output.verbosity != f_console_verbosity_debug_e) return;
+    if (!print) return F_status_set_error(F_output_not);
+    if (print->verbosity != f_console_verbosity_debug_e) return F_output_not;
 
-    f_file_stream_lock(output.to);
+    f_file_stream_lock(print->to);
 
-    fl_print_format("%[%r", output.to, output.context, tool);
+    fl_print_format("%[%Q", print->to, print->context, tool);
 
     for (f_number_unsigned_t i = 0; i < arguments.used; ++i) {
-      fl_print_format(" %Q", output.to, arguments.array[i]);
+      fl_print_format(" %Q", print->to, arguments.array[i]);
     } // for
 
-    fl_print_format("%]%r", output.to, output.context, f_string_eol_s);
+    fl_print_format("%]%r", print->to, print->context, f_string_eol_s);
 
-    f_file_stream_unlock(output.to);
+    f_file_stream_unlock(print->to);
+
+    return F_okay;
   }
 #endif // _di_firewall_print_debug_tool_
 
index 84a8f0a42395cdfe068a82b64d2a5bfd53eb3832..fd45e4fbe2bc2fae481863247d86b8f7aade9dfe 100644 (file)
@@ -19,15 +19,24 @@ extern "C" {
 /**
  * Print debug information about tool execution.
  *
- * @param output
- *   The output to print to.
+ * @param print
+ *   The output structure to print to.
+ *
+ *   This does not alter print.custom.setting.state.status.
  * @param tool
- *   The iptables tool.
+ *   The name of the function associated with the error.
  * @param arguments
- *   The arguments passed to the tool.
+ *   The name of the file, if this error is assocaited with a file.
+ *   Otherwise, set file.used to 0 to not have an file related error message.
+ *
+ * @return
+ *   F_okay on success.
+ *   F_output_not on success, but no printing is performed.
+ *
+ *   F_output_not (with error bit) if setting is NULL.
  */
 #ifndef _di_firewall_print_debug_tool_
-  extern void firewall_print_debug_tool(const fl_print_t output, const f_string_static_t tool, const f_string_statics_t arguments);
+  extern f_status_t firewall_print_debug_tool(fl_print_t * const print, const f_string_static_t tool, const f_string_statics_t arguments);
 #endif // _di_firewall_print_debug_tool_
 
 #ifdef __cplusplus
index edea597aca462b7ca03133dc011f2a79d679a010..22220015213c11fda2ace14b7bd5c1dd19903edc 100644 (file)
@@ -31,7 +31,7 @@ extern "C" {
 #endif // _di_firewall_print_error_file_
 
 #ifndef _di_firewall_print_error_file_empty_
-  f_status_t firewall_print_error_file_empty(fl_print_t * const print, const f_string_static_t section, const f_string_static_t file) {
+  f_status_t firewall_print_error_file_empty(fl_print_t * const print, const f_string_static_t file) {
 
     if (!print) return F_status_set_error(F_output_not);
     if (print->verbosity < f_console_verbosity_error_e) return F_output_not;
@@ -39,7 +39,7 @@ extern "C" {
     f_file_stream_lock(print->to);
 
     fl_print_format("%[%QNo relevant data is found within the file '%]", print->to, print->context, print->prefix, print->context);
-    fl_print_format(f_string_format_Q_single_s.string, print->to, print->notable, operation, print->notable);
+    fl_print_format(f_string_format_Q_single_s.string, print->to, print->notable, file, print->notable);
     fl_print_format(f_string_format_sentence_end_quote_s.string, print->to, print->set->error, print->set->error, f_string_eol_s);
 
     f_file_stream_unlock(print->to);
@@ -66,17 +66,15 @@ extern "C" {
     if (!print || !print->custom) return F_status_set_error(F_output_not);
     if (print->verbosity < f_console_verbosity_error_e) return F_output_not;
 
-    firewall_main_t * const main = (firewall_main_t *) print->custom);
-
-    if (output.verbosity == f_console_verbosity_quiet_e) return;
+    firewall_main_t * const main = (firewall_main_t *) print->custom;
 
     f_file_stream_lock(print->to);
 
     if (F_status_set_fine(main->setting.state.status) == F_memory_not) {
-      fl_print_format("%[%QOut of memory while performing requested %r operation:%]", print->to, print->context, output.prefix, tool, print->context);
+      fl_print_format("%[%QOut of memory while performing requested %r operation:%]", print->to, print->context, print->prefix, tool, print->context);
     }
     else {
-      fl_print_format("%[%QFailed to perform requested %r operation:%]", print->to, print->context, output.prefix, tool, print->context);
+      fl_print_format("%[%QFailed to perform requested %r operation:%]", print->to, print->context, print->prefix, tool, print->context);
     }
 
     fl_print_format("%r  %[%Q", print->to, f_string_eol_s, print->context, tool);
@@ -101,11 +99,11 @@ extern "C" {
     if (!print || !print->custom) return F_status_set_error(F_output_not);
     if (print->verbosity == f_console_verbosity_quiet_e) return F_output_not;
 
-    firewall_main_t * const main = (firewall_main_t *) print->custom);
+    firewall_main_t * const main = (firewall_main_t *) print->custom;
 
     f_file_stream_lock(print->to);
 
-    fl_print_format("%[%QFailed to perform%] ", print->to, print->context, output.prefix);
+    fl_print_format("%[%QFailed to perform%] ", print->to, print->context, print->prefix);
     fl_print_format(f_string_format_Q_single_s.string, print->to, print->notable, operation, print->notable);
     fl_print_format(" %[request because the%] ", print->to, print->context, print->prefix, print->context);
     fl_print_format(f_string_format_Q_single_s.string, print->to, print->notable, operation, print->notable);
@@ -131,41 +129,20 @@ extern "C" {
   }
 #endif // _di_firewall_print_error_operation_specified_not_
 
-#ifndef _di_firewall_print_error_directory_read_
-  f_status_t firewall_print_error_directory_read(fl_print_t * const print, const f_string_static_t ) {
-
-    if (!print) return F_status_set_error(F_output_not);
-    if (print->verbosity < f_console_verbosity_error_e) return F_output_not;
-
-    f_file_stream_lock(print->to);
-
-    fl_print_format("%[%QFailed to read the device directory '%]", print->to, print->context, print->prefix, print->context);
-    fl_print_format(firewall_operation_show_s.string, print->to, print->notable, option, print->notable);
-    fl_print_format(" %[option '%]", print->to, print->context, print->prefix, print->context);
-    fl_print_format(f_string_format_Q_single_s.string, print->to, print->notable, option, print->notable);
-    fl_print_format("%[' is not known.%]%r", print->to, print->context, print->context, f_string_eol_s);
-
-    f_file_stream_unlock(print->to);
-    f_file_stream_flush(print->to);
-
-    return F_okay;
-  }
-#endif // _di_firewall_print_error_directory_read_
-
 #ifndef _di_firewall_print_error_unhandled_
-  void firewall_print_error_unhandled(const fl_print_t print, const f_string_t function, const f_string_static_t file) {
+  f_status_t firewall_print_error_unhandled(fl_print_t * const print, const f_string_t function, const f_string_static_t file) {
 
     if (!print || !print->custom) return F_status_set_error(F_output_not);
     if (print->verbosity < f_console_verbosity_error_e) return F_output_not;
 
-    f_file_stream_lock(print->to);
+    firewall_main_t * const main = (firewall_main_t *) print->custom;
 
-    firewall_main_t * const main = (firewall_main_t *) print->custom);
+    f_file_stream_lock(print->to);
 
     fl_print_format("%[%QAn unhandled error (%]", print->to, f_string_eol_s, print->context, print->prefix, print->context);
     fl_print_format(f_string_format_ui_single_s.string, print->to, print->notable, F_status_set_fine(main->setting.state.status), print->notable);
     fl_print_format("%[) has occurred while calling%] ", print->to, print->context, print->prefix, print->context);
-    fl_print_format(f_string_format_Q_single_s.string, print->to, print->notable, operation, print->notable);
+    fl_print_format(f_string_format_S_single_s.string, print->to, print->notable, function, print->notable);
 
     if (file.used) {
       fl_print_format("%[() for the file%] ", print->to, print->context, print->prefix, print->context);
index 0316e019f645283cd6ee14d4e6711accd7c99255..f42d8437039d8e45cea7e419e3f80b66d76dd865 100644 (file)
@@ -196,7 +196,7 @@ extern "C" {
  *   F_output_not (with error bit) if setting is NULL.
  */
 #ifndef _di_firewall_print_error_unhandled_
-  extern f_status_t firewall_print_error_unhandled(const fl_print_t print, const f_string_t function, const f_string_static_t file);
+  extern f_status_t firewall_print_error_unhandled(fl_print_t * const print, const f_string_t function, const f_string_static_t file);
 #endif // _di_firewall_print_error_unhandled_
 
 #ifdef __cplusplus
index 71507b9a89de86c2e9998ae0e2cb5828ab6e19e9..7c6bf35765b49ca7b911dd5ce53c0295b2e03fdb 100644 (file)
@@ -27,7 +27,7 @@ extern "C" {
 
     f_print_dynamic_raw(f_string_eol_s, print->to);
 
-    fll_program_print_help_usage(print, firewall_program_name_s, firewall_program_help_commands_s);
+    fll_program_print_help_usage(print, firewall_program_name_s, firewall_program_help_parameters_s);
 
     f_file_stream_flush(print->to);
     f_file_stream_unlock(print->to);
@@ -44,13 +44,13 @@ extern "C" {
     f_file_stream_lock(print->to);
 
     if (left.used) {
-      fl_print_format("%[%Q%] ", print->to, print->set.standout, left, print->set.standout);
+      fl_print_format("%[%Q%] ", print->to, print->set->standout, left, print->set->standout);
     }
 
-    fll_print_format("%[%Q%]", print->to, print->set.standout, print->set.standout, print->set.title, print->set.title, print->set.standout, print->set.standout, f_string_eol_s);
+    fll_print_format("%[%Q%]", print->to, print->set->standout, print->set->standout, print->set->title, print->set->title, print->set->standout, print->set->standout, f_string_eol_s);
 
     if (left.used) {
-      fl_print_format(" %[%Q%]", print->to, print->set.standout, right, print->set.standout);
+      fl_print_format(" %[%Q%]", print->to, print->set->standout, right, print->set->standout);
     }
 
     f_print_dynamic_raw(f_string_eol_s, print->to);
index 781b40682f94871fd5bfed229c4a11c16ca02c8f..6029200af0df3037bdcdd4d16a7233bc6972369b 100644 (file)
@@ -38,14 +38,14 @@ build_libraries-monolithic -lfll
 
 build_sources_library main/common.c main/common/define.c main/common/enumeration.c main/common/print.c main/common/string.c main/common/type.c
 build_sources_library main/print/debug.c main/print/error.c main/print/message.c main/print/warning.c
-build_sources_library main/operate.c main/operate/buffer.c main/operate/create.c main/operate/default.c main/operate/delete.c main/operate/load.c main/operate/process.c
+build_sources_library main/operate.c main/operate/buffer.c main/operate/create.c main/operate/default.c main/operate/delete.c main/operate/process.c
 build_sources_library main/firewall.c main/signal.c main/thread.c
 
 build_sources_program main/main.c
 
 build_sources_headers main/common.h main/common/define.h main/common/enumeration.h main/common/print.h main/common/string.h main/common/type.h
 build_sources_headers main/print/debug.h main/print/error.h main/print/message.h main/print/warning.h
-build_sources_headers main/operate.h main/operate/buffer.h main/operate/create.h main/operate/default.h main/operate/delete.h main/operate/load.h main/operate/process.h
+build_sources_headers main/operate.h main/operate/buffer.h main/operate/create.h main/operate/default.h main/operate/delete.h main/operate/process.h
 build_sources_headers main/firewall.h main/operate.h main/signal.h main/thread.h
 
 build_sources_documentation man