]> Kevux Git Server - fll/log
fll
3 years agoUpdate: Remove the "amount" from file stream functions.
Kevin Day [Sun, 2 May 2021 05:12:42 +0000 (00:12 -0500)]
Update: Remove the "amount" from file stream functions.

The "amount" is present to support the parameters that fread() and fwrite() utilize.
This makes no sense to me and it is annoying and confusing.
I end up having to just put 1.

Get rid of it and just use the file.size_read and file.size_write to specify the buffer size to read/write.

The only things that I can thing of might be atomic operations, locking, and calling the function multiple times.
These are good reasons to have an "amount".

If I end up wanting o needing an "amount", I may add additional functions later on.

3 years agoCleanup: Standard code practices refresh.
Kevin Day [Sun, 2 May 2021 04:43:24 +0000 (23:43 -0500)]
Cleanup: Standard code practices refresh.

This is a "quick" run through to refresh the syntax and style with the latest practices.
This fixes any observed styling change.

I noticed some probably errors and added appropriate @fixme comments.

3 years agoUpdate: FSS Basic Read program to use memory allocate/dellocate functions and fix...
Kevin Day [Sat, 1 May 2021 23:37:40 +0000 (18:37 -0500)]
Update: FSS Basic Read program to use memory allocate/dellocate functions and fix error messages.

Remove the allocation and deallocate macros.
Add allocation and deallocation functions in their place.

This makes the common.h and common.c structure more consistent.

Some of the error messages are not respecting verbosity.
They were probably written before the current verbosity implementation was fully realized.

3 years agoCleanup: Always have private-common.h and private-common.c for programs.
Kevin Day [Sat, 1 May 2021 22:31:49 +0000 (17:31 -0500)]
Cleanup: Always have private-common.h and private-common.c for programs.

I am now introducing a new standard practice of always having a private-common.h and private-common.c for programs.
The private data types shared across the program will be stored in these.
These will also provide any functions for allocating, deallocating, or otherwise managing those private structures.

This makes no effort to move over or implement any of the allocation/deallocation functions.

Individual programs will be updated on an as able basis to address this.

The Controller program already has this but it has a bit more than this practice.
The Controller program will see some structural cleanup in the future.

3 years agoRefactor: Relocate 'macro' prefix in names for macros.
Kevin Day [Sat, 1 May 2021 22:00:27 +0000 (17:00 -0500)]
Refactor: Relocate 'macro' prefix in names for macros.

Placing 'macro' after the project name, such as 'fll_' or 'fake_', is a good idea for keeping the function names consistent and contained within the project naming structure.
For short names like 'f_' and 'f_string_t' this is not a problem.
For complex and usually longer names, such as 'fake_' and 'fake_main_t', this becomes confusing quickly,

I have decided to favor the less consistent macro as a prefix to the project name, to make the code a bit more readable.
For example: 'fake_main_macro_delete' would become 'macro_fake_main_delete".

3 years agoRefactor: Use 'main' instead of 'data'.
Kevin Day [Sat, 1 May 2021 21:46:35 +0000 (16:46 -0500)]
Refactor: Use 'main' instead of 'data'.

The original goal of 'data' is to be used as the main store of data for the program.
A program using the programs as a library are also expected to get and use this structure.

The problem is that the programs are designed such that the caller to the program (as a library) should not have access to internal details.
Refactor 'data' to 'main'.
This is a more precise name in that it is the structure passed as if it were called from 'main(argc, argv)'.
This also frees up 'data' for internal use such that 'data' can now be the more generalized 'data' without exposing anything to 'main'.

The Controller program is already using 'main', so that 'main' was refactored to 'global'.

There are still more changes to do, such as restructuring the 'main' types to ensure nothing unwanted is exposed to a caller.
These additional changes, however, are beyond this scope of this commit.

3 years agoBugfix: Several of the parameters are not handling the desired set of possible combin...
Kevin Day [Sat, 1 May 2021 19:46:21 +0000 (14:46 -0500)]
Bugfix: Several of the parameters are not handling the desired set of possible combinations.

With recent changes, more parameters may be used together than before.
This exposed how several combinations simply did nothing or did not do what was expected.

Redesign and even simplify the code to allow these parameters to work together.

Some of the code is abstracted out into their own functions.

There is a goal to have a data structure for passing setting, but before that is done I want to make other significant changes FLL-wide.
For this reason, I am putting in place a temporary 'print_this' bitwise variable.

3 years agoUpdate: Redesign Basic List loading logic to load all files into a single buffer.
Kevin Day [Sat, 1 May 2021 16:23:56 +0000 (11:23 -0500)]
Update: Redesign Basic List loading logic to load all files into a single buffer.

Upon further use and review I believe that it is better to treat all input sources as a single buffer.
This allows for all of the parameters to work closer to what feels like normal logic.
If I want to get the total lines for all listed files, then I should get that.
If I want to get the total lines for each listed file, then I can call this program once for each file to get that.

I am working on Basic List first but this will be repeated for all of the other FSS read projects as well (likely in a single commit).

One of the downsides of this is that it exposes a current design limitation where the max buffer size is more likely to be reached.
Future work will most likely address this in some manner.

3 years agoRegression: Incorrect char type resulted in SIGPIPE.
Kevin Day [Sat, 1 May 2021 03:46:02 +0000 (22:46 -0500)]
Regression: Incorrect char type resulted in SIGPIPE.

The uint8_t/int8_t was changed into char recently.
This change appears to have be incomplete for the Byte Dump program.

Update the code to be aware of PIPE by passing a NULL string to represent a PIPE instead of a file.

While fixing this, go ahead and replace read() with fgetc().
This is more efficient due to the use of a file stream.
The use of read() is originally done for testing some of the lower-level FLL design.
This testing is no longer necessary so it is worth switching to fgetc().

Future design may merit reading larger chunks than 1 character at a time.

The use of fseek() is now available and in use (for non-PIPEs).

Minor code tweaks, such as changing i++ to ++i.

3 years agoFeature: Provide fll_program_parameter_process_empty().
Kevin Day [Sat, 1 May 2021 01:03:09 +0000 (20:03 -0500)]
Feature: Provide fll_program_parameter_process_empty().

This should further simplify the standard color processing code for when color codes are replaced with empty strings.

3 years agoUpdate: Lift the restrictions on specifying -o with -l, -s, and -t for the FSS read...
Kevin Day [Fri, 30 Apr 2021 03:59:41 +0000 (22:59 -0500)]
Update: Lift the restrictions on specifying -o with -l, -s, and -t for the FSS read programs.

At some point the FSS read functions were not designed to allow -o and -c at the same time.

This is no longer necessary.
Remove the checks and the code appears to work as expected.

3 years agoUpdate: Next micro version (0.5.4).
Kevin Day [Thu, 29 Apr 2021 04:33:36 +0000 (23:33 -0500)]
Update: Next micro version (0.5.4).

