diff --git a/Source/DrangPlatform/Include/drang/fs.h b/Source/DrangPlatform/Include/drang/fs.h index 43753f3..10d7f5c 100644 --- a/Source/DrangPlatform/Include/drang/fs.h +++ b/Source/DrangPlatform/Include/drang/fs.h @@ -509,12 +509,12 @@ DRANG_PLATFORM_API int drang_fs_closedir(drang_fs_directory_t *directory); * Retrieves the absolute path of the current working directory. * The path is null-terminated and stored in the provided buffer. * - * @param[out] buffer Buffer to receive the current working directory path. - * @param[in] size Size of the buffer in bytes. + * @param[out] buffer Buffer to receive the current working directory path. (may be NULL) + * @param[in] size Size of the buffer in bytes. (must be > 0 if buffer is not NULL) * @param[out] out_size Pointer to store the actual path length (may be NULL). * @return 0 on success, negative error code on failure. * @retval DRANG_EOK Success - current directory retrieved successfully. - * @retval DRANG_EINVAL Invalid parameter (buffer is NULL or size is 0). + * @retval DRANG_EINVAL Invalid parameter (buffer is NULL or size is not 0 or buffer is not NULL and size is 0). * @retval DRANG_ENOMEM Buffer too small to hold the path. * @retval DRANG_EIO I/O error occurred during path retrieval. * @remarks If out_size is provided, it contains the required buffer size on DRANG_ENOMEM. diff --git a/Source/DrangPlatform/Source/linux/fs/dir.c b/Source/DrangPlatform/Source/linux/fs/dir.c index 664d18f..6d1192c 100644 --- a/Source/DrangPlatform/Source/linux/fs/dir.c +++ b/Source/DrangPlatform/Source/linux/fs/dir.c @@ -7,6 +7,7 @@ #include #include #include +#include int drang_fs_mkdir(const char *path, drang_fs_permissions_t permissions) { @@ -128,17 +129,26 @@ int drang_fs_closedir(drang_fs_directory_t *directory) int drang_fs_get_cwd(char *buffer, size_t size, size_t *out_size) { DRANG_BEGIN_TRY() - DRANG_FAIL_IF_NULL(buffer, DRANG_EINVAL); - if (getcwd(buffer, size) != NULL) { - DRANG_RETURN_IN(out_size, strlen(buffer)); - } - - if (errno == ERANGE) { - if (out_size) { - long required_size = pathconf(".", _PC_PATH_MAX); - *out_size = required_size; + DRANG_CHECK((buffer != NULL && size > 0) || (buffer == NULL && size == 0), DRANG_EINVAL); + char* dir = get_current_dir_name(); + if (dir != NULL) { + const size_t dir_length = strlen(dir); + if (buffer != NULL && size < dir_length + 1) { + free(dir); + if (out_size) { + *out_size = dir_length; + } + DRANG_FAIL(DRANG_ENOMEM); } - DRANG_FAIL(DRANG_ENOMEM); + if (buffer != NULL) { + memcpy(buffer, dir, dir_length); + buffer[dir_length] = '\0'; + } + free(dir); + if (out_size) { + *out_size = dir_length + 1; + } + DRANG_RETURN(); } DRANG_FAIL(drang_errno_to_error(errno)); @@ -149,6 +159,7 @@ int drang_fs_get_cwd(char *buffer, size_t size, size_t *out_size) int drang_fs_set_cwd(const char *path) { DRANG_BEGIN_TRY() + DRANG_CHECK(path != NULL, DRANG_EINVAL); if (chdir(path) != 0) { DRANG_FAIL(drang_errno_to_error(errno)); diff --git a/Source/DrangPlatform/Source/win32/fs/dir.c b/Source/DrangPlatform/Source/win32/fs/dir.c index 1f4f069..1e10dcf 100644 --- a/Source/DrangPlatform/Source/win32/fs/dir.c +++ b/Source/DrangPlatform/Source/win32/fs/dir.c @@ -125,9 +125,8 @@ int drang_fs_get_cwd(char *buffer, size_t size, size_t *out_size) { DWORD length = 0; DRANG_BEGIN_TRY() - DRANG_FAIL_IF_NULL(buffer, DRANG_EINVAL); - length = GetCurrentDirectoryA((DWORD) size, buffer); + length = GetCurrentDirectoryA(buffer ? (DWORD) size : 0, buffer); if (length == 0) { DRANG_FAIL(win32_error_to_drang(GetLastError())); }