ascii-chat 0.11.33
Video chat in your terminal
Loading...
Searching...
No Matches
system.h
Go to the documentation of this file.
1#pragma once
2
28#include <stdio.h>
29#include <stddef.h>
30#include <stdarg.h>
31#include <time.h>
32#ifdef _WIN32
33#include <basetsd.h>
34#ifndef _SSIZE_T_DEFINED
35typedef SSIZE_T ssize_t;
36#define _SSIZE_T_DEFINED
37#endif
38#endif
39#include "../common.h"
40#include "process.h"
41
42#ifdef __cplusplus
43extern "C" {
44#endif
45
52typedef void (*signal_handler_t)(int);
53
65
66// ============================================================================
67// System Functions
68// ============================================================================
69
80
89void platform_destroy(void);
90
108void platform_force_exit(int exit_code);
109
118void platform_sleep_ms(unsigned int ms);
119
138
162
181
200
218
219#ifdef _WIN32
220// usleep macro - only define if not already declared (GCC's unistd.h declares it as a function)
221// On Windows with GCC/Clang, usleep may be available via unistd.h, so we check for that
222// If it's not available, we provide our macro wrapper
223#ifndef _WIN32_USLEEP_AVAILABLE
224// Check if usleep is declared (GCC's unistd.h provides it)
225#if defined(__GNUC__) && !defined(__clang__)
226// INFO: GCC on Windows: unistd.h declares usleep, so don't redefine it
227// Code should use usleep() directly or platform_sleep_us() directly
228#else
229// MSVC/Clang on Windows: Define usleep macro to use platform_sleep_us
230#define usleep(usec) platform_sleep_us(usec)
231#endif
232// sleep() in seconds mapped to platform_sleep_us() in microseconds
233#ifndef sleep
234#define sleep(sec) platform_sleep_us((sec) * 1000000U)
235#endif
236#endif
237#endif
238
251asciichat_error_t platform_localtime(const time_t *timer, struct tm *result);
252
265asciichat_error_t platform_gtime(const time_t *timer, struct tm *result);
266
277const char *platform_get_username(void);
278
290
299
322
334const char *platform_getenv(const char *name);
335
346int platform_setenv(const char *name, const char *value);
347
354int platform_unsetenv(const char *name);
355
361void platform_raise_fd_limit(unsigned int limit);
362
363// ============================================================================
364// Stream Redirection
365// ============================================================================
366
379
401
415
430
443
456
468
469// ============================================================================
470// Safe String Functions
471// ============================================================================
472
487int safe_snprintf(char *buffer, size_t buffer_size, const char *format, ...);
488
501int safe_fprintf(FILE *stream, const char *format, ...);
502
517int safe_vsnprintf(char *buffer, size_t buffer_size, const char *format, va_list ap);
518
525#define SAFE_IGNORE_PRINTF_RESULT(expr) ((void)(expr))
526
527// ============================================================================
528// Safe Memory Functions
529// ============================================================================
530
545asciichat_error_t platform_memcpy(void *dest, size_t dest_size, const void *src, size_t count);
546
561asciichat_error_t platform_memset(void *dest, size_t dest_size, int ch, size_t count);
562
577asciichat_error_t platform_memmove(void *dest, size_t dest_size, const void *src, size_t count);
578
592asciichat_error_t platform_strcpy(char *dest, size_t dest_size, const char *src);
593
606
622const char *platform_strerror(int errnum);
623
637asciichat_error_t platform_resolve_hostname_to_ipv4(const char *hostname, char *ipv4_out, size_t ipv4_out_size);
638
669asciichat_error_t platform_load_system_ca_certs(char **pem_data_out, size_t *pem_size_out);
670
671// ============================================================================
672// Subprocess Execution
673// ============================================================================
674
713int platform_execute_subprocess(const char *executable, const char **argv,
714 char *output_buffer, size_t output_size);
715
716// ============================================================================
717// I/O Functions
718// ============================================================================
719
737size_t platform_write_all(int fd, const void *buf, size_t count);
738
754ssize_t platform_write(int fd, const void *buf, size_t count);
755
777typedef struct {
781 uintptr_t file_offset;
783
798int get_binary_file_address_offsets(const void *addr, platform_binary_match_t *matches, int max_matches);
799
800#ifdef __cplusplus
801}
802#endif
803
int buffer_size
Size of circular buffer.
Definition grep.c:90
unsigned long long uint64_t
Definition common.h:59
void platform_install_crash_handler(void)
Install crash handlers for the application.
asciichat_error_t
Error and exit codes - unified status values (0-255)
Definition error_codes.h:49
platform_stderr_redirect_handle_t platform_stdout_stderr_redirect_to_null(void)
Redirect both stdout and stderr to /dev/null (restorable)
asciichat_error_t platform_request_timer_precision(int precision)
Request coarse (reduced resolution) timer precision.
int safe_fprintf(FILE *stream, const char *format,...)
Platform-safe fprintf wrapper.
Definition system.c:172
signal_handler_t platform_signal(int sig, signal_handler_t handler)
Set a signal handler.
Definition misc.c:115
int platform_setenv(const char *name, const char *value)
Set an environment variable.
Definition wasm/system.c:50
platform_stderr_redirect_handle_t platform_stderr_redirect_to_null(void)
Redirect stderr to /dev/null temporarily.
void platform_stderr_restore(platform_stderr_redirect_handle_t handle)
Restore stderr from a redirect handle.
asciichat_error_t platform_register_signal_handlers(const platform_signal_handler_t *handlers, int count)
Register multiple signal handlers at once.
int safe_snprintf(char *buffer, size_t buffer_size, const char *format,...)
Platform-safe snprintf wrapper.
Definition system.c:148
asciichat_error_t platform_strcpy(char *dest, size_t dest_size, const char *src)
Platform-safe strcpy wrapper.
int platform_get_last_error(void)
Get the last system error code.
Definition util.c:89
size_t platform_write_all(int fd, const void *buf, size_t count)
Write all bytes to a file descriptor, handling partial writes.
Definition system.c:224
asciichat_error_t platform_memset(void *dest, size_t dest_size, int ch, size_t count)
Platform-safe memset wrapper.
void platform_disable_keepawake(void)
Disable system sleep prevention (allow OS to sleep)
int safe_vsnprintf(char *buffer, size_t buffer_size, const char *format, va_list ap)
Platform-safe vsnprintf wrapper.
Definition system.c:199
asciichat_error_t platform_localtime(const time_t *timer, struct tm *result)
Platform-safe localtime wrapper.
Definition util.c:50
asciichat_error_t platform_load_system_ca_certs(char **pem_data_out, size_t *pem_size_out)
Load system CA certificates for TLS/HTTPS.
void platform_destroy(void)
Cleanup platform-specific subsystems.
const char * platform_getenv(const char *name)
Get an environment variable value.
Definition wasm/system.c:39
void(* signal_handler_t)(int)
Signal handler function type.
Definition system.h:52
void platform_force_exit(int exit_code)
Forcefully terminate the process immediately without cleanup.
Definition misc.c:121
const char * platform_strerror(int errnum)
Get human-readable error message for a system error code.
Definition wasm/system.c:46
int platform_execute_subprocess(const char *executable, const char **argv, char *output_buffer, size_t output_size)
Execute a subprocess and optionally capture its output.
uint64_t platform_get_monotonic_time_us(void)
Get monotonic time in microseconds.
void platform_stdio_redirect_to_null_permanent(void)
Permanently redirect stderr and stdout to /dev/null.
void platform_stdout_stderr_restore(platform_stderr_redirect_handle_t handle)
Restore stdout and stderr after platform_stdout_stderr_redirect_to_null()
void platform_raise_fd_limit(unsigned int limit)
Raise the file descriptor limit for the current process.
void platform_sleep_ms(unsigned int ms)
Sleep for a specified number of milliseconds.
asciichat_error_t platform_memcpy(void *dest, size_t dest_size, const void *src, size_t count)
Platform-safe memcpy wrapper.
asciichat_error_t platform_memmove(void *dest, size_t dest_size, const void *src, size_t count)
Platform-safe memmove wrapper.
int get_binary_file_address_offsets(const void *addr, platform_binary_match_t *matches, int max_matches)
Get binary that contains address on Linux via /proc/self/maps.
asciichat_error_t platform_resolve_hostname_to_ipv4(const char *hostname, char *ipv4_out, size_t ipv4_out_size)
Resolve hostname to IPv4 address.
asciichat_error_t platform_gtime(const time_t *timer, struct tm *result)
Platform-safe gmtime wrapper.
asciichat_error_t platform_restore_timer_resolution(void)
Restore default timer precision.
Definition misc.c:99
const char * platform_get_username(void)
Get the current username.
ssize_t platform_write(int fd, const void *buf, size_t count)
Safe file write (write replacement)
Definition wasm/system.c:72
int platform_unsetenv(const char *name)
Remove an environment variable.
Definition wasm/system.c:56
asciichat_error_t platform_init(void)
Initialize platform-specific subsystems.
asciichat_error_t platform_enable_keepawake(void)
Enable system sleep prevention (keepawake mode)
Cross-platform process types and execution utilities.
Find which binary(ies) contain a given address.
Definition system.h:777
uintptr_t file_offset
Definition system.h:781
Signal handler descriptor for bulk registration.
Definition system.h:295
signal_handler_t handler
Definition system.h:297
Handle for temporary stderr redirection.
Definition system.h:375
#define PLATFORM_MAX_PATH_LENGTH
Definition system.c:69
⏱️ High-precision timing utilities using sokol_time.h and uthash