mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-01-22 09:01:57 -05:00
360: Try to fix crash from I/O
This commit is contained in:
parent
39ff1db4ff
commit
2cc17f04c1
2 changed files with 43 additions and 1 deletions
|
@ -43,7 +43,7 @@ LDFLAGS = -g $(MACHDEP) -Wl,--gc-sections -Wl,-Map,$(notdir $@).map
|
||||||
#---------------------------------------------------------------------------------
|
#---------------------------------------------------------------------------------
|
||||||
# any extra libraries we wish to link with the project
|
# any extra libraries we wish to link with the project
|
||||||
#---------------------------------------------------------------------------------
|
#---------------------------------------------------------------------------------
|
||||||
LIBS := -lxenon -lm
|
LIBS := -lxenon -lm -lfat
|
||||||
|
|
||||||
#---------------------------------------------------------------------------------
|
#---------------------------------------------------------------------------------
|
||||||
# list of directories containing libraries, this must be the top level containing
|
# list of directories containing libraries, this must be the top level containing
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
#include <libfat/fat.h>
|
||||||
#include "_PlatformConsole.h"
|
#include "_PlatformConsole.h"
|
||||||
|
|
||||||
const cc_result ReturnCode_FileShareViolation = 1000000000; /* TODO: not used apparently */
|
const cc_result ReturnCode_FileShareViolation = 1000000000; /* TODO: not used apparently */
|
||||||
|
@ -80,6 +81,7 @@ cc_uint64 Stopwatch_Measure(void) {
|
||||||
*#########################################################################################################################*/
|
*#########################################################################################################################*/
|
||||||
static char root_buffer[NATIVE_STR_LEN];
|
static char root_buffer[NATIVE_STR_LEN];
|
||||||
static cc_string root_path = String_FromArray(root_buffer);
|
static cc_string root_path = String_FromArray(root_buffer);
|
||||||
|
static bool fat_available;
|
||||||
|
|
||||||
void Platform_EncodePath(cc_filepath* dst, const cc_string* path) {
|
void Platform_EncodePath(cc_filepath* dst, const cc_string* path) {
|
||||||
char* str = dst->buffer;
|
char* str = dst->buffer;
|
||||||
|
@ -89,15 +91,21 @@ void Platform_EncodePath(cc_filepath* dst, const cc_string* path) {
|
||||||
}
|
}
|
||||||
|
|
||||||
cc_result Directory_Create(const cc_filepath* path) {
|
cc_result Directory_Create(const cc_filepath* path) {
|
||||||
|
if (!fat_available) return ENOSYS;
|
||||||
|
|
||||||
return mkdir(path->buffer, 0) == -1 ? errno : 0;
|
return mkdir(path->buffer, 0) == -1 ? errno : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int File_Exists(const cc_filepath* path) {
|
int File_Exists(const cc_filepath* path) {
|
||||||
|
if (!fat_available) return 0;
|
||||||
|
|
||||||
struct stat sb;
|
struct stat sb;
|
||||||
return stat(path->buffer, &sb) == 0 && S_ISREG(sb.st_mode);
|
return stat(path->buffer, &sb) == 0 && S_ISREG(sb.st_mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
cc_result Directory_Enum(const cc_string* dirPath, void* obj, Directory_EnumCallback callback) {
|
cc_result Directory_Enum(const cc_string* dirPath, void* obj, Directory_EnumCallback callback) {
|
||||||
|
if (!fat_available) return ENOSYS;
|
||||||
|
|
||||||
cc_string path; char pathBuffer[FILENAME_SIZE];
|
cc_string path; char pathBuffer[FILENAME_SIZE];
|
||||||
cc_filepath str;
|
cc_filepath str;
|
||||||
struct dirent* entry;
|
struct dirent* entry;
|
||||||
|
@ -141,12 +149,17 @@ static cc_result File_Do(cc_file* file, const char* path, int mode) {
|
||||||
}
|
}
|
||||||
|
|
||||||
cc_result File_Open(cc_file* file, const cc_filepath* path) {
|
cc_result File_Open(cc_file* file, const cc_filepath* path) {
|
||||||
|
if (!fat_available) return ReturnCode_FileNotFound;
|
||||||
return File_Do(file, path->buffer, O_RDONLY);
|
return File_Do(file, path->buffer, O_RDONLY);
|
||||||
}
|
}
|
||||||
|
|
||||||
cc_result File_Create(cc_file* file, const cc_filepath* path) {
|
cc_result File_Create(cc_file* file, const cc_filepath* path) {
|
||||||
|
if (!fat_available) return ENOTSUP;
|
||||||
return File_Do(file, path->buffer, O_RDWR | O_CREAT | O_TRUNC);
|
return File_Do(file, path->buffer, O_RDWR | O_CREAT | O_TRUNC);
|
||||||
}
|
}
|
||||||
|
|
||||||
cc_result File_OpenOrCreate(cc_file* file, const cc_filepath* path) {
|
cc_result File_OpenOrCreate(cc_file* file, const cc_filepath* path) {
|
||||||
|
if (!fat_available) return ENOTSUP;
|
||||||
return File_Do(file, path->buffer, O_RDWR | O_CREAT);
|
return File_Do(file, path->buffer, O_RDWR | O_CREAT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -264,10 +277,39 @@ cc_result Socket_CheckWritable(cc_socket s, cc_bool* writable) {
|
||||||
/*########################################################################################################################*
|
/*########################################################################################################################*
|
||||||
*--------------------------------------------------------Platform---------------------------------------------------------*
|
*--------------------------------------------------------Platform---------------------------------------------------------*
|
||||||
*#########################################################################################################################*/
|
*#########################################################################################################################*/
|
||||||
|
extern int bdev_enum(int handle, const char** name);
|
||||||
|
|
||||||
|
static void FindRootDirectory(void) {
|
||||||
|
const char* dev = NULL;
|
||||||
|
int handle = bdev_enum(-1, &dev);
|
||||||
|
if (handle < 0) { fat_available = false; return; }
|
||||||
|
|
||||||
|
root_path.length = 0;
|
||||||
|
String_Format1(&root_path, "%c:/ClassiCube", dev);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void CreateRootDirectory(void) {
|
||||||
|
if (!fat_available) return;
|
||||||
|
root_buffer[root_path.length] = '\0';
|
||||||
|
|
||||||
|
int res = mkdir(root_buffer, 0);
|
||||||
|
int err = res == -1 ? errno : 0;
|
||||||
|
Platform_Log1("Created root directory: %i", &err);
|
||||||
|
}
|
||||||
|
|
||||||
void Platform_Init(void) {
|
void Platform_Init(void) {
|
||||||
xenos_init(VIDEO_MODE_AUTO);
|
xenos_init(VIDEO_MODE_AUTO);
|
||||||
console_init();
|
console_init();
|
||||||
//network_init();
|
//network_init();
|
||||||
|
|
||||||
|
xenon_ata_init();
|
||||||
|
xenon_atapi_init();
|
||||||
|
|
||||||
|
fat_available = fatInitDefault();
|
||||||
|
Platform_ReadonlyFilesystem = !fat_available;
|
||||||
|
|
||||||
|
FindRootDirectory();
|
||||||
|
CreateRootDirectory();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Platform_Free(void) {
|
void Platform_Free(void) {
|
||||||
|
|
Loading…
Reference in a new issue