Merge pull request #7972 from Robyt3/Base-Documentation-Shell-OS-etc

Document all shell, OS, secure random and related functions
This commit is contained in:
Dennis Felsing 2024-02-13 08:48:03 +00:00 committed by GitHub
commit 754cb2eee8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -2068,36 +2068,6 @@ int net_would_block();
int net_socket_read_wait(NETSOCKET sock, int time); int net_socket_read_wait(NETSOCKET sock, int time);
/*
Function: open_link
Opens a link in the browser.
Parameters:
link - The link to open in a browser.
Returns:
Returns 1 on success, 0 on failure.
Remarks:
This may not be called with untrusted input or it'll result in arbitrary code execution, especially on Windows.
*/
int open_link(const char *link);
/*
Function: open_file
Opens a file or directory with default program.
Parameters:
path - The path to open.
Returns:
Returns 1 on success, 0 on failure.
Remarks:
This may not be called with untrusted input or it'll result in arbitrary code execution, especially on Windows.
*/
int open_file(const char *path);
/** /**
* Swaps the endianness of data. Each element is swapped individually by reversing its bytes. * Swaps the endianness of data. Each element is swapped individually by reversing its bytes.
* *
@ -2474,165 +2444,246 @@ unsigned bytes_be_to_uint(const unsigned char *bytes);
*/ */
void uint_to_bytes_be(unsigned char *bytes, unsigned value); void uint_to_bytes_be(unsigned char *bytes, unsigned value);
/* /**
Function: pid * @defgroup Shell
Returns the pid of the current process. * Shell, process management, OS specific functionality.
*/
Returns: /**
pid of the current process * Returns the ID of the current process.
*/ *
* @ingroup Shell
*
* @return PID of the current process.
*/
int pid(); int pid();
/* /**
Function: cmdline_fix * Fixes the command line arguments to be encoded in UTF-8 on all systems.
Fixes the command line arguments to be encoded in UTF-8 on all *
systems. * @ingroup Shell
*
Parameters: * @param argc A pointer to the argc parameter that was passed to the main function.
argc - A pointer to the argc parameter that was passed to the main function. * @param argv A pointer to the argv parameter that was passed to the main function.
argv - A pointer to the argv parameter that was passed to the main function. *
* @remark You need to call @link cmdline_free @endlink once you're no longer using the results.
Remarks: */
- You need to call cmdline_free once you're no longer using the
results.
*/
void cmdline_fix(int *argc, const char ***argv); void cmdline_fix(int *argc, const char ***argv);
/* /**
Function: cmdline_free * Frees memory that was allocated by @link cmdline_fix @endlink.
Frees memory that was allocated by cmdline_fix. *
* @ingroup Shell
Parameters: *
argc - The argc obtained from cmdline_fix. * @param argc The argc obtained from `cmdline_fix`.
argv - The argv obtained from cmdline_fix. * @param argv The argv obtained from `cmdline_fix`.
*/
*/
void cmdline_free(int argc, const char **argv); void cmdline_free(int argc, const char **argv);
#if defined(CONF_FAMILY_WINDOWS) #if defined(CONF_FAMILY_WINDOWS)
/**
* A handle for a process.
*
* @ingroup Shell
*/
typedef void *PROCESS; typedef void *PROCESS;
/**
* A handle that denotes an invalid process.
*
* @ingroup Shell
*/
constexpr PROCESS INVALID_PROCESS = nullptr; constexpr PROCESS INVALID_PROCESS = nullptr;
#else #else
/**
* A handle for a process.
*
* @ingroup Shell
*/
typedef pid_t PROCESS; typedef pid_t PROCESS;
/**
* A handle that denotes an invalid process.
*
* @ingroup Shell
*/
constexpr PROCESS INVALID_PROCESS = 0; constexpr PROCESS INVALID_PROCESS = 0;
#endif #endif
/**
* Determines the initial window state when using @link shell_execute @endlink
* to execute a process.
*
* @ingroup Shell
*
* @remark Currently only supported on Windows.
*/
enum class EShellExecuteWindowState enum class EShellExecuteWindowState
{ {
/**
* The process window is opened in the foreground and activated.
*/
FOREGROUND, FOREGROUND,
/**
* The process window is opened in the background without focus.
*/
BACKGROUND, BACKGROUND,
}; };
/** /**
* Executes a given file. * Executes a given file.
* *
* @ingroup Shell
*
* @param file The file to execute. * @param file The file to execute.
* @param window_state The window state how the process window should be shown. * @param window_state The window state how the process window should be shown.
* *
* @return Handle of the new process, or `INVALID_PROCESS` on error. * @return Handle of the new process, or @link INVALID_PROCESS @endlink on error.
*/ */
PROCESS shell_execute(const char *file, EShellExecuteWindowState window_state); PROCESS shell_execute(const char *file, EShellExecuteWindowState window_state);
/** /**
* Sends kill signal to a process. * Sends kill signal to a process.
* *
* @ingroup Shell
*
* @param process Handle of the process to kill. * @param process Handle of the process to kill.
* *
* @return 1 on success, 0 on error. * @return `1` on success, `0` on error.
*/ */
int kill_process(PROCESS process); int kill_process(PROCESS process);
/** /**
* Checks if a process is alive. * Checks if a process is alive.
* *
* @ingroup Shell
*
* @param process Handle/PID of the process. * @param process Handle/PID of the process.
* *
* @return bool Returns true if the process is currently running, false if the process is not running (dead). * @return `true` if the process is currently running,
* `false` if the process is not running (dead).
*/ */
bool is_process_alive(PROCESS process); bool is_process_alive(PROCESS process);
/* /**
Function: generate_password * Opens a link in the browser.
Generates a null-terminated password of length `2 * *
random_length`. * @ingroup Shell
*
* @param link The link to open in a browser.
*
* @return `1` on success, `0` on failure.
*
* @remark The strings are treated as zero-terminated strings.
* @remark This may not be called with untrusted input or it'll result in arbitrary code execution, especially on Windows.
*/
int open_link(const char *link);
Parameters: /**
buffer - Pointer to the start of the output buffer. * Opens a file or directory with default program.
length - Length of the buffer. *
random - Pointer to a randomly-initialized array of shorts. * @ingroup Shell
random_length - Length of the short array. *
*/ * @param path The path to open.
*
* @return `1` on success, `0` on failure.
*
* @remark The strings are treated as zero-terminated strings.
* @remark This may not be called with untrusted input or it'll result in arbitrary code execution, especially on Windows.
*/
int open_file(const char *path);
/**
* @defgroup Secure-Random
* Secure random number generation.
*/
/**
* Generates a null-terminated password of length `2 * random_length`.
*
* @ingroup Secure-Random
*
* @param buffer Pointer to the start of the output buffer.
* @param length Length of the buffer.
* @param random Pointer to a randomly-initialized array of shorts.
* @param random_length Length of the short array.
*/
void generate_password(char *buffer, unsigned length, const unsigned short *random, unsigned random_length); void generate_password(char *buffer, unsigned length, const unsigned short *random, unsigned random_length);
/* /**
Function: secure_random_init * Initializes the secure random module.
Initializes the secure random module. * You *MUST* check the return value of this function.
You *MUST* check the return value of this function. *
* @ingroup Secure-Random
Returns: *
0 - Initialization succeeded. * @return `0` on success.
1 - Initialization failed. */
*/
int secure_random_init(); int secure_random_init();
/* /**
Function: secure_random_uninit * Uninitializes the secure random module.
Uninitializes the secure random module. *
* @ingroup Secure-Random
Returns: *
0 - Uninitialization succeeded. * @return `0` on success.
1 - Uninitialization failed. */
*/
int secure_random_uninit(); int secure_random_uninit();
/* /**
Function: secure_random_password * Fills the buffer with the specified amount of random password characters.
Fills the buffer with the specified amount of random password *
characters. * @ingroup Secure-Random
*
The desired password length must be greater or equal to 6, even * @param buffer Pointer to the start of the buffer.
and smaller or equal to 128. * @param length Length of the buffer.
* @param pw_length Length of the desired password.
Parameters: *
buffer - Pointer to the start of the buffer. * @remark The desired password length must be greater or equal to 6,
length - Length of the buffer. * even and smaller or equal to 128.
pw_length - Length of the desired password. */
*/
void secure_random_password(char *buffer, unsigned length, unsigned pw_length); void secure_random_password(char *buffer, unsigned length, unsigned pw_length);
/* /**
Function: secure_random_fill * Fills the buffer with the specified amount of random bytes.
Fills the buffer with the specified amount of random bytes. *
* @ingroup Secure-Random
Parameters: *
buffer - Pointer to the start of the buffer. * @param buffer Pointer to the start of the buffer.
length - Length of the buffer. * @param length Length of the buffer.
*/ */
void secure_random_fill(void *bytes, unsigned length); void secure_random_fill(void *bytes, unsigned length);
/* /**
Function: secure_rand * Returns random `int`.
Returns random int (replacement for rand()). *
*/ * @ingroup Secure-Random
*
* @return Random int.
*
* @remark Can be used as a replacement for the `rand` function.
*/
int secure_rand(); int secure_rand();
/* /**
Function: secure_rand_below * Returns a random nonnegative integer below the given number,
Returns a random nonnegative integer below the given number, * with a uniform distribution.
with a uniform distribution. *
* @ingroup Secure-Random
Parameters: *
below - Upper limit (exclusive) of integers to return. * @param below Upper limit (exclusive) of integers to return.
*/ *
* @return Random nonnegative below the given number.
*/
int secure_rand_below(int below); int secure_rand_below(int below);
/** /**
* Returns a human-readable version string of the operating system. * Returns a human-readable version string of the operating system.
* *
* @ingroup Shell
*
* @param version Buffer to use for the output. * @param version Buffer to use for the output.
* @param length Length of the output buffer. * @param length Length of the output buffer.
* *
* @return true on success, false on failure. * @return `true` on success, `false` on failure.
*/ */
bool os_version_str(char *version, size_t length); bool os_version_str(char *version, size_t length);
@ -2643,6 +2694,8 @@ bool os_version_str(char *version, size_t length);
* If the preferred locale could not be determined this function * If the preferred locale could not be determined this function
* falls back to the locale `"en-US"`. * falls back to the locale `"en-US"`.
* *
* @ingroup Shell
*
* @param locale Buffer to use for the output. * @param locale Buffer to use for the output.
* @param length Length of the output buffer. * @param length Length of the output buffer.
* *
@ -2651,7 +2704,25 @@ bool os_version_str(char *version, size_t length);
void os_locale_str(char *locale, size_t length); void os_locale_str(char *locale, size_t length);
#if defined(CONF_EXCEPTION_HANDLING) #if defined(CONF_EXCEPTION_HANDLING)
/**
* @defgroup Exception-Handling
* Exception handling (crash logging).
*/
/**
* Initializes the exception handling module.
*
* @ingroup Exception-Handling
*/
void init_exception_handler(); void init_exception_handler();
/**
* Sets the filename for writing the crash log.
*
* @ingroup Exception-Handling
*
* @param log_file_path Absolute path to which crash log file should be written.
*/
void set_exception_handler_log_file(const char *log_file_path); void set_exception_handler_log_file(const char *log_file_path);
#endif #endif
@ -2668,7 +2739,9 @@ int net_socket_read_wait(NETSOCKET sock, std::chrono::nanoseconds nanoseconds);
/** /**
* Fixes the command line arguments to be encoded in UTF-8 on all systems. * Fixes the command line arguments to be encoded in UTF-8 on all systems.
* This is a RAII wrapper for cmdline_fix and cmdline_free. * This is a RAII wrapper for @link cmdline_fix @endlink and @link cmdline_free @endlink.
*
* @ingroup Shell
*/ */
class CCmdlineFix class CCmdlineFix
{ {
@ -2690,25 +2763,29 @@ public:
#if defined(CONF_FAMILY_WINDOWS) #if defined(CONF_FAMILY_WINDOWS)
/** /**
* Converts a utf8 encoded string to a wide character string * Converts a UTF-8 encoded string to a wide character string
* for use with the Windows API. * for use with the Windows API.
* *
* @param str The utf8 encoded string to convert. * @ingroup Shell
*
* @param str The UTF-8 encoded string to convert.
* *
* @return The argument as a wide character string. * @return The argument as a wide character string.
* *
* @remark The argument string must be zero-terminated. * @remark The argument string must be zero-terminated.
* @remark Fails with assertion error if passed utf8 is invalid. * @remark Fails with assertion error if passed UTF-8 is invalid.
*/ */
std::wstring windows_utf8_to_wide(const char *str); std::wstring windows_utf8_to_wide(const char *str);
/** /**
* Converts a wide character string obtained from the Windows API * Converts a wide character string obtained from the Windows API
* to a utf8 encoded string. * to a UTF-8 encoded string.
*
* @ingroup Shell
* *
* @param wide_str The wide character string to convert. * @param wide_str The wide character string to convert.
* *
* @return The argument as a utf8 encoded string, wrapped in an optional. * @return The argument as a UTF-8 encoded string, wrapped in an optional.
* The optional is empty, if the wide string contains invalid codepoints. * The optional is empty, if the wide string contains invalid codepoints.
* *
* @remark The argument string must be zero-terminated. * @remark The argument string must be zero-terminated.
@ -2717,10 +2794,13 @@ std::optional<std::string> windows_wide_to_utf8(const wchar_t *wide_str);
/** /**
* This is a RAII wrapper to initialize/uninitialize the Windows COM library, * This is a RAII wrapper to initialize/uninitialize the Windows COM library,
* which may be necessary for using the open_file and open_link functions. * which may be necessary for using the @link open_file @endlink and
* @link open_link @endlink functions.
* Must be used on every thread. It's automatically used on threads created * Must be used on every thread. It's automatically used on threads created
* with thread_init. Pass true to the constructor on threads that own a * with @link thread_init @endlink. Pass `true` to the constructor on threads
* window (i.e. pump a message queue). * that own a window (i.e. pump a message queue).
*
* @ingroup Shell
*/ */
class CWindowsComLifecycle class CWindowsComLifecycle
{ {
@ -2736,11 +2816,11 @@ public:
* *
* @param protocol_name The name of the protocol. * @param protocol_name The name of the protocol.
* @param executable The absolute path of the executable that will be associated with the protocol. * @param executable The absolute path of the executable that will be associated with the protocol.
* @param updated Pointer to a variable that will be set to true, iff the shell needs to be updated. * @param updated Pointer to a variable that will be set to `true`, iff the shell needs to be updated.
* *
* @return true on success, false on failure. * @return `true` on success, `false` on failure.
* *
* @remark The caller must later call shell_update, iff the shell needs to be updated. * @remark The caller must later call @link shell_update @endlink, iff the shell needs to be updated.
*/ */
bool shell_register_protocol(const char *protocol_name, const char *executable, bool *updated); bool shell_register_protocol(const char *protocol_name, const char *executable, bool *updated);
@ -2753,11 +2833,11 @@ bool shell_register_protocol(const char *protocol_name, const char *executable,
* @param description A readable description for the file extension. * @param description A readable description for the file extension.
* @param executable_name A unique name that will used to describe the application. * @param executable_name A unique name that will used to describe the application.
* @param executable The absolute path of the executable that will be associated with the file extension. * @param executable The absolute path of the executable that will be associated with the file extension.
* @param updated Pointer to a variable that will be set to true, iff the shell needs to be updated. * @param updated Pointer to a variable that will be set to `true`, iff the shell needs to be updated.
* *
* @return true on success, false on failure. * @return `true` on success, `false` on failure.
* *
* @remark The caller must later call shell_update, iff the shell needs to be updated. * @remark The caller must later call @link shell_update @endlink, iff the shell needs to be updated.
*/ */
bool shell_register_extension(const char *extension, const char *description, const char *executable_name, const char *executable, bool *updated); bool shell_register_extension(const char *extension, const char *description, const char *executable_name, const char *executable, bool *updated);
@ -2768,11 +2848,11 @@ bool shell_register_extension(const char *extension, const char *description, co
* *
* @param name Readable name of the application. * @param name Readable name of the application.
* @param executable The absolute path of the executable being registered. * @param executable The absolute path of the executable being registered.
* @param updated Pointer to a variable that will be set to true, iff the shell needs to be updated. * @param updated Pointer to a variable that will be set to `true`, iff the shell needs to be updated.
* *
* @return true on success, false on failure. * @return `true` on success, `false` on failure.
* *
* @remark The caller must later call shell_update, iff the shell needs to be updated. * @remark The caller must later call @link shell_update @endlink, iff the shell needs to be updated.
*/ */
bool shell_register_application(const char *name, const char *executable, bool *updated); bool shell_register_application(const char *name, const char *executable, bool *updated);
@ -2784,11 +2864,11 @@ bool shell_register_application(const char *name, const char *executable, bool *
* @param shell_class The shell class to delete. * @param shell_class The shell class to delete.
* For protocols this is the name of the protocol. * For protocols this is the name of the protocol.
* For file extensions this is the program ID associated with the file extension. * For file extensions this is the program ID associated with the file extension.
* @param updated Pointer to a variable that will be set to true, iff the shell needs to be updated. * @param updated Pointer to a variable that will be set to `true`, iff the shell needs to be updated.
* *
* @return true on success, false on failure. * @return `true` on success, `false` on failure.
* *
* @remark The caller must later call shell_update, iff the shell needs to be updated. * @remark The caller must later call @link shell_update @endlink, iff the shell needs to be updated.
*/ */
bool shell_unregister_class(const char *shell_class, bool *updated); bool shell_unregister_class(const char *shell_class, bool *updated);
@ -2798,11 +2878,11 @@ bool shell_unregister_class(const char *shell_class, bool *updated);
* @ingroup Shell * @ingroup Shell
* *
* @param executable The absolute path of the executable being unregistered. * @param executable The absolute path of the executable being unregistered.
* @param updated Pointer to a variable that will be set to true, iff the shell needs to be updated. * @param updated Pointer to a variable that will be set to `true`, iff the shell needs to be updated.
* *
* @return true on success, false on failure. * @return `true` on success, `false` on failure.
* *
* @remark The caller must later call shell_update, iff the shell needs to be updated. * @remark The caller must later call @link shell_update @endlink, iff the shell needs to be updated.
*/ */
bool shell_unregister_application(const char *executable, bool *updated); bool shell_unregister_application(const char *executable, bool *updated);