INITIAL COMMIT
This commit is contained in:
@@ -0,0 +1,134 @@
|
||||
// vim:fileencoding=utf-8:foldmethod=marker
|
||||
|
||||
#include "file_posix.h"
|
||||
#include "../../../common/platform/platform.h"
|
||||
|
||||
#ifdef WAPP_PLATFORM_POSIX
|
||||
|
||||
#include "../file.h"
|
||||
#include "../../cpath/cpath.h"
|
||||
#include "../../../common/aliases/aliases.h"
|
||||
#include "../../../base/array/array.h"
|
||||
#include "../../../base/strings/str8/str8.h"
|
||||
|
||||
#ifdef WAPP_PLATFORM_APPLE
|
||||
#define _FILE_OFFSET_BITS 64
|
||||
#define lseek64 lseek
|
||||
#endif // !WAPP_PLATFORM_APPLE
|
||||
|
||||
#define __USE_LARGEFILE64
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
wapp_intern i32 file_flags[FILE_ACCESS_MODE_COUNT] = {
|
||||
[WAPP_ACCESS_READ] = O_RDONLY,
|
||||
[WAPP_ACCESS_WRITE] = O_WRONLY | O_CREAT,
|
||||
[WAPP_ACCESS_APPEND] = O_WRONLY | O_APPEND | O_CREAT,
|
||||
[WAPP_ACCESS_READ_EX] = O_RDWR,
|
||||
[WAPP_ACCESS_WRITE_EX] = O_RDWR | O_CREAT,
|
||||
[WAPP_ACCESS_APPEND_EX] = O_RDWR | O_APPEND | O_CREAT,
|
||||
[WAPP_ACCESS_WRITE_FAIL_ON_EXIST] = O_WRONLY | O_CREAT | O_EXCL,
|
||||
[WAPP_ACCESS_WRITE_FAIL_ON_EXIST_EX] = O_RDWR | O_CREAT | O_EXCL,
|
||||
};
|
||||
|
||||
wapp_intern mode_t file_modes[FILE_ACCESS_MODE_COUNT] = {
|
||||
[WAPP_ACCESS_READ] = 0,
|
||||
[WAPP_ACCESS_WRITE] = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP,
|
||||
[WAPP_ACCESS_APPEND] = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP,
|
||||
[WAPP_ACCESS_READ_EX] = 0,
|
||||
[WAPP_ACCESS_WRITE_EX] = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP,
|
||||
[WAPP_ACCESS_APPEND_EX] = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP,
|
||||
[WAPP_ACCESS_WRITE_FAIL_ON_EXIST] = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP,
|
||||
[WAPP_ACCESS_WRITE_FAIL_ON_EXIST_EX] = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP,
|
||||
};
|
||||
|
||||
wapp_intern i32 file_seek_origins[FILE_SEEK_ORIGIN_COUNT] = {
|
||||
[WAPP_SEEK_START] = SEEK_SET,
|
||||
[WAPP_SEEK_CURRENT] = SEEK_CUR,
|
||||
[WAPP_SEEK_END] = SEEK_END,
|
||||
};
|
||||
|
||||
WFile *wapp_file_stdin(void) {
|
||||
wapp_persist WFile _stdin = { .fd = STDIN_FILENO };
|
||||
return &_stdin;
|
||||
}
|
||||
|
||||
WFile *wapp_file_stdout(void) {
|
||||
wapp_persist WFile _stdout = { .fd = STDOUT_FILENO };
|
||||
return &_stdout;
|
||||
}
|
||||
|
||||
WFile *wapp_file_stderr(void) {
|
||||
wapp_persist WFile _stderr = { .fd = STDERR_FILENO };
|
||||
return &_stderr;
|
||||
}
|
||||
|
||||
WFile *_file_open(const Allocator *allocator, Str8RO *filepath, FileAccessMode mode) {
|
||||
wapp_persist c8 tmp[WAPP_PATH_MAX] = {0};
|
||||
memset(tmp, 0, WAPP_PATH_MAX);
|
||||
memcpy(tmp, filepath->buf, filepath->size);
|
||||
|
||||
i32 fd = open((const char *)tmp, file_flags[mode], file_modes[mode]);
|
||||
if (fd < 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
WFile *output = wapp_mem_allocator_alloc(allocator, sizeof(WFile));
|
||||
if (output) {
|
||||
output->fd = fd;
|
||||
}
|
||||
|
||||
return output;
|
||||
}
|
||||
|
||||
i64 _file_seek(WFile *file, i64 offset, FileSeekOrigin origin) {
|
||||
return lseek64(file->fd, offset, file_seek_origins[origin]);
|
||||
}
|
||||
|
||||
u64 _file_read(void *dst_buf, u64 byte_count, WFile *file, u64 file_length) {
|
||||
u64 copy_byte_count = file_length <= byte_count ? file_length : byte_count;
|
||||
|
||||
i64 count = read(file->fd, dst_buf, copy_byte_count);
|
||||
if (count < 0) { return 0; }
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
i64 _file_write(const void *src_buf, WFile *file, u64 byte_count) {
|
||||
return write(file->fd, src_buf, byte_count);
|
||||
}
|
||||
|
||||
i32 _file_flush(WFile *file) {
|
||||
return fsync(file->fd);
|
||||
}
|
||||
|
||||
i32 _file_close(WFile *file) {
|
||||
return close(file->fd);
|
||||
}
|
||||
|
||||
i32 _file_rename(Str8RO *old_filepath, Str8RO *new_filepath) {
|
||||
wapp_persist c8 old_tmp[WAPP_PATH_MAX] = {0};
|
||||
wapp_persist c8 new_tmp[WAPP_PATH_MAX] = {0};
|
||||
memset(old_tmp, 0, WAPP_PATH_MAX);
|
||||
memcpy(old_tmp, old_filepath->buf, old_filepath->size);
|
||||
memset(new_tmp, 0, WAPP_PATH_MAX);
|
||||
memcpy(new_tmp, new_filepath->buf, new_filepath->size);
|
||||
|
||||
i32 link_result = link((const char *)old_tmp, (const char *)new_tmp);
|
||||
if (link_result == 0) {
|
||||
_file_remove(old_filepath);
|
||||
}
|
||||
|
||||
return link_result;
|
||||
}
|
||||
|
||||
i32 _file_remove(Str8RO *filepath) {
|
||||
wapp_persist c8 tmp[WAPP_PATH_MAX] = {0};
|
||||
memset(tmp, 0, WAPP_PATH_MAX);
|
||||
memcpy(tmp, filepath->buf, filepath->size);
|
||||
|
||||
return unlink((const char *)tmp);
|
||||
}
|
||||
|
||||
#endif // !WAPP_PLATFORM_POSIX
|
||||
Reference in New Issue
Block a user