3 years agoBugfix: Previous uint8_t to char resulted in accidental changes. 0.5.3
Kevin Day [Thu, 29 Apr 2021 00:13:43 +0000 (19:13 -0500)]
Bugfix: Previous uint8_t to char resulted in accidental changes.

This should remain int8_t.

3 years agoUpdate: Replace static strings with extern defined in common file.
Kevin Day [Wed, 28 Apr 2021 23:57:36 +0000 (18:57 -0500)]
Update: Replace static strings with extern defined in common file.

This makes the controller program more consistent with the FLL projects.
This should make it easier to use the controller program as a library as well.

3 years agoUpdate: Fix problems and make changes after testing LLVM's Clang compiler.
Kevin Day [Wed, 28 Apr 2021 23:08:29 +0000 (18:08 -0500)]
Update: Fix problems and make changes after testing LLVM's Clang compiler.

Add flags "-Wno-logical-not-parentheses" "-Wno-logical-op-parentheses".
Programmers should be expected to understand the language they are working.
Having the compiler for a style is bad practice.

The cap_to_text() needs ssize_t, do not use f_array_length_t.

The project is inconsistently using int8_t and uint8_t for character types.
Furthermore, clang likes to complain about uint8_t being converted to char.
(I believe uint8_t is supposed to be of type unsigned char and char by default is supposed to be unsigned.)
Fix the inconsistency and just use char, which happens to make clang happy without any complaints from gcc.

Clang does a much better job at detecting some problems than GCC.
Compiling with clang resulted in revealing several printf related problems that now should be fixed.

The f_gcc_attribute_visibility_internal (and related) have the "_gcc" removed because these seem to exist beyond just gcc (such as with clang).

Make sure something is always returned.
There are some functions that didn't have a return.

One of the UTF processing functions has an accidental hex character in the condition.
Remove the extra character, which I am pretty sure is the leading "d".
I have not validated the correct sequence and so further investigation in the proper sequence for U+1D7CE to U+1D7D7 may be warranted.

The clang compiler claims that int main() should only be an integer for the argc.
This is unfortunate but that is fine, switch to use an int instead of an unsigned long.

3 years agoUpdate: Support legacy-only capability by default.
Kevin Day [Wed, 28 Apr 2021 12:49:50 +0000 (07:49 -0500)]
Update: Support legacy-only capability by default.

3 years agoBugfix: Fake should ceate parent directories for the "path_headers".
Kevin Day [Wed, 28 Apr 2021 05:14:40 +0000 (00:14 -0500)]
Bugfix: Fake should ceate parent directories for the "path_headers".

This really should be done for all cases like this, but for now just fix "path_headers" and add a todo comment.

3 years agoCleanup: Relocate headers into appropriate sub-directories.
Kevin Day [Wed, 28 Apr 2021 04:48:28 +0000 (23:48 -0500)]
Cleanup: Relocate headers into appropriate sub-directories.

Have the FLL project contain its headers within a sub-directory of 'fll'.
This promotes better organization.

The level_3 programs are just that, programs, and as such will not be under 'fll' but instead will be under their own sub-directory.

The programs are moved out of level_3 and into the program include directory, with their sub-directory using the program name.

3 years agoBugfix: Setting path_headers_preserve should still honor path_headers setting.
Kevin Day [Wed, 28 Apr 2021 04:46:01 +0000 (23:46 -0500)]
Bugfix: Setting path_headers_preserve should still honor path_headers setting.

When both path_headers_preserve and path_headers are provided, the path_headers should still be used.

3 years agoCleanup: Use simpler logic for used > 0 check.
Kevin Day [Wed, 28 Apr 2021 04:20:08 +0000 (23:20 -0500)]
Cleanup: Use simpler logic for used > 0 check.

The logic fo checking if used > 0 can be made simpler by simply checking used.
(Given that used is always unsigned.)

3 years agoUpdate: Include example settings when building Controller.
Kevin Day [Wed, 28 Apr 2021 02:20:40 +0000 (21:20 -0500)]
Update: Include example settings when building Controller.

3 years agoUpdate: Support legacy-only capability by default.
Kevin Day [Wed, 28 Apr 2021 02:12:12 +0000 (21:12 -0500)]
Update: Support legacy-only capability by default.

3 years agoBugfix: cap_mode_t is not available in legacy capability.
Kevin Day [Wed, 28 Apr 2021 01:52:45 +0000 (20:52 -0500)]
Bugfix: cap_mode_t is not available in legacy capability.

3 years agoCleanup: rename program data delete functions.
Kevin Day [Wed, 28 Apr 2021 00:03:47 +0000 (19:03 -0500)]
Cleanup: rename program data delete functions.

Previously the style was to have "action" and then "data".
The new approach is to completely represent the name and then display the "action".

Thus byte_dump_delete_data() becomes byte_dump_data_delete() because the data structure is called "byte_dump_data_t".

3 years agoUpdate: Remove init program.
Kevin Day [Tue, 27 Apr 2021 23:55:14 +0000 (18:55 -0500)]
Update: Remove init program.

The controller program can fully operate as a init program.

The pre_init/pivot_root will likely have its own dedicated program and/or scripts.

3 years agoBugfix: PID and PID file should account for multiples during process execution.
Kevin Day [Tue, 27 Apr 2021 23:49:35 +0000 (18:49 -0500)]
Bugfix: PID and PID file should account for multiples during process execution.

I forgot all about needing to do this so I am considering this a bug.

Each process may execute multiple Actions.
Each Action has its own PID.

In the case of foreground (synchronous) execution, having only a single PID and PID file path on the Process structure is not a problem.
When with PID file (asynchronous) execution operates, multiple PIDs (and respective PID files) may exist for any single Process structure.

Use an array of PIDs and PID file paths.

3 years agoCleanup: Replace 'test' with 'simulate'.
Kevin Day [Tue, 27 Apr 2021 04:20:56 +0000 (23:20 -0500)]
Cleanup: Replace 'test' with 'simulate'.

Prior to this "test" is being used interchangeably with "simulate".
Changing "test" to "simulate" makes the program more consistent with itself.

In the help, use the word "parameter" instead of "operation".

3 years agoRegression: Entry error after failure or during validation is not propogating.
Kevin Day [Tue, 27 Apr 2021 04:09:09 +0000 (23:09 -0500)]
Regression: Entry error after failure or during validation is not propogating.

When an Entry fails and successfully executes a failsafe, the failure is not propagated.
The failsafe is meant to bail out and not continue onward, so after a successful or failed failsafe, return F_failure (with error bit as appropriate).

When passing --validate without --test, the program is not exiting as it should.
This is because the state is not being handled just like the status is not being handled.

When joining threads, be sure to reset the identifiers.

Remove now extra Exit processing block.
This is now handled fully by the cancellation function.

