ascii-chat 0.11.33
Video chat in your terminal
Loading...
Searching...
No Matches
filesystem.h
Go to the documentation of this file.
1#pragma once
2
44#include <stddef.h>
45#include <stdbool.h>
46#include <sys/types.h>
47#include "../asciichat_errno.h"
48
49/* ============================================================================
50 * Cross-platform I/O headers
51 * ============================================================================
52 * Consolidates file descriptor and I/O operations across platforms.
53 */
54#ifdef _WIN32
55#include <io.h> /* Windows I/O functions */
56#include <fcntl.h> /* File control options */
57#else
58#include <unistd.h> /* POSIX standard I/O and file descriptor functions */
59#include <fcntl.h> /* POSIX file control options */
60#endif
61
62#ifdef __cplusplus
63extern "C" {
64#endif
65
66// ============================================================================
67// File Mode Constants (for consistency with fcntl.h)
68// ============================================================================
69
70#ifdef _WIN32
71#include <fcntl.h>
72#define PLATFORM_O_RDONLY _O_RDONLY
73#define PLATFORM_O_WRONLY _O_WRONLY
74#define PLATFORM_O_RDWR _O_RDWR
75#define PLATFORM_O_CREAT _O_CREAT
76#define PLATFORM_O_EXCL _O_EXCL
77#define PLATFORM_O_TRUNC _O_TRUNC
78#define PLATFORM_O_APPEND _O_APPEND
79#define PLATFORM_O_BINARY _O_BINARY
80#else
81#include <fcntl.h>
82#define PLATFORM_O_RDONLY O_RDONLY
83#define PLATFORM_O_WRONLY O_WRONLY
84#define PLATFORM_O_RDWR O_RDWR
85#define PLATFORM_O_CREAT O_CREAT
86#define PLATFORM_O_EXCL O_EXCL
87#define PLATFORM_O_TRUNC O_TRUNC
88#define PLATFORM_O_APPEND O_APPEND
89#define PLATFORM_O_BINARY 0 // Not needed on POSIX
90#endif
91
92// ============================================================================
93// Path Separator and Length Constants
94// ============================================================================
95
108#ifdef _WIN32
109#define PATH_DELIM '\\'
110#define PATH_SEPARATOR_STR "\\"
111#else
112#define PATH_DELIM '/'
113#define PATH_SEPARATOR_STR "/"
114#endif
115
124#ifdef _WIN32
125#define PATH_ENV_SEPARATOR ";"
126#else
127#define PATH_ENV_SEPARATOR ":"
128#endif
129
143#ifdef _WIN32
144#define PLATFORM_MAX_PATH_LENGTH 32767
145#elif defined(__linux__)
146#ifndef PATH_MAX
147#define PLATFORM_MAX_PATH_LENGTH 4096
148#else
149#define PLATFORM_MAX_PATH_LENGTH PATH_MAX
150#endif
151#elif defined(__APPLE__)
152#ifndef PATH_MAX
153#define PLATFORM_MAX_PATH_LENGTH 1024
154#else
155#define PLATFORM_MAX_PATH_LENGTH PATH_MAX
156#endif
157#else
158#define PLATFORM_MAX_PATH_LENGTH 4096
159#endif
160
171#define PLATFORM_MAX_ENV_VALUE_LENGTH 32768
172
173// ============================================================================
174// File Permission Constants
175// ============================================================================
176
187#define FILE_PERM_PRIVATE 0600
188
199#define DIR_PERM_PRIVATE 0700
200
209#define FILE_PERM_PUBLIC_READ 0644
210
219#define FILE_PERM_MASK 0777
220
221// ============================================================================
222// File Statistics
223// ============================================================================
224
232typedef struct {
233 size_t size;
234 int mode;
239
269
285int platform_is_regular_file(const char *path);
286
302int platform_is_directory(const char *path);
303
304// ============================================================================
305// Directory Management
306// ============================================================================
307
335asciichat_error_t platform_mkdir(const char *path, int mode);
336
364asciichat_error_t platform_mkdir_recursive(const char *path, int mode);
365
384asciichat_error_t platform_mkdtemp(char *path_out, size_t path_size, const char *prefix);
385
404
409typedef struct {
410 const char *name;
411 bool is_dir;
413
420typedef bool (*platform_dir_foreach_cb)(const platform_dir_entry_t *entry, void *user_data);
421
430asciichat_error_t platform_dir_foreach(const char *path, platform_dir_foreach_cb callback, void *user_data);
431
432// ============================================================================
433// Temporary Files
434// ============================================================================
435
452int platform_create_temp_file(char *path_out, size_t path_size, const char *prefix, int *fd);
453
462int platform_delete_temp_file(const char *path);
463
484asciichat_error_t platform_temp_file_open(const char *name, const char *path, int *fd_out);
485
486// ============================================================================
487// File Truncation
488// ============================================================================
489
508asciichat_error_t platform_truncate_file(const char *path, size_t size);
509
510// ============================================================================
511// Path Utilities
512// ============================================================================
513
526bool platform_path_is_absolute(const char *path);
527
536
549asciichat_error_t platform_path_normalize(const char *input, char *output, size_t output_size);
550
551// ============================================================================
552// Key File Security
553// ============================================================================
554
571
572// ============================================================================
573// Config File Search
574// ============================================================================
575
588
600
657asciichat_error_t platform_find_config_file(const char *filename, config_file_list_t *list_out);
658
674
675// ============================================================================
676// Home and Config Directory Discovery
677// ============================================================================
678
693const char *platform_get_home_dir(void);
694
721char *platform_get_config_dir(void);
722
748char *platform_get_data_dir(void);
749
750// ============================================================================
751// File I/O Operations
752// ============================================================================
753
762int platform_open(const char *name, const char *pathname, int flags, ...);
763
771FILE *platform_fopen(const char *name, const char *filename, const char *mode);
772
777FILE *platform_tmpfile(void);
778
786FILE *platform_fdopen(const char *name, int fd, const char *mode);
787
795ssize_t platform_read(int fd, void *buf, size_t count);
796
804ssize_t platform_write(int fd, const void *buf, size_t count);
805
811int platform_close(int fd);
812
818int platform_unlink(const char *pathname);
819
826int platform_chmod(const char *pathname, int mode);
827
828// ============================================================================
829// Platform Path Utilities
830// ============================================================================
831
849const char *platform_path_skip_absolute_prefix(const char *path);
850
868
885int platform_path_strcasecmp(const char *a, const char *b, size_t n);
886
901const char *file_read_error_message(const char *path);
902
919const char *file_write_error_message(const char *path);
920
931bool file_is_readable(const char *path);
932
944bool file_is_writable(const char *path);
945
946/* ============================================================================
947 * Path Utilities
948 * ============================================================================ */
949
978bool platform_get_executable_path(char *exe_path, size_t path_size);
979
1011bool platform_get_temp_dir(char *temp_dir, size_t path_size);
1012
1023bool platform_get_cwd(char *cwd, size_t path_size);
1024
1030#define PLATFORM_ACCESS_EXISTS 0
1031#define PLATFORM_ACCESS_WRITE 2
1032#define PLATFORM_ACCESS_READ 4
1033
1061int platform_access(const char *path, int mode);
1062
1090bool platform_is_binary_in_path(const char *bin_name);
1091
1104
1114int platform_fsync(int fd);
1115
1116/* ============================================================================
1117 * Platform-Specific Internal Functions (not part of public API)
1118 * ============================================================================ */
1119
1129bool check_binary_in_path_uncached(const char *bin_name);
1130
1131#ifdef __cplusplus
1132}
1133#endif
1134
unsigned char uint8_t
Definition common.h:56
asciichat_error_t
Error and exit codes - unified status values (0-255)
Definition error_codes.h:49
asciichat_error_t platform_stat(const char *path, platform_stat_t *stat_out)
Get file statistics.
const char * file_write_error_message(const char *path)
Get human-readable error message for file write failure.
Definition filesystem.c:43
int platform_create_temp_file(char *path_out, size_t path_size, const char *prefix, int *fd)
Create a temporary file with a given prefix.
asciichat_error_t platform_mkdir(const char *path, int mode)
Create a directory.
bool platform_get_executable_path(char *exe_path, size_t path_size)
Get the path to the current executable.
Definition filesystem.c:191
int platform_fsync(int fd)
Synchronize a file descriptor to disk.
asciichat_error_t platform_dir_foreach(const char *path, platform_dir_foreach_cb callback, void *user_data)
Iterate over entries in a directory.
asciichat_error_t platform_find_config_file(const char *filename, config_file_list_t *list_out)
Find config file across multiple standard locations.
FILE * platform_fdopen(const char *name, int fd, const char *mode)
Convert file descriptor to stream (fdopen replacement)
FILE * platform_tmpfile(void)
Create a temporary file (tmpfile replacement)
bool platform_get_cwd(char *cwd, size_t path_size)
Get the current working directory of the process.
Definition util.c:110
int platform_path_strcasecmp(const char *a, const char *b, size_t n)
Platform-aware path string comparison.
Definition util.c:119
char * platform_get_data_dir(void)
Get the application data directory.
void platform_normalize_path_separators(char *path)
Normalize path separators for the current platform.
Definition util.c:98
int platform_access(const char *path, int mode)
Check file/directory access permissions.
char platform_path_get_separator(void)
Get the path separator character for current platform.
int platform_is_directory(const char *path)
Check if a path is a directory.
bool file_is_writable(const char *path)
Check if file is writable.
int platform_chmod(const char *pathname, int mode)
Change file permissions/mode.
asciichat_error_t platform_mkdir_recursive(const char *path, int mode)
Create directories recursively (mkdir -p equivalent)
asciichat_error_t platform_temp_file_open(const char *name, const char *path, int *fd_out)
Open a temporary file for writing.
bool platform_is_binary_in_path(const char *bin_name)
Check if a binary is available in the system PATH.
Definition filesystem.c:133
asciichat_error_t platform_rmdir_recursive(const char *path)
Recursively delete a directory and all its contents.
int platform_unlink(const char *pathname)
Delete/unlink file.
asciichat_error_t platform_validate_key_file_permissions(const char *key_path)
Validate that a cryptographic key file has appropriate permissions.
int platform_open(const char *name, const char *pathname, int flags,...)
Safe file open (open replacement)
int platform_close(int fd)
Safe file close (close replacement)
bool platform_get_temp_dir(char *temp_dir, size_t path_size)
Get the system temporary directory path.
Definition util.c:74
bool file_is_readable(const char *path)
Check if file is readable.
const char * platform_path_skip_absolute_prefix(const char *path)
Skip absolute path prefix (drive letter on Windows)
asciichat_error_t platform_truncate_file(const char *path, size_t size)
Truncate a file to a specific size.
int platform_is_regular_file(const char *path)
Check if a path is a regular file.
Definition util.c:124
FILE * platform_fopen(const char *name, const char *filename, const char *mode)
Safe file open stream (fopen replacement)
asciichat_error_t platform_path_normalize(const char *input, char *output, size_t output_size)
Normalize and validate a file path.
bool platform_path_is_absolute(const char *path)
Check if a path is absolute (not relative)
ssize_t platform_read(int fd, void *buf, size_t count)
Safe file read (read replacement)
asciichat_error_t platform_mkdtemp(char *path_out, size_t path_size, const char *prefix)
Create a temporary directory with a given prefix.
const char * platform_get_home_dir(void)
Get the user's home directory.
Definition util.c:94
ssize_t platform_write(int fd, const void *buf, size_t count)
Safe file write (write replacement)
Definition wasm/system.c:72
int platform_delete_temp_file(const char *path)
Delete a temporary file.
void platform_cleanup_binary_path_cache(void)
Cleanup the binary PATH cache.
Definition filesystem.c:113
void config_file_list_destroy(config_file_list_t *list)
Free config file list resources.
bool(* platform_dir_foreach_cb)(const platform_dir_entry_t *entry, void *user_data)
Callback for platform_dir_foreach()
Definition filesystem.h:420
const char * file_read_error_message(const char *path)
Get human-readable error message for file read failure.
Definition filesystem.c:24
bool check_binary_in_path_uncached(const char *bin_name)
Check if a binary is in PATH (uncached, platform-specific implementation)
char * platform_get_config_dir(void)
Get the application configuration directory.
Definition util.c:104
Capture stdout/stderr and redirect to logging system.
ClangTool/LibTooling compatibility shim for stdbool.h.
#define bool
Definition stdbool.h:61
List of config file search results.
Definition filesystem.h:595
size_t count
Number of results found.
Definition filesystem.h:597
config_file_result_t * files
Array of results (allocated, must be freed)
Definition filesystem.h:596
size_t capacity
Allocated capacity.
Definition filesystem.h:598
Result of a config file search.
Definition filesystem.h:582
uint8_t priority
Priority order (0 = highest, 255 = lowest)
Definition filesystem.h:584
bool exists
True if file exists and is a regular file.
Definition filesystem.h:585
char * path
Absolute path to config file (allocated, must be freed)
Definition filesystem.h:583
bool is_system_config
True if from system directory (not user config)
Definition filesystem.h:586
Directory entry information for platform_dir_foreach()
Definition filesystem.h:409
const char * name
Definition filesystem.h:410
bool is_dir
Definition filesystem.h:411
File type information from stat()
Definition filesystem.h:232
int is_regular_file
Non-zero if file is a regular file.
Definition filesystem.h:235
int is_symlink
Non-zero if file is a symbolic link.
Definition filesystem.h:237
int is_directory
Non-zero if file is a directory.
Definition filesystem.h:236
size_t size
File size in bytes.
Definition filesystem.h:233
int mode
File mode (permissions and type)
Definition filesystem.h:234