]> Kevux Git Server - kevux-tools/commitdiff
Progress: Continue working on completing the remove program.
authorKevin Day <Kevin@kevux.org>
Thu, 27 Mar 2025 01:18:50 +0000 (20:18 -0500)
committerKevin Day <Kevin@kevux.org>
Thu, 27 Mar 2025 01:18:50 +0000 (20:18 -0500)
Use polling on the standard input to allow for blocking in an interruptible way.
Once there is input the file read can be called to read the input.

This finishes the `remove` program development.
I am still designating this as progress because the following wrapper programs now need to be written:
  - `rm`
  - `rmdir`
  - `unlink`

data/build/stand_alone/configs/remove-config.h
sources/c/program/kevux/tools/remove/main/common/define.h
sources/c/program/kevux/tools/remove/main/common/print.c
sources/c/program/kevux/tools/remove/main/common/print.h
sources/c/program/kevux/tools/remove/main/common/type.c
sources/c/program/kevux/tools/remove/main/common/type.h
sources/c/program/kevux/tools/remove/main/operate.c

index 8d58a0f6bf1fcbc05b4658fb7d0d709b78e932ad..477372bf952d140e7685587976f35d79ec3eadb6 100644 (file)
 #define _di_f_file_operation_wipe_s_
 #define _di_f_file_operation_write_s_
 #define _di_f_file_owner_read_
-#define _di_f_file_poll_
+//#define _di_f_file_poll_
 #define _di_f_file_read_
 //#define _di_f_file_read_block_
 #define _di_f_file_read_until_
 #define _di_f_pipe_error_exists_
 //#define _di_f_pipe_input_exists_
 #define _di_f_pipe_output_exists_
-#define _di_f_poll_e_
+//#define _di_f_poll_e_
 //#define _di_f_poll_t_
-#define _di_f_polls_t_
+//#define _di_f_polls_t_
 #define _di_f_pollss_delete_callback_
 #define _di_f_pollss_destroy_callback_
 #define _di_f_pollss_t_
index 3f0af2efd286a9d0062aa7c3e055d5b930039de4..6ce49085d4245690c9412059d8f265b6c0fe3601 100644 (file)
@@ -20,7 +20,10 @@ extern "C" {
  * The program defines.
  *
  * Leap Year:
- *   - If can be evenly divided by 4, then this is a leap year. (@fixme relocate or move "Leap Year" comments where appropriate.)
+ *   - If can be evenly divided by 4, then this is a leap year. (@fixme relocate or move "Leap Year" comments where appropriate
+ *
+ * kt_remove_poll_*_d:
+ *   - timeout: The time in milliseconds to block, waiting for a poll response.
  *
  * kt_remove_depth_*_d:
  *   - max: The maximum recursion depth to perform when recursing into a directory.
@@ -43,6 +46,8 @@ extern "C" {
 #ifndef _di_kt_remove_d_
   #define kt_remove_depth_max_d F_directory_max_recurse_depth_d
 
+  #define kt_remove_poll_timeout_d          200
+
   #define kt_remove_signal_check_d          20000
   #define kt_remove_signal_check_failsafe_d 20000
 
index 8e214d8fd8a1548cbacec9c39efab0887d949ca2..6d7d715d4a6909e46b7eb4c21a7ac26621d87da4 100644 (file)
@@ -11,6 +11,7 @@ extern "C" {
     "f_directory_remove",
     "f_file_mode_from_string",
     "f_file_mode_to_mode",
+    "f_file_poll",
     "f_file_read_block",
     "f_file_remove",
     "f_memory_array_increase",
index 968edb68e28be71cf9673d4de095613cce791375..c72df87dd474722af68456ecfc4b1ff5cf8122f0 100644 (file)
@@ -44,6 +44,7 @@ extern "C" {
     kt_remove_f_f_directory_remove_e,
     kt_remove_f_f_file_mode_from_string_e,
     kt_remove_f_f_file_mode_to_mode_e,
+    kt_remove_f_f_file_poll_e,
     kt_remove_f_f_file_read_block_e,
     kt_remove_f_f_file_remove_e,
     kt_remove_f_f_memory_array_increase_e,
index 3a459bbe0a9128f5e62d08f30ac31ffadb1315a6..39e5fcdba2d1157616fa468836031c32688d7d0d 100644 (file)
@@ -9,6 +9,8 @@ extern "C" {
 
     if (!cache) return;
 
+    f_memory_array_resize(0, sizeof(f_polls_t), (void **) &cache->polls.array, &cache->polls.used, &cache->polls.size);
+
     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->input.string, &cache->input.used, &cache->input.size);
 
index d27a72421d7f6a8a14f518b0365b7b72997f102d..9c38df5d3ce515aef3348afcfc348cb43faa0152 100644 (file)
@@ -140,6 +140,7 @@ extern "C" {
 /**
  * The program cache.
  *
+ * polls:  An array of poll structures.
  * buffer: The generic buffer.
  * input:  The buffer used specifically for handling input.
  * files:  A collection of files, often used during path recursion like those associated with the tree parameter.
@@ -148,6 +149,8 @@ extern "C" {
  */
 #ifndef _di_kt_remove_cache_t_
   typedef struct {
+    f_polls_t polls;
+
     f_string_dynamic_t buffer;
     f_string_dynamic_t input;
     f_string_dynamics_t files;
@@ -157,6 +160,7 @@ extern "C" {
 
   #define kt_remove_cache_t_initialize \
     { \
+      f_polls_t_initialize, \
       f_string_dynamic_t_initialize, \
       f_string_dynamic_t_initialize, \
       f_string_dynamics_t_initialize, \
index 4d1af67bc9f3df0ee3a140fe3025c0be85d9a6fd..c5d677e98bc4853bc3835b80a377ba1ae1005f47 100644 (file)
@@ -164,7 +164,35 @@ extern "C" {
 
     kt_remove_print_message_remove_confirm(&main->program.message, path);
 
-    // @todo This does not work well with interrupts, so another f_file_read_block_interrupt() needs to be created in the FLL project (or add interrupt callback to each f_file_read function).
+    if (!main->cache.polls.size) {
+      main->setting.state.status = f_memory_array_increase(1, sizeof(f_poll_t), (void **) &main->cache.polls.array, &main->cache.polls.used, &main->cache.polls.size);
+
+      if (F_status_is_error(main->setting.state.status)) {
+        kt_remove_print_error(&main->program.error, macro_kt_remove_f(f_memory_array_increase));
+
+        return;
+      }
+
+      // This is only every used here so assign this once and never again.
+      main->cache.polls.array[0].fd = main->program.input.id;
+      main->cache.polls.array[0].events = f_poll_read_e;
+      main->cache.polls.array[0].revents = 0;
+      main->cache.polls.used = 1;
+    }
+
+    // Use polling to read input while allowing interrupt signals to be received (the read() function blocks signals).
+    do {
+      main->setting.state.status = f_file_poll(main->cache.polls, kt_remove_poll_timeout_d);
+
+      if (F_status_is_error(main->setting.state.status)) {
+        kt_remove_print_error(&main->program.error, macro_kt_remove_f(f_file_poll));
+
+        return;
+      }
+
+      if (kt_remove_signal_check(main)) return;
+    } while (F_status_set_fine(main->setting.state.status) == F_time_out);
+
     main->setting.state.status = f_file_read_block(main->program.input, &main->cache.input);
 
     if (F_status_is_error(main->setting.state.status)) {