diff --git a/lib/xboxrt/Makefile b/lib/xboxrt/Makefile index 05b8fc126..90a431513 100644 --- a/lib/xboxrt/Makefile +++ b/lib/xboxrt/Makefile @@ -1,5 +1,6 @@ XBOXRT_SRCS := \ $(NXDK_DIR)/lib/xboxrt/libc_extensions/stat.c \ + $(NXDK_DIR)/lib/xboxrt/libc_extensions/direct.c \ $(NXDK_DIR)/lib/xboxrt/libc_extensions/strings.c \ $(NXDK_DIR)/lib/xboxrt/libc_extensions/wchar.c \ $(NXDK_DIR)/lib/xboxrt/libc_extensions/wchar_ext_.c \ diff --git a/lib/xboxrt/libc_extensions/direct.c b/lib/xboxrt/libc_extensions/direct.c new file mode 100644 index 000000000..64ce9bb32 --- /dev/null +++ b/lib/xboxrt/libc_extensions/direct.c @@ -0,0 +1,110 @@ +// SPDX-License-Identifier: MIT + +// SPDX-FileCopyrightText: 2023 ExoSkye + +// Part of Microsoft CRT + +#include +#include +#include +#include +#include +#include + +// Made referencing https://www.digitalmars.com/rtl/direct.html, retrieved 2023-06-10, copyrighted 1999-2018 by Digital Mars + +// Only call this function in the case there actually is an error +static int convert_error(DWORD winerror) +{ + switch (winerror) { + case ERROR_FILE_NOT_FOUND: + case ERROR_PATH_NOT_FOUND: + case ERROR_FILENAME_EXCED_RANGE: + case ERROR_BAD_PATHNAME: + return ENOENT; + break; + case ERROR_ALREADY_EXISTS: + case ERROR_FILE_EXISTS: + return EEXIST; + break; + case ERROR_NOT_LOCKED: + case ERROR_ACCESS_DENIED: + return EACCES; + break; + case ERROR_INVALID_PARAMETER: + case ERROR_INVALID_FUNCTION: + return EINVAL; + break; + case ERROR_NOT_ENOUGH_MEMORY: + return ENOMEM; + break; + case ERROR_DIR_NOT_EMPTY: + return ENOTEMPTY; + break; + default: + debugPrint("WARNING: Unknown win32 error code 0x%08lx, returning EINVAL", winerror); + return EINVAL; + } +} + +/* + * TODO: Make a working directory system? + */ + +int _chdir(char* path) { + assert(0); + return -1; // Unreachable +} + +int _chdrive(int drive) { + assert(0); + return -1; // Unreachable +} + +char* _getcwd(char* buffer, size_t length) { + assert(0); + return NULL; // Unreachable +} + +char* _getwd(char* path_name) { + assert(0); + return NULL; // Unreachable +} + +int _getdrive(void) { + assert(0); + return -1; // Unreachable +} + +/* + * Below are the only things that can work + */ + +int _mkdir(const char* pathname) { + BOOL result = CreateDirectoryA( + pathname, + NULL + ); + + if (result == true) { + return 0; + } else { + errno = convert_error(GetLastError()); + + return -1; + } +} + +int _rmdir(const char* pathname) { + BOOL result = RemoveDirectoryA( + pathname + ); + + if (result == true) { + return 0; + } else { + errno = convert_error(GetLastError()); + + return -1; + } +} diff --git a/lib/xboxrt/libc_extensions/direct.h b/lib/xboxrt/libc_extensions/direct.h index e7244239a..76c8b29df 100644 --- a/lib/xboxrt/libc_extensions/direct.h +++ b/lib/xboxrt/libc_extensions/direct.h @@ -3,3 +3,11 @@ // SPDX-FileCopyrightText: 2020 Jannik Vogel // Part of Microsoft CRT + +int _chdir(char* path); +int _chdrive(int drive); +char* _getcwd(char* buffer, size_t length); +char* _getwd(char* path_name); +int _getdrive(void); +int _mkdir(const char* pathname); +int _rmdir(const char* pathname);