Restore the thread enabled state after operating failsafe.

Get rid of simulate variable, instead use the console parameter directly.
This saves memory by a trivial amount.

3 years agoRegression: validation is printing "synchronous" when it should print "asynchronous".
Kevin Day [Tue, 27 Apr 2021 00:03:02 +0000 (19:03 -0500)]
Regression: validation is printing "synchronous" when it should print "asynchronous".

3 years agoUpdate: Implement "execute" support and fix bugs.
Kevin Day [Mon, 26 Apr 2021 23:45:23 +0000 (18:45 -0500)]
Update: Implement "execute" support and fix bugs.

Provide new feature for executing into another program.
This is provided via the new Item Action "execute".

The function controller_perform_ready() is being called and the status is being checked but the status is not being assigned.

There are a few cases where thread.enabled needs to be checked and a few cases it does not need to be checked.

Several of the threads need to be aware of the normal/other status to properly determine the thread.eneabled situation.
Without this, they make incorrect decisions that result in bugs.
I did not want to implement a new structure to resolve this so instead provide custom wrapper functions to call that set the appropriate normal/other state.

The functon controller_thread_process_cancel() now needs to be caller aware so that the caller does not get cancelled.

3 years agoFeature: add support for F_execute and F_execute_not status codes.
Kevin Day [Mon, 26 Apr 2021 00:17:31 +0000 (19:17 -0500)]
Feature: add support for F_execute and F_execute_not status codes.

3 years agoUpdate: Add documentation about the design problems around POSIX cancellation.
Kevin Day [Sun, 25 Apr 2021 21:50:05 +0000 (16:50 -0500)]
Update: Add documentation about the design problems around POSIX cancellation.

3 years agoCleanup: remove extra newline printing on exit after failsafe in verbose mode.
Kevin Day [Sun, 25 Apr 2021 17:58:03 +0000 (12:58 -0500)]
Cleanup: remove extra newline printing on exit after failsafe in verbose mode.

3 years agoUpdate: Improve entry/exit verbose messages, display exit with -tv, and wait all...
Kevin Day [Sun, 25 Apr 2021 17:13:54 +0000 (12:13 -0500)]
Update: Improve entry/exit verbose messages, display exit with -tv, and wait all with read lock fix.

The verbose messages should be distinguishing between an entry and an exit now.

When both --simulate and --test are specified, the printout should include both the entry and the exit.
Previously, only the entry was printed.

The wait all should only be triggered to wait for all processes at the current moment in time.
Furthermore, the read lock is being held too long (for the entire loop).
Maintain the read lock long enough to build a list of all processes to wait for.

3 years agoUpdate: signal wait after each time the state becomes "idle".
Kevin Day [Fri, 23 Apr 2021 12:43:29 +0000 (07:43 -0500)]
Update: signal wait after each time the state becomes "idle".

This should give processes waiting more opportunities to wake up.

3 years agoCleanup: display "exit" instead of "entry" when finished process an exit file.
Kevin Day [Fri, 23 Apr 2021 03:27:09 +0000 (22:27 -0500)]
Cleanup: display "exit" instead of "entry" when finished process an exit file.

3 years agoProgress: redesign processing logic to accommodate different process Rule Actions...
Kevin Day [Fri, 23 Apr 2021 01:49:21 +0000 (20:49 -0500)]
Progress: redesign processing logic to accommodate different process Rule Actions and update dependency design accordingly.

When I implemented the "exit" support (opposite of an "entry") I noticed a oversight in the design whereas there was no way to distinguish between a process that successfully started via the "entry" or the "exit".
Change the design to now utilize unique Rule Processes for each Rule Action requested.

This required further changes to the status handling.
A rule status is now an array of all possible Rule Actions.
This is utilized using a static array for simplicity purposes (there is no need for a dynamic array here).

All of the recent changes introduced a lot more complex code.
There are now helper functions to help facility common tasks.
This should also make updating easier as there is only one place to update.
The downside is the introduction of an additional function call (which is a tiny runtime cost).

To facility this new design, the Rule files must also be aware of the different Rule Actions.
The "need", "want", and "wish" have been relocated into a new Rule Action called "on".
Additional parameters for an "on" allow for describing the Rule Action in which the dependency applies to.
This allows, for example, a "stop" Action to operate in a different order than a "start" Action.
An example of this is provided.
Look at the data/settings/example/rules/serial/*.rule files.

An example syntax is:
  on start need serial s_1
  on stop need serial s_3

When validate is passed, do not wait for asynchronous processes because they are not run.
Normally this is not noticeable but is exposed when 'script/fail' failed to execute and return ('script/fail' should execute, fail, and return).
This bug is caused by the wait functions not checking to see if the caller is the same as the current process (it was waiting for itself).
This may have been introduced as a result of the redesign.

3 years agoProgress: Redesign enty/exit rule handling, now requiring Action instead of "rule".
Kevin Day [Wed, 21 Apr 2021 22:12:00 +0000 (17:12 -0500)]
Progress: Redesign enty/exit rule handling, now requiring Action instead of "rule".

The Entry and Exit files are using "rule" to designate a Rule to operate.
This is designed on the assumption that an Entry always runs a "start" and Exit always runs a "stop".

This behavior is changed such that "rule" is no longer specified and one of the 9 supported Actions may be used.
Such as "start" or "stop", for example.

There is still more work to do as this change doesn't fix the Exit in terms of dependency handling.
Currently, the process structure does not distinguish the Rule action, such as "start" or "stop".
Additional changes to the process structure are needed.

3 years agoProgress: controller program, add exit support.
Kevin Day [Tue, 20 Apr 2021 23:16:45 +0000 (18:16 -0500)]
Progress: controller program, add exit support.

This implements the initial work needed to get exit files working.

A new thread is added to handle both "entry" and "exit" to free up the "rule" thread and allow for the "exit" to start will the "rule" thread exists.

The thread enabled process is now more complex given that there needs to be stages so that "exit" threads can work while "entry" or "control" operations begin terminating.
Add several helper functions to help simplify the detection.

Add an "alert" lock to send/receive alerts.
This is a more general purpose lock that tells something waiting on the alert to wake up and see if anything you care about changed.

The file loading now needs to be aware of "optional" files, namely the exit files.
If the named exit file does not exist, then do not care as it is not required (unlike entry and rule files).

Many of the read and write locks are now timed so that they can check to see if the controller is enabled or not.

While working on this I noticed some oversights and things that I did not previously consider.
I need to follow this up with a redesign in the entry/exit rule handling.

Instead of "rule", I should have the rule actions like "start" and "stop".

There needs to be support for default behaviors, such as allow for "stop" to not have a parameter and to correctly find and terminate a service.

There needs to be consideration on dependencies when exiting, perhaps there needs to be an exit-specific dependency management.

3 years agoProgress: exit prep work, reserve and implement "setting" in entries and exits, add...
Kevin Day [Sun, 18 Apr 2021 15:47:12 +0000 (10:47 -0500)]
Progress: exit prep work, reserve and implement "setting" in entries and exits, add option to "ready', and update documentation.

Add documentation, specifications, and basic structural changes for the "exit" files.

The "entry" and "exit" files now reserve "setting" for designating settings.
Currently, only "entry" supports a setting and that setting is "mode".

The "mode" setting designates how the entry program is intended to behave.
When operating as a "service", the controller program will wait indefinitely for commands (via the not yet implemented "control" program or "control" socket).
When operating as a "program", the controller program will immediately exit after completion.

The "ready" Entry Action now supports "wait".
When "wait" is provided, the "ready" operation will wait for all current asynchronous processes to complete before operating.

Update documentation and specifications, adding the "exit" files.
Cleanup the existing documentation and specifications, fixing wording.

3 years agoUpdate: display when done processing entry when verbosity is set to verbose.
Kevin Day [Sun, 18 Apr 2021 05:22:12 +0000 (00:22 -0500)]
Update: display when done processing entry when verbosity is set to verbose.

3 years agoUpdate: include rule status when wait all function when waiting.
Kevin Day [Sun, 18 Apr 2021 05:21:13 +0000 (00:21 -0500)]
Update: include rule status when wait all function when waiting.

3 years agoBugfix: asynchronous processes not executing properly according to dependencies.
Kevin Day [Sun, 18 Apr 2021 04:44:38 +0000 (23:44 -0500)]
Bugfix: asynchronous processes not executing properly according to dependencies.

The controller_process_wait() function is returning immediately because the status is being changed and is only checking for F_time.

Add status_lock to separate it from status.
Return if status is an error.

Require Rule status to be both not F_known_not and not one of "active" or "busy".

If processes are waiting for a while and a signal is received, decrease the wait timer.

3 years agoUpdate: use the action of the process type, preparing for implementing exit files...
Kevin Day [Sun, 18 Apr 2021 04:22:36 +0000 (23:22 -0500)]
Update: use the action of the process type, preparing for implementing exit files and the control program.

3 years agoUpdate: implement with pid execution, simplify related rules.
Kevin Day [Sat, 17 Apr 2021 23:44:52 +0000 (18:44 -0500)]
Update: implement with pid execution, simplify related rules.

Implement the with pid execution.
This expects the process to be spawned in the background.

After some review, I decided to remove "use" and "create", replacing those with "pid_file".
The reasons are:
- For "use", the spawned service manages the pid file, so it would be overly complicated to try and manage it in addition to the spawned service.
- For "create", if the process is to go into the background, in order to manage it then there would still need to be a running process (this defeats the purpose).

When the termination signal is received, then inform any background process spawned by the controller program to exit, based on the existence of the pid file.

3 years agoUpdate: generalize the pid file creation and deletion.
Kevin Day [Sat, 17 Apr 2021 20:27:05 +0000 (15:27 -0500)]
Update: generalize the pid file creation and deletion.

The PID create and delete functions were written as intended specifically for the main controller program.

PID files are to be used by services and utilities, therefore the PID create and delete functions should also be used there.

Detect if the main PID file is created and then only attempt to delete it on exit (and then do not do so for child processes).

3 years agoBugfix: invalid file descptor error on stream close.
Kevin Day [Sat, 17 Apr 2021 20:23:35 +0000 (15:23 -0500)]
Bugfix: invalid file descptor error on stream close.

This caused both flushing to fail and closing to fail.

Make flushing more flexible and more optional, expanding the close functions to be non-autoflushing and autoflushing.

The fclose() closes the file stream and therefore the descriptor will be invalid.
In this case, the descriptor need only be reset to -1.

If the stream property is not populated and "complete" is designated, then close the file by the file descriptor id.

3 years agoUpdate: fix file stream error return, improve file error messages, add new status...
Kevin Day [Sat, 17 Apr 2021 19:44:21 +0000 (14:44 -0500)]
Update: fix file stream error return, improve file error messages, add new status types and remove status types.

The f_file_stream_close() function is missing some errors.

The file error message printer is missing several error messages.
There is also some cleanup is needed in the file error messages (consistency problems, mostly).

Add F_file_overflow, and F_file_underflow for file specific overflow and underflow.
Add missing F_file_descriptor_not.

Remove F_file_allocation and F_file_deallocation, only the generalized F_memory and F_memory_not are used now.

3 years agoUpdate: handle F_failure error in fll print function.
Kevin Day [Sat, 17 Apr 2021 18:44:49 +0000 (13:44 -0500)]
Update: handle F_failure error in fll print function.

3 years agoCleanup: relocate fl_color code to f_color and remove fl_color.
Kevin Day [Sat, 17 Apr 2021 16:36:17 +0000 (11:36 -0500)]
Cleanup: relocate fl_color code to f_color and remove fl_color.

Ever since f_string became a core/required/special project where all level_0 could depend on it, fl_color no longer needed to be at level_1.
Relocate fl_color into f_color, removing the fl_color project entirely.

Update all dependencies.
This exposed some missing dependencies in fll_program that fl_color is secretly handling.
Fix that as well.

3 years agoFeature: controller program must support "with full_path".
Kevin Day [Sat, 17 Apr 2021 05:41:11 +0000 (00:41 -0500)]
Feature: controller program must support "with full_path".

This is necessary to accomodate fickle programs like SSHD where the full path in argument[0] is required.

This implements a general feature called "with" which is provided to add flags on a per Rule Type basis.
These flags will tweak the Rule Type is some manner.

Only one flag is suppoted at this time: "full_path".
The "full_path" provides the necessary functionality to make SSHD happy.

3 years agoUpdate: redesign fl_execute_parameter_option_path in fll_execute.
Kevin Day [Sat, 17 Apr 2021 05:34:34 +0000 (00:34 -0500)]
Update: redesign fl_execute_parameter_option_path in fll_execute.

The previous design of fl_execute_parameter_option_path seemed pointless because it could be detected if a slash is in the progam name.
Recent changes have utilized the slash in the path to do just that.

While working with the controller program the SSHD program revealed that some programs are fickle about what is in their argument[0].
SSHD wants the full path and as such it needs to be provided.
This makes sense as the normal behavior of most programs when started with a full path general expect a full path in argument[0].

The fl_execute_parameter_option_path is redesigned to instead provide a full path for program and for argument[0].

Examples:
  - "bash my_script.sh" (without fl_execute_parameter_option_path), results in: program="bash", argument[0]="bash", argument[1]="my_script.sh".
  - "/bin/bash my_script.sh" (without fl_execute_parameter_option_path), results in: program="/bin/bash", argument[0]="bash", argument[1]="my_script.sh".
  - "bash my_script.sh" (with fl_execute_parameter_option_path), results in: program="/bin/bash", argument[0]="/bin/bash", argument[1]="my_script.sh".
  - "/bin/bash my_script.sh" (with fl_execute_parameter_option_path), results in: program="/bin/bash", argument[0]="/bin/bash", argument[1]="my_script.sh".

3 years agoBugfix: fll_execute does not execute full path.
Kevin Day [Sat, 17 Apr 2021 04:00:00 +0000 (23:00 -0500)]
Bugfix: fll_execute does not execute full path.

When passed a full path to a program (rather than depending on detecting in from just a program name) the program does not execute.

There are several logic flaws and mistakes.
- The last_slash should have "+1" to avoid including the slash itself.
- When environment is cleared, it need to potentially use "program" or "arguments.array[0].string" if a slash already exists in the provided name.
- The final NULL at the end of the program_path string is missing.
- The "program" or "arguments.array[0].string" should be used in general instead of always the "program" only.
- The fixated_is is being used incorrectly in private_fll_execute_path_arguments_fixate (and the documentation is incorrect).

I suspect that these functions are messy due to changes in design that were not fully updated (including the appropriate documentation).

3 years agoBugfix: properly configure example.
Kevin Day [Fri, 16 Apr 2021 23:48:04 +0000 (18:48 -0500)]
Bugfix: properly configure example.

The reason why controller is attempting to execute "/var/run/sshd.pid" is not because it is incorrectly attempting to process the "use" as a start.
Instead, it is because it is properly attempting to do so because it is being told to.

Oops! This is just a simple misconfiguration and not a bug in the code.
A bug in the configuration.

3 years agoProgress: controller program, begin working on pid file related executions.
Kevin Day [Fri, 16 Apr 2021 04:20:22 +0000 (23:20 -0500)]
Progress: controller program, begin working on pid file related executions.

It occurred to me that I could quickly create a process with a PID file using a script.
I then realized that "service" only applies to binaries and not scripts.
Add a new type called "utility" that is identical to "service" in purpose except that it processes scripts.

Begin implementing the PID file related code.
It seems there are a few things to address, such as proper test output display.
For example, I am seeing "Simulating execution of '/var/run/sshd.pid' with the arguments: '' from 'SSH Service'.".
That "/var/run/sshd.pid" should instead be "/usr/sbin/sshd".

Creating or checking existence of the PID files is not yet written.
The behavior of after a process forks is not yet written either.

An error needs to be printed and F_failure (with error bit set) should be returned.

The "success = F_failure" should probably have error bit set.

Add new rules and entries for testing this (to be implemented) functionality.

Update the documentation.
Some of the documentation is outdated and as a result, wrong.

3 years agoUpdate: implement read lock handlings support.
Kevin Day [Thu, 15 Apr 2021 02:52:47 +0000 (21:52 -0500)]
Update: implement read lock handlings support.

There are some cases where I am able to figure out a way to make the logic continue on on failure and handle the case of read lock failure.
There are other cases where I am not yet sure how to handle.
Expect more changes in the future to address ability to continue onward on lock failure.

Some functions now return F_lock (with error bit) to designate that the lock failed.
In these cases, it is for functions that require the caller to have a read lock (such as process->lock) locked before starting.
When such functions return the caller now has a way of knowing that the read lock is no longer held.

Remove now pointless "busy" variable.

Update documentation comments with @todo.

3 years agoUpdate: handle write lock failures, begin adding support for handling read lock failures.
Kevin Day [Wed, 14 Apr 2021 22:44:13 +0000 (17:44 -0500)]
Update: handle write lock failures, begin adding support for handling read lock failures.

Get the response on write lock failure.
Present an error message.
Return the error status.

Increase the cancellation timeouts from 0.06 seconds to 0.6 seconds, making it less aggresive.
This results in a 90 second max timeout, which gives more problematic exists a lot more time to cleanly exit.

Begin adding support for getting and handing read lock failures.
Read locks attempts will be in a loop that checks main thread enabled as well.
The timeout is longer than write locks to reduce the CPU overhead as there will be a lot of read locks.
Follow up work will utilize this read lock status handling.

Remove the additional thread enabled check that follows a write lock.
The write lock already checks if the main thread is enabled.

3 years agoUpdate: f_thread_lock_read_timed() should return F_resource_not.
Kevin Day [Wed, 14 Apr 2021 22:41:18 +0000 (17:41 -0500)]
Update: f_thread_lock_read_timed() should return F_resource_not.

The pthread_rwlock_timedrdlock() potentially returns EAGAIN.
This needs to be handled, translated into F_resource_not (with error bit), and then returned.

3 years agoUpdate: handle asynchronous failures for failsafe, update locks, and related fixes.
Kevin Day [Wed, 14 Apr 2021 17:08:27 +0000 (12:08 -0500)]
Update: handle asynchronous failures for failsafe, update locks, and related fixes.

The failsafe needs to be triggered when a required but asynchronous process fails.
I originally planned on implementing this via locks but I would rather avoid adding even more locks.
This approach instead provides a wait loop at the end of the entry waiting only on all required processes.
If any of these fail, then the wait will return the requirement failure.
This is a change to the wait all function and behavior, which is updating to now return statuses.

Get rid of process->status, it is no longer needed now that process->rule.status exists.
Having it remain is wasteful and confusing.

The entry processing is updated to be failsafe aware.
This now potentially operates the failsafe rule item.
The failsafe must not do a wait all like normal operation inside of the entry processing function.

There are some discrepancies between "process options" and "rule options".
Technically, there are no "options" on a rule as this is a concept introduced for/by entries.
The process uses these options but most of them were named "rule options".
I then later created a "process options" to add override so that even if the rule is requested asynchronous, if a dependant thread is requiring it, then it will instead run synchronously in the thread of the depending process.
This resulted in both "process options" and "rule options".
They really are the same, so instead remove the current "process options" and rename all "rule options" into "process options".
There are now no longer any "rule options".
I then renamed the "process options" variables to "force options".

Remove signal_all from delete process.
The signals should now all be timed and will exit when thread disabled is set.

The execution used to be designed with the intent that is where the asynchronous processing would handle.
After multiple iterations in design, this is no longer the case.
Update the code to always pass parameter option fl_execute_parameter_option_return instead of doing it only for asynchronous processes.

Add missing re-locks.
Some of the functions require that a certain (read) lock be held prior to calling the function.
When the function returns, the expected lock should still be held.
It so happens that this is not consistently the case.
Certain error or exit states are returning without re-establishing the expected (read) locks.

The controller_rule_find() returns a boolean and not a status with potential error bits.
Fix a block of code where it is checking for error bit on the return value of this function.

The controller_rule_read() also returns a boolean and is being handled as a status with a bit.
In this case, change it to return a status given that this make more sense in this particular case.

Remove relevant/related stale code and add missing comments.

3 years agoUpdate: f_thread_lock_read() should return F_resource_not.
Kevin Day [Wed, 14 Apr 2021 17:04:52 +0000 (12:04 -0500)]
Update: f_thread_lock_read() should return F_resource_not.

The pthread_rwlock_rdlock() potentially returns EAGAIN.
This needs to be handled, translated into F_resource_not (with error bit), and then returned.

3 years agoProgress: controller program, implementing failsafe.
Kevin Day [Tue, 13 Apr 2021 03:18:47 +0000 (22:18 -0500)]
Progress: controller program, implementing failsafe.

Minor code cleanup:
- Removing no longer valid documentation.
- Cleaning up syntax, such as spacing.
- Updating documentation comments.
- Pass controller_main_t as a pointer in the entry function, updating all uses.
- Remove @fixme for considering status handling because I don't plan on bothering with this now.

A lot of the controller_print_unlock_flush() calls are using the incorrect stream.

Use status_lock as a return in cases where the status that is retuned shouldn't become lost when processing the locks.
Otherwise, the errors may never properly bubble to the parent and therefore may never trigger the failsafe.

The failsafe is not a rule id, but instead an item id.

If and when failsafe support is enabled, trigger it.
The currently implemented code only handles synchronous failures.

Begin work with adding a "failed" flag so that asynchronous, but required, failures can be detected for the purposes of failsafe execution.

3 years agoUpdate: add comments, fix action type error reporting, and fix entry documentation.
Kevin Day [Mon, 12 Apr 2021 22:55:21 +0000 (17:55 -0500)]
Update: add comments, fix action type error reporting, and fix entry documentation.

Be consistent and add comments when dealing with nanoseconds.

Action types "consider" and "rule" should be the ".. or more.." error messages.

The entry documentation should be using the word "need" and not "require".
Improve wording.

3 years agoUpdate: properly process and support -c/--control custom control group file path.
Kevin Day [Mon, 12 Apr 2021 01:57:36 +0000 (20:57 -0500)]
Update: properly process and support -c/--control custom control group file path.

This is a directory path to the sysfs cgroups directory.
It must end in a path separator '/'.

There is existing code that needed to be updated to use the -c/--control.
It was being ignored!

3 years agoCleanup: fix parameter order of fl_conversion_* functions.
Kevin Day [Mon, 12 Apr 2021 00:42:02 +0000 (19:42 -0500)]
Cleanup: fix parameter order of fl_conversion_* functions.

3 years agoCleanup: remove "local" workaround in execute function.
Kevin Day [Mon, 12 Apr 2021 00:14:06 +0000 (19:14 -0500)]
Cleanup: remove "local" workaround in execute function.

At the time I was unable to determine the cause.

Now, I strongly suspect it was due to the way threads were being created on the parent stack and the child threads could not access them once a resize function happened.
The resize can, on occasion (and likely more often than not), relocate the address location of the range (array).
This relocation in memory likely caused the weird memory behavior.

Now that the memory is allocated such that the it is an array of allocated pointers, the memory addresses should not change when the array of pointers is resized.
The address to the pointers might change, but from the perspective of the child threads, they don't exist or otherwise matter anyway.

Removing the work around cleans up some clutter and what is essentially a waste of resources.

3 years agoUpdate: cleanup @todo/@fixme that no longer matter and implement multistep thread...
Kevin Day [Sun, 11 Apr 2021 23:58:16 +0000 (18:58 -0500)]
Update: cleanup @todo/@fixme that no longer matter and implement multistep thread wait timeout.

3 years agoBugfix: validation is not processing dependencies.
Kevin Day [Sun, 11 Apr 2021 23:41:58 +0000 (18:41 -0500)]
Bugfix: validation is not processing dependencies.

There is a return statement that must no longer be there.
Make sure to always pass the validation bit.

3 years agoBugfix: test mode (-t), should be simulating not executing.
Kevin Day [Sun, 11 Apr 2021 23:16:16 +0000 (18:16 -0500)]
Bugfix: test mode (-t), should be simulating not executing.

The rule_options is setup but it seems that I forgot to actually pass it.
Set the controller_process_option_execute on the rule_options and then pass rule_options instead of directly passing controller_process_option_execute.

3 years agoBugfix: child process PID is not being passed properly and child process prints failu...
Kevin Day [Sun, 11 Apr 2021 23:03:29 +0000 (18:03 -0500)]
Bugfix: child process PID is not being passed properly and child process prints failure message on terminate signal.

The child process PID was not being assigned because the wrong variable was being passed.

The child processes should not present error messages on exit when termination signal is received.
Make sure that when the child process exists and the main thread is disabled, exit with F_signal.

3 years agoBugfix: main process doesn't always exit.
Kevin Day [Sun, 11 Apr 2021 23:00:09 +0000 (18:00 -0500)]
Bugfix: main process doesn't always exit.

Remove stale lock and unlock that was used for testing or experimentally.
This was causing it to wait for something that would never release the lock because it was closed resulting in a deadlock and the main process hanging on exit.

3 years agoBugfix: rules not properly handling status.
Kevin Day [Sun, 11 Apr 2021 21:53:54 +0000 (16:53 -0500)]
Bugfix: rules not properly handling status.

The status F_known_not was incorrectly being treated as busy.
Make sure to guarantee lock and then unlock of the process_other lock (read lock) to prevent execution of dependent rule while analyzing state of dependent rule.

Read the rule's status after executing from the rule in the rules array and not on the process.
The rules on the rules array is updated after execution but the process is not guaranteed this.
The status of process is generally reserved for the process to manage the status and not to represent the rule status.

Expanded the example serial execution test entries and rules.
Add a new alternative serial so that one uses normal execution and other uses dependent execution (execution is executed by something depending on it rather than being directly started via the entry).

3 years agoBugfix: nanoseconds should become seconds when a second is at least reached.
Kevin Day [Sun, 11 Apr 2021 21:44:49 +0000 (16:44 -0500)]
Bugfix: nanoseconds should become seconds when a second is at least reached.

When adding to nanoseconds would result in a value greater than or equal to a second, instead increment by 1 second.

3 years agoProgress: controller program.
Kevin Day [Sun, 11 Apr 2021 05:01:36 +0000 (00:01 -0500)]
Progress: controller program.

I completely overlooked that the thread time related functions are relative to the absolute system clock.
The timed locks were all acting crazy because I used relative values!

The process status is not being initialized, resulting in invalid and error prone checks.

Begin fixing problems with the asynchronous processing.
Between incorrect uses of times and some stuctural problems, the asynchronous behavior was not operating in the order of the dependencies.
The current work fixes that, but there is still more work to do.
I expect this code to not work just yet.

There also seems to be a locking issue somewhere in here that prevents the program from fully exiting.
Check the thread conditions as those have had problems in the past.
.

3 years agoUpdate: Finish implementing the thread condition functions.
Kevin Day [Sun, 11 Apr 2021 04:57:05 +0000 (23:57 -0500)]
Update: Finish implementing the thread condition functions.

It looks like the f_thread_condition_wait() f_thread_condition_wait_timed() functions were not fully written.
Add missing handlers.
The f_thread_condition_wait_timed() was even missing the return case of F_time!

Update the comments as the "time" value is relative to the absolute system clock time.

Add F_dead, F_live, and related.

3 years agoBugfix: improve cancellation point processing and handling.
Kevin Day [Sat, 10 Apr 2021 15:35:00 +0000 (10:35 -0500)]
Bugfix: improve cancellation point processing and handling.

This avoids the use of f_thread_cancel_test() which is horribly limited in design.
Because f_thread_cancel_test() never returns when thread is in cancelled state, the caller cannot properly handle the situation.
This limits the code design in order to properly use f_thread_cancel_test().

There are already cancellation points in place due to the extensive use of thread.enabled.
Improve these cancellation points, adding timed checks to write locks to further check if a cancellation was received (via thread.enabled).
The timeout is arbitrarily pick as "0.1 seconds".
Hopefully, this doesn't make things too busy, but really the write locks should (ideally) never have to be waiting that long anyway.

Remove stale code in private-common.c involving a write lock and then an immediate unlock on deallocation.

Add additional thread.enabled checks.

There were some places where cancellation points were being returned but were not properly unlocking all held locks that are within the scope of the function.

All threads should now be set to PTHREAD_CANCEL_DEFERRED.

The forced thread termination via kill signals are now removed.
They shouldn't be needed now that cancellation (should be) guaranteed.
This will have to be tested over time to confirm the truth of.

3 years agoUpdate: handle POSIX compatibility automatically in f_thread_cancel_state_set().
Kevin Day [Sat, 10 Apr 2021 15:32:15 +0000 (10:32 -0500)]
Update: handle POSIX compatibility automatically in f_thread_cancel_state_set().

The POSIX standard does not explicitly define that this parameter can be NULL.
To prevent any possible problems, allow NULL but when NULL is received, use a temporary variable in its place.

3 years agoBugfix: thread exiting issues and related.
Kevin Day [Sat, 10 Apr 2021 04:31:13 +0000 (23:31 -0500)]
Bugfix: thread exiting issues and related.

My attempt to add locks to make helgrind ended up backfired on me.
It seems that when an interrupt is received, the cancel is being sent and it happens at any point in time.
Which includes when locks are opened.
When an interrupt cancels a thread with an open lock, that lock is never closed.
Then, using the same locks to handle cleanup of threads resulted in an occasional deadlock.
Remove all locking in the main thread.
The logic should be safe as the only cases where there might be a conflict, a f_thread_join() is in protected between them.
The cancel function should avoid locks to, where possible.
I am somewhat more nervous about this case, I need to review and confirm if main->thread->processs.size does not change.

I previously updated the force cancel exit thread to use waits and locks.
It later dawned on me that I could just get rid of the force cancel exit thread entirely and implement the same functionality in the cancel thread.

3 years agoUpdate: redesign forced exit to utilize timed waits.
Kevin Day [Sat, 10 Apr 2021 01:42:46 +0000 (20:42 -0500)]
Update: redesign forced exit to utilize timed waits.

3 years agoUpdate: lock handling tweaks.
Kevin Day [Sat, 10 Apr 2021 00:15:07 +0000 (19:15 -0500)]
Update: lock handling tweaks.

Move the rule lock to inside the if condition block because part of the rule is still being read.

Add missing unlock for other process active lock before break.
Relocate the other process active lock in some cases to be after the last access to the rule.

Utilize process r/w locks around starting and joining the main threads.

On exit, check to see if id_exit thread is actually used before attempting to join it.

3 years agoProgress: controller program.
Kevin Day [Fri, 9 Apr 2021 02:10:37 +0000 (21:10 -0500)]
Progress: controller program.

Copy over the rule item action statuses when the rule process completes.

Update cleanup thread:
- deallocate rule data in no longer used space.
- make sure cache thread is being started.

Implement asynchronous example rules for testing.

Disable asynchronous execution when running in validation mode.
This ensures consistency and cleanliness when outputting the validation data.
There is no reason to run asynchronously in this mode because nothing is supposed to be run anyway.
Make sure that execution (simulated or not) is not performed in validation mode.
Make sure the program immediately executes at the end when in validation mode.

3 years agoWorkaround: weird print data when received by a pipe.
Kevin Day [Fri, 9 Apr 2021 00:51:14 +0000 (19:51 -0500)]
Workaround: weird print data when received by a pipe.

Not sure what is going on here, but it seems that the data is not correctly printing via pipes.
Add a flush before unlocking the print locks as workaround.

3 years agoCleanup: rename controller_rule_simulate() to controller_rule_validate().
Kevin Day [Fri, 9 Apr 2021 00:25:30 +0000 (19:25 -0500)]
Cleanup: rename controller_rule_simulate() to controller_rule_validate().

This function is actually for the "validation" part of the simulation.
Changing the name makes it less confusing and more semantically accurate.

3 years agoProgress: controller program.
Kevin Day [Thu, 8 Apr 2021 03:25:05 +0000 (22:25 -0500)]
Progress: controller program.

Update some of the comments.

The "consider" was not being loaded into the "process" array.
Change the behavior to allow for loading the "consider" rules into the "process" array without executing them.

Fix a bug where some entry items were being skipped.
The counter was being added an extra time during the loop, resulting in the skip.

The child processes are not exiting cleanly.
The state F_child was not being fully bubbled up the call stack.

It seems that when forking within a thread, the forked child process, on exit will not result in the thread returning to the caller.
For now there is 1 block (according to valgrind) that is "possibly lost" for every forked child process.
A more in depth investigation is needed.

Add a stub for an asynchronous entry that I will be writing for additional testing of the asynchronous processing.

3 years agoCleanup: printing and stale code.
Kevin Day [Wed, 7 Apr 2021 04:58:47 +0000 (23:58 -0500)]
Cleanup: printing and stale code.

Structural problems related to printing.
Relocate how the final newline being printed on simulate is structured in the code.

Remove stale "simulate" variable that is no longer used.

3 years agoUpdate: add pthread semaphore support and correct comments.
Kevin Day [Wed, 7 Apr 2021 04:52:43 +0000 (23:52 -0500)]
Update: add pthread semaphore support and correct comments.

This includes named semaphores, using the words "semaphore_file".

Fix several problems with the comments.

3 years agoUpdate: controller program should immediately exit when doone after validating.
Kevin Day [Sun, 4 Apr 2021 23:51:47 +0000 (18:51 -0500)]
Update: controller program should immediately exit when doone after validating.

When in validate mode, the controller progam should not sit and wait but instead should immediately exit.

3 years agoUpdate: controller program should continue on error.
Kevin Day [Sun, 4 Apr 2021 23:16:13 +0000 (18:16 -0500)]
Update: controller program should continue on error.

Except for certain error codes, like out of memory, record errors and continue onward.
Future versions should somehow handle out of memory issues if this program is to become an "init" replacement.

Avoid unnecessary assignment of rules error status.
In some cases, the rules error status was being assigned twice.

3 years agoUpdate: add message when done processing entry.
Kevin Day [Sun, 4 Apr 2021 22:49:58 +0000 (17:49 -0500)]
Update: add message when done processing entry.

3 years agoBugfix: wait condition issues, memory addressing issues, and exiting issues.
Kevin Day [Sun, 4 Apr 2021 21:52:57 +0000 (16:52 -0500)]
Bugfix: wait condition issues, memory addressing issues, and exiting issues.

The thread conditions, when waiting, may never stop waiting.
Switch to a timed wait, allowing for the condition to determine if it should stop waiting.
I attempting to signal the waits on exit, but this didn't work (however, this will still signal on exit).

Make sure to join all threads, add a failsafe thread join in the process delete function.

The array of processes is a single array.
When this array gets reallocated (resizing to a larger size) the memory addresses may change.
This is a serious problem in that the threads are using those addresses and they suddenly change.
The threads have no way of switching to the new addresses and memory problems happen.
Redesign the array of processes to an array of pointers to processes.
I considered using a block structure, but decided to keep it simple for now.
The downside of this is that on every resize, there must be another allocation for the process address being pointed to.
In the future, I may consider switching to a block structure where I allocated multiple blocks at a time, while still using pointers.

Rename "id_process" to "id_child" to avoid potential confusion between "processes" and "pids", given that I am using "process" with a very different context in this project.

Update all timeouts to be stored in macros.

The cleanup and exit functions were deadlocking, change the locking usage in these functions.

Add missing increment at the end of the loop when processing entry items.

3 years agoBugfix: asynchronous processing is not working in controller program.
Kevin Day [Sun, 4 Apr 2021 17:08:53 +0000 (12:08 -0500)]
Bugfix: asynchronous processing is not working in controller program.

This is because I accidentally passed a pointer of a pointer instead of the pointer itself.

3 years agoProgress: controller program.
Kevin Day [Sun, 4 Apr 2021 16:10:35 +0000 (11:10 -0500)]
Progress: controller program.

3 years agoUpdate: don't use WUNTRACED | WCONTINUED by default, provide "wait".
Kevin Day [Sun, 4 Apr 2021 15:21:59 +0000 (10:21 -0500)]
Update: don't use WUNTRACED | WCONTINUED by default, provide "wait".

Don't have waitpid return if child stopped or continued.
Instead, provide a "wait" property to pass to waitpid().

3 years agoProgrress: controller program.
Kevin Day [Fri, 2 Apr 2021 04:54:36 +0000 (23:54 -0500)]
Progrress: controller program.

This gets the program back into a semi-working state.
I've tested the threading and the previous threading problems appear to be gone.
That tells me this massive rewrite/redesign seems to have been worth it.

There is still a lot more to do:
1) Something is not being shutdown properly, on exit (using the control-c termination signal with -t passed to it).
2) The simulate parameters are no longer working (oops!).
3) The printing appears done, but I've confirmed some problems due to design*.
4) I have not done extensive tests, so there may be other regressions.

* As for the case of #3, the problem is with printf() (and fprintf()) and threading:
- The child processes will write to stdout and stderr.
- The controller program also writes to stdout and stderr.
- printf() and fprintf() guarantee locking, but this doesn't help between different executions.
- Writing one massive complete fprintf with, say 20 parameters, is ridiculous.

This leads me to believe the best solution is to write my own printf/fprintf replacement...which is a huge task.
If I do this, then I can get rid of all of that print locking and use the locking provided by the custom functions.
The difference being that these locks would be designated by another, special function, so that the locks can be held across function calls.
The other advantage would be being able to add support for many of the specialized FLL structures (particularly color printing).
The downside is I would need to do a lot of research in witing to the terminal (the putc() and similar stdio functions) and bufferring.
I would then have to handle all of this!
Which is a huge amount of work.
So, for the time being #3 will be ignored and left as a design flaw (or more accurately a design limitation).

3 years agoProgress: controller program.
Kevin Day [Wed, 31 Mar 2021 04:54:28 +0000 (23:54 -0500)]
Progress: controller program.

3 years agoProgress: controller program.
Kevin Day [Mon, 29 Mar 2021 01:34:45 +0000 (20:34 -0500)]
Progress: controller program.

3 years agoBugfix: fix thread initializers and add documentation on thread allocation requirements.
Kevin Day [Mon, 29 Mar 2021 01:32:33 +0000 (20:32 -0500)]
Bugfix: fix thread initializers and add documentation on thread allocation requirements.

The PTHREAD_ONCE_INIT cannot be deleted.
The pthread_spinlock_t cannot use PTHREAD_MUTEX_INITIALIZER, so instead use ((pthread_spinlock_t) 0xFFFFFFFF).

Many of the thread structures require dynamic initialization.
Document this behavior.

3 years agoProgress: controller program.
Kevin Day [Wed, 24 Mar 2021 03:57:47 +0000 (22:57 -0500)]
Progress: controller program.

3 years agoProgress: controller program and related.
Kevin Day [Sat, 20 Mar 2021 00:36:28 +0000 (19:36 -0500)]
Progress: controller program and related.

Use "copy" instead of "clone", it seems more accurate given that the code is not guaranteeing the same exact memory structure (only the data is guaranteed).
I believe that I need to document my "completeness principle", documenting the structures and what needs to be done.
I also need to document the exception cases.

Implementing the rule copy function, I realized that I need to have the copy function and not just utilize the "append" functions.
There are many functions where "append" does not make sense.
This means that "copy" must be part of the completeness.

Comment out the cache clearing code.
I will probably get to that part last.

3 years agoCleanup: document _di_pthread_support_.
Kevin Day [Thu, 18 Mar 2021 23:43:37 +0000 (18:43 -0500)]
Cleanup: document _di_pthread_support_.

Provide simple "defines" documentation for "_di_pthread_support_", even though its technically not used in that project.

3 years agoBugfix: recently added capability functions are from newer version.
Kevin Day [Thu, 18 Mar 2021 23:43:12 +0000 (18:43 -0500)]
Bugfix: recently added capability functions are from newer version.

The libcap project hasn't been updated in a long time.
Apparently, somebody relatively recently picked up the project and started maintaining it.
This introduced newer functions.

For some reason, my system has a hybrid of this.
The headers show the newer functions but the libraries lack them.

Add a new define "_libcap_legacy_only_".
Enable this by default given how long libcap has exist unchanged.

I also noticed and inconsistency with the function names for users and groups (which are newer functions).
Rename them to not include the "_id".
Remove a duplicate function that didn't even have a reference in the header (oops!).